# Headless JSON Response

The default invocation is headless: input goes in, JSON comes out. The contract is intentionally tiny — return the outcome and the files touched. Anything else a caller needs is inside those files (SPEC.md, companions, `.decision-log.md`).

## Success

```json
{
  "status": "complete",
  "files": [
    "_xiaoma-output/specs/spec-quarter-drop/SPEC.md",
    "_xiaoma-output/specs/spec-quarter-drop/glossary.md",
    "_xiaoma-output/specs/spec-quarter-drop/.decision-log.md"
  ]
}
```

`files` lists every file written or modified in this run, in any order. The spec folder, kernel filename, decision log location, capabilities, companions, and verdict are all readable from those files; no need to re-encode them in the response.

## Blocked

```json
{
  "status": "blocked",
  "error_code": "insufficient_intent",
  "reason": "Input was a one-line idea with no surrounding context; too thin to distill. Suggest xiaoma-prd to draw the vision out first."
}
```

Defined `error_code` values:

- `insufficient_intent` — input too thin to distill into a kernel.
- `missing_slug` — input is sparse or multi-source and no slug was provided by the caller or derivable from a source path.
