@open-agent-toolkit/cli 0.2.26 → 0.2.27

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 (64) hide show
  1. package/assets/NOTICES.md +156 -0
  2. package/assets/docs/contributing/explainer-kit-verification.md +125 -0
  3. package/assets/docs/contributing/index.md +1 -0
  4. package/assets/docs/reference/troubleshooting.md +47 -0
  5. package/assets/docs/workflows/projects/artifacts.md +24 -6
  6. package/assets/docs/workflows/skills/explainer-kit-providers.md +144 -0
  7. package/assets/docs/workflows/skills/explainer-kit.md +121 -69
  8. package/assets/docs/workflows/skills/index.md +1 -0
  9. package/assets/public-package-versions.json +4 -4
  10. package/assets/skills/explainer-kit/SKILL.md +18 -3
  11. package/assets/skills/explainer-kit/recipes/project-recap.json +43 -16
  12. package/assets/skills/explainer-kit/references/contracts.md +167 -20
  13. package/assets/skills/explainer-kit/references/golden-conformance.md +80 -0
  14. package/assets/skills/explainer-kit/references/visual-authoring.md +92 -0
  15. package/assets/skills/explainer-kit/references/visual-review.md +57 -0
  16. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +172 -1
  17. package/assets/skills/explainer-kit/schemas/build-record.schema.json +7 -1
  18. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +38 -2
  19. package/assets/skills/explainer-kit/schemas/manifest.schema.json +25 -1
  20. package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -0
  21. package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +149 -0
  22. package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +117 -0
  23. package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +80 -0
  24. package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +148 -4
  25. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +243 -0
  26. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +586 -8
  27. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +285 -8
  28. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +35 -0
  29. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +144 -8
  30. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +379 -0
  31. package/assets/skills/explainer-kit/scripts/lib/png.mjs +287 -0
  32. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +280 -8
  33. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +132 -3
  34. package/assets/skills/explainer-kit/scripts/lib/records.mjs +513 -21
  35. package/assets/skills/explainer-kit/scripts/lib/render.mjs +67 -3
  36. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +43 -1
  37. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +208 -0
  38. package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +218 -0
  39. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +380 -0
  40. package/assets/skills/explainer-kit/scripts/render-qa.mjs +48 -10
  41. package/assets/skills/explainer-kit/scripts/run.mjs +859 -134
  42. package/assets/skills/oat-explainer-kit/SKILL.md +40 -12
  43. package/assets/skills/oat-explainer-kit/references/author-callback.md +12 -10
  44. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +40 -2
  45. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +72 -0
  46. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +167 -5
  47. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +92 -5
  48. package/assets/skills/oat-explainer-kit/scripts/run.mjs +324 -2
  49. package/dist/commands/project/archive/archive-utils.d.ts +1 -0
  50. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  51. package/dist/commands/project/archive/archive-utils.js +109 -42
  52. package/dist/commands/project/archive/explainer-package-coverage.d.ts +14 -0
  53. package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -0
  54. package/dist/commands/project/archive/explainer-package-coverage.js +27 -0
  55. package/dist/commands/project/archive/explainer-source-backlinks.d.ts +18 -0
  56. package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +1 -0
  57. package/dist/commands/project/archive/explainer-source-backlinks.js +27 -0
  58. package/dist/commands/project/archive/push-runner.d.ts +2 -1
  59. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  60. package/dist/commands/project/archive/push-runner.js +5 -1
  61. package/dist/release/public-package-contract.d.ts +6 -0
  62. package/dist/release/public-package-contract.d.ts.map +1 -1
  63. package/dist/release/public-package-contract.js +75 -0
  64. package/package.json +2 -2
@@ -25,16 +25,16 @@ schema. Each recipe's own `version` selector remains `"1"`, so `{id, version}`
25
25
  callers and manifest cross-checks are unaffected by the schema move.
26
26
 
