@open-agent-toolkit/cli 0.2.58 → 0.2.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/assets/agents/oat-phase-implementer.md +27 -4
  2. package/assets/agents/oat-reviewer.md +25 -14
  3. package/assets/bundle-metadata.json +1 -1
  4. package/assets/docs/cli-utilities/configuration.md +16 -0
  5. package/assets/docs/cli-utilities/workflow-gates.md +91 -6
  6. package/assets/docs/contributing/skills.md +27 -5
  7. package/assets/docs/provider-sync/commands.md +23 -0
  8. package/assets/docs/reference/cli-reference.md +10 -3
  9. package/assets/docs/reference/oat-directory-structure.md +1 -0
  10. package/assets/docs/workflows/ideas/index.md +1 -1
  11. package/assets/docs/workflows/index.md +1 -0
  12. package/assets/docs/workflows/projects/artifacts.md +24 -3
  13. package/assets/docs/workflows/projects/autonomy.md +5 -2
  14. package/assets/docs/workflows/projects/dispatch-ceiling.md +43 -7
  15. package/assets/docs/workflows/projects/hill-checkpoints.md +21 -0
  16. package/assets/docs/workflows/projects/implementation-execution.md +10 -2
  17. package/assets/docs/workflows/projects/lifecycle.md +128 -10
  18. package/assets/docs/workflows/projects/pr-flow.md +2 -0
  19. package/assets/docs/workflows/projects/reviews.md +1 -1
  20. package/assets/docs/workflows/projects/state-machine.md +20 -0
  21. package/assets/docs/workflows/skills/index.md +2 -1
  22. package/assets/public-package-versions.json +4 -4
  23. package/assets/skills/oat-brainstorm/SKILL.md +61 -12
  24. package/assets/skills/oat-docs/SKILL.md +13 -8
  25. package/assets/skills/oat-doctor/SKILL.md +3 -3
  26. package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
  27. package/assets/skills/oat-project-autonomous/SKILL.md +14 -9
  28. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +59 -38
  29. package/assets/skills/oat-project-capture/SKILL.md +2 -2
  30. package/assets/skills/oat-project-design/SKILL.md +10 -5
  31. package/assets/skills/oat-project-discover/SKILL.md +15 -9
  32. package/assets/skills/oat-project-document/SKILL.md +11 -1
  33. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +59 -38
  34. package/assets/skills/oat-project-implement/SKILL.md +3 -3
  35. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +149 -24
  36. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +14 -8
  37. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +59 -38
  38. package/assets/skills/oat-project-implement/references/phase-execution.md +16 -1
  39. package/assets/skills/oat-project-implement/references/plan-and-resume.md +19 -1
  40. package/assets/skills/oat-project-import-plan/SKILL.md +75 -6
  41. package/assets/skills/oat-project-lite/SKILL.md +467 -0
  42. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +331 -0
  43. package/assets/skills/oat-project-next/SKILL.md +54 -11
  44. package/assets/skills/oat-project-plan/SKILL.md +42 -5
  45. package/assets/skills/oat-project-plan-writing/SKILL.md +100 -3
  46. package/assets/skills/oat-project-pr-final/SKILL.md +33 -7
  47. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +59 -38
  48. package/assets/skills/oat-project-pr-progress/SKILL.md +3 -3
  49. package/assets/skills/oat-project-progress/SKILL.md +27 -3
  50. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +3 -1
  51. package/assets/skills/oat-project-quick-start/SKILL.md +29 -4
  52. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +59 -38
  53. package/assets/skills/oat-project-review-provide/SKILL.md +37 -11
  54. package/assets/skills/oat-project-review-provide-remote/SKILL.md +12 -5
  55. package/assets/skills/oat-project-summary/SKILL.md +27 -3
  56. package/assets/templates/plan-lite.md +165 -0
  57. package/assets/templates/plan.md +1 -1
  58. package/assets/templates/state.md +5 -2
  59. package/dist/commands/gate/index.d.ts.map +1 -1
  60. package/dist/commands/gate/index.js +102 -8
  61. package/dist/commands/init/index.d.ts.map +1 -1
  62. package/dist/commands/init/index.js +16 -1
  63. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  64. package/dist/commands/project/dispatch-ceiling/index.js +10 -1
  65. package/dist/commands/project/index.d.ts.map +1 -1
  66. package/dist/commands/project/index.js +2 -0
  67. package/dist/commands/project/new/index.d.ts +3 -2
  68. package/dist/commands/project/new/index.d.ts.map +1 -1
  69. package/dist/commands/project/new/index.js +2 -1
  70. package/dist/commands/project/new/scaffold.d.ts +5 -3
  71. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  72. package/dist/commands/project/new/scaffold.js +38 -10
  73. package/dist/commands/project/promote/index.d.ts +2 -0
  74. package/dist/commands/project/promote/index.d.ts.map +1 -0
  75. package/dist/commands/project/promote/index.js +1 -0
  76. package/dist/commands/project/promote/promote.d.ts +47 -0
  77. package/dist/commands/project/promote/promote.d.ts.map +1 -0
  78. package/dist/commands/project/promote/promote.js +322 -0
  79. package/dist/commands/project/split/run.d.ts.map +1 -1
  80. package/dist/commands/project/split/run.js +8 -1
  81. package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
  82. package/dist/commands/project/validate-plan/index.js +25 -1
  83. package/dist/commands/project/validate-plan/validate-plan.d.ts +8 -0
  84. package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
  85. package/dist/commands/project/validate-plan/validate-plan.js +49 -0
  86. package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
  87. package/dist/commands/remove/skill/remove-skill.js +10 -1
  88. package/dist/commands/shared/frontmatter.d.ts +32 -1
  89. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  90. package/dist/commands/shared/frontmatter.js +93 -0
  91. package/dist/commands/state/generate.d.ts.map +1 -1
  92. package/dist/commands/state/generate.js +23 -0
  93. package/dist/commands/status/index.d.ts.map +1 -1
  94. package/dist/commands/status/index.js +8 -1
  95. package/dist/commands/sync/apply.d.ts.map +1 -1
  96. package/dist/commands/sync/apply.js +40 -6
  97. package/dist/commands/sync/index.d.ts.map +1 -1
  98. package/dist/commands/sync/index.js +11 -17
  99. package/dist/commands/sync/sync.types.d.ts +6 -6
  100. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  101. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  102. package/dist/commands/tools/shared/pack-manifest.js +2 -0
  103. package/dist/config/resolve.d.ts +16 -0
  104. package/dist/config/resolve.d.ts.map +1 -1
  105. package/dist/config/resolve.js +16 -8
  106. package/dist/engine/execute-plan.d.ts.map +1 -1
  107. package/dist/engine/execute-plan.js +6 -0
  108. package/dist/manifest/index.d.ts +2 -1
  109. package/dist/manifest/index.d.ts.map +1 -1
  110. package/dist/manifest/index.js +1 -1
  111. package/dist/manifest/manager.d.ts +40 -0
  112. package/dist/manifest/manager.d.ts.map +1 -1
  113. package/dist/manifest/manager.js +35 -0
  114. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-phase-implementer
