---
title: "Validate Workflow Manifest"
method: POST
path: "/api/v1/validate"
tags: ["Runs"]
---

# Validate Workflow Manifest

`POST /api/v1/validate`

Validates workflow structure and diagnostics without runtime readiness checks.

## Request body

- RunManifest — Self-contained workflow run manifest.
  - `version` integer, required — Manifest schema version.
  - `parent_id` string, nullable — Optional orchestration parent run ID. Fork and rewind lineage use separate fields and should not set this value.
  - `title` string, nullable — Optional explicit run title. The server trims leading/trailing whitespace, rejects blank values, rejects control characters and newline characters, and requires at most 100 characters.
  - `cwd` string, required — CLI working directory at invocation time.
  - `git` GitContext — Observable git state captured before the run starts.
    - `origin_url` string, required — Remote origin URL with any embedded credentials removed.
    - `branch` string, required — Current branch name.
    - `sha` string, nullable — Current commit SHA, when known.
    - `dirty` 'clean' | 'dirty' | 'unknown', required
  - `goal` ManifestGoal — Resolved goal kind and content.
    - `type` 'value' | 'file' | 'graph', required
    - `text` string, required — Resolved goal content.
  - `args` ManifestArgs — Sparse command-local args that affect run settings.
    - `model` string
    - `provider` string
    - `environment` string — Named environment slug to select for the run.
    - `verbose` boolean
    - `dry_run` boolean
    - `auto_approve` boolean
    - `preserve_sandbox` boolean
    - `label` string[]
    - `input` string[] — Raw repeated CLI input overrides, each in `KEY=VALUE` form.
  - `target` ManifestTarget, required
    - `path` string, required — Resolved path that keys into the workflows map.
  - `configs` ManifestConfig[]
    - `type` 'project' | 'user', required
    - `path` string, nullable
    - `source` string, nullable
  - `workflows` object, required

## Response `200`

Validation result

- ValidateResponse
  - `ok` boolean, required — Whether validation passed with no error diagnostics.
  - `workflow` PreflightWorkflowSummary, required
    - `name` string, required
    - `graph_path` string, nullable
    - `nodes` integer, required
    - `edges` integer, required
    - `goal` string, required
    - `diagnostics` WorkflowDiagnostic[], required
      - `rule` string, required
      - `severity` 'error' | 'warning' | 'info', required
      - `message` string, required
      - `node_id` string, nullable
      - `edge` string[], nullable
      - `fix` string, nullable
      - `source_path` string, nullable
      - `line` integer, nullable
      - `column` integer, nullable
      - `span_start` integer, nullable
      - `span_len` integer, nullable
      - `related` RelatedWorkflowDiagnostic[]
        - `message` string, required
        - `source_path` string, nullable
        - `line` integer, nullable
        - `column` integer, nullable

## Other responses

- `400` — Invalid manifest or workflow

---

[API](https://skmtc.net/fabro-sh/apis/fabro-run-api.md) · [All operations](https://skmtc.net/fabro-sh/apis/fabro-run-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/fabro-sh/fabro-run-api/revisions/bee030053823/schema)
