@open-agent-toolkit/cli 0.2.19 → 0.2.21

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 (66) hide show
  1. package/assets/config/dispatch-matrix-recommendation.json +15 -5
  2. package/assets/docs/cli-utilities/configuration.md +10 -5
  3. package/assets/docs/contributing/index.md +1 -0
  4. package/assets/docs/contributing/verifying-cursor-pins.md +282 -0
  5. package/assets/docs/workflows/projects/artifacts.md +1 -1
  6. package/assets/docs/workflows/projects/dispatch-ceiling.md +50 -4
  7. package/assets/docs/workflows/skills/explainer-kit.md +188 -23
  8. package/assets/docs/workflows/skills/index.md +1 -1
  9. package/assets/public-package-versions.json +4 -4
  10. package/assets/skills/explainer-kit/SKILL.md +87 -25
  11. package/assets/skills/explainer-kit/briefs/deep-dive.md +35 -0
  12. package/assets/skills/explainer-kit/briefs/engineer-tour.md +45 -0
  13. package/assets/skills/explainer-kit/briefs/program-recap.md +41 -0
  14. package/assets/skills/explainer-kit/briefs/project-explainer.md +38 -0
  15. package/assets/skills/explainer-kit/briefs/project-page.md +38 -0
  16. package/assets/skills/explainer-kit/briefs/project-recap.md +47 -0
  17. package/assets/skills/explainer-kit/briefs/supporting-diagram.md +28 -0
  18. package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +35 -0
  19. package/assets/skills/explainer-kit/examples/project-recap/content.md +57 -14
  20. package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +104 -0
  21. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +26 -4
  22. package/assets/skills/explainer-kit/recipes/engineer-tour.json +27 -10
  23. package/assets/skills/explainer-kit/recipes/program-recap.json +35 -11
  24. package/assets/skills/explainer-kit/recipes/project-explainer.json +27 -10
  25. package/assets/skills/explainer-kit/recipes/project-recap.json +43 -11
  26. package/assets/skills/explainer-kit/references/contracts.md +45 -19
  27. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +41 -0
  28. package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +52 -0
  29. package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +442 -0
  30. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +223 -10
  31. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +28 -43
  32. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +237 -0
  33. package/assets/skills/explainer-kit/scripts/lib/html-safety.mjs +680 -0
  34. package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +414 -0
  35. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +309 -10
  36. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +313 -41
  37. package/assets/skills/explainer-kit/scripts/lib/records.mjs +61 -0
  38. package/assets/skills/explainer-kit/scripts/lib/render.mjs +166 -12
  39. package/assets/skills/explainer-kit/scripts/render-qa.mjs +147 -2
  40. package/assets/skills/explainer-kit/scripts/run.mjs +796 -272
  41. package/assets/skills/explainer-kit/templates/deck-shell.html +25 -5
  42. package/assets/skills/explainer-kit/templates/diagram-shell.html +29 -7
  43. package/assets/skills/explainer-kit/templates/engineer-tour.html +133 -9
  44. package/assets/skills/explainer-kit/templates/house-style.html +82 -0
  45. package/assets/skills/oat-explainer-kit/SKILL.md +16 -9
  46. package/assets/skills/oat-explainer-kit/references/author-callback.md +51 -0
  47. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +10 -8
  48. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +14 -0
  49. package/assets/skills/oat-explainer-kit/scripts/run.mjs +7 -11
  50. package/assets/skills/oat-project-complete/SKILL.md +18 -2
  51. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  52. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +7 -1
  53. package/assets/skills/oat-wave-execute/SKILL.md +12 -19
  54. package/assets/skills/oat-wave-program/SKILL.md +12 -13
  55. package/assets/skills/subagent-orchestration/SKILL.md +1 -1
  56. package/assets/skills/subagent-orchestration/references/evidence-and-refresh.md +153 -15
  57. package/assets/skills/subagent-orchestration/references/model-selection-principles.md +75 -3
  58. package/assets/skills/subagent-orchestration/references/provider-claude.md +95 -35
  59. package/assets/skills/subagent-orchestration/references/provider-codex.md +36 -10
  60. package/assets/skills/subagent-orchestration/references/provider-cursor.md +91 -15
  61. package/dist/providers/cursor/codec/catalog.d.ts +19 -1
  62. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -1
  63. package/dist/providers/cursor/codec/catalog.js +54 -0
  64. package/package.json +2 -2
  65. package/assets/skills/explainer-kit/schemas/author-request.schema.json +0 -85
  66. package/assets/skills/explainer-kit/schemas/author-result.schema.json +0 -65