3
- version: 1.1.3
3
+ version: 1.1.5
4
4
  description: Implements one plan phase end-to-end, commits each task separately, self-checks between tasks, and handles bounded review fixes when resumed by oat-project-implement.
5
5
  tools: Read, Write, Edit, Bash, Grep, Glob, Task
6
6
  color: cyan
@@ -29,7 +29,7 @@ The root supplies:
29
29
  - `mode`: `implement`, `fix`, or `recover`;
30
30
  - `artifact_paths`: available plan, design, spec, discovery, implementation,
31
31
  and imported-plan paths;
32
- - `workflow_mode`: `spec-driven`, `quick`, or `import`;
32
+ - `workflow_mode`: `spec-driven`, `quick`, `import`, or `lite`;
33
33
  - `commit_convention`: exact task/fix commit convention;
34
34
  - `phase_base_head`: root-recorded HEAD before phase dispatch;
35
35
  - `worktree`: assigned phase worktree or orchestration checkout;
@@ -120,6 +120,11 @@ Read each required artifact once at phase start:
120
120
  - `quick`: phase section from plan and discovery; design/spec when present;
121
121
  - `import`: phase section from plan and imported plan; design/spec when
122
122
  present.
123
+ - `lite`: read the whole plan.md requirements contract: the assigned phase
124
+ section plus Summary, Decisions, Assumptions, Out of Scope, and Validation
125
+ Criteria, and the Product Behavior and/or Technical Design selected by its
126
+ recorded `minimal`, `product`, `technical`, or `both` content shape.
127
+ Discovery, spec, and design are absent by design.
123
128
 
124
129
  Extract all phase tasks, dependency order, file boundaries, verification
125
130
  commands, commit messages, and phase-wide verification before editing.
@@ -402,7 +407,20 @@ For every task:
402
407
 
403
408
  1. Record `PRE_TASK_HEAD`.
404
409
  2. Read the task steps and declared file boundary.
405
- 3. Follow RED/GREEN/refactor ordering when specified.
410
+ 3. Execute the task's declared implementation and proof strategy without
411
+ silently substituting TDD. Follow RED/GREEN/refactor ordering only when the
412
+ selected strategy specifies it.
413
+ For required manual or visual proof, inspect the effective runtime tool
414
+ catalog for an available computer-use capability; never infer availability
415
+ from planning prose, configuration, or another agent's tools. Use available
416
+ computer-use for required visual proof and record the performed proof. When
417
+ no available executor can perform the criterion, stop before committing the
418
+ task or marking the task or phase complete. Under `OAT_AUTONOMOUS=1`, return
419
+ `BLOCKED` with an explicit `IMPLEMENT-20 unverified proof boundary` and name
420
+ the criterion and missing capability. In an interactive run, return
421
+ `NEEDS_CONTEXT` and wait for the operator to execute the criterion or direct
422
+ the next action. Neither path may mark unavailable proof
423
+ deferred-but-verified.
406
424
  4. Implement only that task. Optional nested help does not transfer task
407
425
  ownership or commit authority.
408
426
  5. Apply the Prevention and Post-Commit Recovery ordering: format, run every
@@ -440,7 +458,12 @@ After all task commits:
440
458
  - apply the same post-commit recovery contract to an eligible phase-level
441
459
  composition failure;
442
460
  - verify task outputs compose correctly;
443
- - compare the phase result with design/spec/discovery;
461
+ - compare the phase result with the requirements source selected by workflow
462
+ mode:
463
+ - `lite`: the complete `plan.md` requirements contract loaded at phase start;
464
+ - `spec-driven`: `plan.md`, `design.md`, and `spec.md`;
465
+ - `quick`: `plan.md` and `discovery.md`, plus design/spec when present; and
466
+ - `import`: `plan.md` and the imported plan, plus design/spec when present;
444
467
  - confirm no task boundary or dependency was missed; and
445
468
  - report Medium/Minor concerns without launching a reviewer.
446
469
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-reviewer
3
- version: 1.2.1
3
+ version: 1.2.3
4
4
  description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
5
5
  tools: Read, Bash, Grep, Glob, Write, Task
6
6
  color: yellow
@@ -50,7 +50,7 @@ You will be given a "Review Scope" block including:
50
50
  - **commits/range**: Git commits or SHA range for changed files. For code review, this is the authoritative review surface.
51
51
  - **files_changed**: Optional orientation hint listing files believed to be modified in scope. If this disagrees with the commit range, trust the commit range.
52
52
  - **analysis_artifact**: For `type: analysis`, path to the severity-rated analysis artifact to fact-check.
