@open-agent-toolkit/cli 0.2.73 → 0.2.75

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 (149) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +3 -56
  3. package/assets/docs/cli-utilities/tool-packs.md +4 -4
  4. package/assets/docs/contributing/code.md +2 -2
  5. package/assets/docs/contributing/index.md +0 -1
  6. package/assets/docs/reference/cli-reference.md +1 -1
  7. package/assets/docs/reference/troubleshooting.md +17 -40
  8. package/assets/docs/workflows/projects/artifacts.md +16 -34
  9. package/assets/docs/workflows/projects/lifecycle.md +20 -19
  10. package/assets/docs/workflows/skills/explainer-kit.md +180 -440
  11. package/assets/docs/workflows/skills/index.md +1 -2
  12. package/assets/public-package-versions.json +4 -4
  13. package/assets/skills/explainer-kit/SKILL.md +96 -171
  14. package/assets/skills/explainer-kit/recipes/engineer-tour.json +1 -22
  15. package/assets/skills/explainer-kit/recipes/program-recap.json +1 -29
  16. package/assets/skills/explainer-kit/recipes/project-explainer.json +1 -22
  17. package/assets/skills/explainer-kit/recipes/project-recap.v2.json +1 -43
  18. package/assets/skills/explainer-kit/references/fact-base-contract.md +76 -101
  19. package/assets/skills/explainer-kit/references/recap-authoring.md +99 -0
  20. package/assets/skills/explainer-kit/schemas/manifest.schema.json +13 -135
  21. package/assets/skills/explainer-kit/scripts/bundle.mjs +712 -0
  22. package/assets/skills/explainer-kit/scripts/lib/claim-subject.mjs +40 -0
  23. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +113 -1504
  24. package/assets/skills/explainer-kit/scripts/lib/failure.mjs +13 -0
  25. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +57 -403
  26. package/assets/skills/explainer-kit/scripts/lib/qa-result.mjs +168 -0
  27. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +90 -488
  28. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +28 -545
  29. package/assets/skills/explainer-kit/scripts/lib/run-package.mjs +120 -0
  30. package/assets/skills/explainer-kit/scripts/lib/sanitize.mjs +42 -0
  31. package/assets/skills/explainer-kit/scripts/record.mjs +335 -0
  32. package/assets/skills/explainer-kit/scripts/verify.mjs +648 -0
  33. package/assets/skills/oat-explainer-kit/SKILL.md +57 -117
  34. package/assets/skills/oat-explainer-kit/references/config-contract.md +20 -64
  35. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +85 -237
  36. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +18 -10
  37. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +1 -0
  38. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +256 -21
  39. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +82 -3
  40. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +0 -162
  41. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +57 -123
  42. package/assets/skills/oat-project-autonomous/SKILL.md +14 -13
  43. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +165 -165
  44. package/assets/skills/oat-project-complete/SKILL.md +168 -349
  45. package/assets/skills/oat-project-complete/scripts/consume-persisted-recap-intent.mjs +125 -0
  46. package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +0 -30
  47. package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +4 -37
  48. package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +17 -16
  49. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +9 -174
  50. package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +1 -2
  51. package/assets/skills/oat-project-document/SKILL.md +1 -1
  52. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +165 -165
  53. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  54. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +44 -56
  55. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +165 -165
  56. package/assets/skills/oat-project-lite/SKILL.md +1 -1
  57. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +165 -165
  58. package/assets/skills/oat-project-plan/SKILL.md +5 -6
  59. package/assets/skills/oat-project-pr-final/SKILL.md +1 -1
  60. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +165 -165
  61. package/assets/skills/oat-project-quick-start/SKILL.md +1 -1
  62. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +165 -165
  63. package/assets/skills/oat-project-summary/SKILL.md +35 -25
  64. package/assets/skills/oat-wave-execute/SKILL.md +11 -36
  65. package/assets/skills/oat-wave-program/SKILL.md +13 -37
  66. package/dist/commands/config/index.d.ts.map +1 -1
  67. package/dist/commands/config/index.js +9 -113
  68. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  69. package/dist/commands/project/archive/archive-utils.js +32 -184
  70. package/dist/commands/project/archive/explainer-package-coverage.d.ts +3 -8
  71. package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -1
  72. package/dist/commands/project/archive/explainer-package-coverage.js +1 -1
  73. package/dist/config/oat-config.d.ts +0 -11
  74. package/dist/config/oat-config.d.ts.map +1 -1
  75. package/dist/config/oat-config.js +0 -34
  76. package/dist/config/resolve.d.ts.map +1 -1
  77. package/dist/config/resolve.js +0 -8
  78. package/dist/release/public-package-contract.d.ts.map +1 -1
  79. package/dist/release/public-package-contract.js +2 -10
  80. package/dist/validation/project-state.d.ts.map +1 -1
  81. package/dist/validation/project-state.js +42 -3
  82. package/package.json +2 -2
  83. package/assets/docs/contributing/explainer-kit-verification.md +0 -133
  84. package/assets/docs/workflows/skills/explainer-kit-providers.md +0 -155
  85. package/assets/skills/explainer-kit/briefs/deep-dive.md +0 -35
  86. package/assets/skills/explainer-kit/briefs/project-page.md +0 -38
  87. package/assets/skills/explainer-kit/briefs/supporting-diagram.md +0 -28
  88. package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +0 -35
  89. package/assets/skills/explainer-kit/examples/project-explainer/content.md +0 -31
  90. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +0 -22
  91. package/assets/skills/explainer-kit/examples/project-recap/content.md +0 -77
  92. package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +0 -104
  93. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +0 -44
  94. package/assets/skills/explainer-kit/examples/theme-bundle.json +0 -87
  95. package/assets/skills/explainer-kit/recipes/project-recap.v1.json +0 -93
  96. package/assets/skills/explainer-kit/references/contracts.md +0 -324
  97. package/assets/skills/explainer-kit/references/destination-contract.md +0 -210
  98. package/assets/skills/explainer-kit/references/extension-contract.md +0 -80
  99. package/assets/skills/explainer-kit/references/golden-conformance.md +0 -80
  100. package/assets/skills/explainer-kit/references/visual-review.md +0 -71
  101. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +0 -212
  102. package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +0 -241
  103. package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +0 -52
  104. package/assets/skills/explainer-kit/schemas/build-record.schema.json +0 -98
  105. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +0 -53
  106. package/assets/skills/explainer-kit/schemas/publish-receipt.v1.schema.json +0 -97
  107. package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +0 -215
  108. package/assets/skills/explainer-kit/schemas/publish-request.v1.schema.json +0 -32
  109. package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +0 -34
  110. package/assets/skills/explainer-kit/schemas/run-request.schema.json +0 -147
  111. package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +0 -149
  112. package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +0 -81
  113. package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +0 -66
  114. package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +0 -117
  115. package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +0 -80
  116. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +0 -349
  117. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +0 -418
  118. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +0 -514
  119. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +0 -643
  120. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +0 -664
  121. package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +0 -538
  122. package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +0 -414
  123. package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +0 -54
  124. package/assets/skills/explainer-kit/scripts/lib/records.mjs +0 -954
  125. package/assets/skills/explainer-kit/scripts/lib/render.mjs +0 -703
  126. package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +0 -353
  127. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +0 -759
  128. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +0 -209
  129. package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +0 -218
  130. package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +0 -157
  131. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +0 -400
  132. package/assets/skills/explainer-kit/scripts/publish.mjs +0 -76
  133. package/assets/skills/explainer-kit/scripts/record-durability.mjs +0 -64
  134. package/assets/skills/explainer-kit/scripts/render-qa.mjs +0 -461
  135. package/assets/skills/explainer-kit/scripts/run.mjs +0 -3038
  136. package/assets/skills/explainer-kit/scripts/validate.mjs +0 -59
  137. package/assets/skills/oat-explainer-kit/references/author-callback.md +0 -53
  138. package/assets/skills/oat-explainer-kit/references/migration.md +0 -144
  139. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +0 -83
  140. package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +0 -91
  141. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +0 -531
  142. package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +0 -371
  143. package/assets/skills/oat-explainer-kit/scripts/run.mjs +0 -905
  144. package/dist/commands/project/archive/explainer-source-backlinks.d.ts +0 -18
  145. package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +0 -1
  146. package/dist/commands/project/archive/explainer-source-backlinks.js +0 -27
  147. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +0 -29
  148. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +0 -1
  149. package/dist/commands/project/archive/explainer-terminal-evidence.js +0 -37