@@ -0,0 +1,28 @@
1
+ # Supporting diagram author brief
2
+
3
+ ## Audience
4
+
5
+ Create a visual for a reader who understands the parent explainer but needs one
6
+ boundary, flow, dependency, or state transition made unmistakable.
7
+
8
+ ## Voice and visual intent
9
+
10
+ Lead with the visual. Use short labels, consistent terminology, and a clear
11
+ reading direction. Make the title state the question the diagram answers.
12
+ Include a concise legend or annotation only when the visual vocabulary is not
13
+ self-evident.
14
+
15
+ ## Floor
16
+
17
+ Compose a complete, accessible HTML diagram from the supplied
18
+ `diagram-shell`. Preserve its required anchors, theme tokens, and core scripts.
19
+ The diagram must have an explicit title, meaningful labels, a visible primary
20
+ flow, and a short text explanation that remains useful to screen-reader users.
21
+ Do not encode essential meaning through color alone.
22
+
23
+ ## Expansion license
24
+
25
+ Elaborate the shell's non-script markup and SVG freely when needed for
26
+ legibility. Keep the scope to one coherent question. If the visual needs
27
+ several unrelated panels or long prose to make sense, recommend a deep-dive
28
+ instead.
@@ -0,0 +1,35 @@
1
+ # Walkthrough deck author brief
2
+
3
+ ## Audience
4
+
5
+ Build for a live or self-guided walkthrough with teammates who need the project
6
+ story in a deliberate sequence rather than a reference document.
7
+
8
+ ## Voice and sequence
9
+
10
+ Use one claim per slide and a clear narrative arc: context, change, system,
11
+ evidence, outcome, next action. Keep text brief enough to scan at presentation
12
+ distance. Use diagrams, comparisons, and evidence excerpts instead of
13
+ shrinking prose to fit.
14
+
15
+ ## Floor
16
+
17
+ Compose a complete HTML deck from the supplied `deck-shell`. Preserve required
18
+ anchors, theme tokens, keyboard navigation, progress behavior, print behavior,
19
+ and all core scripts exactly. Include:
20
+
21
+ - an opening frame that states the project and reader promise;
22
+ - a before/after or request/outcome frame;
23
+ - a high-level architecture or execution-flow visual;
24
+ - a decision or trade-off frame;
25
+ - a validation-evidence frame;
26
+ - a closing frame with outcome and next actions.
27
+
28
+ Every slide must have a useful heading, readable contrast, and a sensible
29
+ no-JavaScript and print order.
30
+
31
+ ## Shell-composition license
32
+
33
+ The shell supplies safety and presentation mechanics. You may recompose and
34
+ extend non-script markup and styling to fit the story. Do not add scripts,
35
+ external active content, or inline event handlers.
@@ -2,33 +2,76 @@
2
2
 
3
3
  ## Original request
4
4
 
5
- Replace the nightly full rebuild with incremental indexing without changing the
6
- public query contract.
5
+ Every correction to the fictional Atlas Index corpus had to wait for the next
6
+ overnight window, and the cost of that window grew with the corpus. The team was
7
+ asked to make indexing continuous without asking a single caller to change how
8
+ they query.
9
+
10
+ > [!IMPORTANT]
11
+ > The query contract was frozen for the whole engagement. Any option that would
12
+ > have reshaped a response was out of scope before it was evaluated.
7
13
 
8
14
  ## Key agent decisions
9
15
 
10
- - Use partition-local checkpoints to bound replay.
11
- - Make index writes idempotent before enabling automatic retries.
12
- - Retain the full rebuild as a documented recovery path.
16
+ | Decision | Alternative weighed | Why it won |
17
+ | ---------------------------- | ---------------------------- | -------------------------------------------------- |
18
+ | Checkpoint each partition | A single global checkpoint | Replay after a crash stays inside one partition |
19
+ | Make writes idempotent first | Deduplicate in each consumer | Retry safety belongs to the writer, not the reader |
20
+ | Keep the rebuild as recovery | Delete it after cutover | A proven fallback costs almost nothing to retain |
21
+
22
+ Each row records what was chosen and what it was chosen over, so a later reader
23
+ can reconstruct the reasoning rather than just the result.
13
24
 
14
25
  ## As-built architecture
15
26
 
16
- A change reader resumes from each partition checkpoint and hands batches to
17
- idempotent workers. A scheduled audit compares source and index samples and
18
- raises a recovery task when drift exceeds the accepted threshold.
27
+ ```diagram
28
+ graph TD
29
+ reader[Change reader] --> queue(Batch queue)
30
+ queue --> worker[Index worker]
31
+ worker --> index[Search index]
32
+ audit{Drift beyond threshold} -->|yes| recovery[Recovery task]
33
+ index --> audit
34
+ ```
35
+
36
+ The reader resumes from whichever checkpoint its partition last committed, so a
37
+ restart repeats at most one batch. Workers apply batches by key, which makes a
38
+ repeated batch indistinguishable from a first delivery. The audit closes the
39
+ loop by sampling both sides on a schedule and opening a recovery task only when
40
+ the difference clears the accepted threshold.
19
41
 
20
42
  ## Implementation record
21
43
 
22
- The team delivered checkpoint persistence, replay-safe workers, audit reporting,
23
- and the recovery runbook in three sequential milestones.
44
+ ```timeline
45
+ 2026-02-03 Checkpoint persistence landed behind a flag
46
+ 2026-02-17 — Replay-safe workers replaced the batch writer
47
+ 2026-03-02 — Drift audit and the recovery runbook shipped
48
+ ```
49
+
50
+ - The first milestone changed only bookkeeping, so it could ship dark.
51
+ - The second made retries safe, which is what unlocked automatic recovery.
52
+ - The third added the observability the operators asked for before cutover.
24
53
 
25
54
  ## Validation evidence
26
55
 
