@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,210 +0,0 @@
1
- # S3 static destination contract
2
-
3
- The `s3-static` connector publishes only files declared as built artifacts in a
4
- validated manifest. Publishing is human-gated:
5
-
6
- ```bash
7
- node scripts/publish.mjs \
8
- --request /path/to/publish-request.json \
9
- --receipt /path/to/publish-receipt.json \
10
- --confirm-publish
11
- ```
12
-
13
- New requests use `explainer-kit.publish-request/v2` and explicitly declare
14
- `publicAccess` as `public` or `protected`. V1 remains readable as public-mode
15
- replay. Credentials come only from the standard AWS credential chain or the
16
- request's optional profile. Never put access keys, secret keys, session tokens,
17
- or SSO tokens in a request.
18
-
19
- ## How the two roots compose
20
-
21
- `s3Uri` and `publicBaseUrl` are each normalized without trailing slashes. For a
22
- path `P` relative to `siteRoot`, the connector writes `<s3Uri>/P` and verifies
23
- `<publicBaseUrl>/P`. That composition is the whole of the relationship.
24
-
25
- **No relational validation is performed between the two roots, by design.** The
26
- mapping from an S3 key to a public URL is underdetermined by these two strings:
27
- it lives in CDN configuration the connector cannot read. Both of these are
28
- legitimate, and they disagree structurally:
29
-
30
- | Shape | `s3Uri` | `publicBaseUrl` |
31
- | ----- | ---------------------------- | ----------------------------- |
32
- | A | `s3://bucket/repositories/x` | `https://host/repositories/x` |
33
- | B | `s3://bucket/explainers` | `https://host` |
34
-
35
- B is an ordinary CloudFront **Origin Path** deployment, where a bucket prefix is
36
- mapped to the distribution root. Requiring the public path to equal the S3 key
37
- prefix rejects it. Suffix-containment does not rescue the rule either — an empty
38
- public path is a suffix of everything, so B would pass vacuously while
39
- path-rewriting deployments (CloudFront Functions, Lambda@Edge, custom origins)
40
- still produce false rejections.
41
-
42
- Divergence between the two paths is therefore reported as a **non-blocking
43
- warning**, never a failure. Correctness of an advertised URL is established by
44
- verification, not by string shape — which is also why `publicAccess: protected`,
45
- where no anonymous fetch happens, cannot establish it at all.
46
-
47
- For example:
48
-
49
- | Input | Value |
50
- | ----------------------- | --------------------------------------------------------------- |
51
- | `siteRoot` | `/tmp/run/site` |
52
- | manifest `renderedPath` | `site/initiatives/demo/index.html` |
53
- | `s3Uri` | `s3://example-bucket/published` |
54
- | `publicBaseUrl` | `https://cdn.example.com/published` |
55
- | object | `s3://example-bucket/published/initiatives/demo/index.html` |
56
- | public URL | `https://cdn.example.com/published/initiatives/demo/index.html` |
57
-
58
- Use explicit `index.html` URLs. Directory redirects are not portable evidence.
59
- The destination must serve the uploaded bytes at the composed public path. That
60
- is a requirement on the deployment, not something the connector validates from
61
- the two root strings; see below.
62
-
63
- ## The manifest a connector receives is intentionally incomplete
64
-
65
- The core persists the manifest **before** it invokes the publisher callback, so
66
- the file at `manifestPath` carries `outcome: "incomplete"` while the `publish`
67
- stage is still `running`. This is a contractually intended intermediate state,
68
- not a corrupt or half-written record, and a connector must not reject it on the
69
- strength of `outcome` alone.
70
-
71
- Do not decide publishability from the manifest by itself. Read the build record
72
- named by `manifest.buildRecord.path` (resolved relative to the manifest) and
73
- require all of:
74
-
75
- - the manifest carries no `visual-review-required:` warning;
76
- - the build record's own `outcome` is `incomplete`;
77
- - its `publish` stage exists and is `running`; and
78
- - every stage before `publish` is `passed`, `warned`, or `skipped` and carries
79
- no `visual-review-required:` warning.
80
-
81
- Only that combination makes an `incomplete` manifest publishable. The one other
82
- eligible shape is a finalized `built-durable` manifest that is not
83
- review-flagged. Any other `incomplete` manifest, and every manifest whose run is
84
- flagged, failed, or superseded, must be refused. The built-in connector performs
85
- exactly this check before its first network call; third-party connectors are
86
- required to perform an equivalent one.
87
-
88
- The published bytes cannot diverge from the finalized manifest: the catalog
89
- projection omits `outcome` and `warnings`, and both manifest writes share one
90
- `finalizedAt`. After the callback returns a valid receipt, the core rewrites the
91
- manifest with its terminal outcome.
92
-
93
- ## Safety and ordering
94
-
95
- The connector validates the request, manifest, paths, hashes, and duplicate
96
- site-relative paths before network access. It then:
97
-
98
- 1. uploads a sentinel whose path contains the run ID and a random 128-bit
99
- suffix;
100
- 2. verifies the sentinel with a service-computed SHA-256 checksum or an
101
- authenticated download hash;
102
- 3. for public destinations, fetches that exact sentinel anonymously through the
103
- public root; protected destinations skip this public fetch explicitly;
104
- 4. deletes only that sentinel;
105
- 5. uploads or idempotently skips each declared artifact;
106
- 6. verifies exact object bytes from service-computed SHA-256 evidence or an
107
- authenticated download hash, then additionally verifies the exact anonymous
108
- response bytes for public destinations; and
109
- 7. atomically writes `explainer-kit.publish-receipt/v2` with separate
110
- authenticated-object and anonymous-public verification facts.
111
-
112
- If required sentinel verification fails or its verification capability is
113
- unavailable, no artifact is uploaded. The connector attempts sentinel cleanup
114
- and emits no successful receipt. An undeclared `401` or `403` in public mode is
115
- a verification failure, never evidence that the destination is protected.
116
-
117
- Publishing is additive. The implementation uses individual `put-object`,
118
- `head-object`, and sentinel-only `delete-object` operations. It never performs
119
- root-wide synchronization, never passes a delete flag, never walks or uploads
120
- undeclared files, and never deletes an artifact object. Existing declared
121
- objects with matching hash and metadata are skipped; changed declared objects
122
- may be replaced.
123
-
124
- ## Metadata
125
-
126
- Every upload sets metadata explicitly:
127
-
128
- | File | Content type |
129
- | ------- | ------------------------------------------------- |
130
- | `.html` | `text/html; charset=utf-8` |
131
- | `.json` | `application/json` |
132
- | `.css` | `text/css; charset=utf-8` |
133
- | `.js` | `text/javascript; charset=utf-8` |
134
- | `.svg` | `image/svg+xml` |
135
- | `.txt` | `text/plain; charset=utf-8` |
136
- | other | manifest media type or `application/octet-stream` |
137
-
138
- Artifacts use `Cache-Control: public, max-age=300`. The connector stores the
139
- SHA-256 digest as object metadata for idempotency and supplies
140
- `--checksum-sha256` on upload. It requests service checksum evidence with
141
- `--checksum-mode ENABLED`; caller-authored metadata and ETags are never treated
142
- as object-byte proof. When service SHA-256 evidence is unavailable, the
143
- connector hashes bytes from an authenticated download. Public verification
144
- separately hashes response bytes without text decoding, so binary artifacts and
145
- stale wrong-byte 200 responses are covered.
146
-
147
- ## Failures and retries
148
-
149
- Authentication and permission failures stop immediately. The connector does
150
- not run `aws sso login`, retry with another profile, expose AWS diagnostics, or
151
- persist credentials. Refresh credentials separately and rerun after approval.
152
-
153
- Only transient individual object-operation failures receive bounded retries.
154
- Input, authorization, metadata, and public-verification failures are not
155
- retried. A failed publish preserves the local package.
156
-
157
- Public roots must be credential-free HTTPS URLs with no username, password,
158
- query, or fragment. Three further rejections apply, all before any AWS or HTTP
159
- operation, and none of them are ever persisted in receipts:
160
-
161
- - **Control characters.** Any codepoint in `0x00`–`0x1f` or `0x7f`–`0x9f`, and
162
- any backslash, in either root. These otherwise reach S3 object keys, composed
163
- public URLs, the catalog, the receipt and `aws` argv; `0x9b` is the 8-bit CSI.
164
- - **Non-public addresses.** Loopback, link-local (`169.254.0.0/16`, `fe80::/10`,
165
- including the `169.254.169.254` instance-metadata address), unique-local
166
- (`fc00::/7`) and RFC 1918 private hosts, in both literal IPv4 and IPv6 forms
167
- including IPv4-mapped spellings. Public verification issues an outbound GET
168
- against whatever the root names, so an unconstrained root is a request
169
- primitive aimed at internal addresses. Set
170
- `EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT=1` to opt back in for a genuinely
171
- internal mirror. The policy is address-literal only: a hostname that happens
172
- to resolve inward is not detected.
173
- - **Redirects.** Public verification uses `redirect: 'error'`. A canonical
174
- artifact URL is uploaded to a known key and should never legitimately
175
- redirect, so any redirecting destination is a hard verification failure rather
176
- than something to follow. A destination that requires redirects is
177
- incompatible with this connector and will report as such rather than failing
178
- opaquely later.
179
-
180
- ## The generated initiative catalog
181
-
182
- The connector generates one auxiliary artifact the manifest does not declare: an
183
- initiative catalog at `site/initiatives/<slug>/catalog.json`, uploaded alongside
184
- the declared artifacts and recorded in the receipt as
185
- `source: { kind: 'auxiliary', name: 'catalog' }`.
186
-
187
- A third-party connector must reproduce it **byte for byte**, because
188
- `recordDurability` rebuilds it from the manifest and compares hashes; a mismatch
189
- rejects the publication with `cross-record-mismatch`. Build it with
190
- `catalogFromManifest(manifest, publicBaseUrl, { publicAccess })` and serialize
191
- with `serializeInitiativeCatalog`, rather than constructing it by hand.
192
-
193
- Two properties matter most:
194
-
195
- - The `{ publicAccess }` option is **required**. Omitting it raises a
196
- `TypeError` rather than defaulting, because the policy selects a field inside
197
- the serialized bytes and therefore changes the hash. Pass
198
- `{ publicAccess: undefined }` for `publish-request/v1`, which has no such
199
- field and is public by definition.
200
- - `publicVerification` carries **policy, never outcome**: `"required"` for
201
- public destinations and `"skipped-by-policy"` for protected ones. The catalog
202
- is serialized and hashed before the first upload and long before any
203
- per-artifact verification runs, so it cannot carry a verification result
204
- without invalidating its own hash. The authoritative outcome lives in the
205
- publish receipt, which the catalog's `runId` identifies. Never write
206
- `"verified"` into a catalog.
207
-
208
- Publishability is gated by `assertManifestPublishable`, which raises
209
- `E_PUBLISH_OUTCOME` for a manifest that is not eligible; see the intermediate
210
- `incomplete` state described above.
@@ -1,80 +0,0 @@
1
- # Wrapper extension contract
2
-
3
- V1 freezes one destination-neutral extension seam:
4
-
5
- 1. **Pre-resolution:** the caller resolves presets, private source systems,
6
- accounts, and destination topology without exposing them as public config.
7
- 2. **`ExplainerRunRequestV1`:** the caller translates only the inputs required
8
- by `explainer-kit.run-request/v1`.
9
- 3. **Core run:** the caller invokes `runExplainer(request, options)` once. The
10
- core owns validation, fact-base processing, content, theme, render, QA, and
11
- run records.
12
- 4. **Manifest consumption:** the caller accepts only
13
- `explainer-kit.manifest/v1`, verifies its run, recipe, and slug identity, and
14
- reads built artifact paths from the manifest.
15
- 5. **Post-run linking:** the caller may create companion notes, synchronize
16
- external documents, or maintain private links from manifest and optional
17
- publish-receipt data.
18
-
19
- Private wrappers may retain presets, vault conventions, Google Docs behavior,
20
- and personal destinations around this seam. Those values are wrapper-owned;
21
- they are not OAT config keys and must not be discovered by the core.
22
-
23
- ## Frozen versioned boundary
24
-
25
- The versioned request, artifact package, manifest, build record, durability
26
- request, publish request, and publish receipt are the public boundary. New
27
- publication work uses the immutable `explainer-kit.publish-request/v2` and
28
- `explainer-kit.publish-receipt/v2` contracts. The corresponding
29
- `publish-request/v1` and `publish-receipt/v1` contracts remain readable for
30
- replay; v2 is a new contract version, not an in-place mutation of v1. The
31
- extension seam has no plugin registry and no mid-pipeline callback API for
32
- private destinations. Provider-neutral callbacks already documented by the
33
- core remain explicit run options; they do not transfer stage ownership to a
34
- wrapper.
35
-
36
- V1 readers reject unsupported contract majors and identity mismatches rather
37
- than guessing. Wrappers should preserve unknown future versions for diagnosis,
38
- stop before post-processing, and migrate deliberately.
39
-
40
- The compatibility smoke fixture at
41
- `tools/smoke/explainer-kit/wrapper-compatibility.test.mjs` proves this sequence
42
- with the actual core. It uses sanitized private-wrapper inputs and is not a
43
- substitute for the operator-owned release-candidate gate.
44
-
45
- Release-candidate execution requires the retained tarball directory explicitly:
46
-
47
- ```bash
48
- # Pre: resolve private inputs and write the external run request.
49
- node tools/release/run-explainer-rc.mjs \
50
- --rc-manifest /path/to/acceptance/rc.json \
51
- --artifacts-dir /path/to/retained/explainer-kit-rc \
52
- --entry scripts/run.mjs \
53
- --record /path/to/acceptance/private-wrapper-execution.json \
54
- -- --request /path/to/private/request.json
55
- ```
56
-
57
- The packaged CLI stdout contract is exactly one complete JSON result document.
58
- The document may be pretty-printed across lines; progress text and
59
- line-delimited JSON are not part of this machine framing. The RC runner parses
60
- the complete document, then binds the request, child-reported manifest, and core
61
- run ID. It binds a receipt only when the packaged child itself reports that
62
- output. The sanitized record does not store paths, argument values, credentials,
63
- or private content.
64
-
65
- After the core command returns, the wrapper performs its post-run publication
66
- and linking work. It retains the immutable core manifest as
67
- `private-wrapper-manifest.json`, the complete `publish-receipt/v2` as
68
- `private-wrapper-publish-receipt.json`, and its sanitized wrapper result as
69
- `private-wrapper-result.json`. The wrapper result repeats canonical hashes for
70
- the request, manifest, and post-run receipt.
71
-
72
- The wrapper acceptance stage reads those post-run files separately. It
73
- validates the closed receipt contract, complete manifest and catalog evidence,
74
- every source identity, path, artifact hash, destination, and verification fact,
75
- the run-unique sentinel, the manifest hash, and the core run ID against
76
- `private-wrapper-execution.json`. Public and protected v2 receipts must each
77
- provide exactly one entry for every finalized manifest artifact and exactly one
78
- generated catalog entry. A `publish-receipt/v1` remains consumable only for
79
- replay. Repeating a matching hash cannot make a foreign, duplicate, incomplete,
80
- or stale receipt attributable to the packaged run.
@@ -1,80 +0,0 @@
1
- # Golden conformance contract
2
-
3
- Golden conformance runs the unattended project-recap workflow from portable
4
- semantic inputs and validates its live output in real Chromium. It is a
5
- behavioral oracle, not a pixel snapshot: output may change markup, spacing, or
6
- composition when it clears the same quality bar.
7
-
8
- ## Cases
9
-
10
- Each case directory under `tests/fixtures/golden/` contains:
11
-
12
- - `simple` checks viewport-sized lead evidence and a cohesive baseline recap.
13
- - `non-linear` checks branch, fan-in, and cycle preservation.
14
- - `explainer-authoring-redesign` checks an archive-only rebuild from a dense
15
- completed project record.
16
-
17
- | Path | Contract |
18
- | ----------------------------- | --------------------------------------------------------------- |
19
- | `descriptor.json` | Case identity plus paths and SHA-256 hashes for semantic inputs |
20
- | `source-input.json` | Source-grounded claims, topology, and reader questions |
21
- | `evidence/source-record.json` | Retained source claims, upstream repository hash, and topology |
22
-
23
- All cases share `tests/fixtures/golden/rubric.json`. Generated HTML, browser
24
- captures, measurements, manifests, catalogs, and review records are temporary
25
- test output and must not be committed.
26
-
27
- The descriptor's retained-file set is case-relative and content addressed. The
28
- loader recomputes each hash, resolves source records, and rejects missing,
29
- changed, duplicate, non-portable, or ungrounded input.
30
- `sharedRubricPath` resolves from `tests/fixtures/golden/`, and
31
- `sharedRubricSha256` content-addresses that common contract.
32
-
33
- ## Required rubric
34
-
35
- The shared `explainer-kit.golden-rubric/v1` `checks` object has exactly these
36
- required fields:
37
-
38
- 1. `adaptiveMinimumSet`
39
- 2. `firstViewport`
40
- 3. `hierarchy`
41
- 4. `representationChoice`
42
- 5. `legibility`
43
- 6. `cohesion`
44
- 7. `sourceCoverage`
45
- 8. `interactions`
46
- 9. `topologyPreservation`
47
- 10. `catalogParity`
48
- 11. `boundedCorrection`
49
-
50
- The benchmark enforces every field against live runtime evidence. A passing set
51
- contains exactly the project recap, architecture, and deck; preserves source
52
- meaning and topology; has catalog-to-manifest parity; includes real browser
53
- captures and measurements; and reaches a passing terminal review without a
54
- correction. Integration suites separately exercise the one-correction ceiling.
55
-
56
- ## Runtime evidence
57
-
58
- The suite generates one complete recap package per case in a temporary
59
- directory. It validates artifact membership, claim markers, exact topology,
60
- catalog parity, independent visual review, real Chromium identity, viewport
61
- dimensions, lead-content presence, heading order, capture identity, overflow,
62
- keyboard and deck-arrow behavior, and bounded review. The temporary package is
63
- removed when the test completes.
64
-
65
- Claims are accepted only when their source ID exists and their text exactly
66
- matches a claim in the retained source record. Repository-backed records also
67
- pin the upstream repository file and prove every retained claim occurs there.
68
- Runtime tests must not load an operator plugin, home directory, active project,
69
- or moving branch.
70
-
71
- ## Portability rules
72
-
73
- - Retained descriptor paths are relative to their case and cannot escape it;
74
- the shared rubric path is relative to the golden fixture root.
75
- - POSIX roots, Windows drive paths, UNC paths, home-relative paths, and
76
- `file://` locators are rejected wherever they occur in committed inputs.
77
- - Repository-relative paths and supported `https://` source URLs are allowed.
78
- - Every claim, topology node, and topology edge resolves to retained,
79
- hash-verified source input, so later runs do not need the original
80
- workstation.
@@ -1,71 +0,0 @@
1
- # Visual review guidance
2
-
3
- Review the rendered artifact set against its reconciled fact base, shared
4
- ledger, set plan, and browser evidence. This rubric is independent of authoring
5
- guidance: it tells a critic what to assess, not how an author should compose.
6
- An optional installed visual-explainer capability may assist, but review must
7
- remain possible from bundled evidence and rules alone.
8
-
9
- ## Review the whole set
10
-
11
- Inspect the complete set before assigning artifact findings. Verify:
12
-
13
- - **First viewport:** each artifact establishes purpose, project state, and the
14
- primary reader question without scrolling.
15
- - **Typography:** titles, framing text, headings, labels, body copy, and
16
- annotations have distinct, readable roles that remain consistent across the
17
- set.
18
- - **Hierarchy:** the most important outcome or relationship is dominant, with
19
- secondary detail grouped and ordered consistently.
20
- - **Composition:** grouping, alignment, spacing, and emphasis create a clear
21
- reading path suited to the artifact's evidence.
22
- - **Density:** crowded material is restructured instead of miniaturized, while
23
- sparse material is not padded with decorative filler.
24
- - **Medium leverage:** the selected medium makes a relationship, comparison,
25
- sequence, or decision easier to understand than plain prose would.
26
- - **Legibility:** text, labels, status cues, tables, and connectors remain
27
- readable at every required viewport.
28
- - **Medium fit:** the hub orients and links, the system visual preserves
29
- relationships, the deck paces a narrative, and optional artifacts add a
30
- distinct source-backed perspective.
31
- - **Template repetition:** sections, cards, and slides vary when the evidence
32
- calls for a different treatment instead of repeating one shell mechanically.
33
- - **Diagram semantics:** topology, direction, labels, edge meaning, and
34
- fit-to-content framing communicate the planned relationships without false
35
- linearization or decorative ambiguity.
36
- - **Cross-artifact cohesion:** terminology, status labels, numbers, color
37
- meaning, typographic roles, and visual language match the shared ledger and
38
- one another.
39
- - **Coverage and redundancy:** planned sources and reader questions are covered
40
- once at the right depth; optional artifacts do not repeat the hub or deck
41
- without a justified purpose.
42
- - **Interaction:** navigation, links, keyboard controls, reduced motion, table
43
- overflow, and diagram pan or zoom work without hiding content.
44
-
45
- ## Artifact-scoped findings
46
-
47
- Every finding identifies an artifact ID, the failed rubric area, evidence, and
48
- a concrete correction. Distinguish factual or ledger conflicts from visual
49
- judgment. Never infer a fact that is absent from the retained sources.
50
-
51
- Use severity proportionally:
52
-
53
- - Critical: unsafe, fabricated, or materially false output.
54
- - Important: the artifact cannot answer its primary question or loses required
55
- topology, content, or legibility.
56
- - Medium: meaningful visual or cohesion weakness that does not invalidate the
57
- set.
58
- - Minor: localized polish issue.
59
-
60
- ## Disposition
61
-
62
- Return exactly one provider-neutral disposition:
63
-
64
- - `pass` when the full set clears the rubric with no required correction.
65
- - `correct` when bounded artifact-scoped changes can clear the rubric; every
66
- finding must name a concrete, actionable correction.
67
- - `fail` when evidence is missing, the plan or ledger is internally invalid, or
68
- correction would require unsupported facts or a different artifact set.
69
-
70
- Do not award `pass` from source code inspection alone. Base visual findings on
71
- the retained browser evidence available to the review request.
@@ -1,212 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "explainer-kit.author-request/v2",
4
- "title": "AuthorRequestV2",
5
- "type": "object",
6
- "additionalProperties": false,
7
- "required": [
8
- "schemaVersion",
9
- "artifactId",
10
- "artifactType",
11
- "authoring",
12
- "brief",
13
- "visualAuthoringGuidance",
14
- "factBase",
15
- "theme",
16
- "setContext",
17
- "plannedArtifact"
18
- ],
19
- "properties": {
20
- "schemaVersion": { "const": "explainer-kit.author-request/v2" },
21
- "artifactId": { "type": "string", "minLength": 1 },
22
- "artifactType": {
23
- "enum": ["hub", "diagram", "explainer", "deck", "catalog"]
24
- },
25
- "authoring": { "enum": ["markdown", "html"] },
26
- "brief": { "type": "string", "minLength": 1 },
27
- "visualAuthoringGuidance": { "type": "string", "minLength": 1 },
28
- "factBase": { "$ref": "explainer-kit.fact-base/v1" },
29
- "shell": { "type": "string", "minLength": 1 },
30
- "theme": { "$ref": "explainer-kit.theme/v1" },
31
- "setContext": { "$ref": "explainer-kit.set-plan/v1" },
32
- "plannedArtifact": { "$ref": "#/$defs/plannedArtifact" },
33
- "graphSemantics": {
34
- "type": "array",
35
- "items": { "$ref": "#/$defs/graphSemantics" },
36
- "minItems": 1
37
- },
38
- "floor": {
39
- "type": "object",
40
- "additionalProperties": false,
41
- "required": ["requiredNarrative"],
42
- "properties": {
43
- "requiredNarrative": {
44
- "type": "array",
45
- "items": { "type": "string", "minLength": 1 },
46
- "minItems": 1,
47
- "uniqueItems": true
48
- }
49
- }
50
- }
51
- },
52
- "$defs": {
53
- "graphSemantics": {
54
- "type": "object",
55
- "additionalProperties": false,
56
- "required": ["direction", "nodes", "edges", "topology"],
57
- "properties": {
58
- "direction": { "enum": ["TD", "LR"] },
59
- "nodes": {
60
- "type": "array",
61
- "items": {
62
- "type": "object",
63
- "additionalProperties": false,
64
- "required": ["id", "label", "shape", "explicit"],
65
- "properties": {
66
- "id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" },
67
- "label": { "type": "string", "minLength": 1 },
68
- "shape": { "enum": ["rectangle", "rounded", "diamond"] },
69
- "explicit": { "type": "boolean" }
70
- }
71
- },
72
- "minItems": 1,
73
- "uniqueItems": true
74
- },
75
- "edges": {
76
- "type": "array",
77
- "items": {
78
- "type": "object",
79
- "additionalProperties": false,
80
- "required": ["from", "to", "kind", "label"],
81
- "properties": {
82
- "from": {
83
- "type": "string",
84
- "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
85
- },
86
- "to": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" },
87
- "kind": { "enum": ["arrow", "line"] },
88
- "label": { "type": "string" }
89
- }
90
- },
91
- "minItems": 1
92
- },
93
- "topology": {
94
- "type": "object",
95
- "additionalProperties": false,
96
- "required": [
97
- "kind",
98
- "features",
99
- "branchNodes",
100
- "fanInNodes",
101
- "cycle",
102
- "order"
103
- ],
104
- "properties": {
105
- "kind": { "const": "non-linear" },
106
- "features": {
107
- "type": "array",
108
- "items": {
109
- "enum": [
110
- "branch",
111
- "fan-in",
112
- "cycle",
113
- "disconnected",
114
- "non-linear"
115
- ]
116
- },
117
- "minItems": 1,
118
- "uniqueItems": true
119
- },
120
- "branchNodes": {
121
- "type": "array",
122
- "items": {
123
- "type": "string",
124
- "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
125
- },
126
- "uniqueItems": true
127
- },
128
- "fanInNodes": {
129
- "type": "array",
130
- "items": {
131
- "type": "string",
132
- "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
133
- },
134
- "uniqueItems": true
135
- },
136
- "cycle": { "type": "boolean" },
137
- "order": {
138
- "type": "array",
139
- "items": {
140
- "type": "string",
141
- "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
142
- },
143
- "maxItems": 0
144
- }
145
- }
146
- }
147
- }
148
- },
149
- "plannedArtifact": {
150
- "type": "object",
151
- "additionalProperties": false,
152
- "required": [
153
- "artifactId",
154
- "artifactType",
155
- "profileId",
156
- "required",
157
- "sourceIds",
158
- "draft",
159
- "visualIntent"
160
- ],
161
- "properties": {
162
- "artifactId": {
163
- "type": "string",
164
- "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
165
- },
166
- "artifactType": {
167
- "enum": ["hub", "diagram", "explainer", "deck", "catalog"]
168
- },
169
- "profileId": {
170
- "type": "string",
171
- "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
172
- },
173
- "required": { "type": "boolean" },
174
- "sourceIds": {
175
- "type": "array",
176
- "items": {
177
- "type": "string",
178
- "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
179
- },
180
- "minItems": 1,
181
- "uniqueItems": true
182
- },
183
- "draft": { "type": "string", "minLength": 1 },
184
- "visualIntent": { "type": "string", "minLength": 1 },
185
- "justification": {
186
- "type": "object",
187
- "additionalProperties": false,
188
- "required": ["kind", "sourceIds", "rationale"],
189
- "properties": {
190
- "kind": {
191
- "enum": [
192
- "status-change",
193
- "rollout-complexity",
194
- "source-backed-detail"
195
- ]
196
- },
197
- "sourceIds": {
198
- "type": "array",
199
- "items": {
200
- "type": "string",
201
- "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
202
- },
203
- "minItems": 1,
204
- "uniqueItems": true
205
- },
206
- "rationale": { "type": "string", "minLength": 1 }
207
- }
208
- }
209
- }
210
- }
211
- }
212
- }