53
- - **workflow_mode**: `spec-driven` | `quick` | `import` (default to `spec-driven` if absent)
53
+ - **workflow_mode**: `spec-driven` | `quick` | `import` | `lite` (default to `spec-driven` if absent)
54
54
  - **artifact_paths**: Paths to available artifacts (spec/design/plan/implementation/discovery/import reference)
55
55
  - **tasks_in_scope**: Task IDs being reviewed (if task/phase scope)
56
56
  - **oat_output_mode**: Optional output-sink selector. Absent (or any value other than `structured`) means **artifact mode** — write the review artifact to disk per Step 8. `structured` means **structured-output mode** — return a `StructuredFindings` object in-memory and write NO artifact file (see **Structured-Output Mode**). This key parallels the existing `oat_review_invocation` dispatch-payload naming.
@@ -122,6 +122,7 @@ Use workflow mode to determine required evidence:
122
122
  - **spec-driven**: `spec.md`, `design.md`, `plan.md` are expected.
123
123
  - **quick**: `discovery.md` + `plan.md` are expected (`spec.md`/`design.md` optional if present).
124
124
  - **import**: `plan.md` is expected (`references/imported-plan.md` preferred; `spec.md`/`design.md` optional).
125
+ - **lite**: `plan.md` and `implementation.md` are expected; discovery, spec, and design are absent by design.
125
126
 
126
127
  Do not mark missing optional artifacts as findings.
127
128
  If required artifacts for the mode are unexpectedly missing, record a workflow contract gap.
@@ -144,6 +145,7 @@ Read available artifacts to understand what SHOULD have been built:
144
145
  - `spec-driven`: read `spec.md` and `design.md`.
145
146
  - `quick`: read `discovery.md` and `plan.md`; read `spec.md`/`design.md` only if they exist.
146
147
  - `import`: read `plan.md` and `references/imported-plan.md` (if present); read `spec.md`/`design.md` only if they exist.
148
+ - `lite`: read `plan.md` and `implementation.md`; do not require discovery, spec, design, or an import reference.
147
149
  3. For `type: analysis`, read `analysis_artifact` and then inspect only the cited evidence sources needed to verify its findings:
148
150
  - `scope: docs`: consult the docs contract, docs navigation/index files, and cited docs source files relevant to the analysis.
149
151
  - `scope: agent-instructions`: consult the repo/root instruction files, provider instruction files, and cited skill/agent instruction files relevant to the analysis.
@@ -168,6 +170,7 @@ For each requirement in scope, use the best available requirement source by mode
168
170
  - `spec-driven`: `spec.md` (primary), `design.md` mapping (secondary)
169
171
  - `quick`: `discovery.md` + `plan.md`
170
172
  - `import`: normalized `plan.md` + `references/imported-plan.md` (if present)
173
+ - `lite`: the requirements contract in `plan.md`: Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria. Also use Product Behavior and/or Technical Design when selected by the recorded `minimal`, `product`, `technical`, or `both` content shape.
171
174
 
172
175
  Then verify:
173
176
 
@@ -176,10 +179,17 @@ Then verify:
176
179
  - Check acceptance criteria are met
177
180
  - If missing: add to Critical findings
178
181
 
179
- 2. **Is the Verification satisfied?**
180
- - Check if tests exist matching declared verification intent in available artifacts
181
- - If `design.md` exists, cross-reference Requirement-to-Test Mapping
182
- - If tests missing for P0 requirements: add to Critical findings
182
+ 2. **Is the applicable verification intent satisfied?**
183
+ - First identify the verification intent declared by the applicable workflow
184
+ artifacts. When that contract declares an `Implementation and Proof
185
+ Strategy`, check whether the evidence matches the declared strategy, covers
186
+ its observable risk, and is capable of failing when the claim is false.
187
+ - A missing or unjustified proof strategy is a finding only when the
188
+ applicable workflow artifact declares that strategy. When it does not,
189
+ review the plan's existing verification commands and produced evidence
190
+ without inventing a missing strategy field.
191
+ - If `design.md` exists, cross-reference Requirement-to-Test Mapping.
192
+ - The absence of an automated test alone is not a finding.
183
193
 
184
194
  3. **Is there extra work?**
185
195
  - Code that doesn't map to any requirement
@@ -207,6 +217,7 @@ Treat the artifact as a product deliverable. Verify it is:
207
217
  - `spec-driven`: spec + design
208
218
  - `quick`: discovery (+ spec/design if present)
209
219
  - `import`: imported-plan reference (+ discovery/spec/design if present)
220
+ - `lite`: plan.md Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria. Also review the Product Behavior and/or Technical Design required by its recorded content shape; challenge `minimal` when an observable shape trigger applies.
210
221
  - For import-mode `plan` reviews, bias findings toward canonical-format conformance and completeness. Do not rewrite the imported author's intent merely to match OAT house style.
211
222
 
212
223
  4. **Actionable**
@@ -220,7 +231,7 @@ Treat the artifact as a product deliverable. Verify it is:
220
231
  - Stable task IDs: task headings use `pNN-tNN`, IDs are monotonic within each phase, and review-generated tasks do not reuse prior IDs.
221
232
  - Required sections: the plan includes Reviews, Implementation Complete, and References sections without placeholder-only critical content.
222
233
  - Review-table preservation: existing review rows are preserved; never require deleting rows to "clean up" the table.
223
- - Task atomicity and verifiability: each task is independently committable, has bounded file scope, and declares verification that can actually be run.
234
+ - Task atomicity and verifiability: each task is independently committable, has bounded file scope, and has executable verification intent. Require a proportionate implementation and proof strategy only when the applicable workflow plan contract declares it; otherwise review the task's existing verification commands and evidence.
224
235
  - Coverage of design/discovery: every in-scope design component or discovery decision is mapped to at least one task or explicitly deferred/out of scope.