@@ -1,7 +1,7 @@
1
1
  # Lifecycle intent contract
2
2
 
3
- The OAT adapter resolves `projectExplainer` and `projectRecap` intent without
4
- reading or mutating project files. Lifecycle callers pass explicit inputs to
3
+ The OAT adapter resolves `projectExplainer` and `projectRecap` intent before it
4
+ prepares a bundle. Lifecycle callers pass explicit inputs to
5
5
  `resolveIntent(...)` and persist only the returned `record`, when present.
6
6
 
7
7
  ## Resolution
@@ -19,40 +19,20 @@ now })` is pure. Its result contains the effective `decision`, the
19
19
  warnings.
20
20
 
21
21
  In autonomous mode, `projectRecap` resolves to `generate` with source
22
- `autonomous_policy` on any host whose recap seams resolve. A lower-precedence
23
- skip or `never` preference is overridden and reported as a warning. Autonomous
24
- `projectExplainer` resolves to `generate` only when the kickoff prompt
25
- explicitly requested it; otherwise it resolves to `skip` without writing an
26
- invalid prompt-source skip record.
22
+ `autonomous_policy`. Autonomous `projectExplainer` resolves to `generate` only
23
+ when the kickoff prompt explicitly requested it; otherwise it resolves to
24
+ `skip` without writing an invalid prompt-source record.
27
25
 
28
- Autonomous `projectRecap` resolution accepts an optional `seamProbe`, the
29
- result of `scripts/probe-recap-seams.mjs#probeRecapSeams`. It is a pre-flight
30
- capability input, never a post-hoc reaction to a failed run:
31
-
32
- - `ok: true` leaves resolution unchanged, so a configured host still forces
33
- `generate / autonomous_policy`.
34
- - `seams-unavailable` — no callback and no module path is supplied for a seam
35
- this mode requires — resolves `skip` with source `capability_probe` and a
36
- warning naming the unavailable seams.
37
- - `seams-invalid` — a seam is supplied but violates a resolution rule — throws
38
- `E_RECAP_SEAMS_INVALID` and fails closed exactly as the runtime would. A
39
- configured-but-invalid seam is a configuration error, never a capability
40
- skip.
41
-
42
- A seam probe is scoped to autonomous `projectRecap`; supplying one for
43
- `projectExplainer` or for interactive resolution is an error. A recap that
44
- fails after a passing probe stays `failed` and is never reinterpreted as a
45
- skip.
46
-
47
- In interactive mode, an existing valid project record prevents another prompt.
26
+ In interactive mode, a valid project record prevents another prompt.
48
27
  Preferences `always` and `never` resolve directly but are not copied into
49
- project state: doing so would freeze a workflow preference snapshot.
50
- An unresolved `ask` prompts once. Either answer produces an `interactive`
51
- record, so a decision made at any lifecycle gate can be persisted and reused.
28
+ project state. An unresolved `ask` prompts once. Either answer produces an
29
+ `interactive` record that later lifecycle gates reuse.
52
30
 
53
31
  ## State records
54
32
 
55
- Records use the Phase 1 state contract:
33
+ Records normally retain the three-field state contract. The sole extension is
34
+ `projectRecap` `skip/failed_attempt`, which requires one project-relative
35
+ `failed_attempt_evidence` locator:
56
36
 
57
37
  ```yaml
58
38
  oat_project_explainer:
@@ -60,29 +40,34 @@ oat_project_explainer:
60
40
  source: kickoff_prompt
61
41
  decided_at: '2026-07-18T02:30:00Z'
62
42
  oat_project_recap:
63
- decision: generate
64
- source: autonomous_policy
43
+ decision: skip
44
+ source: failed_attempt
65
45
  decided_at: '2026-07-18T02:30:00Z'
46
+ failed_attempt_evidence: explainers/failed-run/failure.json
66
47
  ```
67
48
 
68
49
  Allowed decision/source pairs are:
69
50
 
70
- | Product | Allowed pairs |
71
- | ------------------ | ------------------------------------------------------------------------------------------------- |
72
- | `projectExplainer` | `generate/interactive`, `skip/interactive`, `generate/kickoff_prompt` |
73
- | `projectRecap` | `generate/interactive`, `skip/interactive`, `generate/autonomous_policy`, `skip/capability_probe` |
74
-
75
- In particular, `skip/autonomous_policy` is invalid: an autonomous skip is
76
- recordable only as the probe-driven `skip/capability_probe`, and that pair is
77
- product-scoped to `projectRecap`. `generate/capability_probe` is invalid too,
78
- because a probe can only withhold a run, never authorize one.
79
-
80
- The pair is product-scoped but not mode-scoped, and that is deliberate. Only
81
- autonomous resolution can _produce_ a `skip/capability_probe`, but once one is
82
- persisted a later interactive resolution reads it back as a valid recorded
83
- decision and honors it, exactly as it honors `skip/interactive`. A resumed
84
- project therefore neither re-prompts nor fails validation on a legitimately
85
- recorded capability skip.
51
+ | Product | Allowed pairs |
52
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------------ |
53
+ | `projectExplainer` | `generate/interactive`, `skip/interactive`, `generate/kickoff_prompt` |
54
+ | `projectRecap` | `generate/interactive`, `skip/interactive`, `generate/autonomous_policy`, `skip/failed_attempt`, `skip/capability_probe` |
55
+
56
+ `skip/capability_probe` is a read-only legacy pair. Readers continue to accept
57
+ an already persisted record, but lifecycle callers must not write a new one.
58
+ After an actual failed generation, persist `skip/failed_attempt` only when the
59
+ terminal guard can read either a failed or incomplete `manifest.json` or the
60
+ flow's `failure.json`. Store that proof only as
61
+ `explainers/<run-slug>/manifest.json` or
62
+ `explainers/<run-slug>/failure.json`; no other decision/source pair may carry
63
+ the field.
64
+
65
+ The pair is product-scoped but not mode-scoped. A resumed completion honors any
66
+ valid persisted skip without prompting, bundling, or authoring again. The
67
+ deployed consumer resolves only an explicitly persisted failed-attempt locator,
68
+ requires its canonical real path to remain inside the declared project run,
69
+ requires a regular file, and validates it through the terminal guard's own
70
+ failed-attempt contract. It never enumerates explainer runs for a skip.
86
71
 
87
72
  ## Safe persistence
88
73
 
@@ -97,191 +82,54 @@ that content hash with the chosen record. Persistence:
97
82
  frontmatter fields and the Markdown body; and
98
83
  - writes a same-directory temporary file and atomically renames it.
99
84
 
100
- On a stale-write conflict, the caller must re-read state, resolve precedence
101
- again, and decide whether a write is still required. It must not retry the old
102
- record blindly.
103
-
104
- ## Author execution
105
-
106
- Every adapter run in both interactive and unattended modes must provide exactly
107
- one provider-neutral author seam. In-process callers pass `author`; JSON-only
108
- and official CLI callers put `authorModulePath` in the adapter context, naming
109
- a module whose `author` export is a function. Missing module files, invalid
110
- exports, and direct-plus-module conflicts fail at the adapter boundary. See
111
- `author-callback.md` for brief, fact-base, shell, theme, result, and expansion
112
- handling.
113
-
114
- The resolved callback is passed only as the `author` option to
115
- `core.runExplainer`. It is never copied into `ExplainerRunRequestV1`,
116
- `run-request.json`, or another retained data contract. Interactive runs use the
117
- same author contract and differ only at the later approval gate.
118
-
119
- ## Repository invocation sources
120
-
121
- A repository invocation must provide `suppliedFactBasePath`. The adapter binds
122
- that validated fact-base input with provenance from the exact reviewed
123
- repository revision returned by `resolveReviewedRepository`; it never resolves
124
- or reads an active project for this invocation. Missing supplied input fails
125
- closed before core invocation with an actionable requirement.
126
-
127
- Repository runs write beneath `.oat/repo/reference/explainers/<run-slug>/` and
128
- use repository-level publish roots unchanged. Project invocations retain their
129
- approved lifecycle-artifact binding and project-local output behavior.
130
-
131
- When publish durability is explicitly selected, the adapter constructs the
132
- core `explainer-kit.publish-request/v2` with the per-invocation derived `s3Uri`,
133
- `publicBaseUrl`, and source-aware `publicAccess`. New adapter runs emit this v2
134
- shape atomically; the request carries no project/repository topology fields and
135
- no credential material. The human-gated publisher returns a complete
136
- `explainer-kit.publish-receipt/v2`, which the core validates against the
137
- finalized manifest and generated catalog before the adapter forwards the
138
- publication summary without destination reinterpretation. The immutable
139
- `publish-request/v1` and `publish-receipt/v1` contracts remain supported only
140
- for replay; v2 does not mutate either v1 contract in place. Configuration never
141
- bypasses the human publication gate.
142
-
143
- The adapter forwards the immutable `explainer-kit.publish-summary/v2` lifecycle
144
- handoff without destination reinterpretation. Every v2 artifact entry retains
145
- its source identity, rendered path, S3 URI, canonical public URL, content hash,
146
- object verification, and public verification evidence. A
147
- `publish-receipt/v1` replay instead yields the reduced immutable
148
- `explainer-kit.publish-summary/v1` shape, whose artifact entries retain only
149
- the relative path and public URL. Neither summary contract is mutated in place.
150
-
151
- ## Browser and visual-review execution
152
-
153
- Lifecycle callers probe seam availability before attempting an unattended
154
- `project-recap`. `scripts/probe-recap-seams.mjs#probeRecapSeams({ mode, ...
155
- seams })` is pure: it applies the same resolution and exclusivity rules this
156
- adapter applies at run time, but never imports a module, calls a callback,
157
- validates a session brand, or touches the filesystem. Unattended runs require
158
- all five seams — author, fact critic, browser session, visual critic, and set
159
- planner — and interactive runs require the author and fact critic. A probe that
160
- checks only four of the five passes on a host with no set planner and the
161
- adapter still throws `E_SET_PLANNER_REQUIRED`, so the planner is probed with
162
- the rest.
163
-
164
- The probe classifies each seam as resolved, `missing`, or `invalid` and never
165
- conflates them. Only `missing` may become a recorded skip. Requirements below
166
- are unchanged for every run that is actually attempted: the probe gates whether
167
- a run is attempted, and never weakens the evidence a run that happens must
168
- produce.
169
-
170
- Every unattended `project-recap` must provide exactly one browser-evidence
171
- session and exactly one whole-set visual critic through the adapter's
172
- first-class boundary. In-process callers pass `browserSession`, created by the
173
- compatible core's `createBrowserProbeSession()`, and `visualCritic`. JSON-only
174
- and official CLI callers pass `browserSessionModulePath` and
175
- `visualCriticModulePath`, naming modules whose matching exports are
176
- `browserSession` and `visualCritic`. Direct-plus-module conflicts, invalid
177
- exports, bare `browserProbe` inputs, and the legacy
178
- `coreOptions.browserProbe`, `coreOptions.browserSession`, or
179
- `coreOptions.visualCritic` routes fail before core invocation.
180
-
181
- The author, fact critic, branded session probe, and visual critic must have
182
- distinct callback identities. The adapter asks the loaded core to validate the
183
- session's private brand and launched-Chromium runtime before passing it to
184
- `core.runExplainer`. Executable callbacks, descriptors, and module paths never
185
- enter the retained run request. Deterministic fixture sessions are rejected for
186
- unattended project recaps. See `visual-review-callback.md` for the session,
187
- request/result, and byte-bound whole-set review contracts.
188
-
189
- The core retains canonical 320, 768, and 1440 viewport screenshots, paired
190
- `explainer-kit.browser-evidence/v2` metrics with launched Chromium name,
191
- version, and capture identity, each review request and closed local evidence
192
- projection, cohesion
193
- observations, and any one-pass revision record. Missing, malformed, forged,
194
- cross-record mismatched, stale, or failed review-chain evidence terminates as
195
- `built-needs-review`; durability and publication remain blocked.
196
- The review chain performs at most one correction and one final review. It never
197
- starts a second rebuild to chase visual perfection.
198
-
199
- ## Tracked-run finalization
200
-
201
- `planTrackedRunFinalization(request, context)` is the shared command planner for
202
- tracked project explainer and recap runs. The request contains `runRoot`,
203
- `manifestPath`, `commitMode`, and optional `relocatedFrom`. Context supplies the
204
- repository root, project name, an explicit compatible `coreRoot`, and, for
205
- `completion-bookkeeping`, the existing full artifact commit SHA. Finalization
206
- dynamically loads the versioned package-coverage contract from that core root;
207
- it does not maintain an adapter-local path list.
208
-
209
- A core `built-needs-review` or `failed` outcome is terminal evidence, not a
210
- non-durable success. Provider review and diagnostic prose exists only during
211
- the in-memory correction attempt. Retained review attempts use the closed
212
- `visual-review-evidence/v1` projection bound to the adjacent request hash and
213
- attempt directory. The core retains `terminal-evidence.json` with run identity,
214
- the manifest hash when available, bounded `stage`/`kind` reason tuples, and the
215
- evidence disposition. The planner verifies that binding and returns complete
216
- without artifact, attestation, evidence-commit, or push commands. This preserves
217
- the handoff without promoting it to durable or publishable success.
218
-
219
- The returned stages must run in order:
220
-
221
- 1. In `dedicated` mode, commit exactly the manifest-declared immutable package
222
- with `docs(oat): persist <recipe> for <project>`. In
223
- `completion-bookkeeping` mode, reuse the caller's existing lifecycle commit.
224
- 2. Replace `$ARTIFACT_COMMIT` with the created full SHA when present, then pass
225
- the planned durability request to the compatible core's
226
- `recordDurability(...)`. The core verifies commit blobs and updates records;
227
- it never invokes Git or creates commits.
228
- 3. Commit only `manifest.json` and `build-record.json` as the evidence update.
229
- 4. Call `verifyTrackedRunFinalization(...)`, then push once so the artifact and
230
- evidence commits travel together.
231
-
232
- Artifact evidence contains retained fact-base, content, theme, and rendered
233
- paths. It always excludes mutable `manifest.json` and `build-record.json`.
234
- Generated Git commands use explicit pathspecs and `commit --only`; callers must
235
- also snapshot unrelated working-tree changes before execution and supply the
236
- before/after lists to the verifier. A mismatch prevents pushing.
237
-
238
- An evidence-verification failure is a successful finalizer termination with
239
- run outcome `built-not-durable`: commit the warning-bearing mutable records and
240
- push them with the artifact commit. It does not block project completion. A
241
- later attempt reuses the same artifact commit, supplies the current HEAD as
242
- `currentHead`, invokes core verification again, and appends a new evidence
243
- commit. If the manifest already contains matching durable commit evidence, the
244
- planner returns `complete` with no commands, making repeat termination
245
- idempotent.
246
-
247
- For archive relocation, `relocatedFrom` identifies the prior active run for
248
- caller reporting. The current run's immutable paths and the export bookkeeping
249
- commit are submitted to the core; core evidence supersession remains the
250
- authoritative relocation record.
251
-
252
- ## Completion-time archive relocation
253
-
254
- Completion consumes the machine-readable `oat project archive --json` report.
255
- When a recap was selected, `projectRecapExport.sourceRunRoot`,
256
- `projectRecapExport.exportRoot`, and
257
- `projectRecapExport.manifest.relativePath` identify the relocation. The caller
258
- must not predict the dated export path or substitute the gitignored local
259
- archive.
260
-
261
- Archive completion is exactly two commits: the lifecycle bookkeeping commit, then the exported recap evidence commit. The bookkeeping commit contains the
262
- tracked export and active-tree deletion and is passed to the finalizer as the
263
- existing artifact commit in `completion-bookkeeping` mode. The finalizer
264
- attests only immutable package paths under the reported export root. The
265
- second commit contains only the updated exported `manifest.json` and
266
- `build-record.json`; one push follows both commits.
267
-
268
- The exported-path evidence supersedes the selected run's prior active-path evidence. Mutable records are never part of their own commit evidence, and no
269
- path under `.oat/projects/archived/` is evidence.
270
-
271
- Failure to verify the exported commit evidence is non-blocking. The tracked
272
- export remains committed, the mutable records retain the warning and
273
- `built-not-durable` outcome, and the evidence-record commit and push still
274
- complete. A later attestation may recover durability without repeating the
275
- archive.
276
-
277
- This recovery path applies only to `built-not-durable`.
278
- `built-needs-review` and `failed` packages may be exported so their compact
279
- terminal evidence survives project deletion, but they cannot be attested into
280
- `built-durable`, pushed by the finalizer, or published. Flagged, failed,
281
- superseded, and `built-not-durable` runs are never publishable. Only a
282
- review-clean `built-durable` run may cross the explicit human publication gate.
283
-
284
- Post-archive summary and PR recap links target `projectRecapExport.exportRoot`
285
- under `.oat/repo/reference/project-recaps/` on the current head branch. The
286
- tracked summary export and the PR body may carry that link; the gitignored
287
- archive never does.
85
+ On a stale-write conflict, re-read state and resolve precedence again. Do not
86
+ retry the old record blindly.
87
+
88
+ ## Generate and consume
89
+
90
+ After a `generate` decision, follow `oat-explainer-kit` § Generate:
91
+
92
+ 1. verify the installed core;
93
+ 2. resolve the approved input set, theme defaults, and output root;
94
+ 3. run `bundle.mjs`;
95
+ 4. let the host agent author `site/index.html` from the recipe brief and
96
+ `references/recap-authoring.md`;
97
+ 5. run `verify.mjs` at the highest available browser rung; and
98
+ 6. run `record.mjs`.
99
+
100
+ Read the terminal outcome from `manifest.json` and the rung and reason from
101
+ `qa/result.json`. The vocabulary is:
102
+
103
+ - `built`: generation is satisfied;
104
+ - `built-needs-review`: generation is satisfied and the artifact needs a
105
+ human look;
106
+ - `failed`: generation is not satisfied; show the sanitized cause and require
107
+ retry or skip; and
108
+ - `incomplete`: generation is not satisfied; require retry or skip.
109
+
110
+ If the flow stops before recording, read `failure.json` instead. A completion
111
+ resume must re-read the persisted intent before inspecting or creating a run.
112
+ A persisted skip suppresses bundle and authoring work and reaches
113
+ `check-terminal-outcome.mjs` with its recorded source as `--skip-reason`.
114
+
115
+ Project-recap lifecycle calls use `mode: unattended` and never prompt during
116
+ generation. Project-explainer failures are reported with the run path and do not
117
+ roll back an approved plan.
118
+
119
+ ## Output roots and archive handoff
120
+
121
+ - Active project runs write below
122
+ `<resolved-project-path>/explainers/<slug>/`.
123
+ - Program runs write below
124
+ `.oat/repo/reference/explainers/<slug>/`.
125
+ - Direct core callers provide an explicit parent output root.
126
+
127
+ At project completion, pass only a selected satisfied `project-recap` run to
128
+ `oat project archive --project-recap-run`. Consume
129
+ `projectRecapExport.sourceRunRoot`, `projectRecapExport.exportRoot`, and
130
+ `projectRecapExport.manifest.relativePath` from the archive JSON response. Do
131
+ not infer the dated export path. The archive export is the durable copy.
132
+
133
+ Project-explainer runs remain active-project working artifacts and are never
134
+ exported as completion reference products. Local-scope projects do not export a
135
+ tracked recap or pass `--project-recap-run`.
@@ -7,8 +7,18 @@ import { promisify } from 'node:util';
7
7
  const execFile = promisify(execFileCallback);
8
8
 
9
9
  const RECIPE_ARTIFACTS = Object.freeze({
10
- 'project-explainer': ['plan', 'design', 'spec'],
11
- 'project-recap': ['plan', 'design', 'spec', 'implementation', 'summary'],
10
+ 'project-explainer': ['plan', 'design', 'spec', 'discovery'],
11
+ 'project-recap': [
12
+ 'summary',
13
+ 'implementation',
14
+ 'project-log',
15
+ 'plan',
16
+ 'discovery',
17
+ 'spec',
18
+ 'design',
19
+ 'orchestration-log',
20
+ ],
21
+ 'program-recap': ['program'],
12
22
  });
13
23
 
14
24
  export async function bindProjectSources({
@@ -86,19 +96,13 @@ export async function bindProjectSources({
86
96
  };
87
97
  }
88
98
 
89
- export async function bindRepositorySources({
90
- repoRoot,
91
- suppliedFactBasePath,
92
- reviewedRepository,
93
- }) {
99
+ export async function bindRepositorySources({ suppliedFactBasePath }) {
94
100
  if (!suppliedFactBasePath) {
95
101
  throw new Error(
96
102
  'Repository invocation requires a caller-supplied fact base path.',
97
103
  );
98
104
  }
99
- const repository =
100
- reviewedRepository ?? (await resolveReviewedRepository(repoRoot));
101
- return bindSuppliedFactBase(suppliedFactBasePath, repository);
105
+ return bindSuppliedFactBase(suppliedFactBasePath, null);
102
106
  }
103
107
 
104
108
  export async function resolveReviewedRepository(
@@ -274,6 +278,7 @@ function githubRepositoryIdentity(remote) {
274
278
  function authoritativeTopics(id) {
275
279
  return {
276
280
  plan: ['phases', 'validation-approach'],
281
+ discovery: ['problem-space', 'constraints'],
277
282
  design: ['planned-architecture', 'decisions', 'risks'],
278
283
  spec: ['original-request', 'requirements'],
279
284
  implementation: [
@@ -282,6 +287,9 @@ function authoritativeTopics(id) {
282
287
  'implementation-record',
283
288
  'validation-evidence',
284
289
  ],
290
+ 'project-log': ['project-history'],
291
+ 'orchestration-log': ['execution-orchestration'],
292
+ program: ['program-map'],
285
293
  summary: ['outcome'],
286
294
  }[id];
287
295
  }
@@ -5,6 +5,7 @@ import { basename, dirname, join, resolve } from 'node:path';
5
5
  export const CORE_INSTALL_COMMAND = 'oat tools install utility --scope user';
6
6
  export const CORE_UPDATE_COMMAND =
7
7
  'oat tools update --pack utility --scope user';
8
+ export const MINIMUM_CORE_VERSION = '3.0.0';
8
9
 
9
10
  export async function checkCoreCompatibility({
10
11
  adapterRoot,