@open-agent-toolkit/cli 0.2.30 → 0.2.31
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 +41 -0
- package/assets/docs/contributing/code.md +19 -7
- package/assets/docs/contributing/explainer-kit-verification.md +9 -1
- package/assets/docs/contributing/skills.md +9 -0
- package/assets/docs/workflows/skills/explainer-kit-providers.md +16 -5
- package/assets/docs/workflows/skills/explainer-kit.md +98 -38
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +33 -8
- package/assets/skills/explainer-kit/briefs/project-recap.md +25 -7
- package/assets/skills/explainer-kit/recipes/project-recap.v2.json +72 -0
- package/assets/skills/explainer-kit/references/contracts.md +49 -17
- package/assets/skills/explainer-kit/references/destination-contract.md +141 -25
- package/assets/skills/explainer-kit/references/extension-contract.md +19 -10
- package/assets/skills/explainer-kit/references/visual-authoring.md +24 -0
- package/assets/skills/explainer-kit/references/visual-review.md +19 -5
- package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +241 -0
- package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +215 -0
- package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +34 -0
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -1
- package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +81 -0
- package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +66 -0
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +109 -3
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +550 -17
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +90 -8
- package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +5 -0
- package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +538 -0
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +129 -11
- package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +54 -0
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +2 -1
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +139 -22
- package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +353 -0
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +237 -107
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +1 -0
- package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +157 -0
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +26 -6
- package/assets/skills/explainer-kit/scripts/run.mjs +1006 -144
- package/assets/skills/oat-explainer-kit/SKILL.md +16 -3
- package/assets/skills/oat-explainer-kit/references/config-contract.md +13 -8
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +50 -6
- package/assets/skills/oat-explainer-kit/references/migration.md +2 -1
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +11 -0
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +37 -15
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +83 -0
- package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +91 -0
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +66 -10
- package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +60 -21
- package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +52 -8
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +271 -36
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +19 -3
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +2 -2
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +8 -0
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +2 -2
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +2 -2
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +2 -2
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +18 -0
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +57 -7
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +29 -0
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +1 -0
- package/dist/commands/project/archive/explainer-terminal-evidence.js +37 -0
- package/dist/config/oat-config.d.ts +2 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +4 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +1 -0
- package/package.json +2 -2
- /package/assets/skills/explainer-kit/recipes/{project-recap.json → project-recap.v1.json} +0 -0
- /package/assets/skills/explainer-kit/schemas/{publish-receipt.schema.json → publish-receipt.v1.schema.json} +0 -0
- /package/assets/skills/explainer-kit/schemas/{publish-request.schema.json → publish-request.v1.schema.json} +0 -0
|
@@ -138,6 +138,7 @@ plumbing uses `explainers.*`; project lifecycle preferences use
|
|
|
138
138
|
| `explainers.publish.publicBaseUrl` | HTTPS URL | shared | unset |
|
|
139
139
|
| `explainers.publish.awsRegion` | non-empty string | shared | unset |
|
|
140
140
|
| `explainers.publish.awsProfile` | non-empty string | local, user | unset |
|
|
141
|
+
| `explainers.publish.publicAccess` | `public\|protected` | shared | `public` |
|
|
141
142
|
| `workflow.explainers.projectExplainer` | `always\|ask\|never` | local, shared, user | `ask` |
|
|
142
143
|
| `workflow.explainers.projectRecap` | `always\|ask\|never` | local, shared, user | `ask` |
|
|
143
144
|
|
|
@@ -172,6 +173,46 @@ chain applies. Config never starts publishing by itself: lifecycle callers must
|
|
|
172
173
|
still select publish durability explicitly, and publishing remains
|
|
173
174
|
human-gated. Raw AWS credentials are not config keys.
|
|
174
175
|
|
|
176
|
+
`publicAccess` declares whether published objects are expected to be reachable
|
|
177
|
+
anonymously; it does not authorize publication and it does not change any
|
|
178
|
+
bucket policy. It selects how publication is verified. The default `public`
|
|
179
|
+
fetches every uploaded object over HTTPS and compares the returned bytes
|
|
180
|
+
against the manifest hash. `protected` skips those anonymous fetches, verifies
|
|
181
|
+
each object through authenticated S3 hashing instead, and records
|
|
182
|
+
`skipped-protected` in the publish receipt. Because no anonymous fetch happens
|
|
183
|
+
under `protected`, a mistyped `publicBaseUrl` is not detected at publish time:
|
|
184
|
+
the advertised URLs are still written into the initiative catalog and receipt,
|
|
185
|
+
and the catalog records `publicVerification: "skipped-by-policy"` so consumers
|
|
186
|
+
can see the URLs were never exercised.
|
|
187
|
+
|
|
188
|
+
### Explainer publication environment variables
|
|
189
|
+
|
|
190
|
+
Two escape hatches are read from the process environment rather than from
|
|
191
|
+
config, because both are machine-local operational overrides rather than
|
|
192
|
+
project settings. Neither has a config key.
|
|
193
|
+
|
|
194
|
+
| Variable | Effect | Default |
|
|
195
|
+
| ------------------------------------------------ | --------------------------------------------------------------------------- | ------- |
|
|
196
|
+
| `EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT` | Permits a loopback, link-local, unique-local or RFC 1918 `publicBaseUrl` | off |
|
|
197
|
+
| `EXPLAINER_KIT_SUPPRESS_ROOT_DIVERGENCE_WARNING` | Silences the advisory warning when the S3 key prefix and public path differ | off |
|
|
198
|
+
|
|
199
|
+
Both accept `1`, `true` or `on`.
|
|
200
|
+
|
|
201
|
+
`EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT` disables an anti-SSRF control. Public
|
|
202
|
+
verification issues an outbound GET against whatever `publicBaseUrl` names, so
|
|
203
|
+
by default the connector refuses internal addresses — including the
|
|
204
|
+
`169.254.169.254` instance-metadata endpoint. Enable it only for a genuinely
|
|
205
|
+
internal mirror. When it is set and the root is in fact non-public, the run
|
|
206
|
+
records `publicRootPolicy: "private-allowed"` in the publish receipt, so a
|
|
207
|
+
publication made with the control disabled is distinguishable in durable
|
|
208
|
+
evidence from one made without it. The policy is address-literal only: a
|
|
209
|
+
hostname that resolves inward is not detected either way.
|
|
210
|
+
|
|
211
|
+
`EXPLAINER_KIT_SUPPRESS_ROOT_DIVERGENCE_WARNING` only affects an advisory
|
|
212
|
+
message. Divergent roots are never a publication failure — a CloudFront Origin
|
|
213
|
+
Path deployment legitimately maps a bucket prefix to the distribution root — so
|
|
214
|
+
this changes no validation outcome.
|
|
215
|
+
|
|
175
216
|
See [Explainer Kit](../workflows/skills/explainer-kit.md) for recipes, artifact
|
|
176
217
|
locations, lifecycle behavior, and durability.
|
|
177
218
|
|
|
@@ -41,18 +41,30 @@ OAT is organized as a pnpm workspace with Turborepo orchestration.
|
|
|
41
41
|
|
|
42
42
|
## Quality Gates
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
Every change runs the ordered Definition of Done from the root `AGENTS.md`,
|
|
45
|
+
which mirrors CI's gate steps exactly so a locally green run implies CI green:
|
|
45
46
|
|
|
46
47
|
```bash
|
|
47
|
-
pnpm
|
|
48
|
-
pnpm lint
|
|
49
|
-
pnpm format
|
|
48
|
+
pnpm check
|
|
50
49
|
pnpm type-check
|
|
51
|
-
pnpm
|
|
52
|
-
pnpm build
|
|
50
|
+
pnpm test
|
|
51
|
+
pnpm build # excludes docs for speed
|
|
52
|
+
pnpm run check:skill-bumps # changed .agents/skills/*/SKILL.md must bump version
|
|
53
|
+
pnpm release:check-versions # lockstep public package version bumps
|
|
54
|
+
pnpm release:validate
|
|
55
|
+
pnpm build:docs # builds docs site and its dependencies
|
|
53
56
|
```
|
|
54
57
|
|
|
55
|
-
|
|
58
|
+
`pnpm test` is composite: it runs the workspace vitest suites, then
|
|
59
|
+
`test:smoke` (`tools/smoke`), `test:skills` (`.agents/skills/*/tests`), and
|
|
60
|
+
the named-file `test:release` set. Steps 5 and 6 are the version-lockstep
|
|
61
|
+
gates; they are in the local list because they previously ran only in CI and
|
|
62
|
+
version-bump drift twice reached review with no local gate to surface it.
|
|
63
|
+
|
|
64
|
+
CI runs neither `pnpm lint` nor `pnpm format` — run both whenever a change
|
|
65
|
+
touches `tools/smoke` or `.agents/skills`, since nothing else covers them.
|
|
66
|
+
For narrower changes, use package-specific checks when possible, but do not
|
|
67
|
+
merge without passing the relevant workspace gates.
|
|
56
68
|
|
|
57
69
|
### TypeScript and type-aware linting
|
|
58
70
|
|
|
@@ -62,6 +62,11 @@ The suite recomputes semantic-input hashes, grounds every claim in retained
|
|
|
62
62
|
source evidence, and evaluates the shared rubric against live runtime output.
|
|
63
63
|
A prose claim or status label without runtime proof does not pass.
|
|
64
64
|
|
|
65
|
+
The existing three-case, 27-capture golden suite is intentionally unchanged by
|
|
66
|
+
the prose-led visual-review work. Simplifying it is a separate follow-up: first
|
|
67
|
+
audit each case's unique coverage, runtime cost, and flakiness, then remove or
|
|
68
|
+
replace fixtures only with evidence that the same behavior remains protected.
|
|
69
|
+
|
|
65
70
|
## Inspect generated evidence
|
|
66
71
|
|
|
67
72
|
The suite materializes each case's runtime package under its temporary working
|
|
@@ -114,9 +119,12 @@ pnpm check
|
|
|
114
119
|
pnpm type-check
|
|
115
120
|
pnpm test
|
|
116
121
|
pnpm build
|
|
122
|
+
pnpm run check:skill-bumps
|
|
123
|
+
pnpm release:check-versions
|
|
124
|
+
pnpm release:validate
|
|
125
|
+
pnpm build:docs
|
|
117
126
|
pnpm lint
|
|
118
127
|
pnpm format
|
|
119
|
-
pnpm build:docs
|
|
120
128
|
git diff --check
|
|
121
129
|
```
|
|
122
130
|
|
|
@@ -43,6 +43,15 @@ Skill behavior is defined by frontmatter plus the process contract in each `SKIL
|
|
|
43
43
|
- `allowed-tools`
|
|
44
44
|
- `oat_gateable`
|
|
45
45
|
|
|
46
|
+
### The `version` field is gated
|
|
47
|
+
|
|
48
|
+
Changing any canonical skill's `SKILL.md` requires bumping its frontmatter
|
|
49
|
+
`version` in the same PR — one bump per changed skill in the final PR diff,
|
|
50
|
+
even if the skill was edited multiple times on the branch. The rule is
|
|
51
|
+
enforced by `pnpm run check:skill-bumps`, which runs locally (root `AGENTS.md`
|
|
52
|
+
Definition of Done) and in CI; a changed skill whose version matches
|
|
53
|
+
`origin/main` fails the gate.
|
|
54
|
+
|
|
46
55
|
## Practical Authoring Flow
|
|
47
56
|
|
|
48
57
|
1. Decide whether you are adding a general reusable skill or an OAT-specific lifecycle skill.
|
|
@@ -38,9 +38,11 @@ The provider-neutral `planSet` callback runs once after fact reconciliation and
|
|
|
38
38
|
before any author callback. It returns the complete portfolio and one shared
|
|
39
39
|
claim ledger.
|
|
40
40
|
|
|
41
|
-
For a project recap, the portfolio must contain the required
|
|
42
|
-
|
|
43
|
-
inside recipe and per-profile limits, and
|
|
41
|
+
For a new project recap, the portfolio must contain the required navigational
|
|
42
|
+
hub. A diagram, deck, or deep dive is optional and must use a recipe-licensed
|
|
43
|
+
profile, remain inside recipe and per-profile limits, and answer a distinct
|
|
44
|
+
reader question with source evidence and a medium rationale. Version 1 recap
|
|
45
|
+
plans remain readable for replay with their historical three-artifact floor.
|
|
44
46
|
Duplicate identities, undeclared sources, conflicting shared terms, and
|
|
45
47
|
unjustified optionals fail validation.
|
|
46
48
|
|
|
@@ -50,14 +52,16 @@ artifact. Authors cannot add, remove, replace, or rename portfolio entries.
|
|
|
50
52
|
## Artifact author
|
|
51
53
|
|
|
52
54
|
The core invokes `author` once per planned artifact with
|
|
53
|
-
`explainer-kit.author-request/
|
|
55
|
+
`explainer-kit.author-request/v3`. Version 2 requests remain readable for
|
|
56
|
+
replay. The current request contains:
|
|
54
57
|
|
|
55
58
|
- artifact identity, type, and authoring path;
|
|
56
59
|
- the versioned brief and bundled medium-specific guidance;
|
|
57
60
|
- reconciled facts and the shared set context;
|
|
58
61
|
- the matching planned artifact;
|
|
59
62
|
- the resolved theme; and
|
|
60
|
-
- the bundled shell for artistic HTML
|
|
63
|
+
- the bundled shell for artistic HTML; and
|
|
64
|
+
- canonical artifact links ending in explicit `index.html` paths.
|
|
61
65
|
|
|
62
66
|
Return `explainer-kit.author-result/v2` with exactly one of
|
|
63
67
|
`content.markdown` or `content.html` and non-secret provenance. The core
|
|
@@ -128,6 +132,13 @@ all reviewed artifact IDs, structured findings, and one disposition:
|
|
|
128
132
|
- `correct` requests one bounded correction and one final review; or
|
|
129
133
|
- `fail` terminates the gate.
|
|
130
134
|
|
|
135
|
+
Judge typography, hierarchy, composition, density, medium leverage, template
|
|
136
|
+
repetition, diagram semantics, and cross-artifact cohesion from the bound
|
|
137
|
+
browser evidence. `pass` means no required correction remains. `correct`
|
|
138
|
+
findings name concrete artifact-scoped actions that can be completed in the
|
|
139
|
+
single bounded correction round. Keep this judgment in prose; do not invent
|
|
140
|
+
numeric scores or geometry thresholds.
|
|
141
|
+
|
|
131
142
|
The critic must not mutate rendered files or evidence. The core revalidates all
|
|
132
143
|
bound bytes after each callback.
|
|
133
144
|
|
|
@@ -20,19 +20,19 @@ OAT lifecycle callers use the adapter.
|
|
|
20
20
|
|
|
21
21
|
## Recipes
|
|
22
22
|
|
|
23
|
-
The core ships four
|
|
24
|
-
schema.
|
|
25
|
-
|
|
23
|
+
The core ships four recipe families on the `explainer-kit.recipe/v2` file
|
|
24
|
+
schema. Most recipe selectors remain at version `"1"`. New project recaps use
|
|
25
|
+
immutable `project-recap@2`, while `project-recap@1` remains readable for replay.
|
|
26
26
|
|
|
27
27
|
A v2 recipe declares a **floor** — the artifacts every run must produce — plus
|
|
28
28
|
a licensed **expansion** set. Most recipes retain one floor artifact.
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
`project-recap@2` requires one complete navigational hub and plans any additional
|
|
30
|
+
artifact before an author runs.
|
|
31
31
|
|
|
32
32
|
| Recipe | Use | Required floor |
|
|
33
33
|
| ------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
|
|
34
34
|
| `project-explainer` | Working explanation after project planning | one Markdown `hub` covering architecture, decisions, risks, phases, and validation |
|
|
35
|
-
| `project-recap` | Final record after implementation and final review | HTML
|
|
35
|
+
| `project-recap` | Final record after implementation and final review | one HTML navigational hub; diagrams, decks, and deep dives are adaptive expansions |
|
|
36
36
|
| `program-recap` | Bird's-eye record of a multi-wave delivery program | one Markdown `hub` covering the wave map, outcomes, convention evolution, aggregate numbers, and follow-up ledger |
|
|
37
37
|
| `engineer-tour` | Engineer-facing orientation to a codebase and its flow | one HTML-composed `explainer` covering orientation, architecture, execution flow, key code, and validation |
|
|
38
38
|
|
|
@@ -46,8 +46,8 @@ adding an OAT dependency.
|
|
|
46
46
|
### Project recap modes
|
|
47
47
|
|
|
48
48
|
Project recaps default to `recapMode: artistic`. This mode uses the shared set
|
|
49
|
-
plan and provider-neutral author seam to compose the required HTML hub
|
|
50
|
-
|
|
49
|
+
plan and provider-neutral author seam to compose the required HTML hub plus any
|
|
50
|
+
source-backed expansion that answers a distinct reader question.
|
|
51
51
|
|
|
52
52
|
`recapMode: deterministic-markdown` is an explicit fallback for callers that
|
|
53
53
|
need deterministic output. It preserves the same planned artifact portfolio and
|
|
@@ -63,16 +63,16 @@ artifact `type`, authoring path, brief, optional shell, and a mandatory
|
|
|
63
63
|
`maxCount`. Every recipe also carries a mandatory `expansion.limits.maxArtifacts`
|
|
64
64
|
that caps the whole expansion set; floor artifacts do not count against it.
|
|
65
65
|
|
|
66
|
-
| Recipe | Profiles (max per profile)
|
|
67
|
-
| ------------------- |
|
|
68
|
-
| `project-recap`
|
|
69
|
-
| `program-recap` | `supporting-diagram` 3, `project-page` 12
|
|
70
|
-
| `project-explainer` | `supporting-diagram` 4
|
|
71
|
-
| `engineer-tour` | `supporting-diagram` 4
|
|
66
|
+
| Recipe | Profiles (max per profile) | `maxArtifacts` |
|
|
67
|
+
| ------------------- | ----------------------------------------------------------- | -------------- |
|
|
68
|
+
| `project-recap@2` | `supporting-diagram` 1, `walkthrough-deck` 1, `deep-dive` 3 | 5 |
|
|
69
|
+
| `program-recap` | `supporting-diagram` 3, `project-page` 12 | 12 |
|
|
70
|
+
| `project-explainer` | `supporting-diagram` 4 | 4 |
|
|
71
|
+
| `engineer-tour` | `supporting-diagram` 4 | 4 |
|
|
72
72
|
|
|
73
|
-
For project recaps, optional
|
|
74
|
-
source
|
|
75
|
-
|
|
73
|
+
For project recaps, every optional diagram, deck, or deep dive needs a distinct
|
|
74
|
+
reader question, supporting source evidence, and rationale for choosing that
|
|
75
|
+
medium. Other recipes retain their recipe-owned diagram and project-page
|
|
76
76
|
profiles. Every declared type stays inside the frozen `manifest/v1` enum.
|
|
77
77
|
|
|
78
78
|
## Content authoring and review
|
|
@@ -116,6 +116,11 @@ author request, so an unattended author receives everything it needs in one
|
|
|
116
116
|
payload. Changing a brief changes output expectations with no contract
|
|
117
117
|
migration.
|
|
118
118
|
|
|
119
|
+
The bundled authoring prose covers typographic roles, hierarchy, composition,
|
|
120
|
+
density, medium leverage, template repetition, diagram semantics, and
|
|
121
|
+
cross-artifact cohesion. These remain editorial judgments rather than numeric
|
|
122
|
+
scores or deterministic layout checks.
|
|
123
|
+
|
|
119
124
|
### The planning and author seams
|
|
120
125
|
|
|
121
126
|
Before authoring, one provider-neutral `planSet` callback produces the complete
|
|
@@ -125,15 +130,17 @@ portfolio. Every run also requires one provider-neutral author callback, in
|
|
|
125
130
|
without one fails with `E_AUTHOR_REQUIRED`.
|
|
126
131
|
|
|
127
132
|
The core invokes the author once per planned artifact with an
|
|
128
|
-
`explainer-kit.author-request/
|
|
133
|
+
`explainer-kit.author-request/v3` payload carrying the artifact identity and
|
|
129
134
|
type, its authoring path, the inlined brief, the reconciled fact base, the
|
|
130
135
|
resolved theme, the shell source for artistic artifacts, the immutable set
|
|
131
|
-
context, the matching planned artifact, and bundled
|
|
132
|
-
guidance.
|
|
136
|
+
context, the matching planned artifact, canonical artifact links, and bundled
|
|
137
|
+
medium-specific authoring guidance. Version 2 requests remain readable for
|
|
138
|
+
replay. The installed skill is the complete unattended baseline; optional
|
|
133
139
|
provider capabilities can enhance composition but are not required. The core
|
|
134
|
-
accepts only a schema-valid `explainer-kit.author-result/v2` containing exactly
|
|
135
|
-
`content.markdown` or `content.html` plus non-secret provenance.
|
|
136
|
-
content is still checked for excessive verbatim overlap with the fact
|
|
140
|
+
accepts only a schema-valid `explainer-kit.author-result/v2` containing exactly
|
|
141
|
+
one of `content.markdown` or `content.html` plus non-secret provenance.
|
|
142
|
+
Authored content is still checked for excessive verbatim overlap with the fact
|
|
143
|
+
base.
|
|
137
144
|
|
|
138
145
|
Direct callbacks and module entry points are first-class but transient: they
|
|
139
146
|
never enter retained request contracts. See
|
|
@@ -143,9 +150,10 @@ planner, author, browser-session, and visual-critic boundaries.
|
|
|
143
150
|
### Planner-owned adaptive sets
|
|
144
151
|
|
|
145
152
|
The set planner finalizes required and optional artifacts before authoring.
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
153
|
+
New project recaps always contain a navigational hub. The planner may add only
|
|
154
|
+
recipe-licensed optional diagrams, decks, or deep dives with a distinct reader
|
|
155
|
+
question, source evidence, and medium rationale. Recipe and per-profile limits
|
|
156
|
+
still bound the portfolio.
|
|
149
157
|
Undeclared sources, conflicting ledger values, duplicate IDs, and unjustified
|
|
150
158
|
optionals fail validation. Author results cannot add, remove, or replace
|
|
151
159
|
artifacts.
|
|
@@ -188,11 +196,21 @@ evidence to an independent critic. Fixture sessions are test-only and are
|
|
|
188
196
|
rejected in unattended production.
|
|
189
197
|
|
|
190
198
|
A `correct` disposition permits one bounded correction and exactly one final
|
|
191
|
-
review; there is no second correction or third review.
|
|
199
|
+
review; there is no second correction or third review. The correction budget is
|
|
200
|
+
shared with the internal-link gate described below, so a `correct` disposition
|
|
201
|
+
is refused outright with `E_VISUAL_CORRECTION` when link validation already
|
|
202
|
+
spent the single bounded correction on this run. Missing, forged,
|
|
192
203
|
cross-record-mismatched, or invalid evidence, a failed critic, or an unresolved
|
|
193
204
|
correction ends as `built-needs-review`. Such output is retained for diagnosis
|
|
194
205
|
but cannot become durable, finalized, archived, or published.
|
|
195
206
|
|
|
207
|
+
The critic reviews the whole set for typography, hierarchy, composition,
|
|
208
|
+
density, medium leverage, template repetition, diagram semantics, and
|
|
209
|
+
cross-artifact cohesion. It returns the existing provider-neutral result:
|
|
210
|
+
`pass` when no required correction remains or `correct` with concrete,
|
|
211
|
+
artifact-scoped actions for the bounded correction round. No numeric design
|
|
212
|
+
threshold is part of the contract.
|
|
213
|
+
|
|
196
214
|
The approval record is also the durable source of truth for the resolved
|
|
197
215
|
artifact set. It records every floor and accepted expansion artifact for all
|
|
198
216
|
approval states, including pending and rejected, so a paused expanded run
|
|
@@ -221,6 +239,26 @@ Every legacy `ekrt1` token is rejected. A paused run created with the legacy
|
|
|
221
239
|
format must restart to receive an authenticated token; editing retained package
|
|
222
240
|
state cannot opt it into compatibility.
|
|
223
241
|
|
|
242
|
+
### Internal-link validation
|
|
243
|
+
|
|
244
|
+
Every internal reference in the rendered set must resolve to a
|
|
245
|
+
manifest-declared target before the run can reach browser review. The gate runs
|
|
246
|
+
after render and uses a bounded tokenizer rather than a general HTML parser.
|
|
247
|
+
Relative references resolve from the current explicit file and must bind
|
|
248
|
+
exactly to the manifest/site tree, and a referenced fragment must resolve to
|
|
249
|
+
exactly one ID in its target document. Directory references, path traversal,
|
|
250
|
+
missing targets, missing fragments, ambiguous fragments, and unsafe schemes all
|
|
251
|
+
fail with `E_INTERNAL_REFERENCE`.
|
|
252
|
+
|
|
253
|
+
A failure gets one bounded correction round, re-rendered and revalidated. That
|
|
254
|
+
round is the same single budget the visual-review `correct` disposition uses —
|
|
255
|
+
whichever gate reaches it first consumes it. Once it is exhausted the run fails
|
|
256
|
+
hard: the QA stage is recorded `failed` with code-only evidence and the scrubbed
|
|
257
|
+
message `The qa stage failed.`, and the run is neither durability- nor
|
|
258
|
+
publication-eligible. No finding is retained, so nothing in the durable record
|
|
259
|
+
names the broken reference; the failure is attributed to the `link-validation`
|
|
260
|
+
evidence stage.
|
|
261
|
+
|
|
224
262
|
## Warnings and QA severity
|
|
225
263
|
|
|
226
264
|
QA findings are split by severity, and the split is what lets thin content ship
|
|
@@ -296,9 +334,17 @@ Reviewed source and citation backlinks are absolute canonical GitHub blob URLs
|
|
|
296
334
|
pinned to the exact 40-character commit revision and line range, so they
|
|
297
335
|
survive project archival without resolving through a mutable branch or local
|
|
298
336
|
checkout. Each recap also emits
|
|
299
|
-
`site/initiatives/<slug>/catalog.json` from the finalized manifest
|
|
300
|
-
artifact IDs, types, paths,
|
|
301
|
-
manifest parity; authors do
|
|
337
|
+
`site/initiatives/<slug>/catalog.json` from the finalized manifest, versioned
|
|
338
|
+
as `explainer-kit.initiative-catalog/v2`. Its artifact IDs, types, paths,
|
|
339
|
+
URLs, and source backlinks must remain in exact manifest parity; authors do
|
|
340
|
+
not hand-maintain the catalog. The catalog's `publicVerification` field is a
|
|
341
|
+
**policy marker, never an outcome**: `required` when the run's public access
|
|
342
|
+
policy calls for anonymous URL verification, `skipped-by-policy` for
|
|
343
|
+
protected destinations. It records what the publication policy was — the
|
|
344
|
+
per-artifact verification outcomes live in `publish-receipt.json`.
|
|
345
|
+
Compatibility is regenerate-only: consumers parse the declared version, and
|
|
346
|
+
no v1 read path exists because no released consumer could verify v1 catalog
|
|
347
|
+
evidence.
|
|
302
348
|
|
|
303
349
|
`manifest.immutableHashes` covers the exact retained bytes for
|
|
304
350
|
`run-request.json`, content approval, fact-base JSON and Markdown, declared
|
|
@@ -322,12 +368,25 @@ Build success and durability are separate:
|
|
|
322
368
|
|
|
323
369
|
The core verifies caller-supplied commit or publish evidence; it never creates
|
|
324
370
|
Git commits. Publishing is always explicitly requested and human-gated. The
|
|
325
|
-
public `s3-static` connector validates
|
|
326
|
-
run-unique sentinel, uploads only
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
371
|
+
public `s3-static` connector validates each S3 and HTTPS root independently and
|
|
372
|
+
proves the destination with a run-unique sentinel, uploads only
|
|
373
|
+
manifest-declared `site/` files, and writes `publish-receipt.json`.
|
|
374
|
+
Verification depends on the declared `publicAccess` policy: in `public` mode
|
|
375
|
+
the connector anonymously fetches each published URL and compares content
|
|
376
|
+
type and SHA-256 response bytes; in `protected` mode it verifies object
|
|
377
|
+
integrity through authenticated S3 hashing instead, and every receipt entry
|
|
378
|
+
records `publicVerification: skipped-protected` so the skipped anonymous
|
|
379
|
+
check is visible rather than implied.
|
|
380
|
+
|
|
381
|
+
Root screening is strict on both roots: no credentials, queries, or
|
|
382
|
+
fragments; no whitespace, C0/C1 control characters, or backslashes; and the
|
|
383
|
+
gate applies to every publish-request and publish-receipt contract version
|
|
384
|
+
rather than being pinned to one version string. Public roots must be HTTPS
|
|
385
|
+
and must not address loopback, link-local, or private networks, and
|
|
386
|
+
verification fetches refuse redirects (`redirect: 'error'`) — see the
|
|
387
|
+
[publication environment variables](/docs/cli-utilities/configuration#explainer-publication-environment-variables)
|
|
388
|
+
for the explicit private-root opt-in and its durable receipt trace.
|
|
389
|
+
Publishing is additive and does not run a root-wide destructive sync.
|
|
331
390
|
|
|
332
391
|
Release validation drives the bounded curated-style/template matrix in a real
|
|
333
392
|
installed Chromium browser and retains machine-readable viewport, clipping,
|
|
@@ -375,8 +434,9 @@ typed adapter settings.
|
|
|
375
434
|
Private integrations use the core boundary directly: resolve private inputs
|
|
376
435
|
before the run, construct one versioned request, invoke the core once, then
|
|
377
436
|
publish or link the versioned manifest after the run. Wrapper acceptance reads
|
|
378
|
-
the complete post-run `
|
|
379
|
-
the core run ID, and rejects foreign or stale receipts
|
|
437
|
+
the complete post-run `publish-receipt/v2`, verifies every manifest artifact
|
|
438
|
+
and the core run ID, and rejects foreign or stale receipts; `publish-receipt/v1`
|
|
439
|
+
remains readable for replay of older runs only. Presets, private source
|
|
380
440
|
systems, external-document synchronization, and personal destinations remain
|
|
381
441
|
wrapper-owned.
|
|
382
442
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: explainer-kit
|
|
3
|
-
version: 2.0
|
|
3
|
+
version: 2.1.0
|
|
4
4
|
description: Use when building destination-neutral visual explainer artifacts from explicit, versioned inputs.
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Edit, Bash, Grep, Glob, Agent, mcp__*
|
|
@@ -74,11 +74,13 @@ request.
|
|
|
74
74
|
The recipe — never the author — selects each artifact's authoring path. Floor
|
|
75
75
|
entries and expansion profiles declare `authoring: markdown` for the narrative
|
|
76
76
|
path or `authoring: html` for the artistic path. The core invokes the author
|
|
77
|
-
once per artifact with an `explainer-kit.author-request/
|
|
77
|
+
once per artifact with an `explainer-kit.author-request/v3` payload carrying the
|
|
78
78
|
artifact identity and type, its authoring path, the inlined brief from
|
|
79
79
|
`briefs/`, the reconciled fact base, the resolved theme, the shell source for
|
|
80
|
-
artistic artifacts,
|
|
81
|
-
artifacts
|
|
80
|
+
artistic artifacts, the required narrative sections for narrative floor
|
|
81
|
+
artifacts, and canonical `artifactLinks` with explicit `index.html` site paths
|
|
82
|
+
and receiver-relative hrefs. Version 2 requests remain readable for replay. It
|
|
83
|
+
accepts only a schema-valid
|
|
82
84
|
`explainer-kit.author-result/v2` with exactly one of `content.markdown` or
|
|
83
85
|
`content.html` plus non-secret provenance, rejects excessive verbatim source
|
|
84
86
|
overlap, retains each validated result under `source/author/` and its content
|
|
@@ -107,11 +109,28 @@ continues. Accepted expansion artifacts render to
|
|
|
107
109
|
`site/{directory}/{slug}/{artifactId}/index.html` and are linked from the floor
|
|
108
110
|
hub; floor artifacts keep their existing paths.
|
|
109
111
|
|
|
112
|
+
`project-recap@2` requires one complete navigational hub and makes diagrams,
|
|
113
|
+
decks, and deep dives adaptive expansions. The planner proposes one only when
|
|
114
|
+
it can name a distinct reader question, the supporting source evidence, and why
|
|
115
|
+
that medium improves on adding more hub prose. The prose brief governs
|
|
116
|
+
typographic roles, hierarchy, slide archetypes, diagram semantics,
|
|
117
|
+
fit-to-content composition, density, repetition, and medium choice. These are
|
|
118
|
+
editorial judgments, not new request fields or renderer rules.
|
|
119
|
+
`project-recap@1` remains readable for replay with its historical three-artifact
|
|
120
|
+
floor.
|
|
121
|
+
|
|
110
122
|
## Review, Approval, and Warnings
|
|
111
123
|
|
|
112
|
-
Approval runs after theme, render,
|
|
113
|
-
render QA, immediately before publish and
|
|
114
|
-
rendered artifacts and the complete warning
|
|
124
|
+
Approval runs after theme, render, hard internal-reference validation, safety
|
|
125
|
+
validation, the guideline checker, and render QA, immediately before publish and
|
|
126
|
+
durability — so a reviewer approves rendered artifacts and the complete warning
|
|
127
|
+
set, not raw prose. The reference gate resolves `href`, `src`, `srcset`,
|
|
128
|
+
fragments, and safe embedded references against explicit manifest/site-tree
|
|
129
|
+
files. It may invoke the existing correction author once, then rerenders and
|
|
130
|
+
revalidates before any browser or visual review. A later visual correction also
|
|
131
|
+
rerenders and passes through the validation-only reference gate without
|
|
132
|
+
receiving another correction attempt. An exhausted `E_INTERNAL_REFERENCE`
|
|
133
|
+
finding fails closed and cannot reach durability.
|
|
115
134
|
|
|
116
135
|
Interactive runs stop with an `incomplete` outcome once artifacts are built and
|
|
117
136
|
checked. Review the rendered `site/` tree, the sources under `source/content/`,
|
|
@@ -144,7 +163,13 @@ succeed.
|
|
|
144
163
|
|
|
145
164
|
Visual critics use the independent whole-set rubric in
|
|
146
165
|
`references/visual-review.md`, which separates review judgment from
|
|
147
|
-
medium-specific authoring rules.
|
|
166
|
+
medium-specific authoring rules. They assess typography, hierarchy,
|
|
167
|
+
composition, density, medium leverage, template repetition, diagram semantics,
|
|
168
|
+
and cross-artifact cohesion from rendered browser evidence. The rubric keeps
|
|
169
|
+
the existing provider-neutral result contract: `pass` means no required
|
|
170
|
+
correction remains, while `correct` carries concrete artifact-scoped actions
|
|
171
|
+
into the one bounded correction round. It does not assign design scores or
|
|
172
|
+
encode geometry thresholds.
|
|
148
173
|
|
|
149
174
|
Render QA is opt-in. It runs only against an injected `browserProbe`, and the
|
|
150
175
|
core never launches a browser of its own — reviewing the rendered output in a
|
|
@@ -34,14 +34,32 @@ Use the same terms, statuses, and numbers throughout.
|
|
|
34
34
|
|
|
35
35
|
## Floor
|
|
36
36
|
|
|
37
|
-
Produce one rich
|
|
38
|
-
|
|
39
|
-
and
|
|
40
|
-
useful without
|
|
37
|
+
Produce one rich navigational hub covering all six sections above. It must
|
|
38
|
+
orient the reader, expose the project state and outcome in the first viewport,
|
|
39
|
+
and link every selected artifact with descriptive labels. The hub should remain
|
|
40
|
+
complete and useful without an expansion artifact.
|
|
41
|
+
|
|
42
|
+
Establish deliberate typographic roles for the title, framing statement,
|
|
43
|
+
section headings, labels, body text, and evidence annotations. Build hierarchy
|
|
44
|
+
through scale, spacing, contrast, and grouping instead of applying one repeated
|
|
45
|
+
card or section treatment everywhere. Keep density fit to the material: shorten
|
|
46
|
+
or restructure crowded passages, but do not pad sparse evidence with decorative
|
|
47
|
+
filler. Choose tables, lists, diagrams, and prose only when each medium makes
|
|
48
|
+
the evidence easier to understand.
|
|
41
49
|
|
|
42
50
|
## Expansion license
|
|
43
51
|
|
|
44
|
-
Propose
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
Propose a supporting diagram, walkthrough deck, or deep-dive only when it
|
|
53
|
+
answers a distinct reader question that the hub cannot answer cleanly. For
|
|
54
|
+
every proposal, identify the reader question, the source evidence that supports
|
|
55
|
+
it, and the rationale for choosing that medium. Do not expand to repeat the
|
|
47
56
|
same story in another format.
|
|
57
|
+
|
|
58
|
+
Use a diagram when topology, direction, ownership, or flow carries meaning.
|
|
59
|
+
Preserve branches, fan-in, cycles, labels, and explicit relationships, and fit
|
|
60
|
+
the frame to the content rather than leaving a tiny graph in a large canvas.
|
|
61
|
+
Use a deck only when pacing adds value; choose slide archetypes to match the
|
|
62
|
+
story, such as an outcome opener, comparison, system view, decision, evidence,
|
|
63
|
+
or next-action frame. Vary composition to fit each claim instead of repeating
|
|
64
|
+
one template. Use a deep-dive when source-backed mechanics or trade-offs need
|
|
65
|
+
more room than the hub can give them.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "explainer-kit.recipe/v2",
|
|
3
|
+
"id": "project-recap",
|
|
4
|
+
"version": "2",
|
|
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
|
+
"expansion": {
|
|
33
|
+
"profiles": [
|
|
34
|
+
{
|
|
35
|
+
"profileId": "supporting-diagram",
|
|
36
|
+
"type": "diagram",
|
|
37
|
+
"authoring": "html",
|
|
38
|
+
"briefRef": "briefs/supporting-diagram.md",
|
|
39
|
+
"shell": "diagram-shell",
|
|
40
|
+
"maxCount": 1
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"profileId": "walkthrough-deck",
|
|
44
|
+
"type": "deck",
|
|
45
|
+
"authoring": "html",
|
|
46
|
+
"briefRef": "briefs/walkthrough-deck.md",
|
|
47
|
+
"shell": "deck-shell",
|
|
48
|
+
"maxCount": 1
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"profileId": "deep-dive",
|
|
52
|
+
"type": "explainer",
|
|
53
|
+
"authoring": "markdown",
|
|
54
|
+
"briefRef": "briefs/deep-dive.md",
|
|
55
|
+
"maxCount": 3
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"limits": {
|
|
59
|
+
"maxArtifacts": 5
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"fallback": {
|
|
63
|
+
"mode": "deterministic-markdown",
|
|
64
|
+
"selection": "explicit",
|
|
65
|
+
"authoring": "markdown",
|
|
66
|
+
"scope": "portfolio"
|
|
67
|
+
},
|
|
68
|
+
"discoveryLimits": {
|
|
69
|
+
"consecutiveNoNewFindingsRounds": 2,
|
|
70
|
+
"maxRounds": 8
|
|
71
|
+
}
|
|
72
|
+
}
|