@open-agent-toolkit/cli 0.2.73 → 0.2.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +3 -56
  3. package/assets/docs/cli-utilities/tool-packs.md +4 -4
  4. package/assets/docs/contributing/code.md +2 -2
  5. package/assets/docs/contributing/index.md +0 -1
  6. package/assets/docs/reference/cli-reference.md +1 -1
  7. package/assets/docs/reference/troubleshooting.md +17 -40
  8. package/assets/docs/workflows/projects/artifacts.md +16 -34
  9. package/assets/docs/workflows/projects/lifecycle.md +20 -19
  10. package/assets/docs/workflows/skills/explainer-kit.md +180 -440
  11. package/assets/docs/workflows/skills/index.md +1 -2
  12. package/assets/public-package-versions.json +4 -4
  13. package/assets/skills/explainer-kit/SKILL.md +96 -171
  14. package/assets/skills/explainer-kit/recipes/engineer-tour.json +1 -22
  15. package/assets/skills/explainer-kit/recipes/program-recap.json +1 -29
  16. package/assets/skills/explainer-kit/recipes/project-explainer.json +1 -22
  17. package/assets/skills/explainer-kit/recipes/project-recap.v2.json +1 -43
  18. package/assets/skills/explainer-kit/references/fact-base-contract.md +76 -101
  19. package/assets/skills/explainer-kit/references/recap-authoring.md +99 -0
  20. package/assets/skills/explainer-kit/schemas/manifest.schema.json +13 -135
  21. package/assets/skills/explainer-kit/scripts/bundle.mjs +712 -0
  22. package/assets/skills/explainer-kit/scripts/lib/claim-subject.mjs +40 -0
  23. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +113 -1504
  24. package/assets/skills/explainer-kit/scripts/lib/failure.mjs +13 -0
  25. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +57 -403
  26. package/assets/skills/explainer-kit/scripts/lib/qa-result.mjs +168 -0
  27. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +90 -488
  28. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +28 -545
  29. package/assets/skills/explainer-kit/scripts/lib/run-package.mjs +120 -0
  30. package/assets/skills/explainer-kit/scripts/lib/sanitize.mjs +42 -0
  31. package/assets/skills/explainer-kit/scripts/record.mjs +335 -0
  32. package/assets/skills/explainer-kit/scripts/verify.mjs +648 -0
  33. package/assets/skills/oat-explainer-kit/SKILL.md +57 -117
  34. package/assets/skills/oat-explainer-kit/references/config-contract.md +20 -64
  35. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +85 -237
  36. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +18 -10
  37. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +1 -0
  38. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +256 -21
  39. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +82 -3
  40. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +0 -162
  41. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +57 -123
  42. package/assets/skills/oat-project-autonomous/SKILL.md +14 -13
  43. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +165 -165
  44. package/assets/skills/oat-project-complete/SKILL.md +168 -349
  45. package/assets/skills/oat-project-complete/scripts/consume-persisted-recap-intent.mjs +125 -0
  46. package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +0 -30
  47. package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +4 -37
  48. package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +17 -16
  49. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +9 -174
  50. package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +1 -2
  51. package/assets/skills/oat-project-document/SKILL.md +1 -1
  52. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +165 -165
  53. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  54. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +44 -56
  55. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +165 -165
  56. package/assets/skills/oat-project-lite/SKILL.md +1 -1
  57. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +165 -165
  58. package/assets/skills/oat-project-plan/SKILL.md +5 -6
  59. package/assets/skills/oat-project-pr-final/SKILL.md +1 -1
  60. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +165 -165
  61. package/assets/skills/oat-project-quick-start/SKILL.md +1 -1
  62. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +165 -165
  63. package/assets/skills/oat-project-summary/SKILL.md +35 -25
  64. package/assets/skills/oat-wave-execute/SKILL.md +11 -36
  65. package/assets/skills/oat-wave-program/SKILL.md +13 -37
  66. package/dist/commands/config/index.d.ts.map +1 -1
  67. package/dist/commands/config/index.js +9 -113
  68. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  69. package/dist/commands/project/archive/archive-utils.js +32 -184
  70. package/dist/commands/project/archive/explainer-package-coverage.d.ts +3 -8
  71. package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -1
  72. package/dist/commands/project/archive/explainer-package-coverage.js +1 -1
  73. package/dist/config/oat-config.d.ts +0 -11
  74. package/dist/config/oat-config.d.ts.map +1 -1
  75. package/dist/config/oat-config.js +0 -34
  76. package/dist/config/resolve.d.ts.map +1 -1
  77. package/dist/config/resolve.js +0 -8
  78. package/dist/release/public-package-contract.d.ts.map +1 -1
  79. package/dist/release/public-package-contract.js +2 -10
  80. package/dist/validation/project-state.d.ts.map +1 -1
  81. package/dist/validation/project-state.js +42 -3
  82. package/package.json +2 -2
  83. package/assets/docs/contributing/explainer-kit-verification.md +0 -133
  84. package/assets/docs/workflows/skills/explainer-kit-providers.md +0 -155
  85. package/assets/skills/explainer-kit/briefs/deep-dive.md +0 -35
  86. package/assets/skills/explainer-kit/briefs/project-page.md +0 -38
  87. package/assets/skills/explainer-kit/briefs/supporting-diagram.md +0 -28
  88. package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +0 -35
  89. package/assets/skills/explainer-kit/examples/project-explainer/content.md +0 -31
  90. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +0 -22
  91. package/assets/skills/explainer-kit/examples/project-recap/content.md +0 -77
  92. package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +0 -104
  93. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +0 -44
  94. package/assets/skills/explainer-kit/examples/theme-bundle.json +0 -87
  95. package/assets/skills/explainer-kit/recipes/project-recap.v1.json +0 -93
  96. package/assets/skills/explainer-kit/references/contracts.md +0 -324
  97. package/assets/skills/explainer-kit/references/destination-contract.md +0 -210
  98. package/assets/skills/explainer-kit/references/extension-contract.md +0 -80
  99. package/assets/skills/explainer-kit/references/golden-conformance.md +0 -80
  100. package/assets/skills/explainer-kit/references/visual-review.md +0 -71
  101. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +0 -212
  102. package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +0 -241
  103. package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +0 -52
  104. package/assets/skills/explainer-kit/schemas/build-record.schema.json +0 -98
  105. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +0 -53
  106. package/assets/skills/explainer-kit/schemas/publish-receipt.v1.schema.json +0 -97
  107. package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +0 -215
  108. package/assets/skills/explainer-kit/schemas/publish-request.v1.schema.json +0 -32
  109. package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +0 -34
  110. package/assets/skills/explainer-kit/schemas/run-request.schema.json +0 -147
  111. package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +0 -149
  112. package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +0 -81
  113. package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +0 -66
  114. package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +0 -117
  115. package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +0 -80
  116. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +0 -349
  117. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +0 -418
  118. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +0 -514
  119. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +0 -643
  120. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +0 -664
  121. package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +0 -538
  122. package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +0 -414
  123. package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +0 -54
  124. package/assets/skills/explainer-kit/scripts/lib/records.mjs +0 -954
  125. package/assets/skills/explainer-kit/scripts/lib/render.mjs +0 -703
  126. package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +0 -353
  127. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +0 -759
  128. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +0 -209
  129. package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +0 -218
  130. package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +0 -157
  131. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +0 -400
  132. package/assets/skills/explainer-kit/scripts/publish.mjs +0 -76
  133. package/assets/skills/explainer-kit/scripts/record-durability.mjs +0 -64
  134. package/assets/skills/explainer-kit/scripts/render-qa.mjs +0 -461
  135. package/assets/skills/explainer-kit/scripts/run.mjs +0 -3038
  136. package/assets/skills/explainer-kit/scripts/validate.mjs +0 -59
  137. package/assets/skills/oat-explainer-kit/references/author-callback.md +0 -53
  138. package/assets/skills/oat-explainer-kit/references/migration.md +0 -144
  139. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +0 -83
  140. package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +0 -91
  141. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +0 -531
  142. package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +0 -371
  143. package/assets/skills/oat-explainer-kit/scripts/run.mjs +0 -905
  144. package/dist/commands/project/archive/explainer-source-backlinks.d.ts +0 -18
  145. package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +0 -1
  146. package/dist/commands/project/archive/explainer-source-backlinks.js +0 -27
  147. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +0 -29
  148. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +0 -1
  149. package/dist/commands/project/archive/explainer-terminal-evidence.js +0 -37
@@ -1,104 +0,0 @@
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,44 +0,0 @@
1
- # Example fact base: Atlas Index recap
2
-
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.
7
-
8
- ## Reconciled claims
9
-
10
- - **F-101 — Request:** Replace a nightly full rebuild with incremental indexing
11
- while preserving the existing query contract.
12
- Source: [approved request](https://docs.example.com/atlas-index/request).
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
17
- workers; a scheduled audit detects drift.
18
- Source: [as-built record](https://docs.example.com/atlas-index/as-built).
19
- - **F-104 — Implementation:** 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.
24
- Source: [validation evidence](https://docs.example.com/atlas-index/evidence).
25
- - **F-106 — Outcome:** Incremental indexing is active and the nightly rebuild
26
- remains available only as a recovery procedure.
27
- Source: [outcome record](https://docs.example.com/atlas-index/outcome).
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
-
34
- ## Reconciliation notes
35
-
36
- An early plan proposed one shared checkpoint. Implementation evidence records a
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,87 +0,0 @@
1
- {
2
- "schemaVersion": "explainer-kit.theme/v1",
3
- "name": "neutral-clean",
4
- "defaultMode": "light",
5
- "modes": {
6
- "light": {
7
- "surface": {
8
- "canvas": "#ffffff",
9
- "panel": "#f3f4f6",
10
- "elevated": "#e5e7eb"
11
- },
12
- "ink": { "primary": "#111827", "muted": "#4b5563", "inverse": "#ffffff" },
13
- "accent": { "primary": "#374151", "secondary": "#4b5563" },
14
- "status": {
15
- "success": "#166534",
16
- "warning": "#854d0e",
17
- "danger": "#991b1b",
18
- "info": "#1e40af"
19
- },
20
- "diagramSeries": ["#374151", "#1e40af", "#166534", "#854d0e"]
21
- },
22
- "dark": {
23
- "surface": {
24
- "canvas": "#111827",
25
- "panel": "#1f2937",
26
- "elevated": "#374151"
27
- },
28
- "ink": { "primary": "#f9fafb", "muted": "#d1d5db", "inverse": "#111827" },
29
- "accent": { "primary": "#d1d5db", "secondary": "#e5e7eb" },
30
- "status": {
31
- "success": "#86efac",
32
- "warning": "#fde047",
33
- "danger": "#fca5a5",
34
- "info": "#93c5fd"
35
- },
36
- "diagramSeries": ["#d1d5db", "#93c5fd", "#86efac", "#fde047"]
37
- }
38
- },
39
- "provenance": {
40
- "palette": "neutral",
41
- "visualProfile": "clean",
42
- "derived": false
43
- },
44
- "typography": {
45
- "sans": ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
46
- "serif": ["ui-serif", "Georgia", "serif"],
47
- "mono": ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
48
- "scale": {
49
- "caption": "0.875rem",
50
- "body": "1rem",
51
- "title": "1.5rem",
52
- "display": "2.25rem"
53
- },
54
- "lineHeight": { "caption": 1.4, "body": 1.6, "title": 1.25, "display": 1.1 }
55
- },
56
- "spacing": {
57
- "unit": 4,
58
- "scale": { "xs": 4, "sm": 8, "md": 16, "lg": 24, "xl": 40 }
59
- },
60
- "geometry": {
61
- "radius": { "sm": 4, "md": 8, "lg": 12 },
62
- "borderWidth": 1
63
- },
64
- "elevation": {
65
- "shadows": {
66
- "low": "0 1px 2px rgb(0 0 0 / 0.08)",
67
- "high": "0 12px 28px rgb(0 0 0 / 0.16)"
68
- }
69
- },
70
- "density": "comfortable",
71
- "motion": {
72
- "enabled": true,
73
- "durationMs": { "fast": 120, "normal": 200, "slow": 320 },
74
- "easing": {
75
- "standard": "ease",
76
- "emphasized": "cubic-bezier(0.2, 0, 0, 1)"
77
- },
78
- "reducedMotion": "disable-nonessential"
79
- },
80
- "diagrams": {
81
- "lineWidth": 2,
82
- "nodeGap": 32,
83
- "arrowStyle": "straight",
84
- "labelTreatment": "boxed"
85
- },
86
- "bundleHash": "sha256:7e7b935c2a6d1603fe4e9fb6bdd32859d3a8fc558db38a7b3289d78e8c1396b3"
87
- }
@@ -1,93 +0,0 @@
1
- {
2
- "schemaVersion": "explainer-kit.recipe/v2",
3
- "id": "project-recap",
4
- "version": "1",
5
- "sourceRoles": [
6
- {
7
- "role": "project",
8
- "required": true,
9
- "accepts": ["file", "directory", "git", "github"],
10
- "minBindings": 1,
11
- "maxBindings": 1
12
- }
13
- ],
14
- "floor": [
15
- {
16
- "id": "project-recap",
17
- "type": "hub",
18
- "authoring": "html",
19
- "template": "house-style",
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
- ]
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"]
48
- }
49
- ],
50
- "expansion": {
51
- "profiles": [
52
- {
53
- "profileId": "status-view",
54
- "type": "explainer",
55
- "authoring": "html",
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"]
69
- },
70
- {
71
- "profileId": "deep-dive",
72
- "type": "explainer",
73
- "authoring": "markdown",
74
- "briefRef": "briefs/deep-dive.md",
75
- "maxCount": 3,
76
- "allowedJustificationKinds": ["source-backed-detail"]
77
- }
78
- ],
79
- "limits": {
80
- "maxArtifacts": 5
81
- }
82
- },
83
- "fallback": {
84
- "mode": "deterministic-markdown",
85
- "selection": "explicit",
86
- "authoring": "markdown",
87
- "scope": "portfolio"
88
- },
89
- "discoveryLimits": {
90
- "consecutiveNoNewFindingsRounds": 2,
91
- "maxRounds": 8
92
- }
93
- }
@@ -1,324 +0,0 @@
1
- # Core run contract
2
-
3
- `scripts/run.mjs` is the config-blind orchestration entry point. It reads only
4
- the explicit `ExplainerRunRequestV1`, bundled skill assets, and source paths
5
- named by that request. It does not search for `.oat`, user configuration,
6
- provider configuration, vaults, or destinations.
7
-
8
- ## Invocation
9
-
10
- Programmatic callers import `runExplainer(request, options)`. Command-line
11
- callers use:
12
-
13
- ```bash
14
- node scripts/run.mjs --request request.json
15
- ```
16
-
17
- Federated runs require a provider-neutral critic callback. A command-line
18
- caller supplies one with `--critic-module critic.mjs`; the module exports
19
- `critic(request)` or a default function. The callback receives reconciled
20
- claims, sources, overrides, and the freshness policy. It returns:
21
-
22
- ```json
23
- {
24
- "criticId": "skeptical-pass",
25
- "executedAt": "2026-07-17T20:00:00Z",
26
- "findings": []
27
- }
28
- ```
29
-
30
- No provider name, command, credential, or dispatch protocol is part of this
31
- contract.
32
-
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/v3` payload containing the artifact
38
- identity and type, the artifact's authoring path, the inlined brief, the bundled
39
- `visualAuthoringGuidance`, the reconciled fact base, the resolved theme, the
40
- shell source for artistic artifacts, the required narrative sections for
41
- narrative floor artifacts, bounded-discovery context, and `artifactLinks`.
42
- Each canonical link entry names the planned artifact, its explicit site-relative
43
- path ending in `index.html`, and the relative `href` from the receiving
44
- artifact's own location. The guidance is
45
- loaded only from the installed skill's `references/visual-authoring.md`; no
46
- ambient or home-directory file is consulted. The callback must return an
47
- `explainer-kit.author-result/v2` carrying exactly one of `content.markdown` or
48
- `content.html`, matching the artifact's declared authoring path, plus non-secret
49
- provenance. The executable callback is never persisted in `run-request.json`.
50
-
51
- New project recap producers select immutable `project-recap@2`. Its
52
- navigational hub is the only mandatory artifact. A diagram, deck, or deep dive
53
- is an optional expansion only when its justification states a distinct reader
54
- question, supporting source evidence, and the rationale for using that medium.
55
- Project recap requests also have an explicit `recapMode`. Omitting it selects
56
- and persists `artistic`, which keeps the recipe's rich HTML floor. Selecting
57
- `deterministic-markdown` before the run applies the recipe-owned fallback to the
58
- complete planned portfolio — the hub plus any accepted expansions — without
59
- changing its artifact identities. The resulting Markdown author records and
60
- `source/content/*.md` paths remain distinct in the manifest and immutable
61
- rebuild package. An artistic author failure fails the run; the core never
62
- silently retries or downgrades it as Markdown. `project-recap@1` is immutable
63
- replay guidance only: retained v1 requests remain readable, but current
64
- producers do not select it.
65
-
66
- Before artifact authoring, a caller supplies one provider-neutral `planSet`
67
- callback. It receives the reconciled fact base and recipe policy and returns
68
- `explainer-kit.set-plan/v1`:
69
-
70
- ```json
71
- {
72
- "schemaVersion": "explainer-kit.set-plan/v1",
73
- "planId": "project-recap-set",
74
- "recipe": { "id": "project-recap", "version": "2" },
75
- "sourceIds": ["plan"],
76
- "ledger": {
77
- "terminology": [],
78
- "statuses": [],
79
- "numbers": []
80
- },
81
- "portfolio": [
82
- {
83
- "artifactId": "project-recap",
84
- "artifactType": "hub",
85
- "profileId": "recap-hub",
86
- "required": true,
87
- "sourceIds": ["plan"],
88
- "draft": "Lead with the validated outcome.",
89
- "visualIntent": "Orient the reader in the first viewport."
90
- }
91
- ]
92
- }
93
- ```
94
-
95
- The set plan owns the shared terminology/status/number ledger, source coverage,
96
- adaptive portfolio, per-artifact draft, and visual intent. Optional entries add
97
- a source-backed `justification`; undeclared sources, conflicting ledger values,
98
- duplicate artifact IDs, and unjustified optional entries are invalid. Each
99
- `author-request/v3` carries the complete immutable `setContext` plus the exact
100
- matching `plannedArtifact`. The planner finalizes floor and expansion entries
101
- before authoring; author results cannot add, remove, or replace artifacts.
102
- Version 2 requests remain valid for deterministic replay; new runs emit only
103
- the complete v3 request.
104
- When a planner draft contains a supported non-linear graph, the request also
105
- carries its closed `graphSemantics` (direction, nodes, edges, and topology).
106
- Artistic HTML must expose one exact `data-direction`. Each planned node requires
107
- one observation carrying `data-node`, `data-node-label`, `data-node-shape`, and
108
- `data-node-explicit`; each planned edge requires one observation carrying
109
- `data-from`, `data-to`, `data-edge-kind`, and `data-edge-label`. Values must
110
- match the complete frozen planner tuples exactly, including canonical HTML
111
- attribute escaping and explicit empty edge labels. Missing, extra, duplicate,
112
- malformed, noncanonical, rewired, or semantically drifting observations fail
113
- with `E_DIAGRAM_TOPOLOGY` before browser or visual-critic review.
114
-
115
- Visual review uses provider-neutral
116
- `explainer-kit.visual-review-request/v1` and
117
- `explainer-kit.visual-review-result/v1` envelopes. The request combines the
118
- shared plan with rendered artifact paths and viewport evidence, binds every
119
- rendered file, screenshot, and metrics file by raw-byte SHA-256 hash, and
120
- binds the launched Chromium name, version, and stable capture identity from
121
- `explainer-kit.browser-evidence/v2`. It derives a deterministic `requestId` and
122
- canonical `requestHash`. The critic
123
- receives a confined reader for those snapshotted paths and cannot read
124
- unlisted evidence. Core revalidates the bytes after the callback returns.
125
- Before snapshotting, each screenshot must fully decode as a bounded,
126
- CRC-verified, non-interlaced 8-bit RGB or RGBA PNG with exact zlib consumption
127
- and viewport-matched dimensions. The pixel hash established during QA must
128
- match the later visual-review snapshot.
129
- The result must echo the exact request identity and hash, name the complete
130
- artifact set, include artifact-scoped rubric findings, and select exactly one
131
- `pass`, `correct`, or `fail` disposition. Application validation must pass the
132
- reviewed request as `visualReviewRequest` context when validating the result.
133
- Request artifacts must exactly equal the planned portfolio, result artifact IDs
134
- must exactly equal that reviewed set, and every finding must name one of those
135
- artifacts. `pass` permits no findings; `correct` and `fail` require at least one
136
- correction finding. Provider, model, command, credential, and dispatch fields
137
- are not part of any core contract.
138
-
139
- Unattended project recaps require retained browser evidence at every required
140
- viewport from a branded session returned by `createBrowserProbeSession()` and a
141
- final visual-critic `pass`. The core derives `runtime.name` and
142
- `runtime.version` from the launched browser instance; caller assertions cannot
143
- replace that identity. Deterministic fixture sessions are explicit and may be
144
- used only in bounded non-production tests. A fixture session, missing trusted
145
- session, visual-critic failure, terminal `fail`, or second `correct` after the
146
- one allowed correction pass closes the QA gate with `built-needs-review`. That
147
- terminal outcome preserves rendered artifacts and all available review
148
- evidence while skipping durability and publish callbacks.
149
-
150
- The canonical immutable evidence consumer contract is
151
- `explainer-kit.package-coverage/v2`. It requires one matching launched-Chromium
152
- runtime and capture identity across browser metrics, review requests, retained
153
- attempt copies, manifest hashes, finalization, and archive validation.
154
-
155
- ## Explicit source forms
156
-
157
- - `factBase.mode: supplied` points to a valid `FactBaseV1` JSON file. The core
158
- performs only the lightweight consistency and freshness check and never
159
- invokes the critic.
160
- - `factBase.mode: federated` names explicit source bindings. File locators
161
- contain JSON with a `claims` array of
162
- `{ "id", "text", "locator"?, "sections"? }`. Optional `sections` values
163
- are recipe `requiredNarrative` IDs; untagged claims remain shared across
164
- every required section.
165
- Non-file bindings require a caller-supplied `sourceLoader(source)` callback.
166
- Every binding names its recipe `role` and `sourceSetId`. Multiple documents
167
- may share one source-set ID; recipe cardinality counts distinct sets, not
168
- documents. The core validates these bindings before loading facts, then
169
- reconciles the loaded claims and invokes the critic exactly once.
170
-
171
- Reviewed GitHub provenance is one indivisible tuple: `repository`, full
172
- lowercase 40-character `revision`, repository-relative `path`, inclusive
173
- `lineRange`, and its exact canonical `url`. Every declared source or citation
174
- backlink must include the complete tuple. The URL authority is
175
- `scripts/lib/source-backlinks.mjs`; it rejects moving refs, dot or empty path
176
- segments, decoded separators, noncanonical percent encoding, credentials,
177
- queries, and tuple/URL mismatches. Adapters must bind facts and hashes to the
178
- exact reviewed Git blob bytes, not mutable working-tree content.
179
-
180
- An unattended request asserts that its explicit source artifacts are already
181
- approved. It does not prompt, and it fails before narrative serialization when
182
- the author is absent, returns an invalid result, or copies excessive verbatim
183
- source text. It auto-approves with `auto-drafted` marking once the artifacts are
184
- built and checked.
185
-
186
- ## Pipeline and retained package
187
-
188
- The core executes:
189
-
190
- 1. validate request and recipe
191
- 2. reconcile or check the fact base
192
- 3. apply bounded discovery and produce one validated set plan
193
- 4. resolve one theme
194
- 5. author every planned artifact against the same set context
195
- 6. render typed artifacts through the narrative renderer or validate
196
- agent-composed HTML, per each artifact's declared authoring path
197
- 7. validate every post-render `href`, `src`, `srcset`, and embedded reference
198
- against the manifest paths and generated site tree; reject directory links,
199
- escapes, missing files or fragments, malformed references, and unsafe
200
- embedded resources
201
- 8. optionally apply one bounded author correction, then rerender and revalidate
202
- the complete site before any browser callback
203
- 9. run structural and guideline QA, plus required browser and independent
204
- visual review for unattended project recaps
205
- 10. close any unresolved recap review gate before external persistence
206
- 11. resolve content approval — the interactive gate pauses here, after render and
207
- QA and before anything is published or persisted externally
208
- 12. write the manifest and build record
209
-
210
- The internal-reference gate uses a bounded tokenizer/classifier rather than a
211
- general HTML parser. Relative references resolve from the current explicit file
212
- with an isolated HTTPS base, then must bind exactly to the manifest/site tree.
213
- Referenced fragments must resolve to exactly one ID in the target document;
214
- unused duplicate renderer-generated IDs do not fail indexing. Safe base64 image
215
- data references and same-document fragments are classified separately. A
216
- malformed, unresolved, or ambiguous reference fails `E_INTERNAL_REFERENCE`.
217
- Once the one correction is exhausted, including after visual correction, the run
218
- fails hard: the QA stage is recorded `failed` with code-only evidence and the
219
- scrubbed message `The qa stage failed.`, and the run is not durability- or
220
- publication-eligible. No finding is retained and nothing names the broken
221
- reference — terminal evidence is code-only by design, and the failure is
222
- attributed to the `link-validation` evidence stage rather than to
223
- `browser-review`.
224
-
225
- An incomplete interactive result includes
226
- `approval.resumeToken: "ekrt2:<64 lowercase hex characters>"`. The token is an
227
- opaque v2 digest over the run ID, original canonical absolute output root, the
228
- raw-byte SHA-256 hash of `run-request.json`, and raw-byte SHA-256 hashes of the
229
- five retained `source/set-plan/*.json` records. It is generated from trusted
230
- in-memory run identity before the interactive pause. The external caller must
231
- retain it outside the run root and echo it unchanged as
232
- `reviewedSource.resumeToken` with the later approval decision.
233
-
234
- Resume validates the fixed-length token with a timing-safe comparison before
235
- parsing retained request fields or hydrating set-plan, author, or content
236
- state. Missing, malformed, mismatched, relocated-root, or byte-drifted tokens
237
- fail `E_APPROVAL_RESUME` before planner, author, durability, or publish
238
- callbacks. Only the fixed-format authenticated `ekrt2` token is accepted.
239
- Every `ekrt1` token is rejected, including a correctly derived legacy digest.
240
- Legacy paused runs must restart to obtain an authenticated token; a retained
241
- relative `outputRoot` or any other mutable package state cannot opt into legacy
242
- resume behavior. The token is not written into the run request, content
243
- approval, build record, set-plan projections, manifest, or immutable-hash
244
- inventory.
245
-
246
- After authenticating the retained bytes, resume applies initialization's same
247
- canonical privacy-safe request projection to the current request, including the
248
- canonical output root and default render strategy, and requires an exact match
249
- with `run-request.json` before installing current request state or hydrating any
250
- package content. This binds recipe and recap mode, fact-base input, complete
251
- theme and render policy, privacy, public base URL, durability, publish
252
- destination, and run mode. Raw art direction may differ only when
253
- `privacy.retainRawArtDirection` is not `true`, because that deliberately
254
- redacted input is non-semantic after the rendered package has paused.
255
-
256
- The run package retains the privacy-safe `run-request.json`,
257
- `source/content-approval.json`, `source/fact-base.json`,
258
- `source/fact-base.md`, authored content under `source/content/*.md` and
259
- `source/content/*.html`, structured `source/author/*.json` results,
260
- `theme.resolved.json`, rendered `site/` files, `manifest.json`, and
261
- `build-record.json` as far as each stage succeeds. A stage failure records a
262
- structured error and recovery action without deleting earlier outputs. Raw art
263
- direction is omitted unless the request explicitly opts in.
264
-
265
- `scripts/lib/package-coverage.mjs` is the versioned pure-ESM authority for
266
- required immutable paths. Successful unattended recaps require complete
267
- attempt-1 evidence. Successful interactive recaps require no review paths when
268
- none are retained, but any retained review material requires a complete
269
- attempt. Failed and incomplete packages follow the same no-evidence/complete-
270
- evidence split. Only `built-needs-review` may retain a deliberately partial
271
- chain. Outside that handoff, any attempt-2 material requires complete attempt
272
- 1, the revision record, and complete attempt 2.
273
-
274
- Build-record stages are terminal once `passed` or `warned`. A rejected run that
275
- is later approved reopens the render and QA stages through a narrowly guarded
276
- record-level reset so the corrected sources are re-rendered and re-validated,
277
- leaving an auditable trail rather than approving stale artifacts.
278
-
279
- When a caller supplies `discover({ round, recipe, factBase })`, the callback
280
- returns the findings added in that round. The core stops after two consecutive
281
- empty rounds and always stops at the recipe's `maxRounds`.
282
-
283
- ## Optional seams
284
-
285
- Durability and publishing are never implicit.
286
-
287
- `built-needs-review` is not durability-eligible. The core skips both callbacks
288
- for that outcome, and downstream finalizers, exporters, and archive pushers
289
- must reject it rather than converting it to success.
290
-
291
- - `durability.strategy: none` invokes neither seam.
292
- - `durability.strategy: commit` invokes the explicit `durability` callback.
293
- Caller-created commit evidence is subsequently verified with
294
- `record-durability.mjs`; the core never creates commits. The first evidence
295
- commit must contain every path and byte hash in `manifest.immutableHashes`:
296
- the privacy-safe request, content approval, fact-base JSON and Markdown,
297
- declared author results, all authored content, the resolved theme, and every
298
- built artifact retained in the package. Mutable `manifest.json` and
299
- `build-record.json` remain excluded for the separate evidence update.
300
- Schema-v1 manifests created before complete-package coverage are rejected
301
- with a legacy-manifest diagnostic and must be regenerated; validators never
302
- invent missing hashes.
303
- - `durability.strategy: publish` invokes the explicit `publish` callback with
304
- the complete publish request. A verified receipt is subsequently recorded as
305
- durability evidence.
306
-
307
- CLI callers provide these callbacks only with `--durability-module` and
308
- `--publish-module`. Building remains `built-not-durable` until evidence is
309
- verified. Publishing remains independently human-gated by the caller.
310
-
311
- ## Result
312
-
313
- `runExplainer` returns the run root, manifest path, build-record path, outcome,
314
- warnings, approval status and marking, and bounded-discovery summary. The
315
- marking rides in the result and the approval record only; `manifest/v1` stays
316
- frozen and carries no marking field. Input validation and unsupported
317
- recipes reject before output mutation. Failures after initialization return a
318
- `failed` result with paths to the retained record and intermediates.
319
- `built-needs-review` is a distinct terminal review-gate result, not a synonym
320
- for `built-not-durable`.
321
-
322
- V1 readers reject unknown schema majors and unknown contract fields. Relative
323
- record paths are run-root confined, hashes use `sha256:<hex>`, and command
324
- metadata uses argv arrays rather than shell strings.