@open-agent-toolkit/cli 0.2.25 → 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 (87) hide show
  1. package/assets/NOTICES.md +156 -0
  2. package/assets/docs/cli-utilities/configuration.md +42 -11
  3. package/assets/docs/contributing/explainer-kit-verification.md +125 -0
  4. package/assets/docs/contributing/index.md +1 -0
  5. package/assets/docs/reference/troubleshooting.md +47 -0
  6. package/assets/docs/workflows/projects/artifacts.md +24 -6
  7. package/assets/docs/workflows/projects/dispatch-ceiling.md +67 -16
  8. package/assets/docs/workflows/skills/explainer-kit-providers.md +144 -0
  9. package/assets/docs/workflows/skills/explainer-kit.md +121 -69
  10. package/assets/docs/workflows/skills/index.md +1 -0
  11. package/assets/public-package-versions.json +4 -4
  12. package/assets/skills/explainer-kit/SKILL.md +18 -3
  13. package/assets/skills/explainer-kit/recipes/project-recap.json +43 -16
  14. package/assets/skills/explainer-kit/references/contracts.md +167 -20
  15. package/assets/skills/explainer-kit/references/golden-conformance.md +80 -0
  16. package/assets/skills/explainer-kit/references/visual-authoring.md +92 -0
  17. package/assets/skills/explainer-kit/references/visual-review.md +57 -0
  18. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +172 -1
  19. package/assets/skills/explainer-kit/schemas/build-record.schema.json +7 -1
  20. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +38 -2
  21. package/assets/skills/explainer-kit/schemas/manifest.schema.json +25 -1
  22. package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -0
  23. package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +149 -0
  24. package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +117 -0
  25. package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +80 -0
  26. package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +148 -4
  27. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +243 -0
  28. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +586 -8
  29. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +285 -8
  30. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +35 -0
  31. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +144 -8
  32. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +379 -0
  33. package/assets/skills/explainer-kit/scripts/lib/png.mjs +287 -0
  34. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +280 -8
  35. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +132 -3
  36. package/assets/skills/explainer-kit/scripts/lib/records.mjs +513 -21
  37. package/assets/skills/explainer-kit/scripts/lib/render.mjs +67 -3
  38. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +43 -1
  39. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +208 -0
  40. package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +218 -0
  41. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +380 -0
  42. package/assets/skills/explainer-kit/scripts/render-qa.mjs +48 -10
  43. package/assets/skills/explainer-kit/scripts/run.mjs +859 -134
  44. package/assets/skills/oat-explainer-kit/SKILL.md +40 -12
  45. package/assets/skills/oat-explainer-kit/references/author-callback.md +12 -10
  46. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +40 -2
  47. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +72 -0
  48. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +167 -5
  49. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +92 -5
  50. package/assets/skills/oat-explainer-kit/scripts/run.mjs +324 -2
  51. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  52. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  53. package/assets/skills/oat-project-implement/SKILL.md +9 -11
  54. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +18 -9
  55. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  56. package/assets/skills/oat-project-implement/references/phase-execution.md +13 -4
  57. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  58. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  59. package/dist/commands/config/index.d.ts.map +1 -1
  60. package/dist/commands/config/index.js +27 -3
  61. package/dist/commands/project/archive/archive-utils.d.ts +1 -0
  62. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  63. package/dist/commands/project/archive/archive-utils.js +109 -42
  64. package/dist/commands/project/archive/explainer-package-coverage.d.ts +14 -0
  65. package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -0
  66. package/dist/commands/project/archive/explainer-package-coverage.js +27 -0
  67. package/dist/commands/project/archive/explainer-source-backlinks.d.ts +18 -0
  68. package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +1 -0
  69. package/dist/commands/project/archive/explainer-source-backlinks.js +27 -0
  70. package/dist/commands/project/archive/push-runner.d.ts +2 -1
  71. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  72. package/dist/commands/project/archive/push-runner.js +5 -1
  73. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  74. package/dist/commands/project/dispatch-ceiling/index.js +90 -0
  75. package/dist/config/dispatch-notices.d.ts +8 -0
  76. package/dist/config/dispatch-notices.d.ts.map +1 -0
  77. package/dist/config/dispatch-notices.js +79 -0
  78. package/dist/config/dispatch-policy-options.d.ts +2 -0
  79. package/dist/config/dispatch-policy-options.d.ts.map +1 -1
  80. package/dist/config/dispatch-policy-options.js +14 -2
  81. package/dist/providers/identity/dispatch-report.d.ts +17 -0
  82. package/dist/providers/identity/dispatch-report.d.ts.map +1 -1
  83. package/dist/providers/identity/dispatch-report.js +30 -0
  84. package/dist/release/public-package-contract.d.ts +6 -0
  85. package/dist/release/public-package-contract.d.ts.map +1 -1
  86. package/dist/release/public-package-contract.js +75 -0
  87. package/package.json +2 -2