27
27
  A v2 recipe declares a **floor** — the artifacts every run must produce — plus
28
- a licensed **expansion** set, instead of one exact artifact list. The floor is
29
- identical to the artifact set each recipe produced before, so no published URL
30
- changes:
28
+ a licensed **expansion** set. Most recipes retain one floor artifact.
29
+ Unattended `project-recap` is the exception: it plans and composes an adaptive
30
+ minimum set before any artifact author runs.
31
31
 
32
- | Recipe | Use | Floor artifact | Required narrative |
33
- | ------------------- | ------------------------------------------------------ | ----------------------------- | --------------------------------------------------------------------------------------------------------------------- |
34
- | `project-explainer` | Working explanation after project planning | one Markdown `hub` | planned architecture, decisions, risks, phases, and validation approach |
35
- | `project-recap` | Final record after implementation and final review | one Markdown `hub` | original request, key agent decisions, as-built architecture, implementation record, validation evidence, and outcome |
36
- | `program-recap` | Bird's-eye record of a multi-wave delivery program | one Markdown `hub` | program overview, wave map and outcomes, convention evolution, aggregate numbers, and follow-up ledger |
37
- | `engineer-tour` | Engineer-facing orientation to a codebase and its flow | one HTML-composed `explainer` | orientation, architecture, execution flow, key code, and validation |
32
+ | Recipe | Use | Required floor |
33
+ | ------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
34
+ | `project-explainer` | Working explanation after project planning | one Markdown `hub` covering architecture, decisions, risks, phases, and validation |
35
+ | `project-recap` | Final record after implementation and final review | HTML visual hub, architecture/system diagram, and deck governed by one set plan |
36
+ | `program-recap` | Bird's-eye record of a multi-wave delivery program | one Markdown `hub` covering the wave map, outcomes, convention evolution, aggregate numbers, and follow-up ledger |
37
+ | `engineer-tour` | Engineer-facing orientation to a codebase and its flow | one HTML-composed `explainer` covering orientation, architecture, execution flow, key code, and validation |
38
38
 
39
39
  The OAT project lifecycle owns `project-explainer` and `project-recap`. Both
40
40
  bind one project source set. The adapter binds `plan.md`, `design.md`, and
@@ -43,6 +43,18 @@ bind one project source set. The adapter binds `plan.md`, `design.md`, and
43
43
  set for `program-recap`; direct core callers can use `engineer-tour` without
44
44
  adding an OAT dependency.
45
45
 
46
+ ### Project recap modes
47
+
48
+ Project recaps default to `recapMode: artistic`. This mode uses the shared set
49
+ plan and provider-neutral author seam to compose the required HTML hub,
50
+ architecture view, and deck.
51
+
52
+ `recapMode: deterministic-markdown` is an explicit fallback for callers that
53
+ need deterministic output. It preserves the same planned artifact portfolio and
54
+ cardinality rather than collapsing the recap to one file. The runtime never
55
+ switches modes after an artistic author failure: changing modes requires a new
56
+ request, and a failed artistic run remains failed.
57
+
46
58
  ### Expansion profiles
47
59
 
48
60
  Each recipe declares the expansion it licenses as a list of profiles. A profile
@@ -51,18 +63,17 @@ artifact `type`, authoring path, brief, optional shell, and a mandatory
51
63
  `maxCount`. Every recipe also carries a mandatory `expansion.limits.maxArtifacts`
52
64
  that caps the whole expansion set; floor artifacts do not count against it.
53
65
 