225
236
  - Parallelism-claim sanity: any parallel phase group or parallelism statement is consistent with declared file boundaries and dependency order.
226
237
 
@@ -228,7 +239,7 @@ Treat the artifact as a product deliverable. Verify it is:
228
239
 
229
240
  This step applies to **code reviews** only.
230
241
 
231
- If `design.md` is absent in quick/import mode, mark design alignment as "not applicable (design artifact not present for mode)" and continue.
242
+ If `design.md` is absent in quick/import/lite mode, mark design alignment as "not applicable (design artifact not present for mode)" and continue.
232
243
 
233
244
  For each design decision relevant to scope:
234
245
 
@@ -283,10 +294,10 @@ Pragmatic code quality review (not exhaustive):
283
294
  - Off-by-one errors, null handling
284
295
  - Missing error handling for likely failures
285
296
 
286
- 2. **Test coverage**
287
- - Critical paths have tests
288
- - Edge cases covered
289
- - Unhappy paths tested
297
+ 2. **Evidence coverage**
298
+ - Critical paths have evidence matching the declared proof strategy
299
+ - Edge cases are covered where relevant
300
+ - Behavioral claims have a control that fails without the change
290
301
 
291
302
  3. **Security**
292
303
  - Input validation at boundaries
@@ -307,14 +318,14 @@ Group findings by severity:
307
318
  - Missing P0 requirements
308
319
  - Security vulnerabilities
309
320
  - Broken functionality
310
- - Missing tests for critical paths
321
+ - Missing capable evidence for critical paths
311
322
 
312
323
  **Important** (should fix before merge)
313
324
 
314
325
  - Missing P1 requirements
315
326
  - Missing error handling
316
327
  - Significant maintainability issues
317
- - Missing tests for important paths
328
+ - Missing capable evidence for important paths
318
329
  - Stale spec/design/plan artifact that conflicts with a defensible implementation and should be aligned before closeout
319
330
 
320
331
  **Medium** (default fix before pass)
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.58"
3
+ "oatVersion": "0.2.62"
4
4
  }
@@ -367,6 +367,22 @@ Repo-local and user config can also hold workflow defaults, including
367
367
  example, one user may prefer `claude -p` as a gate target while another prefers
368
368
  `codex exec`.
369
369
 
370
+ ### Per-project gate posture
371
+
372
+ Project state is a separate surface from the five config layers. One project can
373
+ disable a configured lifecycle gate for itself through
374
+ `oat_skill_gate_overrides` in that project's `state.md`, keyed by gate-aware
375
+ skill name with the single permitted value `disabled`.
376
+
377
+ Config layers decide whether a gate exists; the project override then decides
378
+ whether an existing gate runs for that project. An override never creates
379
+ configuration, never mutates any config layer, and is never written by a
380
+ non-interactive run. Resolve it with
381
+ `oat gate resolve <skill> --project <path-or-name> --json`; without `--project`
382
+ the command keeps its original raw output. See
383
+ [Workflow gates](./workflow-gates.md) for the full resolution envelope and the
384
+ phase-review and autonomous exclusions.
385
+
370
386
  In practice, you usually inspect these via:
371
387
 
