@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,124 +1,99 @@
1
- # Fact-base processing contract
1
+ # Fact-base contract
2
2
 
3
- `processFactBase(binding, options)` produces one
4
- `explainer-kit.fact-base/v1` record plus processing diagnostics. It has no
5
- provider-specific dispatch logic and reads no ambient configuration.
3
+ `bundle.mjs` writes the authoring inputs under `<run-root>/source/`. The
4
+ machine contract is `fact-base.json`; `fact-base.md` is its readable rendering;
5
+ `ledger.json` is the bounded verification index.
6
6
 
7
- ## Result
7
+ ## Fact-base record
8
8
 
9
- The function resolves to:
9
+ `source/fact-base.json` is an `explainer-kit.fact-base/v1` object with exactly
10
+ these eight required keys:
10
11
 
11
- ```js
12
- {
13
- factBase, // valid explainer-kit.fact-base/v1
14
- checks, // consistency/freshness diagnostics
15
- critic, // critic invocation and provenance metadata
16
- }
17
- ```
12
+ | Key | Flow value or meaning |
13
+ | ------------------ | ---------------------------------------------------------------------------- |
14
+ | `schemaVersion` | `explainer-kit.fact-base/v1` |
15
+ | `generatedAt` | ISO date-time for this bundle |
16
+ | `mode` | `supplied`; the agent-authored flow assembles the fact base before authoring |
17
+ | `freshnessPolicy` | `live-wins` |
18
+ | `sources` | Hash-bound allowlisted input files |
19
+ | `claims` | Confirmed source-backed claims |
20
+ | `unresolvedClaims` | Inputs or claims that cannot be stated as confirmed |
21
+ | `overrides` | Explicit claim decisions; normally empty |
18
22
 
19
- All claims are cited. Claims that cannot be reconciled remain in
20
- `unresolvedClaims` with one of the contract's closed reason values.
23
+ The record is canonical JSON and must pass
24
+ `validateContract('fact-base', value)` before authoring starts. It carries no
25
+ claims index or browser evidence.
21
26
 
22
- ## Supplied mode
27
+ ## Sources and citations
23
28
 
24
- Use:
29
+ Each selected input is represented by a source:
25
30
 