54
- | Recipe | Profiles (max per profile) | `maxArtifacts` |
55
- | ------------------- | ----------------------------------------------------------- | -------------- |
56
- | `project-recap` | `supporting-diagram` 4, `deep-dive` 3, `walkthrough-deck` 1 | 6 |
57
- | `program-recap` | `supporting-diagram` 3, `project-page` 12 | 12 |
58
- | `project-explainer` | `supporting-diagram` 4 | 4 |
59
- | `engineer-tour` | `supporting-diagram` 4 | 4 |
66
+ | Recipe | Profiles (max per profile) | `maxArtifacts` |
67
+ | ------------------- | ------------------------------------------------ | -------------- |
68
+ | `project-recap` | `status-view` 1, `rollout-view` 1, `deep-dive` 3 | 5 |
69
+ | `program-recap` | `supporting-diagram` 3, `project-page` 12 | 12 |
70
+ | `project-explainer` | `supporting-diagram` 4 | 4 |
71
+ | `engineer-tour` | `supporting-diagram` 4 | 4 |
60
72
 
61
- `supporting-diagram` produces an HTML-composed `diagram` on the diagram shell,
62
- `walkthrough-deck` an HTML-composed `deck` on the deck shell, and `deep-dive`
63
- and `project-page` Markdown `explainer` pages. Every declared type stays inside
64
- the frozen `manifest/v1` enum — narrative sub-pages use `explainer` rather than
65
- introducing a new type.
73
+ For project recaps, optional status and rollout views require matching
74
+ source-backed justifications, while `deep-dive` remains a Markdown
75
+ `explainer`. Other recipes retain their recipe-owned diagram and project-page
76
+ profiles. Every declared type stays inside the frozen `manifest/v1` enum.
66
77
 
67
78
  ## Content authoring and review
68
79
 
@@ -105,50 +116,45 @@ author request, so an unattended author receives everything it needs in one
105
116
  payload. Changing a brief changes output expectations with no contract
106
117
  migration.
107
118
 
108
- ### The author seam
119
+ ### The planning and author seams
109
120
 
110
- Every run requires one provider-neutral author callback, in **both** modes —
111
- there is no synthetic content model to fall back on. A run without one fails
112
- with `E_AUTHOR_REQUIRED`.
121
+ Before authoring, one provider-neutral `planSet` callback produces the complete
122
+ shared terminology, status, and number ledger plus the adaptive artifact
123
+ portfolio. Every run also requires one provider-neutral author callback, in
124
+ **both** modes — there is no synthetic content model to fall back on. A run
125
+ without one fails with `E_AUTHOR_REQUIRED`.
113
126
 
114
- In-process core callers supply `options.author`; core CLI callers use
115
- `--author-module`. The OAT adapter accepts either an in-process `author` or an
116
- `authorModulePath`, and rejects zero or two seams before it invokes the core.
117
- Callback and module paths are transient and never persisted in the run request.
118
- Validated results are retained under `source/author/` and authored content under
119
- `source/content/<artifact>.md` or `.html`; both are covered by the run's
120
- immutable hashes.
121
-
122
- The core invokes the author once per artifact with an
127
+ The core invokes the author once per planned artifact with an
123
128
  `explainer-kit.author-request/v2` payload carrying the artifact identity and
124
129
  type, its authoring path, the inlined brief, the reconciled fact base, the
125
- resolved theme, the shell source for artistic artifacts, and for narrative
126
- floor artifacts — the required narrative section IDs. It accepts only a
127
- schema-valid `explainer-kit.author-result/v2` containing exactly one of
130
+ resolved theme, the shell source for artistic artifacts, the immutable set
131
+ context, the matching planned artifact, and bundled medium-specific authoring
132
+ guidance. The installed skill is the complete unattended baseline; optional
133
+ provider capabilities can enhance composition but are not required. The core
134
+ accepts only a schema-valid `explainer-kit.author-result/v2` containing exactly one of
128
135
  `content.markdown` or `content.html` plus non-secret provenance. Authored
129
136
  content is still checked for excessive verbatim overlap with the fact base.
130
137
 