372
388
  ```bash
@@ -62,12 +62,89 @@ A valid command is stored byte-for-byte. `oat gate resolve` returns that exact
62
62
  string, and the lifecycle executes it unchanged; OAT does not inject, reorder,
63
63
  or rewrite its shell arguments.
64
64
 
65
- `oat-project-plan`, `oat-project-implement`, `oat-project-quick-start`, and
66
- `oat-project-import-plan` are currently gate-aware. Gate awareness is declared
65
+ `oat-project-plan`, `oat-project-implement`, `oat-project-quick-start`,
66
+ `oat-project-lite`, and `oat-project-import-plan` are currently gate-aware. Gate awareness is declared
67
67
  in skill frontmatter with `oat_gateable: true`, and
68
68
  `oat internal validate-oat-skills` warns when config targets a missing or
69
69
  non-gateable skill.
70
70
 
71
+ ### Per-project gate overrides
72
+
73
+ Gate configuration is shared, but one project can opt out of a configured
74
+ lifecycle gate without changing any config layer. The override lives only in
75
+ that project's `state.md`:
76
+
77
+ ```yaml
78
+ oat_skill_gate_overrides:
79
+ oat-project-implement: disabled
80
+ ```
81
+
82
+ The map is strict. Keys are gate-aware skill names and the only permitted value
83
+ is the literal `disabled`. Arrays, booleans, `enabled`, unknown values,
84
+ duplicate keys, and malformed maps are rejected with the offending project state
85
+ path. An absent map means follow configuration; keeping every gate leaves the
86
+ map absent.
87
+
88
+ Override keys are accepted only for skills that declare `oat_gateable: true`.
89
+ A configured gate may still be resolved and executed for a lifecycle skill that
90
+ is not gate-aware — `oat-project-discover` and `oat-project-design` are the
91
+ current examples — but because no override key for such a skill is accepted,
92
+ their configured gates apply to every project and cannot be disabled per
93
+ project.
94
+
95
+ Precedence is layered, not merged: config layers decide whether a gate exists
96
+ at all, and the project override then decides whether an existing gate runs for
97
+ that project. An override never creates configuration, so a project may record
98
+ an override for a skill that has no configured gate; the gate stays absent.
99
+ Overrides never mutate shared, local, or user config, and config changes never
100
+ rewrite a project's override.
101
+
102
+ Interactive project setup offers a keep-or-disable choice per configured gate,
103
+ one skill at a time; there is no single switch that disables every gate.
104
+ Non-interactive runs never prompt and never write a new map, and an explicit
105
+ existing map is preserved unchanged on resume and import.
106
+
107
+ Resolution is opt-in. Without `--project`, `oat gate resolve` keeps returning
108
+ the raw `GateConfig | null` that existing consumers parse:
109
+
110
+ ```bash
111
+ oat gate resolve oat-project-implement --json
112
+ ```
113
+
114
+ With project context it returns a discriminated envelope instead:
115
+
116
+ ```bash
117
+ oat gate resolve oat-project-implement --project "$PROJECT_PATH" --json
118
+ ```
119
+
120
+ The envelope's `resolution` is one of three values:
121
+
122
+ | `resolution` | Meaning | `configuredGate` | `effectiveGate` |
123
+ | -------------------------------- | ----------------------------------------- | ---------------- | --------------- |
124
+ | `configured` | A configured gate runs for this project. | the gate | the gate |
125
+ | `configured_disabled_by_project` | Configured, but this project disabled it. | the gate | `null` |
126
+ | `not_configured` | No gate is configured for this skill. | `null` | `null` |
127
+
128
+ `configured_disabled_by_project` retains `configuredGate` so evidence of a
129
+ deliberate opt-out can never be mistaken for absent configuration. It also
130
+ carries `configSource` and a `projectOverride` record naming the
131
+ `state.md:oat_skill_gate_overrides` source.
132
+
133
+ `configSource` reports the layer that owned the decision. For
134
+ `not_configured` it is the layer that explicitly declared the skill `null`, and
135
+ `null` only when no layer mentions the skill at all, so a deliberate
136
+ layer-level disable stays distinguishable from an absent declaration.
137
+ `configuredGate` is `null` in both cases, so neither reads as configured.
138
+
139
+ Disabled is a posture, not an outcome. A project-disabled gate launches no
140
+ process and never enters the passed, missing, or failed branches. Project
141
+ progress reports every active override by skill key so the deliberate posture
142
+ stays visible to reviewers.
143
+
144
+ This mechanism covers configured lifecycle skill gates only. It does not affect
145
+ the optional `oat_phase_review_gate`, HiLL policy, or autonomous design-gate
146
+ behavior, and it cannot disable every gate with one project-wide boolean.
147
+
71
148
  ### Implementation exit-gate closeout
72
149
 
73
150
  For `oat-project-implement`, the configured skill gate is a final, resumable
@@ -82,14 +159,22 @@ configured command. The state records:
82
159
 
83
160
  - `pending`, `allowed`, `blocked`, or `stale` status;
84
161
  - a `configured` or `no_gate` resolution;
85
- - `passed`, `warned`, `prompt_approved`, or `no_gate` allowed dispositions;
162
+ - `passed`, `warned`, `prompt_approved`, `project_disabled`, or `no_gate`
163
+ allowed dispositions;
86
164
  - the resolved configuration fingerprint, reviewed HEAD, implementation
87
165
  fingerprint, gate run, envelope, and receive provenance; and
88
166
  - launch and receive reconciliation data needed to resume without duplicating
89
167
  an accepted run or completed receive.
90
168
 
91
- A `null` resolution is explicit success for that closeout generation:
92
- `allowed/no_gate` with `disposition: no_gate`. Configured success becomes
169
+ Only a `not_configured` resolution is explicit success for that closeout
170
+ generation: `allowed/no_gate` with `disposition: no_gate`. A null, missing,
171
+ malformed, or unrecognized resolver result fails closed as unresolved and is
172
+ never treated as no gate. A gate this project disabled
173
+ persists `allowed/configured` with `disposition: project_disabled`, the
174
+ configured command retained as never-executed evidence, null launch and receive
175
+ provenance, and a `project_override` record. `config_fingerprint` covers the
176
+ resolved override state, so re-enabling the gate changes the fingerprint and a
177
+ stored `project_disabled` result is routed as stale instead of reused. Configured success becomes
93
178
  `allowed/passed`; `warn` and an explicit `prompt` continuation persist their
94
179
  own allowed dispositions only for a validated, receive-eligible `blocked`
95
180
  envelope after eligible receive completes durably. Unresolved, malformed,
@@ -525,7 +610,7 @@ oat gate set oat-project-implement \
525
610
  ```
526
611
 
527
612
  Apply the same command shape to `oat-project-plan`,
528
- `oat-project-quick-start`, and `oat-project-import-plan` when those lifecycle
613
+ `oat-project-quick-start`, `oat-project-lite`, and `oat-project-import-plan` when those lifecycle
529
614
  skills have configured review gates. Do not add `--target`; explicit targets
530
615
  remain manual/debug or deliberate local/user-specific overrides.
531
616
 
@@ -277,15 +277,37 @@ Use `create-agnostic-skill` or `create-oat-skill` as the starting point; both in
277
277
 
278
278
  ## Gate-aware skills
279
279
 
280
- A skill that supports configured final gates must declare `oat_gateable: true`
280
+ A skill that supports configured final gates should declare `oat_gateable: true`
281
281
  in frontmatter and include a final Gate Execution step in its process contract.
282
- Without both pieces, a configured `workflow.gates.skills.<skill>` entry is a
283
- validation warning rather than an executable contract.
282
+ Without both pieces, a configured `workflow.gates.skills.<skill>` entry raises a
283
+ `Configured gate targets skill without oat_gateable: true` validation warning.
284
+
285
+ The warning does not make the gate inert. `oat_gateable` governs per-project
286
+ override eligibility, not executability: `oat gate resolve` runs the same
287
+ lookup for every skill name, so a configured gate on a non-gate-aware skill
288
+ still resolves as `configured` and still executes if that skill carries a Gate
289
+ Execution step. `oat-project-discover` and `oat-project-design` are the current
290
+ examples. Because no `oat_skill_gate_overrides` key is accepted for a skill
291
+ outside `oat_gateable`, their configured gates apply to every project and can
292
+ never resolve `configured_disabled_by_project`. Prefer declaring
293
+ `oat_gateable: true` for any skill whose gate should be disableable per project.
284
294
 
285
295
  The Gate Execution step should:
286
296
 