26
- ```js
27
- await processFactBase({
28
- mode: 'supplied',
29
- freshnessPolicy: 'live-wins',
30
- factBase,
31
- });
31
+ ```json
32
+ {
33
+ "id": "source-1",
34
+ "kind": "file",
35
+ "locator": "plan.md",
36
+ "hash": "sha256:…"
37
+ }
32
38
  ```
33
39
 
34
- The processor validates the supplied v1 record, verifies unique source and
35
- claim IDs, verifies that every citation names a declared source, verifies that
36
- every override names a confirmed claim, and compares `generatedAt` plus each
37
- available source `observedAt` with the freshness window. Staleness produces a
38
- warning; structural or citation inconsistency rejects the input.
39
-
40
- Supplied mode never invokes the adversarial critic. Its `critic` result is
41
- `{ invoked: false, reason: 'supplied-mode-lightweight-check-only' }`.
40
+ The flow may add the `role: "bundle-input"` marker used when the manifest
41
+ copies input hashes. Every claim citation has exactly the source identity and
42
+ the source-relative location:
42
43
 
43
- ## Federated mode
44
+ ```json
45
+ { "sourceId": "source-1", "locator": "plan.md:40-44" }
46
+ ```
44
47
 
45
- Each source document contains a schema-compatible source and extracted claims:
48
+ Do not add `path`, `lineRange`, repository, or URL backlink fields to
49
+ agent-authored-flow citations. Every citation must name a declared source.
46
50
 
47
- ```js
48
- {
49
- mode: 'federated',
50
- freshnessPolicy: 'live-wins',
51
- sourceDocuments: [{
52
- source: {
53
- id,
54
- kind,
55
- locator,
56
- revision,
57
- hash,
58
- observedAt,
59
- authoritativeFor,
60
- },
61
- claims: [{ id, text, locator, sections }],
62
- }],
63
- overrides: [{ claimId, decision, confirmedAt }],
64
- }
65
- ```
51
+ ## Claims
66
52
 
67
- Optional `sections` entries are recipe `requiredNarrative` IDs. Tagged claims
68
- are routed only to those sections; untagged claims remain shared context for
69
- every required section. Federated reconciliation preserves shared scope when
70
- any agreeing selected observation is untagged.
71
-
72
- For conflicting text under one claim ID, an `authoritativeFor` declaration
73
- wins first. Otherwise the newest `observedAt` wins. A tie remains
74
- `contradictory`. Operator overrides take final precedence, produce an
75
- `overridden` claim, remain explicit in `overrides`, and suppress critic
76
- findings for that claim.
77
-
78
- Federated processing requires `options.critic`, an asynchronous,
79
- provider-neutral callback. The callback receives only data:
80
-
81
- ```js
82
- async function critic({ freshnessPolicy, sources, claims, overrides }) {
83
- return {
84
- criticId: 'stable-callback-id',
85
- executedAt: new Date().toISOString(),
86
- findings: [
87
- {
88
- claimId: 'status',
89
- classification: 'contradictory',
90
- text: 'The status sources disagree.',
91
- sourceIds: ['snapshot', 'live'],
92
- },
93
- ],
94
- };
95
- }
96
- ```
53
+ Confirmed claims have `{ id, text, status: "confirmed", citations }`.
54
+ Unresolved claims retain their text and citations with one schema-defined
55
+ reason: `contradictory`, `stale`, `missing-evidence`, or
56
+ `needs-confirmation`. Inputs that cannot be parsed are represented here rather
57
+ than silently omitted.
97
58
 
98
- The seam deliberately contains no provider, model, command, or dispatch
99
- field. The caller owns critic execution; the core only invokes the callback
100
- and integrates its returned data.
59
+ The author may summarize confirmed claims but must not invent a connective
60
+ fact. An unresolved claim remains visibly uncertain in the artifact.
101
61
 
102
- ## Critic provenance
62
+ ## Anchor ledger
103
63
 
104
- Every federated invocation adds one source:
64
+ `source/ledger.json` is derived from the same claims and has four keys:
105
65
 
106
- ```js
66
+ ```json
107
67
  {
108
- id: `critic:${criticId}`,
109
- kind: 'other',
110
- locator: `critic-callback:${criticId}`,
111
- hash: canonicalHash(criticResult),
112
- observedAt: executedAt,
68
+ "terminology": [{ "term": "agent-authored-recap" }],
69
+ "numbers": [{ "subject": "p02", "value": "4" }],
70
+ "statuses": [{ "subject": "p02", "value": "in_progress" }],
71
+ "claims": [
72
+ {
73
+ "subject": "p02",
74
+ "value": "4",
75
+ "kind": "number",
76
+ "claimId": "claim-1"
77
+ }
78
+ ]
113
79
  }
114
80
  ```
115
81
 
116
- The result's `critic` metadata repeats the stable critic ID, execution time,
117
- source ID, and canonical result hash. Integrated findings cite both this
118
- synthetic critic source and every declared source named by the finding. This
119
- makes the critic's contribution auditable without exposing or depending on a
120
- provider-specific implementation.
82
+ `terminology`, `numbers`, and `statuses` are the bounded anchor groups used by
83
+ the ledger-to-page cohesion check. Each group contains at most 12 entries; an
84
+ individual group may be empty, but all three may not be empty together.
85
+
86
+ `claims` is the page-to-ledger index for numeric, date, and closed-vocabulary
87
+ status tokens. Its subject comes from the source table row, sentence
88
+ identifier, or heading. The authored page keeps each token with that subject
89
+ so `verify.mjs` can match the exact `(subject, value, kind)` tuple.
90
+
91
+ ## Consumers
121
92
 