131
- ### Content-driven expansion
132
-
133
- An author that judges the material to warrant more than the floor may return
134
- `proposedArtifacts` on the floor result, where each entry is only
135
- `{id, profileId, rationale}`. Proposals deliberately cannot carry an authoring
136
- path, brief, or shell — those are read from the referenced profile, so policy
137
- stays recipe-owned.
138
+ Direct callbacks and module entry points are first-class but transient: they
139
+ never enter retained request contracts. See
140
+ [Explainer Provider Integration](explainer-kit-providers.md) for the exact
141
+ planner, author, browser-session, and visual-critic boundaries.
138
142
 
139
- The pipeline validates each proposal, enforces the per-profile and recipe-level
140
- caps, then issues one author request per accepted proposal. The two outcomes are
141
- distinct on purpose:
143
+ ### Planner-owned adaptive sets
142
144
 
143
- - A **malformed** proposal unknown `profileId`, unsafe or duplicate `id`, or a
144
- collision with a floor artifact ID — is a hard error, because it signals a
145
- broken author rather than thin content.
146
- - An **over-limit** proposal is rejected with a stable warning and the run
147
- continues.
145
+ The set planner finalizes required and optional artifacts before authoring.
146
+ Project recaps always contain a hub, architecture/system diagram, and deck;
147
+ the planner may add only recipe-licensed optional views with a source-backed
148
+ justification. Recipe and per-profile limits still bound the portfolio.
149
+ Undeclared sources, conflicting ledger values, duplicate IDs, and unjustified
150
+ optionals fail validation. Author results cannot add, remove, or replace
151
+ artifacts.
148
152
 
149
- Accepted expansion artifacts render to ID-bearing paths
150
- (`site/{directory}/{slug}/{artifactId}/index.html`) and are linked from the floor
151
- hub, while floor artifacts keep their existing paths unchanged.
153
+ When the plan contains a non-linear graph, artistic output must preserve its
154
+ closed semantics exactly: direction, every node and label, every edge and
155
+ label, branching, fan-in, and cycles. Missing, extra, duplicated, rewired, or
156
+ semantically drifting observations fail topology validation before browser or
157
+ critic review.
152
158
 
153
159
  ### Approval and marking
154
160
 
@@ -167,12 +173,25 @@ re-renders and re-runs QA against the edited sources before approval is
167
173
  processed rather than publishing the stale render.
168
174
 
169
175
  Unattended runs — including recaps triggered by automated project completion —
170
- flow through end-to-end and auto-approve. The approval record distinguishes the
171
- two honestly: `explainer-kit.content-approval/v2` carries
172
- `marking: human-approved` for an interactive approval and `auto-drafted` for an
173
- unattended run, and the marking is surfaced in the core and adapter run results.
174
- It is deliberately **not** written to the manifest, which stays frozen on
175
- `manifest/v1`.
176
+ flow through end-to-end and auto-approve content. The approval record
177
+ distinguishes the two honestly: `explainer-kit.content-approval/v2` carries
178
+ `marking: human-approved` for interactive approval and `auto-drafted` for an
179
+ unattended run.
180
+
181
+ Unattended project recaps also require a separate whole-set visual review.
182
+ The adapter supplies a branded session created by the compatible core, which
183
+ derives Chromium name and version from the launched browser rather than trusting
184
+ caller metadata. The browser captures each rendered artifact at exact 320, 768,
185
+ and 1440 viewports. The core validates decoded PNG dimensions and pixels, binds
186
+ screenshots and metrics to one capture identity, and sends only that confined
187
+ evidence to an independent critic. Fixture sessions are test-only and are
188
+ rejected in unattended production.
189
+
190
+ A `correct` disposition permits one bounded correction and exactly one final
191
+ review; there is no second correction or third review. Missing, forged,
192
+ cross-record-mismatched, or invalid evidence, a failed critic, or an unresolved
193
+ correction ends as `built-needs-review`. Such output is retained for diagnosis
194
+ but cannot become durable, finalized, archived, or published.
176
195
 
177
196
  The approval record is also the durable source of truth for the resolved
178
197
  artifact set. It records every floor and accepted expansion artifact for all
@@ -182,6 +201,26 @@ re-invoking the author.
182
201
 
183
202
  Content approval never authorizes publishing.
184
203
 
204
+ ### Interactive resume security
205
+
206
+ An incomplete interactive run returns an opaque `approval.resumeToken`. Keep it
207
+ outside the package, then echo it as `reviewedSource.resumeToken` when resuming
208
+ the same request. Only fixed-format authenticated `ekrt2` tokens are accepted.
209
+ They bind the run ID, original canonical output root, exact retained
210
+ `run-request.json` bytes, and all retained set-plan records.
211
+
212
+ Before hydrating authored content or invoking planner, author, durability, or
213
+ publish callbacks, resume also compares the complete canonical current request
214
+ with the authenticated retained request. Changes to source binding, recipe,
215
+ mode, theme, render strategy, privacy, public URL, durability, or publish
216
+ destination fail with `E_APPROVAL_RESUME`. Intentionally non-retained art
217
+ direction is omitted from the persisted request projection; executable provider
218
+ seams are separately transient and never part of request equality.
219
+
220
+ Every legacy `ekrt1` token is rejected. A paused run created with the legacy
221
+ format must restart to receive an authenticated token; editing retained package
222
+ state cannot opt it into compatibility.
223
+
185
224
  ## Warnings and QA severity
186
225
 
187
226
  QA findings are split by severity, and the split is what lets thin content ship
@@ -211,15 +250,18 @@ succeed in both modes.
211
250
  | `render-qa-deck-print-layout` | A deck degrades incorrectly in print layout |
212
251
  | `render-qa-skipped-no-probe` | Render QA was skipped because no browser probe was supplied |
213
252
 
214
- Render QA is opt-in. When a caller supplies a browser probe, the stage serves
215
- the built site directory, loads each artifact with animations disabled, and runs
216
- the layout-probe battery at representative widths. Viewport clipping
217
- deliberately exempts content inside a horizontally scrollable ancestor, so
218
- intentionally paged deck slides are not reported as clipped while genuinely
219
- unreachable content still is. The core never launches a browser on its own:
220
- without an injected probe the stage records the single
221
- `render-qa-skipped-no-probe` warning and the run continues rather than failing
222
- closed.
253
+ When a caller supplies a browser provider, the stage serves the built site
254
+ directory, loads each artifact with animations disabled, and runs the
255
+ layout-probe battery. Viewport clipping deliberately exempts content inside a
256
+ horizontally scrollable ancestor, so intentionally paged deck slides are not
257
+ reported as clipped while genuinely unreachable content still is. The core
258
+ never launches a browser implicitly; the caller creates and closes an explicit
259
+ session, and the OAT adapter validates it before core invocation. For ordinary
260
+ non-retaining runs, omitting a legacy probe records
261
+ `render-qa-skipped-no-probe` and continues. Unattended project recaps require
262
+ the branded browser session and visual critic described in
263
+ [Explainer Provider Integration](explainer-kit-providers.md); missing evidence
264
+ fails closed as `built-needs-review`.
223
265
 
224
266
  ## Curated styles and themes
225
267
 
@@ -250,6 +292,14 @@ content, resolved theme, `manifest.json`, `build-record.json`, and the rendered
250
292
  `site/` tree. Rendering or publishing failures preserve successful
251
293
  intermediates and recovery information.
252
294
 
295
+ Reviewed source and citation backlinks are absolute canonical GitHub blob URLs
296
+ pinned to the exact 40-character commit revision and line range, so they
297
+ survive project archival without resolving through a mutable branch or local
298
+ checkout. Each recap also emits
299
+ `site/initiatives/<slug>/catalog.json` from the finalized manifest. Its
300
+ artifact IDs, types, paths, URLs, and source backlinks must remain in exact
301
+ manifest parity; authors do not hand-maintain the catalog.
302
+
253
303
  `manifest.immutableHashes` covers the exact retained bytes for
254
304
  `run-request.json`, content approval, fact-base JSON and Markdown, declared
255
305
  author results, authored content, the resolved theme, and every built
@@ -264,6 +314,8 @@ Build success and durability are separate:
264
314
 
265
315
  - `built-not-durable` means artifacts exist but verified commit or publish
266
316
  evidence is absent.
317
+ - `built-needs-review` means the required unattended visual-review chain did
318
+ not finish with a pass; durability and publishing remain blocked.
267
319
  - `built-durable` requires verified evidence for every required
268
320
  non-rebuildable artifact.
269
321
  - `failed` records a failed run without treating partial output as success.
@@ -12,6 +12,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
12
12
  - [Writing Skills](../../contributing/skills.md) - Contributor guide to skill authoring, contracts, and governance.
13
13
  - [Docs Workflows](../../docs-tooling/workflows.md) - How docs CLI helpers and docs skills work together.
14
14
  - [Explainer Kit](explainer-kit.md) - Core and OAT adapter usage, recipes and expansion profiles, the two authoring paths, warnings and QA severity, themes, lifecycle policy, durability, and publishing.
15
+ - [Explainer Provider Integration](explainer-kit-providers.md) - Provider-neutral planner, author, trusted browser-session, and visual-critic contracts.
15
16
  - [Repo Improve](repo-improve.md) - Source modes, external-plan boundaries, optional tracking, and OAT import handoff.
16
17
 
17
18
  ## Key Skills by Use Case
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.26",
3
- "docs-config": "0.2.26",
4
- "docs-theme": "0.2.26",
5
- "docs-transforms": "0.2.26"
2
+ "cli": "0.2.27",
3
+ "docs-config": "0.2.27",
4
+ "docs-theme": "0.2.27",
5
+ "docs-transforms": "0.2.27"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: explainer-kit
3
- version: 2.0.1
3
+ version: 2.0.3
4
4
  description: Use when building destination-neutral visual explainer artifacts from explicit, versioned inputs.
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Edit, Bash, Grep, Glob, Agent, mcp__*
@@ -84,6 +84,11 @@ artifacts. It accepts only a schema-valid
84
84
  overlap, retains each validated result under `source/author/` and its content
85
85
  under `source/content/<artifact>.md` or `.html`, and never prompts.
86
86
 
87
+ Authors follow the bundled medium-specific rules in
88
+ `references/visual-authoring.md`. They do not require a home-directory plugin:
89
+ an optional installed visual-explainer capability may enhance composition, but
90
+ the bundled briefs, shells, and guidance are the complete unattended baseline.
91
+
87
92
  Markdown content is parsed to a validated AST and rendered through the themed
88
93
  block library, including GFM tables and task lists, GFM alert callouts, fenced
89
94
  `timeline` blocks, and fenced `diagram` blocks rendered to inline SVG at build
@@ -137,10 +142,18 @@ guideline misses, rejected over-limit proposals, and render-QA layout findings
137
142
  append stable warning IDs to the manifest's `warnings[]` and let the run
138
143
  succeed.
139
144
 
145
+ Visual critics use the independent whole-set rubric in
146
+ `references/visual-review.md`, which separates review judgment from
147
+ medium-specific authoring rules.
148
+
140
149
  Render QA is opt-in. It runs only against an injected `browserProbe`, and the
141
150
  core never launches a browser of its own — reviewing the rendered output in a
142
- browser is the generating agent's job. Without a probe the stage records
143
- `render-qa-skipped-no-probe` and the run continues.
151
+ browser is the generating agent's job. Unattended project recaps require both
152
+ complete browser evidence and an independent visual-critic `pass`. A missing
153
+ probe or critic, a terminal critic failure, or an unresolved correction records
154
+ `built-needs-review`: built artifacts and review evidence remain available, but
155
+ durability and publishing callbacks are not invoked. Other runs without a probe
156
+ record `render-qa-skipped-no-probe` and continue.
144
157
 
145
158
  See `references/contracts.md` for source formats, callback modules, retained
146
159
  intermediates, and result semantics.
@@ -149,6 +162,8 @@ Durability and publishing run only when the request selects them and the caller
149
162
  supplies the matching callback. The core does not create commits, discover
150
163
  destinations, or publish automatically. A successful build remains
151
164
  `built-not-durable` until caller-supplied evidence is verified.
165
+ `built-needs-review` is terminal but cannot receive durability evidence or be
166
+ published.
152
167
 
153
168
  ## Progress Indicators
154
169
 
@@ -15,7 +15,7 @@
15
15
  {
16
16
  "id": "project-recap",
17
17
  "type": "hub",
18
- "authoring": "markdown",
18
+ "authoring": "html",
19
19
  "template": "house-style",
20
20
  "required": true,
21
21
  "briefRef": "briefs/project-recap.md",
@@ -27,38 +27,65 @@
27
27
  "validation-evidence",
28
28
  "outcome"
29
29
  ]
30
+ },
31
+ {
32
+ "id": "architecture",
33
+ "type": "diagram",
34
+ "authoring": "html",
35
+ "template": "diagram-shell",
36
+ "required": true,
37
+ "briefRef": "briefs/supporting-diagram.md",
38
+ "requiredNarrative": ["as-built-architecture"]
39
+ },
40
+ {
41
+ "id": "deck",
42
+ "type": "deck",
43
+ "authoring": "html",
44
+ "template": "deck-shell",
45
+ "required": true,
46
+ "briefRef": "briefs/walkthrough-deck.md",
47
+ "requiredNarrative": ["outcome"]
30
48
  }
31
49
  ],
32
50
  "expansion": {
33
51
  "profiles": [
34
52
  {
35
- "profileId": "supporting-diagram",
36
- "type": "diagram",
53
+ "profileId": "status-view",
54
+ "type": "explainer",
37
55
  "authoring": "html",
38
- "briefRef": "briefs/supporting-diagram.md",
39
- "shell": "diagram-shell",
40
- "maxCount": 4
56
+ "briefRef": "briefs/project-recap.md",
57
+ "shell": "house-style",
58
+ "maxCount": 1,
59
+ "allowedJustificationKinds": ["status-change"]
60
+ },
61
+ {
62
+ "profileId": "rollout-view",
63
+ "type": "explainer",
64
+ "authoring": "html",
65
+ "briefRef": "briefs/project-recap.md",
66
+ "shell": "house-style",
67
+ "maxCount": 1,
68
+ "allowedJustificationKinds": ["rollout-complexity"]
41
69
  },
42
70
  {
43
71
  "profileId": "deep-dive",
44
72
  "type": "explainer",
45
73
  "authoring": "markdown",
46
74
  "briefRef": "briefs/deep-dive.md",
47
- "maxCount": 3
48
- },
49
- {
50
- "profileId": "walkthrough-deck",
51
- "type": "deck",
52
- "authoring": "html",
53
- "briefRef": "briefs/walkthrough-deck.md",
54
- "shell": "deck-shell",
55
- "maxCount": 1
75
+ "maxCount": 3,
76
+ "allowedJustificationKinds": ["source-backed-detail"]
56
77
  }
57
78
  ],
58
79
  "limits": {
59
- "maxArtifacts": 6
80
+ "maxArtifacts": 5
60
81
  }
61
82
  },
83
+ "fallback": {
84
+ "mode": "deterministic-markdown",
85
+ "selection": "explicit",
86
+ "authoring": "markdown",
87
+ "scope": "portfolio"
88
+ },
62
89
  "discoveryLimits": {
63
90
  "consecutiveNoNewFindingsRounds": 2,
64
91
  "maxRounds": 8