@@ -0,0 +1,144 @@
1
+ ---
2
+ title: Explainer Provider Integration
3
+ description: 'Provider-neutral planner, author, browser-session, and visual-critic contracts for Explainer Kit integrators.'
4
+ ---
5
+
6
+ # Explainer Provider Integration
7
+
8
+ Explainer Kit keeps model and browser providers outside its retained request
9
+ contracts. Integrators supply executable seams in process or through validated
10
+ module exports; the core owns schemas, evidence binding, and terminal outcomes.
11
+
12
+ For recipes, authoring behavior, themes, and lifecycle policy, start with
13
+ [Explainer Kit](explainer-kit.md).
14
+
15
+ ## Provider boundaries
16
+
17
+ Use exactly one form for each required role:
18
+
19
+ | Role | Direct input | Module-path input | Required export |
20
+ | ------------------ | ---------------- | -------------------------- | ----------------------------------- |
21
+ | Set planning | `planSet` | `planSetModulePath` | `planSet` function |
22
+ | Artifact authoring | `author` | `authorModulePath` | `author` function |
23
+ | Browser evidence | `browserSession` | `browserSessionModulePath` | branded `browserSession` descriptor |
24
+ | Whole-set review | `visualCritic` | `visualCriticModulePath` | `visualCritic` function |
25
+
26
+ `project-recap` requires all four roles. Other recipes require the author and
27
+ use their recipe-specific planning behavior. Direct-plus-module conflicts,
28
+ missing files, and invalid exports fail at the adapter boundary before core
29
+ execution.
30
+
31
+ Do not place browser or visual-review providers in `coreOptions`. Executable
32
+ callbacks, descriptors, and module paths are transient and never enter
33
+ `ExplainerRunRequestV1`, `run-request.json`, or immutable package hashes.
34
+
35
+ ## Set planner
36
+
37
+ The provider-neutral `planSet` callback runs once after fact reconciliation and
38
+ before any author callback. It returns the complete portfolio and one shared
39
+ claim ledger.
40
+
41
+ For a project recap, the portfolio must contain the required hub, architecture
42
+ view, and deck. Optional entries must use a recipe-licensed profile, remain
43
+ inside recipe and per-profile limits, and carry source-backed justification.
44
+ Duplicate identities, undeclared sources, conflicting shared terms, and
45
+ unjustified optionals fail validation.
46
+
47
+ Every author request receives the immutable set context and its matching planned
48
+ artifact. Authors cannot add, remove, replace, or rename portfolio entries.
49
+
50
+ ## Artifact author
51
+
52
+ The core invokes `author` once per planned artifact with
53
+ `explainer-kit.author-request/v2`. The request contains:
54
+
55
+ - artifact identity, type, and authoring path;
56
+ - the versioned brief and bundled medium-specific guidance;
57
+ - reconciled facts and the shared set context;
58
+ - the matching planned artifact;
59
+ - the resolved theme; and
60
+ - the bundled shell for artistic HTML.
61
+
62
+ Return `explainer-kit.author-result/v2` with exactly one of
63
+ `content.markdown` or `content.html` and non-secret provenance. The core
64
+ validates source overlap, path ownership, script identity, and structural
65
+ contracts after the callback returns.
66
+
67
+ The author, fact critic, browser probe, and visual critic must have distinct
68
+ callback identities. One provider implementation may back multiple roles, but
69
+ the adapter still requires separate executable boundaries.
70
+
71
+ ## Trusted browser session
72
+
73
+ Create a direct session with the compatible core:
74
+
75
+ ```js
76
+ const browserSession = await core.createBrowserProbeSession();
77
+
78
+ try {
79
+ await runOatExplainer(request, {
80
+ planSet,
81
+ author,
82
+ browserSession,
83
+ visualCritic,
84
+ });
85
+ } finally {
86
+ await browserSession.close();
87
+ }
88
+ ```
89
+
90
+ The factory launches Chromium and derives the runtime name and version from the
91
+ actual browser instance. A private in-memory brand prevents a plain object with
92
+ caller-authored `{name, version}` metadata from impersonating a trusted
93
+ session. Module providers export the already branded descriptor as
94
+ `browserSession`, not a bare callback.
95
+
96
+ For unattended project recaps, the core chooses 320, 768, and 1440 widths and
97
+ requires default-scenario PNGs. It validates the PNG signature, decoded
98
+ dimensions, and pixel payload, then writes paired
99
+ `explainer-kit.browser-evidence/v2` metrics. Every record retains:
100
+
101
+ - launched Chromium name and version;
102
+ - fixed capture settings;
103
+ - one derived capture identity;
104
+ - viewport and scenario;
105
+ - screenshot path and byte binding; and
106
+ - measured overflow, clipping, readability, motion, keyboard, deck, and theme
107
+ behavior.
108
+
109
+ All records in one review chain must carry the same runtime and capture
110
+ identity. Deterministic fixture sessions are explicit test helpers and are
111
+ rejected by unattended production recap paths.
112
+
113
+ ## Whole-set visual critic
114
+
115
+ The `visualCritic` receives one
116
+ `explainer-kit.visual-review-request/v1` plus a confined evidence reader. The
117
+ request binds:
118
+
119
+ - every rendered artifact and its exact content hash;
120
+ - every viewport-matched screenshot and metrics hash;
121
+ - cohesion observations from the shared ledger; and
122
+ - the trusted browser runtime and capture identity.
123
+
124
+ Return `explainer-kit.visual-review-result/v1` with the exact request identity,
125
+ all reviewed artifact IDs, structured findings, and one disposition:
126
+
127
+ - `pass` completes the review gate;
128
+ - `correct` requests one bounded correction and one final review; or
129
+ - `fail` terminates the gate.
130
+
131
+ The critic must not mutate rendered files or evidence. The core revalidates all
132
+ bound bytes after each callback.
133
+
134
+ ## Terminal behavior
135
+
136
+ There is never a second correction or third review. Missing, malformed, forged,
137
+ stale, cross-record-mismatched, or mutated evidence; a thrown callback; a
138
+ `fail`; or an unresolved correction produces `built-needs-review`.
139
+
140
+ That outcome retains available artifacts and review evidence for diagnosis, but
141
+ invokes neither durability nor publication. It cannot be finalized, archived,
142
+ attested, or pushed as a successful recap.
143
+
144
+ See [Troubleshooting](../../reference/troubleshooting.md) for recovery steps.
@@ -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.25",
3
- "docs-config": "0.2.25",
4
- "docs-theme": "0.2.25",
5
- "docs-transforms": "0.2.25"
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