27
- Contract tests, interrupted-restart tests, duplicate-batch tests, and sampled
28
- parity checks passed. See the fictional
56
+ | Suite | Scope | Result |
57
+ | ------------------ | ------------------------------------------- | --------- |
58
+ | Contract | Query responses across the fixture corpus | Unchanged |
59
+ | Restart | Interruption at every checkpoint boundary | No gaps |
60
+ | Duplicate delivery | The same batch applied twice | No drift |
61
+ | Parity sampling | Scheduled samples against the source record | In budget |
62
+
63
+ The full logs sit in the fictional
29
64
  [evidence index](https://docs.example.com/atlas-index/evidence).
30
65
 
66
+ > [!NOTE]
67
+ > How long audit samples should be retained is still an open governance
68
+ > question, and it is tracked outside this recap.
69
+
31
70
  ## Outcome
32
71
 
33
- Incremental indexing is active. The nightly rebuild is no longer part of normal
34
- operation and remains documented for recovery only.
72
+ Corrections now reach readers in minutes instead of waiting for a nightly
73
+ window, and the operational surface got smaller rather than larger.
74
+
75
+ 1. Continuous indexing is the normal path.
76
+ 2. The rebuild remains documented, exercised, and unused.
77
+ 3. Drift is a monitored quantity rather than an assumption.
@@ -0,0 +1,104 @@
1
+ {
2
+ "schemaVersion": "explainer-kit.fact-base/v1",
3
+ "generatedAt": "2026-03-09T18:00:00Z",
4
+ "mode": "supplied",
5
+ "freshnessPolicy": "live-wins",
6
+ "sources": [
7
+ {
8
+ "id": "atlas-index-project",
9
+ "kind": "file",
10
+ "locator": "https://docs.example.com/atlas-index/project-record",
11
+ "hash": "sha256:1f0c4d2b8a6e5937c41d0b7a2e8f36154c9d0ab7e25f8341d6c07b9ae4315f28",
12
+ "observedAt": "2026-03-09T18:00:00Z"
13
+ }
14
+ ],
15
+ "claims": [
16
+ {
17
+ "id": "F-101",
18
+ "text": "Nightly full rebuilds were replaced by incremental indexing with no change to the public query contract.",
19
+ "status": "confirmed",
20
+ "sections": ["original-request"],
21
+ "citations": [
22
+ {
23
+ "sourceId": "atlas-index-project",
24
+ "locator": "project-record#request"
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "id": "F-102",
30
+ "text": "Checkpoints are partition-local, index writes are idempotent, and the full rebuild survives as a recovery path.",
31
+ "status": "confirmed",
32
+ "sections": ["key-agent-decisions"],
33
+ "citations": [
34
+ {
35
+ "sourceId": "atlas-index-project",
36
+ "locator": "project-record#decisions"
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ "id": "F-103",
42
+ "text": "A checkpointed change reader feeds idempotent workers, and a scheduled audit samples both sides for drift.",
43
+ "status": "confirmed",
44
+ "sections": ["as-built-architecture"],
45
+ "citations": [
46
+ {
47
+ "sourceId": "atlas-index-project",
48
+ "locator": "project-record#as-built"
49
+ }
50
+ ]
51
+ },
52
+ {
53
+ "id": "F-104",
54
+ "text": "Checkpoint persistence, replay-safe workers, and the drift audit shipped across three sequential milestones.",
55
+ "status": "confirmed",
56
+ "sections": ["implementation-record"],
57
+ "citations": [
58
+ {
59
+ "sourceId": "atlas-index-project",
60
+ "locator": "project-record#milestones"
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "id": "F-105",
66
+ "text": "Contract, interrupted-restart, duplicate-batch, and sampled parity suites all passed before cutover.",
67
+ "status": "confirmed",
68
+ "sections": ["validation-evidence"],
69
+ "citations": [
70
+ {
71
+ "sourceId": "atlas-index-project",
72
+ "locator": "project-record#validation"
73
+ }
74
+ ]
75
+ },
76
+ {
77
+ "id": "F-106",
78
+ "text": "Incremental indexing is active and the nightly rebuild is documented as a recovery-only procedure.",
79
+ "status": "confirmed",
80
+ "sections": ["outcome"],
81
+ "citations": [
82
+ {
83
+ "sourceId": "atlas-index-project",
84
+ "locator": "project-record#outcome"
85
+ }
86
+ ]
87
+ }
88
+ ],
89
+ "unresolvedClaims": [
90
+ {
91
+ "id": "F-107",
92
+ "text": "Retention of audit samples beyond ninety days awaits a governance decision.",
93
+ "reason": "needs-confirmation",
94
+ "sections": ["validation-evidence"],
95
+ "citations": [
96
+ {
97
+ "sourceId": "atlas-index-project",
98
+ "locator": "project-record#open-questions"
99
+ }
100
+ ]
101
+ }
102
+ ],
103
+ "overrides": []
104
+ }
@@ -1,22 +1,44 @@
1
1
  # Example fact base: Atlas Index recap
2
2
 
3
- This fictional fact base demonstrates a completed-project recap.
3
+ This fictional fact base demonstrates a completed-project recap. The prose below
4
+ is the human-readable view; `fact-base.json` beside it is the same evidence in
5
+ the `explainer-kit.fact-base/v1` shape a run actually consumes, with each claim
6
+ tagged to the narrative section it belongs to.
4
7
 
5
8
  ## Reconciled claims
6
9
 
7
10
  - **F-101 — Request:** Replace a nightly full rebuild with incremental indexing
8
11
  while preserving the existing query contract.
9
12
  Source: [approved request](https://docs.example.com/atlas-index/request).
10
- - **F-102 — As built:** A checkpointed change reader feeds idempotent index
13
+ - **F-102 — Decisions:** Checkpoints are partition-local, writes are idempotent,
14
+ and the full rebuild is retained as a recovery path.
15
+ Source: [decision log](https://docs.example.com/atlas-index/decisions).
16
+ - **F-103 — As built:** A checkpointed change reader feeds idempotent index
11
17
  workers; a scheduled audit detects drift.
12
18
  Source: [as-built record](https://docs.example.com/atlas-index/as-built).
13
- - **F-103Validation:** Contract, restart, and sampled parity checks passed.
19
+ - **F-104Implementation:** Checkpoint persistence, replay-safe workers, and
20
+ the drift audit shipped across three milestones.
21
+ Source: [milestone record](https://docs.example.com/atlas-index/milestones).
22
+ - **F-105 — Validation:** Contract, restart, duplicate-delivery, and sampled
23
+ parity checks passed.
14
24
  Source: [validation evidence](https://docs.example.com/atlas-index/evidence).
15
- - **F-104 — Outcome:** Incremental indexing is active and the nightly rebuild
25
+ - **F-106 — Outcome:** Incremental indexing is active and the nightly rebuild
16
26
  remains available only as a recovery procedure.
17
27
  Source: [outcome record](https://docs.example.com/atlas-index/outcome).
18
28
 
29
+ ## Unresolved
30
+
31
+ - **F-107 — Retention:** How long audit samples are kept is still a governance
32
+ question, so the recap reports it as unresolved rather than deciding it.
33
+
19
34
  ## Reconciliation notes
20
35
 
21
36
  An early plan proposed one shared checkpoint. Implementation evidence records a
22
37
  checkpoint per partition, so F-102 treats the implementation as authoritative.
38
+
39
+ ## Companion draft
40
+
41
+ `content.md` is the authored floor draft this evidence supports. It is written
42
+ for the v2 authoring model: tables, a fenced `diagram` block, a `timeline`,
43
+ callouts, and lists, all of which the deterministic narrative renderer turns
44
+ into real structured HTML rather than flat paragraphs.
@@ -1,5 +1,5 @@
1
1
  {
2
- "schemaVersion": "explainer-kit.recipe/v1",
2
+ "schemaVersion": "explainer-kit.recipe/v2",
3
3
  "id": "engineer-tour",
4
4
  "version": "1",
5
5
  "sourceRoles": [
@@ -11,21 +11,38 @@
11
11
  "maxBindings": 1
12
12
  }
13
13
  ],
14
- "requiredNarrative": [
15
- "orientation",
16
- "architecture",
17
- "execution-flow",
18
- "key-code",
19
- "validation"
20
- ],
21
- "artifacts": [
14
+ "floor": [
22
15
  {
23
16
  "id": "engineer-tour",
24
17
  "type": "explainer",
18
+ "authoring": "html",
25
19
  "template": "engineer-tour",
26
- "required": true
20
+ "required": true,
21
+ "briefRef": "briefs/engineer-tour.md",
22
+ "requiredNarrative": [
23
+ "orientation",
24
+ "architecture",
25
+ "execution-flow",
26
+ "key-code",
27
+ "validation"
28
+ ]
27
29
  }
28
30
  ],
31
+ "expansion": {
32
+ "profiles": [
33
+ {
34
+ "profileId": "supporting-diagram",
35
+ "type": "diagram",
36
+ "authoring": "html",
37
+ "briefRef": "briefs/supporting-diagram.md",
38
+ "shell": "diagram-shell",
39
+ "maxCount": 4
40
+ }
41
+ ],
42
+ "limits": {
43
+ "maxArtifacts": 4
44
+ }
45
+ },
29
46
  "discoveryLimits": {
30
47
  "consecutiveNoNewFindingsRounds": 2,
31
48
  "maxRounds": 8
@@ -1,5 +1,5 @@
1
1
  {
2
- "schemaVersion": "explainer-kit.recipe/v1",
2
+ "schemaVersion": "explainer-kit.recipe/v2",
3
3
  "id": "program-recap",
4
4
  "version": "1",
5
5
  "sourceRoles": [
@@ -11,22 +11,46 @@
11
11
  "maxBindings": 1
12
12
  }
13
13
  ],
14
- "requiredNarrative": [
15
- "program-overview",
16
- "wave-map",
17
- "per-wave-outcomes",
18
- "convention-evolution",
19
- "aggregate-numbers",
20
- "follow-up-ledger"
21
- ],
22
- "artifacts": [
14
+ "floor": [
23
15
  {
24
16
  "id": "program-recap",
25
17
  "type": "hub",
18
+ "authoring": "markdown",
26
19
  "template": "house-style",
27
- "required": true
20
+ "required": true,
21
+ "briefRef": "briefs/program-recap.md",
22
+ "requiredNarrative": [
23
+ "program-overview",
24
+ "wave-map",
25
+ "per-wave-outcomes",
26
+ "convention-evolution",
27
+ "aggregate-numbers",
28
+ "follow-up-ledger"
29
+ ]
28
30
  }
29
31
  ],
32
+ "expansion": {
33
+ "profiles": [
34
+ {
35
+ "profileId": "supporting-diagram",
36
+ "type": "diagram",
37
+ "authoring": "html",
38
+ "briefRef": "briefs/supporting-diagram.md",
39
+ "shell": "diagram-shell",
40
+ "maxCount": 3
41
+ },
42
+ {
43
+ "profileId": "project-page",
44
+ "type": "explainer",
45
+ "authoring": "markdown",
46
+ "briefRef": "briefs/project-page.md",
47
+ "maxCount": 12
48
+ }
49
+ ],
50
+ "limits": {
51
+ "maxArtifacts": 12
52
+ }
53
+ },
30
54
  "discoveryLimits": {
31
55
  "consecutiveNoNewFindingsRounds": 2,
32
56
  "maxRounds": 8
@@ -1,5 +1,5 @@
1
1
  {
2
- "schemaVersion": "explainer-kit.recipe/v1",
2
+ "schemaVersion": "explainer-kit.recipe/v2",
3
3
  "id": "project-explainer",
4
4
  "version": "1",
5
5
  "sourceRoles": [
@@ -11,21 +11,38 @@
11
11
  "maxBindings": 1
12
12
  }
13
13
  ],
14
- "requiredNarrative": [
15
- "planned-architecture",
16
- "decisions",
17
- "risks",
18
- "phases",
19
- "validation-approach"
20
- ],
21
- "artifacts": [
14
+ "floor": [
22
15
  {
23
16
  "id": "project-explainer",
24
17
  "type": "hub",
18
+ "authoring": "markdown",
25
19
  "template": "house-style",
26
- "required": true
20
+ "required": true,
21
+ "briefRef": "briefs/project-explainer.md",
22
+ "requiredNarrative": [
23
+ "planned-architecture",
24
+ "decisions",
25
+ "risks",
26
+ "phases",
27
+ "validation-approach"
28
+ ]
27
29
  }
28
30
  ],
31
+ "expansion": {
32
+ "profiles": [
33
+ {
34
+ "profileId": "supporting-diagram",
35
+ "type": "diagram",
36
+ "authoring": "html",
37
+ "briefRef": "briefs/supporting-diagram.md",
38
+ "shell": "diagram-shell",
39
+ "maxCount": 4
40
+ }
41
+ ],
42
+ "limits": {
43
+ "maxArtifacts": 4
44
+ }
45
+ },
29
46
  "discoveryLimits": {
30
47
  "consecutiveNoNewFindingsRounds": 2,
31
48
  "maxRounds": 8
@@ -1,5 +1,5 @@
1
1
  {
2
- "schemaVersion": "explainer-kit.recipe/v1",
2
+ "schemaVersion": "explainer-kit.recipe/v2",
3
3
  "id": "project-recap",
4
4
  "version": "1",
5
5
  "sourceRoles": [
@@ -11,22 +11,54 @@
11
11
  "maxBindings": 1
12
12
  }
13
13
  ],
14
- "requiredNarrative": [
15
- "original-request",
16
- "key-agent-decisions",
17
- "as-built-architecture",
18
- "implementation-record",
19
- "validation-evidence",
20
- "outcome"
21
- ],
22
- "artifacts": [
14
+ "floor": [
23
15
  {
24
16
  "id": "project-recap",
25
17
  "type": "hub",
18
+ "authoring": "markdown",
26
19
  "template": "house-style",
27
- "required": true
20
+ "required": true,
21
+ "briefRef": "briefs/project-recap.md",
22
+ "requiredNarrative": [
23
+ "original-request",
24
+ "key-agent-decisions",
25
+ "as-built-architecture",
26
+ "implementation-record",
27
+ "validation-evidence",
28
+ "outcome"
29
+ ]
28
30
  }
29
31
  ],
32
+ "expansion": {
33
+ "profiles": [
34
+ {
35
+ "profileId": "supporting-diagram",
36
+ "type": "diagram",
37
+ "authoring": "html",
38
+ "briefRef": "briefs/supporting-diagram.md",
39
+ "shell": "diagram-shell",
40
+ "maxCount": 4
41
+ },
42
+ {
43
+ "profileId": "deep-dive",
44
+ "type": "explainer",
45
+ "authoring": "markdown",
46
+ "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
56
+ }
57
+ ],
58
+ "limits": {
59
+ "maxArtifacts": 6
60
+ }
61
+ },
30
62
  "discoveryLimits": {
31
63
  "consecutiveNoNewFindingsRounds": 2,
32
64
  "maxRounds": 8
@@ -30,13 +30,25 @@ claims, sources, overrides, and the freshness policy. It returns:
30
30
  No provider name, command, credential, or dispatch protocol is part of this
31
31
  contract.
32
32
 
33
- Every unattended run also requires a provider-neutral author callback. An
34
- in-process caller supplies `options.author(request)`; a JSON-only CLI caller
35
- uses `--author-module author.mjs`. The core invokes it once per recipe artifact
36
- with an `AuthorRequestV1` containing the exact narrative outline, reconciled
37
- fact base, and bounded-discovery context. It must return an `AuthorResultV1`
38
- with every required section in order, non-empty prose, and non-secret
39
- provenance. The executable callback is never persisted in `run-request.json`.
33
+ Every run, interactive or unattended, also requires a provider-neutral author
34
+ callback; a run without one fails `E_AUTHOR_REQUIRED`. An in-process caller
35
+ supplies `options.author(request)`; a JSON-only CLI caller uses
36
+ `--author-module author.mjs`. The core invokes it once per resolved artifact
37
+ with an `explainer-kit.author-request/v2` payload containing the artifact
38
+ identity and type, the artifact's authoring path, the inlined brief, the
39
+ reconciled fact base, the resolved theme, the shell source for artistic
40
+ artifacts, the required narrative sections for narrative floor artifacts, and
41
+ bounded-discovery context. It must return an `explainer-kit.author-result/v2`
42
+ carrying exactly one of `content.markdown` or `content.html`, matching the
43
+ artifact's declared authoring path, plus non-secret provenance. A floor result
44
+ may also carry `proposedArtifacts` of `{id, profileId, rationale}`; the
45
+ referenced expansion profile supplies the type, authoring path, brief, and
46
+ shell. The executable callback is never persisted in `run-request.json`.
47
+
48
+ Unknown profile IDs and unsafe, duplicate, or floor-colliding artifact IDs are
49
+ hard errors. Proposals beyond a profile's `maxCount` or the recipe's
50
+ `expansion.limits.maxArtifacts` are rejected with a warning and the run
51
+ continues.
40
52
 
41
53
  ## Explicit source forms
42
54
 
@@ -57,7 +69,8 @@ provenance. The executable callback is never persisted in `run-request.json`.
57
69
  An unattended request asserts that its explicit source artifacts are already
58
70
  approved. It does not prompt, and it fails before narrative serialization when
59
71
  the author is absent, returns an invalid result, or copies excessive verbatim
60
- source text. Interactive review and same-run approval/resume remain unchanged.
72
+ source text. It auto-approves with `auto-drafted` marking once the artifacts are
73
+ built and checked.
61
74
 
62
75
  ## Pipeline and retained package
63
76
 
@@ -65,19 +78,30 @@ The core executes:
65
78
 
66
79
  1. validate request and recipe
67
80
  2. reconcile or check the fact base
68
- 3. apply bounded discovery and obtain or create recipe content
81
+ 3. apply bounded discovery
69
82
  4. resolve one theme
70
- 5. render typed artifacts
71
- 6. run structural and optional browser QA
72
- 7. write the manifest and build record
83
+ 5. author each floor artifact against its brief, evaluate expansion proposals,
84
+ and author each accepted expansion artifact
85
+ 6. render typed artifacts through the narrative renderer or validate
86
+ agent-composed HTML, per each artifact's declared authoring path
87
+ 7. run structural, guideline, and optional browser QA
88
+ 8. resolve content approval — the interactive gate pauses here, after render and
89
+ QA and before anything is published or persisted externally
90
+ 9. write the manifest and build record
73
91
 
74
92
  The run package retains the privacy-safe `run-request.json`,
75
93
  `source/content-approval.json`, `source/fact-base.json`,
76
- `source/fact-base.md`, `source/content/*.md`, optional structured
77
- `source/author/*.json` results, `theme.resolved.json`, rendered `site/` files,
78
- `manifest.json`, and `build-record.json` as far as each stage succeeds. A stage
79
- failure records a structured error and recovery action without deleting earlier
80
- outputs. Raw art direction is omitted unless the request explicitly opts in.
94
+ `source/fact-base.md`, authored content under `source/content/*.md` and
95
+ `source/content/*.html`, structured `source/author/*.json` results,
96
+ `theme.resolved.json`, rendered `site/` files, `manifest.json`, and
97
+ `build-record.json` as far as each stage succeeds. A stage failure records a
98
+ structured error and recovery action without deleting earlier outputs. Raw art
99
+ direction is omitted unless the request explicitly opts in.
100
+
101
+ Build-record stages are terminal once `passed` or `warned`. A rejected run that
102
+ is later approved reopens the render and QA stages through a narrowly guarded
103
+ record-level reset so the corrected sources are re-rendered and re-validated,
104
+ leaving an auditable trail rather than approving stale artifacts.
81
105
 
82
106
  When a caller supplies `discover({ round, recipe, factBase })`, the callback
83
107
  returns the findings added in that round. The core stops after two consecutive
@@ -93,7 +117,7 @@ Durability and publishing are never implicit.
93
117
  `record-durability.mjs`; the core never creates commits. The first evidence
94
118
  commit must contain every path and byte hash in `manifest.immutableHashes`:
95
119
  the privacy-safe request, content approval, fact-base JSON and Markdown,
96
- declared author results, all content Markdown, the resolved theme, and every
120
+ declared author results, all authored content, the resolved theme, and every
97
121
  built artifact retained in the package. Mutable `manifest.json` and
98
122
  `build-record.json` remain excluded for the separate evidence update.
99
123
  Schema-v1 manifests created before complete-package coverage are rejected
@@ -110,7 +134,9 @@ verified. Publishing remains independently human-gated by the caller.
110
134
  ## Result
111
135
 
112
136
  `runExplainer` returns the run root, manifest path, build-record path, outcome,
113
- warnings, and bounded-discovery summary. Input validation and unsupported
137
+ warnings, approval status and marking, and bounded-discovery summary. The
138
+ marking rides in the result and the approval record only; `manifest/v1` stays
139
+ frozen and carries no marking field. Input validation and unsupported
114
140
  recipes reject before output mutation. Failures after initialization return a
115
141
  `failed` result with paths to the retained record and intermediates.
116
142