122
- Critic classifications map directly to unresolved-claim reasons. A finding
123
- removes a previously confirmed claim and creates an unresolved claim, or
124
- updates an already unresolved claim while preserving its existing citations.
93
+ - The host agent reads `fact-base.json`, `fact-base.md`, and `ledger.json`
94
+ while authoring.
95
+ - `verify.mjs` checks ledger anchors against the page and machine-readable page
96
+ claims against `ledger.claims`.
97
+ - `record.mjs` carries the fact-base hash and source input hashes into
98
+ `manifest.json`.
99
+ - A human uses source locators and claim IDs to diagnose verification findings.
@@ -0,0 +1,99 @@
1
+ # Agent-authored recap mechanics
2
+
3
+ Use this reference with the recipe's bundled author brief. The brief defines
4
+ the audience, voice, and narrative intent; this reference defines how to turn a
5
+ prepared run into one verifiable HTML artifact.
6
+
7
+ ## Read the run inputs
8
+
9
+ Read these files before authoring:
10
+
11
+ - `source/fact-base.json` for confirmed and unresolved claims and their source
12
+ locators;
13
+ - `source/fact-base.md` for a readable rendering of the same fact base;
14
+ - `source/ledger.json` for the bounded terminology, number, date, and status
15
+ anchors verification expects;
16
+ - `theme.resolved.json` for the resolved palette and typography; and
17
+ - the selected recipe's `floor[0]`, including `template`,
18
+ `requiredNarrative`, and `briefRef`.
19
+
20
+ Read the bundled file named by `briefRef` verbatim. Do not replace its
21
+ audience or editorial instructions with generic recap prose.
22
+
23
+ ## Preserve recipe anchors
24
+
25
+ Write each `requiredNarrative` value as a non-empty `<section id="…">`:
26
+
27
+ | Recipe | Required section IDs |
28
+ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
29
+ | `project-recap` | `original-request`, `key-agent-decisions`, `as-built-architecture`, `implementation-record`, `validation-evidence`, `outcome` |
30
+ | `program-recap` | `program-overview`, `wave-map`, `per-wave-outcomes`, `convention-evolution`, `aggregate-numbers`, `follow-up-ledger` |
31
+ | `project-explainer` | `planned-architecture`, `decisions`, `risks`, `phases`, `validation-approach` |
32
+ | `engineer-tour` | `orientation`, `architecture`, `execution-flow`, `key-code`, `validation` |
33
+
34
+ Navigation should link to these IDs with descriptive labels. Keep every
35
+ section useful without JavaScript.
36
+
37
+ ## Build from the recipe shell
38
+
39
+ Copy `templates/<floor[0].template>.html` to `site/index.html`, then replace its
40
+ tokens:
41
+
42
+ - `THEME_CSS`: CSS derived from `theme.resolved.json`;
43
+ - `TITLE`, `DESCRIPTION`, and `EYEBROW`: concise framing grounded in the fact
44
+ base;
45
+ - `NAVIGATION`: links to every required section;
46
+ - `CONTENT`: the authored sections and their source-grounded visuals; and
47
+ - `FOOTER`: provenance or reading guidance that does not dump source text.
48
+
49
+ The `engineer-tour` shell also has a `DIAGRAM` token. Fill it only with
50
+ source-grounded inline SVG markup. Preserve every bundled script byte-for-byte;
51
+ do not add scripts or event-handler attributes.
52
+
53
+ ## Keep the artifact self-contained
54
+
55
+ Produce one `site/index.html` with inline CSS and inline, shell-approved
56
+ scripts only. Do not load fonts, images, styles, scripts, or other resources
57
+ from external URLs. Do not paste source documents or the fact base into the
58
+ page. Summarize and structure the evidence for the reader.
59
+
60
+ ## Trace every machine-checkable claim
61
+
62
+ Spell terms, identifiers, numbers, dates, and closed-vocabulary statuses
63
+ exactly as the fact base spells them. Keep each number, date, or status in the
64
+ same sentence, list item, or table row as its subject so verification can match
65
+ the `(subject, value)` pair in `source/ledger.json`.
66
+ For cards, definition lists, and other non-paragraph elements, verification
67
+ uses the nearest bold or definition label or preceding heading as the subject,
68
+ with the enclosing section ID as fallback.
69
+
70
+ Treat `unresolvedClaims` as unresolved. Label uncertainty as
71
+ `needs confirmation`; do not turn it into a confirmed narrative bridge.
72
+ Citations remain in the fact base and should inform the prose without becoming
73
+ a source dump.
74
+
75
+ ## Review visual composition
76
+
77
+ Follow `references/visual-authoring.md` for hierarchy, responsive navigation,
78
+ tables, diagrams, and the final composition check. The page itself must not
79
+ overflow horizontally. Put intrinsically wide content inside a bounded,
80
+ scrollable container.
81
+
82
+ ## Submit host-rung evidence
83
+
84
+ When the host has browser capability:
85
+
86
+ 1. Open `file://<run-root>/site/index.html`.
87
+ 2. Capture the page at widths 320, 768, and 1440 into
88
+ `<run-root>/qa/320.png`, `768.png`, and `1440.png`.
89
+ 3. Inspect all three screenshots. Confirm no horizontal page overflow, every
90
+ required section is visible, headings remain readable at 320 pixels, and no
91
+ text overlaps.
92
+ 4. Compute the SHA-256 of the exact `site/index.html` bytes captured.
93
+ 5. Run `verify.mjs` with `--rung host`, `--screenshots <run-root>/qa`,
94
+ `--artifact-sha256 <sha256:hex>`, `--visual-verdict pass|findings`, and
95
+ concise `--visual-notes`.
96
+
97
+ A screenshot capture without inspection is not verification. If the artifact
98
+ hash or any PNG binding is invalid, verification records the browser rung as
99
+ `none`.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "explainer-kit.manifest/v1",
4
- "title": "ArtifactManifestV1",
3
+ "$id": "explainer-kit.manifest/v2",
4
+ "title": "ArtifactManifestV2",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
7
7
  "required": [
@@ -10,16 +10,16 @@
10
10
  "slug",
11
11
  "recipe",
12
12
  "createdAt",
13
+ "mode",
13
14
  "source",
14
15
  "theme",
15
16
  "artifacts",
16
17
  "immutableHashes",
17
18
  "outcome",
18
- "buildRecord",
19
19
  "warnings"
20
20
  ],
