@open-agent-toolkit/cli 0.2.73 → 0.2.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +3 -56
- package/assets/docs/cli-utilities/tool-packs.md +4 -4
- package/assets/docs/contributing/code.md +2 -2
- package/assets/docs/contributing/index.md +0 -1
- package/assets/docs/reference/cli-reference.md +1 -1
- package/assets/docs/reference/troubleshooting.md +17 -40
- package/assets/docs/workflows/projects/artifacts.md +16 -34
- package/assets/docs/workflows/projects/lifecycle.md +20 -19
- package/assets/docs/workflows/skills/explainer-kit.md +180 -440
- package/assets/docs/workflows/skills/index.md +1 -2
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +96 -171
- package/assets/skills/explainer-kit/recipes/engineer-tour.json +1 -22
- package/assets/skills/explainer-kit/recipes/program-recap.json +1 -29
- package/assets/skills/explainer-kit/recipes/project-explainer.json +1 -22
- package/assets/skills/explainer-kit/recipes/project-recap.v2.json +1 -43
- package/assets/skills/explainer-kit/references/fact-base-contract.md +76 -101
- package/assets/skills/explainer-kit/references/recap-authoring.md +99 -0
- package/assets/skills/explainer-kit/schemas/manifest.schema.json +13 -135
- package/assets/skills/explainer-kit/scripts/bundle.mjs +712 -0
- package/assets/skills/explainer-kit/scripts/lib/claim-subject.mjs +40 -0
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +113 -1504
- package/assets/skills/explainer-kit/scripts/lib/failure.mjs +13 -0
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +57 -403
- package/assets/skills/explainer-kit/scripts/lib/qa-result.mjs +168 -0
- package/assets/skills/explainer-kit/scripts/lib/qa.mjs +90 -488
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +28 -545
- package/assets/skills/explainer-kit/scripts/lib/run-package.mjs +120 -0
- package/assets/skills/explainer-kit/scripts/lib/sanitize.mjs +42 -0
- package/assets/skills/explainer-kit/scripts/record.mjs +335 -0
- package/assets/skills/explainer-kit/scripts/verify.mjs +648 -0
- package/assets/skills/oat-explainer-kit/SKILL.md +57 -117
- package/assets/skills/oat-explainer-kit/references/config-contract.md +20 -64
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +85 -237
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +18 -10
- package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +1 -0
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +256 -21
- package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +82 -3
- package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +0 -162
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +57 -123
- package/assets/skills/oat-project-autonomous/SKILL.md +14 -13
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +165 -165
- package/assets/skills/oat-project-complete/SKILL.md +168 -349
- package/assets/skills/oat-project-complete/scripts/consume-persisted-recap-intent.mjs +125 -0
- package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +0 -30
- package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +4 -37
- package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +17 -16
- package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +9 -174
- package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +1 -2
- package/assets/skills/oat-project-document/SKILL.md +1 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +44 -56
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-lite/SKILL.md +1 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-plan/SKILL.md +5 -6
- package/assets/skills/oat-project-pr-final/SKILL.md +1 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-quick-start/SKILL.md +1 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-summary/SKILL.md +35 -25
- package/assets/skills/oat-wave-execute/SKILL.md +11 -36
- package/assets/skills/oat-wave-program/SKILL.md +13 -37
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +9 -113
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +32 -184
- package/dist/commands/project/archive/explainer-package-coverage.d.ts +3 -8
- package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -1
- package/dist/commands/project/archive/explainer-package-coverage.js +1 -1
- package/dist/config/oat-config.d.ts +0 -11
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +0 -34
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +0 -8
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +2 -10
- package/dist/validation/project-state.d.ts.map +1 -1
- package/dist/validation/project-state.js +42 -3
- package/package.json +2 -2
- package/assets/docs/contributing/explainer-kit-verification.md +0 -133
- package/assets/docs/workflows/skills/explainer-kit-providers.md +0 -155
- package/assets/skills/explainer-kit/briefs/deep-dive.md +0 -35
- package/assets/skills/explainer-kit/briefs/project-page.md +0 -38
- package/assets/skills/explainer-kit/briefs/supporting-diagram.md +0 -28
- package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +0 -35
- package/assets/skills/explainer-kit/examples/project-explainer/content.md +0 -31
- package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +0 -22
- package/assets/skills/explainer-kit/examples/project-recap/content.md +0 -77
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +0 -104
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +0 -44
- package/assets/skills/explainer-kit/examples/theme-bundle.json +0 -87
- package/assets/skills/explainer-kit/recipes/project-recap.v1.json +0 -93
- package/assets/skills/explainer-kit/references/contracts.md +0 -324
- package/assets/skills/explainer-kit/references/destination-contract.md +0 -210
- package/assets/skills/explainer-kit/references/extension-contract.md +0 -80
- package/assets/skills/explainer-kit/references/golden-conformance.md +0 -80
- package/assets/skills/explainer-kit/references/visual-review.md +0 -71
- package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +0 -212
- package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +0 -241
- package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +0 -52
- package/assets/skills/explainer-kit/schemas/build-record.schema.json +0 -98
- package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +0 -53
- package/assets/skills/explainer-kit/schemas/publish-receipt.v1.schema.json +0 -97
- package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +0 -215
- package/assets/skills/explainer-kit/schemas/publish-request.v1.schema.json +0 -32
- package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +0 -34
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +0 -147
- package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +0 -149
- package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +0 -81
- package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +0 -66
- package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +0 -117
- package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +0 -80
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +0 -349
- package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +0 -418
- package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +0 -514
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +0 -643
- package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +0 -664
- package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +0 -538
- package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +0 -414
- package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +0 -54
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +0 -954
- package/assets/skills/explainer-kit/scripts/lib/render.mjs +0 -703
- package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +0 -353
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +0 -759
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +0 -209
- package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +0 -218
- package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +0 -157
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +0 -400
- package/assets/skills/explainer-kit/scripts/publish.mjs +0 -76
- package/assets/skills/explainer-kit/scripts/record-durability.mjs +0 -64
- package/assets/skills/explainer-kit/scripts/render-qa.mjs +0 -461
- package/assets/skills/explainer-kit/scripts/run.mjs +0 -3038
- package/assets/skills/explainer-kit/scripts/validate.mjs +0 -59
- package/assets/skills/oat-explainer-kit/references/author-callback.md +0 -53
- package/assets/skills/oat-explainer-kit/references/migration.md +0 -144
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +0 -83
- package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +0 -91
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +0 -531
- package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +0 -371
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +0 -905
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts +0 -18
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +0 -1
- package/dist/commands/project/archive/explainer-source-backlinks.js +0 -27
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +0 -29
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +0 -1
- package/dist/commands/project/archive/explainer-terminal-evidence.js +0 -37
|
@@ -1,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.
|