287
- 1. Run `oat gate resolve <this-skill> --json`.
288
- 2. Treat `null` as "no gate configured."
297
+ 1. Run `oat gate resolve <this-skill> --project "$PROJECT_PATH" --json`
298
+ (`$PROJECT_PATH` is the resolved project path exported in step 3).
299
+ Project context is required. Without `--project` the command returns the
300
+ legacy raw gate and can never report a project override, so the skill would
301
+ silently run a gate the project deliberately disabled.
302
+ 2. Handle all three `resolution` values explicitly:
303
+ - `configured` - run `effectiveGate` exactly as configured.
304
+ - `configured_disabled_by_project` - the project disabled this configured gate. Do not launch any process; emit `configured but disabled by project override`, including the project path and the `projectOverride` source, and finish the skill. The returned `configuredGate` is evidence only and is never executed.
305
+ - `not_configured` - no gate is configured; finish the skill.
306
+
307
+ A null, missing, malformed, or unrecognized result is an operational failure
308
+ that fails closed as unresolved. Never treat it as "no gate configured." See
309
+ [Per-project gate overrides](../cli-utilities/workflow-gates.md#per-project-gate-overrides).
310
+
289
311
  3. Export the resolved path with `export PROJECT_PATH` before launching the
290
312
  command shell.
291
313
  4. For `oat gate review`, require the configured command to use
@@ -88,6 +88,29 @@ Key behavior:
88
88
  `versionSkew` array (`{ scope, producingVersion, invokingVersion }`) in both
89
89
  `--dry-run` and apply envelopes; a scope without skew is omitted from the
90
90
  array.
91
+ - When a run's only effect is that restamp — no planned operations and no
92
+ failures, but skew present — apply reports
93
+ `Manifest version refreshed; no content changes required.` instead of
94
+ `No changes required.`, so a manifest write is never described as a no-op.
95
+
96
+ `oat sync` is not the only command that replaces a manifest's producer version.
97
+ `oat init`, `oat remove skill`, and `oat status` each capture the manifest's
98
+ pre-mutation `oatVersion` while loading and planning, compare it with the
99
+ invoking CLI version, and log the same advisory immediately before a qualifying
100
+ save when the two differ:
101
+
102
+ ```text
103
+ Manifest version restamp [init user]: manifest produced by oat "0.2.58" will be restamped to oat "0.2.59".
104
+ ```
105
+
106
+ The advisory sits immediately before the save, so a run that aborts earlier
107
+ never announces a restamp it did not perform; a save that fails after the
108
+ advisory still leaves the manifest unrestamped. An equal or absent version stays
109
+ quiet. JSON mode suppresses the human warning; `oat init` and `oat remove skill`
110
+ report the applied restamps under a top-level `manifestVersionRestamps` array of
111
+ `{ scope, producingVersion, invokingVersion }` entries. The `oat remove skill`
112
+ dry-run payload omits the field rather than naming a restamp no save will
113
+ perform.
91
114
 
92
115
  Preview project and user cleanup before applying it:
93
116
 
@@ -56,8 +56,14 @@ The first practical expansion path is to keep improving the existing owners: [Do
56
56
 
57
57
  Notable commands introduced in the current CLI surface:
58
58
 
59
- - `oat project new <slug> --scope shared|local|synced [--force]` - create a
60
- project in an explicit scope. Without `--scope`, creation uses
59
+ - `oat project new <slug> [--mode spec-driven|quick|import|lite] --scope shared|local|synced [--force]` - create a
60
+ project in an explicit scope. `--mode` selects the workflow mode and therefore
61
+ which artifacts are scaffolded; it defaults to `spec-driven`. Use `quick` for a
62
+ bounded feature with clear requirements, `import` to normalize an externally
63
+ authored plan, and `lite` for a single-sitting change that scaffolds only
64
+ `plan.md`, `state.md`, and `implementation.md`. See
65
+ [Lifecycle](../workflows/projects/lifecycle.md) for the per-lane flow. Without
66
+ `--scope`, creation uses
61
67
  `projects.defaultScope`, which defaults to `synced`. Project slugs are
62
68
  unique across all scopes by default, including recorded or remotely
63
69
  published synced projects. `--force` deliberately permits a duplicate; use
@@ -133,13 +139,14 @@ Notable commands introduced in the current CLI surface:
133
139
  - `oat project status --field <path>` - print one arbitrary dot-path field from the same status payload, e.g. `project.workflowMode` or `project.timestamps.stateUpdated`. Missing/null fields print `null`; object and array fields print compact JSON.
134
140
  - `oat project status --project-path <path>` - read from a repo-relative or absolute project path instead of `.oat/config.local.json`'s active project pointer. Combine it with `--field` or `--shell` when a skill has already resolved the target project path.
135
141
  - `oat project status --shell NAME=path ...` - print shell-safe assignments for one or more fields from one status read, e.g. `WORKFLOW_MODE='quick'`. This is the preferred multi-field read API for skills. See [Writing Skills → Reading project state](../contributing/skills.md#reading-project-state) for examples and the `npx`-backed `oat` shim contract.
142
+ - `oat project promote <project-path> --to quick [--json]` - promote an authored lite project to quick mode. The command derives `discovery.md` from the lite plan's Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria; carries Product Behavior into Success Criteria and Technical Design into a carried-forward discovery section when those adaptive sections are present; preserves the original as `references/lite-plan.md`; and scaffolds a fresh quick `plan.md`. It refuses unsupported targets, non-lite or unreadable projects, an existing lite-plan reference, invalid authored sections, unresolved scope, unavailable templates, failed writes, or failed persistence. JSON output is `{ status: "promoted" | "refused", reason, files }`; `reason` is the stable categorical contract and refused results exit non-zero.
136
143
  - `oat review latest --json` - find the newest review artifact by `oat_generated_at`, scanning the active or specified project's `reviews/` and `reviews/archived/` directories plus ad-hoc review locations. Same-time candidates use target priority, then lifecycle recency (`final` > higher phase/task > lower phase/task). The JSON contract returns `path`, `scope`, `generatedAt`, `kind` (`project` or `adhoc`), `archived`, and `actionable`, with `null` values when no review exists. Archived project reviews remain discoverable as history but return `actionable: false`.
137
144
  - `oat project list --json` - summary state for tracked projects under the configured projects root
138
145
  - `oat project complete-state <project-path>` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout
139
146
  - `oat project archive [project-path] [--project-recap-run <project-relative-path>] [--no-commit]` - archive a tracked project through the same local move, summary export, and configured S3 upload path used by completion. When omitted, the project path falls back to the active project. The optional recap path must identify a `project-recap` run inside the project's `explainers/` directory. Archive stages the selected complete package into `.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>/`, verifies every manifest-declared immutable file byte, then atomically installs the export before deleting the active project. Existing destinations, incomplete legacy hash coverage, stale bytes, path escapes, and recipe mismatches fail without removing the active project. For synced projects, a configured S3 upload must succeed before terminal cleanup. Successful closeout makes `refs/oat/completed/<project>` authoritative, deletes the tracked JSON record and nested checkout, and leaves archive metadata sufficient for an idempotent recordless retry. Legacy complete records receive a cleanup diagnosis rather than pull/open guidance. With `--json`, the terminal receipt reports `completedRef`, `verifiedSourceSha`, whether `activeAliasDisposition` was `retained` or `removed`, whether `recordRetired` completed, and the parent `lifecycleCommit`. `--no-commit` is a manual/library-only option: for a synced project it still removes the checkout but deliberately leaves `lifecycleCommit` null. Never pass it through `oat-project-complete`, which requires that receipt.
140
147
  - `oat repo archive sync [project-name]` - hydrate archived project snapshots from the configured repo-scoped S3 archive into `.oat/projects/archived/`. The old `oat project archive sync` path remains as a deprecated shim.
141
148
  - `oat project dispatch record --event-file <json-file-or-dash> [--project <project-path>]` - validate one generic dispatch record plus its namespaced OAT evidence event, and persist it into the project's append-only `dispatch/` journal. Omit `--project` to validate without persisting. Revision 1 is `dispatch/<request-id>.json` and every later revision is `dispatch/<request-id>@<NNNN>.json`; superseded revisions are never replaced or removed. The command validates and records evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never persisted, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/projects/evidence-layers.md).
142
- - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
149
+ - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. Lite plans must contain exactly one phase, declare no parallel groups, and give every Validation Criteria bullet either a backticked command or a `manual:` instruction. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
143
150
  - `oat project log append|check|synthesize|rollup` - manage the optional append-only project observation log: append validated judgment or structural entries, inspect grammar and synthesis status, complete end-of-run synthesis, and roll observations into `summary.md` plus the configured repository ledger. See [Project Log](../cli-utilities/project-log.md).
144
151
  - `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
145
152
  - `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
@@ -305,6 +305,7 @@ Not all workflow modes require every artifact:
305
305
  - `spec-driven`: discovery + spec + design + plan + implementation
306
306
  - `quick`: discovery + plan + implementation (spec/design optional)
307
307
  - `import`: imported plan + implementation (spec/design optional)
308
+ - `lite`: single-phase plan + implementation (summary/documentation optional at closeout)
308
309
 
309
310
  ## `.oat/repo/` structure
310
311
 
@@ -37,4 +37,4 @@ If the thought is still pre-shape — you don't know whether it should land as a
37
37
 
38
38
  ## Promotion Path
39
39
 
40
- When an idea becomes concrete, summarize it and then start a tracked OAT project in quick or spec-driven mode depending on design risk.
40
+ When an idea becomes concrete, summarize it and then start a tracked OAT project in lite, quick, or spec-driven mode depending on scope and design risk. Lite suits a single-sitting change and seeds `plan.md` directly; quick and spec-driven seed `discovery.md` instead.
@@ -44,6 +44,7 @@ Stay with direct CLI usage when:
44
44
  ## Workflow Modes In Practice
45
45
 
46
46
  - CLI only: direct commands, no tracked project artifacts
47
+ - Lite mode: a batched interview and one approval produce a single-phase `plan.md` for a single-sitting change
47
48
  - Quick mode: tracked work with a lighter upfront planning path
48
49
  - Spec-driven mode: explicit discovery, requirements, design, and plan artifacts
49
50
  - Import mode: an externally-authored plan imported into OAT for tracked execution
@@ -50,9 +50,30 @@ archive metadata own terminal reachability and retry identity.
50
50
 
51
51
  Mode-sensitive notes:
52
52
 
53
- - `state.md` includes workflow mode metadata (`spec-driven`, `quick`, `import`) for routing.
54
- - `spec.md` and `design.md` are required in spec-driven mode, optional in quick/import mode. Quick mode offers a lightweight `design.md` (architecture, components, testing strategy) at a post-discovery decision point.
55
- - `plan.md` remains canonical execution artifact across all modes.
53
+ - `state.md` includes workflow mode metadata (`spec-driven`, `quick`, `import`, `lite`) for routing.
54
+ - `plan.md` remains the canonical execution artifact across all modes.
55
+
56
+ | Mode | Core authored artifacts | Optional artifacts |
57
+ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
58
+ | `spec-driven` | `discovery.md`, `spec.md`, `design.md`, `plan.md` | - |
59
+ | `quick` | `discovery.md`, `plan.md` | Lightweight `design.md`, `spec.md` |
60
+ | `import` | `references/imported-plan.md`, `plan.md` | `spec.md`, `design.md` |
61
+ | `lite` | Single-phase `plan.md` with Summary, Decisions, Assumptions, Out of Scope, Validation Criteria, and an explicit adaptive content shape | `summary.md` and documentation at closeout |
62
+
63
+ Every Lite plan keeps Summary, Decisions, Assumptions, Out of Scope, and
64
+ Validation Criteria. User-visible changes add numbered, testable Product
65
+ Behavior. Changes that cross module boundaries, alter data or state formats,
66
+ or change a contract consumed by another surface add Technical Design. That
67
+ section covers current operation, proposed changes, and data flow when data or
68
+ state crosses a boundary. The Decisions section records the selected shape and
69
+ why it fits.
70
+
71
+ Each Lite task also records an implementation and proof strategy: the risk it
72
+ covers, why the evidence is proportionate, and the exact command or manual
73
+ proof. Strategies may be test-first, characterization-first,
74
+ implementation-then-regression, static/build, or manual/visual. Static or build
75
+ checks alone fit only changes that cannot affect runtime behavior; every
76
+ behavioral change needs evidence that fails without the change.
56
77
 
57
78
  ## Supporting artifacts
58
79
 
@@ -136,8 +136,11 @@ At final closeout, autonomy follows the same authoritative order as an
136
136
  interactive run: final verification, mandatory final lifecycle review,
137
137
  configured implementation exit gate, pre-approval sequence, final HiLL
138
138
  approval, post-approval sequence, then implementation completion and success
139
- output. A null gate resolution persists an explicit no-gate allowance before
140
- the sequence starts.
139
+ output. A `not_configured` resolution persists an explicit no-gate allowance
140
+ before the sequence starts; a null, missing, or unrecognized resolver result
141
+ fails closed as unresolved. A gate this project disabled persists an
142
+ `allowed/configured` result with `disposition: project_disabled` and never
143
+ launches the configured command.
141
144
 
142
145
  Autonomy does not turn an ordinary independent review into configured-gate
143
146
  provenance. A configured review must produce a gate-originated artifact with
@@ -438,7 +438,8 @@ write authority. See
438
438
  ## Dispatch Report V1 and Producer Provenance
439
439
 
440
440
  Resolver calls that pass `--report-scope` and `--report-action` include a
441
- `dispatchReport` object in JSON output. Consumers must require
441
+ `dispatchReport` object in JSON output, plus the additive `dispatchStamp`
442
+ string described below. Consumers must require
442
443
  `dispatchReport.schemaVersion: 1` before dispatch. The report keeps these
443
444
  concerns separate:
444
445
 
@@ -485,18 +486,53 @@ also retain a parseable compatibility stamp for later review gates:
485
486
  Dispatch: scope=p06-t03 action=implementation role=implementer producer=gpt-5.6-sol provenance=declared model_axis=selected:gpt-5.6-sol effort_axis=selected:high dispatch_policy=high dispatch_ceiling=high target=oat-phase-implementer-gpt-5-6-sol-high
486
487
  ```
487
488
 
488
- The stamp must be derived through `toDispatchStampRecord(dispatchReport)` and
489
- `formatDispatchStamp`; callers must not reconstruct it from policy labels, role
490
- names, candidate strings, or target names. `producer` is the runtime model slug
491
- when OAT can establish it; otherwise it is `unknown`. `provenance` is
492
- `declared`, `observed`, `inferred`, or `unknown`. Selected model and effort axes
493
- can remain exact even when runtime producer identity is not reported.
489
+ `producer` is the runtime model slug when OAT can establish it; otherwise it is
490
+ `unknown`. `provenance` is `declared`, `observed`, `inferred`, or `unknown`.
491
+ Selected model and effort axes can remain exact even when runtime producer
492
+ identity is not reported.
494
493
 
495
494
  Before launching an implementation, fix, or reviewer, surface the structured
496
495
  notices in `dispatchReport.notices` and render the report. Structured notices
497
496
  and runtime disclosure use the effective target returned by that resolver call,
498
497
  never a target inferred from the bundled recommendation version.
499
498
 
499
+ ### The additive `dispatchStamp` field
500
+
501
+ JSON responses that carry `dispatchReport` also carry `dispatchStamp`, a single
502
+ canonical string produced by the same formatter that owns the grammar above:
503
+
504
+ ```json
505
+ {
506
+ "status": "resolved",
507
+ "dispatchReport": { "schemaVersion": 1 },
508
+ "dispatchStamp": "Dispatch: scope=p06-t03 action=implementation role=implementer ..."
509
+ }
510
+ ```
511
+
512
+ Field eligibility matches report eligibility exactly. The field is present when
513
+ and only when `dispatchReport` is present, so non-report resolver calls and
514
+ error envelopes never carry it. `DispatchReportV1`, its schema version, and the
515
+ stamp grammar are unchanged; the field is purely additive.
516
+
517
+ Eligibility tracks report presence, not dispatch authorization or exit code. A
518
+ `status: blocked` response that was asked for report context therefore carries
519
+ both `dispatchReport` and `dispatchStamp` while still exiting `1`: the stamp
520
+ records what OAT resolved, and a blocked resolution is a resolved fact about an
521
+ unusable route rather than a missing report. Only a call without report context,
522
+ or an error envelope that never built a report, omits the field.
523
+
524
+ Consumers read `dispatchStamp` directly, validate that it is a non-empty string
525
+ beginning with the canonical `Dispatch:` prefix, and copy it byte-for-byte into
526
+ dispatch and audit metadata. Reformatting the report through
527
+ `toDispatchStampRecord(dispatchReport)` and `formatDispatchStamp` is an optional
528
+ corroboration where that library is already loaded; it is never the normal path,
529
+ and no out-of-tree shim is required. Callers must not reconstruct the stamp from
530
+ policy labels, role names, candidate strings, or target names.
531
+
532
+ A stamp carrying `producer=unknown provenance=unknown` is truthful, not
533
+ degraded: the resolver reports configured invocation, and those fields stay
534
+ `unknown` until an independent runtime observation exists.
535
+
500
536
  ## Legacy Compatibility
501
537
 
502
538
  The following remain readable during migration: