@open-agent-toolkit/cli 0.2.73 → 0.2.74
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.
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +3 -56
- package/assets/docs/cli-utilities/tool-packs.md +4 -4
- package/assets/docs/contributing/code.md +2 -2
- package/assets/docs/contributing/index.md +0 -1
- package/assets/docs/reference/cli-reference.md +1 -1
- package/assets/docs/reference/troubleshooting.md +17 -40
- package/assets/docs/workflows/projects/artifacts.md +16 -34
- package/assets/docs/workflows/projects/lifecycle.md +20 -19
- package/assets/docs/workflows/skills/explainer-kit.md +180 -440
- package/assets/docs/workflows/skills/index.md +1 -2
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +96 -171
- package/assets/skills/explainer-kit/recipes/engineer-tour.json +1 -22
- package/assets/skills/explainer-kit/recipes/program-recap.json +1 -29
- package/assets/skills/explainer-kit/recipes/project-explainer.json +1 -22
- package/assets/skills/explainer-kit/recipes/project-recap.v2.json +1 -43
- package/assets/skills/explainer-kit/references/fact-base-contract.md +76 -101
- package/assets/skills/explainer-kit/references/recap-authoring.md +99 -0
- package/assets/skills/explainer-kit/schemas/manifest.schema.json +13 -135
- package/assets/skills/explainer-kit/scripts/bundle.mjs +712 -0
- package/assets/skills/explainer-kit/scripts/lib/claim-subject.mjs +40 -0
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +113 -1504
- package/assets/skills/explainer-kit/scripts/lib/failure.mjs +13 -0
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +57 -403
- package/assets/skills/explainer-kit/scripts/lib/qa-result.mjs +168 -0
- package/assets/skills/explainer-kit/scripts/lib/qa.mjs +90 -488
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +28 -545
- package/assets/skills/explainer-kit/scripts/lib/run-package.mjs +120 -0
- package/assets/skills/explainer-kit/scripts/lib/sanitize.mjs +42 -0
- package/assets/skills/explainer-kit/scripts/record.mjs +335 -0
- package/assets/skills/explainer-kit/scripts/verify.mjs +648 -0
- package/assets/skills/oat-explainer-kit/SKILL.md +57 -117
- package/assets/skills/oat-explainer-kit/references/config-contract.md +20 -64
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +85 -237
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +18 -10
- package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +1 -0
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +256 -21
- package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +82 -3
- package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +0 -162
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +57 -123
- package/assets/skills/oat-project-autonomous/SKILL.md +14 -13
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +165 -165
- package/assets/skills/oat-project-complete/SKILL.md +168 -349
- package/assets/skills/oat-project-complete/scripts/consume-persisted-recap-intent.mjs +125 -0
- package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +0 -30
- package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +4 -37
- package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +17 -16
- package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +9 -174
- package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +1 -2
- package/assets/skills/oat-project-document/SKILL.md +1 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +44 -56
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-lite/SKILL.md +1 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-plan/SKILL.md +5 -6
- package/assets/skills/oat-project-pr-final/SKILL.md +1 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-quick-start/SKILL.md +1 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-summary/SKILL.md +35 -25
- package/assets/skills/oat-wave-execute/SKILL.md +11 -36
- package/assets/skills/oat-wave-program/SKILL.md +13 -37
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +9 -113
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +32 -184
- package/dist/commands/project/archive/explainer-package-coverage.d.ts +3 -8
- package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -1
- package/dist/commands/project/archive/explainer-package-coverage.js +1 -1
- package/dist/config/oat-config.d.ts +0 -11
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +0 -34
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +0 -8
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +2 -10
- package/dist/validation/project-state.d.ts.map +1 -1
- package/dist/validation/project-state.js +42 -3
- package/package.json +2 -2
- package/assets/docs/contributing/explainer-kit-verification.md +0 -133
- package/assets/docs/workflows/skills/explainer-kit-providers.md +0 -155
- package/assets/skills/explainer-kit/briefs/deep-dive.md +0 -35
- package/assets/skills/explainer-kit/briefs/project-page.md +0 -38
- package/assets/skills/explainer-kit/briefs/supporting-diagram.md +0 -28
- package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +0 -35
- package/assets/skills/explainer-kit/examples/project-explainer/content.md +0 -31
- package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +0 -22
- package/assets/skills/explainer-kit/examples/project-recap/content.md +0 -77
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +0 -104
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +0 -44
- package/assets/skills/explainer-kit/examples/theme-bundle.json +0 -87
- package/assets/skills/explainer-kit/recipes/project-recap.v1.json +0 -93
- package/assets/skills/explainer-kit/references/contracts.md +0 -324
- package/assets/skills/explainer-kit/references/destination-contract.md +0 -210
- package/assets/skills/explainer-kit/references/extension-contract.md +0 -80
- package/assets/skills/explainer-kit/references/golden-conformance.md +0 -80
- package/assets/skills/explainer-kit/references/visual-review.md +0 -71
- package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +0 -212
- package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +0 -241
- package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +0 -52
- package/assets/skills/explainer-kit/schemas/build-record.schema.json +0 -98
- package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +0 -53
- package/assets/skills/explainer-kit/schemas/publish-receipt.v1.schema.json +0 -97
- package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +0 -215
- package/assets/skills/explainer-kit/schemas/publish-request.v1.schema.json +0 -32
- package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +0 -34
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +0 -147
- package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +0 -149
- package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +0 -81
- package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +0 -66
- package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +0 -117
- package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +0 -80
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +0 -349
- package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +0 -418
- package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +0 -514
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +0 -643
- package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +0 -664
- package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +0 -538
- package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +0 -414
- package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +0 -54
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +0 -954
- package/assets/skills/explainer-kit/scripts/lib/render.mjs +0 -703
- package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +0 -353
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +0 -759
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +0 -209
- package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +0 -218
- package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +0 -157
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +0 -400
- package/assets/skills/explainer-kit/scripts/publish.mjs +0 -76
- package/assets/skills/explainer-kit/scripts/record-durability.mjs +0 -64
- package/assets/skills/explainer-kit/scripts/render-qa.mjs +0 -461
- package/assets/skills/explainer-kit/scripts/run.mjs +0 -3038
- package/assets/skills/explainer-kit/scripts/validate.mjs +0 -59
- package/assets/skills/oat-explainer-kit/references/author-callback.md +0 -53
- package/assets/skills/oat-explainer-kit/references/migration.md +0 -144
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +0 -83
- package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +0 -91
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +0 -531
- package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +0 -371
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +0 -905
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts +0 -18
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +0 -1
- package/dist/commands/project/archive/explainer-source-backlinks.js +0 -27
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +0 -29
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +0 -1
- 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
|
|
4
|
-
|
|
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
|
|
23
|
-
|
|
24
|
-
`
|
|
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
|
-
|
|
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
|
|
50
|
-
|
|
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
|
|
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:
|
|
64
|
-
source:
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
`
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`
|
|
116
|
-
`
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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': [
|
|
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
|
-
|
|
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,
|