21
21
  "properties": {
22
- "schemaVersion": { "const": "explainer-kit.manifest/v1" },
22
+ "schemaVersion": { "const": "explainer-kit.manifest/v2" },
23
23
  "runId": { "type": "string", "minLength": 1 },
24
24
  "slug": {
25
25
  "type": "string",
@@ -35,6 +35,7 @@
35
35
  }
36
36
  },
37
37
  "createdAt": { "type": "string", "format": "date-time" },
38
+ "mode": { "enum": ["unattended", "interactive"] },
38
39
  "source": {
39
40
  "type": "object",
40
41
  "additionalProperties": false,
@@ -42,63 +43,27 @@
42
43
  "properties": {
43
44
  "factBasePath": { "$ref": "#/$defs/safeRelativePath" },
44
45
  "factBaseHash": { "$ref": "#/$defs/hash" },
45
- "sourceRevision": { "type": "string", "minLength": 1 },
46
- "inputHashes": { "$ref": "#/$defs/hashMap" },
47
- "authorResultPaths": {
48
- "type": "array",
49
- "items": { "$ref": "#/$defs/safeRelativePath" },
50
- "minItems": 1,
51
- "uniqueItems": true
52
- },
53
- "backlinks": {
54
- "type": "array",
55
- "items": { "$ref": "#/$defs/sourceBacklink" },
56
- "uniqueItems": true
57
- }
46
+ "inputHashes": { "$ref": "#/$defs/hashMap" }
58
47
  }
59
48
  },
60
49
  "theme": {
61
50
  "type": "object",
62
51
  "additionalProperties": false,
63
- "required": ["path", "hash", "derived"],
52
+ "required": ["path", "hash"],
64
53
  "properties": {
65
54
  "path": { "const": "theme.resolved.json" },
66
- "hash": { "$ref": "#/$defs/hash" },
67
- "derived": { "type": "boolean" }
55
+ "hash": { "$ref": "#/$defs/hash" }
68
56
  }
69
57
  },
70
58
  "artifacts": {
71
59
  "type": "array",
72
60
  "items": { "$ref": "#/$defs/artifactEntry" },
61
+ "minItems": 1,
73
62
  "uniqueItems": true
74
63
  },
75
64
  "immutableHashes": { "$ref": "#/$defs/hashMap" },
76
65
  "outcome": {
77
- "enum": [
78
- "built-durable",
79
- "built-not-durable",
80
- "built-needs-review",
81
- "failed",
82
- "incomplete"
83
- ]
84
- },
85
- "buildRecord": {
86
- "type": "object",
87
- "additionalProperties": false,
88
- "required": ["path", "hash"],
89
- "properties": {
90
- "path": { "const": "build-record.json" },
91
- "hash": { "$ref": "#/$defs/hash" }
92
- }
93
- },
94
- "publishReceipt": {
95
- "type": "object",
96
- "additionalProperties": false,
97
- "required": ["path", "hash"],
98
- "properties": {
99
- "path": { "const": "publish-receipt.json" },
100
- "hash": { "$ref": "#/$defs/hash" }
101
- }
66
+ "enum": ["built", "built-needs-review", "failed", "incomplete"]
102
67
  },
103
68
  "warnings": {
104
69
  "type": "array",
@@ -113,110 +78,23 @@
113
78
  "safeRelativePath": {
114
79
  "type": "string",
115
80
  "minLength": 1,
116
- "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+$"
81
+ "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)(?:\\.|\\.\\.)(?:/|$))(?!.*\\\\).+$"
117
82
  },
118
83
  "hashMap": {
119
84
  "type": "object",
120
- "description": "Raw-byte SHA-256 coverage for the complete immutable package, including required browser, cohesion, visual-review attempt, and revision evidence.",
121
85
  "propertyNames": { "$ref": "#/$defs/safeRelativePath" },
122
86
  "additionalProperties": { "$ref": "#/$defs/hash" }
123
87
  },
124
- "sourceBacklink": {
125
- "type": "object",
126
- "additionalProperties": false,
127
- "required": ["sourceId", "url"],
128
- "properties": {
129
- "sourceId": { "type": "string", "minLength": 1 },
130
- "url": {
131
- "type": "string",
132
- "pattern": "^https://github\\.com/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+/blob/[a-f0-9]{40}/[^\\s?#]+#L[1-9][0-9]*(?:-L[1-9][0-9]*)?$"
133
- }
134
- }
135
- },
136
- "failure": {
137
- "type": "object",
138
- "additionalProperties": false,
139
- "required": ["code", "message", "recovery"],
140
- "properties": {
141
- "code": { "type": "string", "minLength": 1 },
142
- "message": { "type": "string", "minLength": 1 },
143
- "recovery": {
144
- "type": "array",
145
- "items": { "type": "string", "minLength": 1 },
146
- "minItems": 1
147
- }
148
- }
149
- },
150
- "durableEvidence": {
151
- "type": "object",
152
- "additionalProperties": false,
153
- "required": ["kind", "ref", "paths", "attestedAt"],
154
- "properties": {
155
- "kind": { "enum": ["commit", "publish"] },
156
- "ref": { "type": "string", "minLength": 1 },
157
- "paths": {
158
- "type": "array",
159
- "items": { "$ref": "#/$defs/safeRelativePath" },
160
- "minItems": 1,
161
- "uniqueItems": true
162
- },
163
- "attestedAt": { "type": "string", "format": "date-time" },
164
- "supersedes": {
165
- "type": "object",
166
- "additionalProperties": false,
167
- "required": ["ref", "paths"],
168
- "properties": {
169
- "ref": { "type": "string", "minLength": 1 },
170
- "paths": {
171
- "type": "array",
172
- "items": { "$ref": "#/$defs/safeRelativePath" },
173
- "minItems": 1,
174
- "uniqueItems": true
175
- }
176
- }
177
- }
178
- }
179
- },
180
- "rebuild": {
181
- "type": "object",
182
- "additionalProperties": false,
183
- "required": ["argv", "cwd", "inputHashes"],
184
- "properties": {
185
- "argv": {
186
- "type": "array",
187
- "items": { "type": "string" },
188
- "minItems": 1
189
- },
190
- "cwd": { "type": "string", "minLength": 1 },
191
- "inputHashes": { "$ref": "#/$defs/hashMap" }
192
- }
193
- },
194
88
  "artifactEntry": {
195
89
  "type": "object",
196
90
  "additionalProperties": false,
197
- "required": ["id", "type", "contentPath", "status", "rebuildable"],
91
+ "required": ["id", "type", "contentPath", "hash", "status"],
198
92
  "properties": {
199
93
  "id": { "type": "string", "minLength": 1 },
200
94
  "type": { "enum": ["hub", "diagram", "explainer", "deck", "catalog"] },
201
95
  "contentPath": { "$ref": "#/$defs/safeRelativePath" },
202
- "renderedPath": {
203
- "allOf": [
204
- { "$ref": "#/$defs/safeRelativePath" },
205
- { "pattern": "^site/" }
206
- ],
207
- "pattern": "^site/"
208
- },
209
- "mediaType": { "type": "string", "minLength": 1 },
210
- "status": { "enum": ["built", "failed", "skipped"] },
211
96
  "hash": { "$ref": "#/$defs/hash" },
212
- "rebuildable": { "type": "boolean" },
213
- "rebuild": { "$ref": "#/$defs/rebuild" },
214
- "durableEvidence": {
215
- "type": "array",
216
- "items": { "$ref": "#/$defs/durableEvidence" },
217
- "uniqueItems": true
218
- },
219
- "failure": { "$ref": "#/$defs/failure" }
97
+ "status": { "enum": ["built", "failed"] }
220
98
  }
221
99
  }
222
100
  }