@adia-ai/adia-ui-forge 0.8.5 → 0.8.6

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 (53) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +13 -4
  4. package/agents/a2ui-builder.corpus.json +35 -0
  5. package/agents/a2ui-builder.md +37 -0
  6. package/agents/component-author.corpus.json +40 -0
  7. package/agents/component-author.md +10 -1
  8. package/agents/framework-reviewer.corpus.json +35 -0
  9. package/agents/{framework-verifier.md → framework-reviewer.md} +15 -7
  10. package/agents/release-builder.corpus.json +39 -0
  11. package/agents/release-builder.md +39 -0
  12. package/agents/routing-corpus.json +38 -38
  13. package/commands/release.md +5 -3
  14. package/package.json +1 -1
  15. package/skills/adia-a2ui/SKILL.md +27 -6
  16. package/skills/adia-a2ui/evals/routing-corpus.json +36 -29
  17. package/skills/adia-a2ui/references/zettel-calibration.md +5 -5
  18. package/skills/adia-author/SKILL.md +15 -8
  19. package/skills/adia-author/evals/routing-corpus.json +39 -218
  20. package/skills/adia-author/references/authoring-cycle.md +19 -0
  21. package/skills/adia-author/references/code-style.md +0 -1
  22. package/skills/adia-author/references/llm-bridge.md +7 -0
  23. package/skills/adia-author/references/worked-example.md +18 -2
  24. package/skills/adia-deploy/SKILL.md +33 -18
  25. package/skills/adia-deploy/evals/routing-corpus.json +33 -142
  26. package/skills/adia-dogfood/SKILL.md +10 -3
  27. package/skills/adia-dogfood/evals/routing-corpus.json +30 -142
  28. package/skills/adia-dogfood/references/admin-shell-anatomy.md +1 -1
  29. package/skills/adia-gen-review/SKILL.md +18 -7
  30. package/skills/adia-gen-review/evals/routing-corpus.json +30 -142
  31. package/skills/adia-gen-review/scripts/gen-review-decompose.mjs +5 -0
  32. package/skills/adia-llm-internals/SKILL.md +10 -6
  33. package/skills/adia-llm-internals/evals/routing-corpus.json +33 -142
  34. package/skills/adia-llm-internals/references/bridge-facade.md +2 -2
  35. package/skills/adia-llm-internals/references/streaming-sse.md +1 -1
  36. package/skills/adia-release/SKILL.md +40 -17
  37. package/skills/adia-release/evals/routing-corpus.json +35 -0
  38. package/skills/adia-release/references/changelog-discipline.md +14 -8
  39. package/skills/adia-release/references/cut-procedure.md +48 -28
  40. package/skills/adia-release/references/independent-package-release.md +1 -1
  41. package/skills/adia-release/scripts/insert-stub.mjs +1 -1
  42. package/skills/adia-release/scripts/release-pack.mjs +42 -14
  43. package/skills/adia-site-docs/SKILL.md +6 -1
  44. package/skills/adia-site-docs/evals/routing-corpus.json +35 -173
  45. package/skills/adia-ssr/SKILL.md +32 -14
  46. package/skills/adia-ssr/evals/routing-corpus.json +32 -136
  47. package/skills/adia-ssr/references/consumer-workarounds.md +33 -15
  48. package/skills/adia-ssr/references/failure-shapes.md +49 -7
  49. package/skills/adia-ssr/references/guard-patterns.md +41 -0
  50. package/skills/adia-ssr/references/status-ledger.md +5 -7
  51. package/skills/adia-ssr/references/test-without-linkedom.md +28 -12
  52. package/agents/a2ui-engineer.md +0 -26
  53. package/agents/release-engineer.md +0 -26
@@ -85,7 +85,7 @@ The inserted block:
85
85
 
86
86
  ### Maintenance
87
87
  - **Lockstep version bump only.** No source changes in this package; bumped to
88
- maintain the 9-package version coherence enforced by
88
+ maintain the 11-package version coherence enforced by
89
89
  `scripts/release/check-lockstep.mjs`. Substantive v0.X.Y work shipped in
90
90
  <SUBSTANTIVE>. See `<XREF>` for details.
91
91
  ```
@@ -93,19 +93,25 @@ The inserted block:
93
93
  - **Make the PATCH-cut asymmetry visible** when an entry mentions a dependency: version bumps to `X.Y.Z` while internal ranges hold at `^X.Y.0` — spell it as `dependencies["@adia-ai/<x>"]: ^X.Y.0 (covers X.Y.Z)` so it doesn't read as a bug.
94
94
  - **Stale stubs are an F-N1 hazard.** A "no source changes" stub on a package that DID change earns a warn; the fix is authoring (§Authoring), not stubbing.
95
95
 
96
- ## §F-N1 diff-coverage enrichment the path-keyword discipline
96
+ ## §F-N1 diff-coverage — mechanized at cut time (Step 4f)
97
97
 
98
98
  F-N1 (`node scripts/release/check-release.mjs --all-pending`) cross-checks the git diff between consecutive package tags against the `[VERSION]` block: every touched directory should have its keyword mentioned.
99
99
 
100
- **Cosmetic vs real read the entry.** Does any bullet describe the touched files (by component name, by what the change does)? Yes → cosmetic regex miss → enrich. No → real coverage gap → author a new entry.
100
+ **The coverage pass is mechanized run it BEFORE the release PR, never discover gaps after tagging:**
101
101
 
102
- **Enrichment:** add the path keyword inline where it makes the entry *more* accurate — `` `table.yaml` `` → `` `components/table/table.yaml` `` — never as a bolted-on parenthetical. Then (post-invariant-3: the release commit is already merged via PR, so `--amend` is not possible — this lands as a new commit):
102
+ ```bash
103
+ node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
104
+ ```
103
105
 
104
- 1. `git add` the CHANGELOG; `git commit -m "fix(release): F-N1 enrichmentvX.Y.Z"`; push the branch PR CI merge (or land on the same still-open release PR if one exists).
105
- 2. The SHA moved: `node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/tag-lockstep.mjs" --version X.Y.Z --delete`, then re-tag at `main`'s new post-merge HEAD.
106
- 3. Re-run F-N1; expect per-package clean (umbrella error stays, ignored).
106
+ This is cut-procedure §Step 4f: the SAME matcher F-N1 uses at tag time (all 11 packages, the `changelogMentions` pattern set including the `.claude-plugin` leading-dot case), run against the working tree, auto-appending a verified `### Maintenance` bullet per uncovered directory. It re-checks its own output before writing the v0.8.5 cut hand-authored "enrichment" three times that read correctly but didn't contain the literal substrings the checker matches, costing 3 PRs and 3 tag rewrites. `release-pack.mjs` cut modes run this automatically.
107
107
 
108
- Goal state: author entries with full paths from the start so no enrichment pass is needed.
108
+ **Hand-enrichment (better prose than the auto-bullet):** add the path keyword inline where it makes the entry *more* accurate — `` `table.yaml` `` → `` `components/table/table.yaml` `` — never as a bolted-on parenthetical. Verify with `--pending-version` (no `--fix`) before committing; never assume prose satisfies the matcher.
109
+
110
+ **Recovery — a warn AFTER tagging** (Step 4f skipped, or an interleaved merge added uncovered changes): the release commit is already merged via PR, so `--amend` is not possible —
111
+
112
+ 1. Run `--pending-version X.Y.Z --fix`; `git add` the CHANGELOGs; `git commit -m "fix(release): F-N1 enrichment — vX.Y.Z"`; push the branch → PR → CI → merge.
113
+ 2. The SHA moved: `node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/tag-lockstep.mjs" --version X.Y.Z --delete`, then re-tag at `main`'s new post-merge HEAD.
114
+ 3. Re-run F-N1; expect per-package clean (umbrella error stays, ignored). ONE recovery round — if a second warn appears, the cause is upstream (find what keeps merging into the window), not another enrichment.
109
115
 
110
116
  ## §Dating and anchors
111
117
 
@@ -12,7 +12,7 @@ Two entry variants, converging at Step 5:
12
12
  - **Variant A — deploy handoff:** a peer pre-cut the release commit + CHANGELOG + bump + lockfile. Re-baseline, verify, run **Step 4e** (release docs + team notes — the peer's cut may not have generated them, and the pretag gate blocks Step 6 without them), then resume at Step 6 (tag).
13
13
  - **Variant B — author from scratch:** source landed under `## [Unreleased]` with no bump. Do Step 4 (promotion + bump + lockfile), then the full tail.
14
14
 
15
- `` `${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/release-pack.mjs` `` (bundled) mechanizes the sequence in two phases per invariant 3 — the cut modes stop at the release commit (PR → CI → merge happens between), `--mode handoff` runs tag→publish→deploy from post-merge main with the three operator checkpoints preserved; the steps below are the manual/diagnostic form.
15
+ `` `${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/release-pack.mjs` `` (bundled) mechanizes the sequence in two phases per invariant 3 — the cut modes stop at the release commit (PR → CI → merge happens between), `--mode handoff` runs tag→publish→deploy from post-merge main. **Run with `--go` for an operator-initiated release** (single authorization, §below); the steps below are the manual/diagnostic form and run straight through on the same one-go model.
16
16
 
17
17
  | Step | Action | Mutates? |
18
18
  | --- | --- | --- |
@@ -20,14 +20,15 @@ Two entry variants, converging at Step 5:
20
20
  | 2 | Classify uncommitted files; stash strays | Stash only |
21
21
  | 3 | Pre-flight gates (+ harvest preamble if source content changed) | No |
22
22
  | 4 | (Variant B) Promote `[Unreleased]`; bump; lockfile | Yes |
23
+ | 4f | Pre-tag coverage `--fix` — authoritative F-N1 matcher, pre-PR | CHANGELOGs |
23
24
  | 5 | Stage the release allowlist; commit on `release/vX.Y.Z` | Yes |
24
25
  | 5.5 | Pre-commit freshness trip-wire | No |
25
26
  | 5.7 | Release PR: push branch → CI → merge → re-baseline on `main` | PR + merge |
26
- | 6 | Tag umbrella + per-package at post-merge HEAD — **checkpoint 1 first** | Yes |
27
- | 7 | F-N1 release trip-wire; enrich CHANGELOGs on warns | If warns |
28
- | 8 | Push tags (one per push; `main` already merged) — **checkpoint 2 first** | Push |
29
- | 9 | Dispatch publish workflows; wait; verify registry — **checkpoint 3 first** | Publish |
30
- | 10 | GH releases + site deploy **checkpoint 4 first** | Deploy |
27
+ | 6 | Tag umbrella + per-package at post-merge HEAD | Yes |
28
+ | 7 | F-N1 release trip-wire (expected clean 4f already ran) | No |
29
+ | 8 | Push tags (one per push; `main` already merged) | Push |
30
+ | 9 | Dispatch publish workflows; wait; verify registry | Publish |
31
+ | 10 | GH releases + site deploy dispatch | Deploy |
31
32
  | 11 | Author release notes (default, not optional) | No |
32
33
 
33
34
  ---
@@ -172,22 +173,32 @@ post-merge HEAD, so anything merged before tagging ships in the tarball.
172
173
  If unrelated PRs merged between yours and the tag step, that is fine: tag
173
174
  at HEAD is the invariant, and the window closes at the tag.
174
175
 
175
- ## §Operator checkpoints evidence-first, not a bare y/N
176
+ ## §Single authorization + evidence log (operator ruling 2026-07-17)
176
177
 
177
- Four checkpoints total (corrected on PR #289 reviewthis section previously said "three", missing the Step-10 deploy-dispatch confirm that already existed in the script). Each prints its evidence block BEFORE the prompt, never a bare confirm (H5, forge-campaign gh#268 audit — the prior shape asked "proceed? [y/N]" with nothing to judge it against). The prompt itself is a plain two-way gate, honestly: **yes proceeds** (the mutating step for that checkpoint runs); **anything else aborts** — the script exits cleanly having done nothing past that point. There is no in-script "enrich" path (a CodeRabbit finding on PR #289 caught this doc previously over-promising a three-way go/enrich/abort choice the code never implemented) to enrich, abort, fix the thing the evidence surfaced (a CHANGELOG entry, a version mismatch), then re-run from that checkpoint; the evidence re-prints fresh against the fixed state.
178
+ The operator's initiating instruction covers the whole cycleno per-step re-confirmation (this replaced the 4-checkpoint sign-off model after the v0.8.5 cut spent ~40 minutes on approval relays while every real protection fired deterministically). The evidence blocks the checkpoints used to gate on still PRINT, as a running log — the audit trail is unchanged; only the waiting is gone:
178
179
 
179
- | Checkpoint | Evidence shown BEFORE the prompt | Why this evidence (not F-N1 at cp1) |
180
+ | Evidence logged before | Content | Why it's still printed |
180
181
  | --- | --- | --- |
181
- | 1 before tagging | The planned tag list (umbrella + 11 per-package) | F-N1 inspects tag commits it has nothing to check until Step 6 creates them |
182
- | 2 before pushing | The Step 7 F-N1 output (now real, against the just-created tags) + the tag list again | This is the FIRST point F-N1 evidence exists showing it here, not at cp1, is why the step order (tag → F-N1 cp2) is fixed |
183
- | 3 before publishing | The current registry snapshot (per-package versions + `dist-tags.latest`) | Publish ordering is judged against what's LIVE right now, not an assumption |
184
- | 4 before deploying the site | The `deploy-site.yml` dispatch itself as evidence (never a raw rsync) | Deploy is its own irreversible, outward-facing action distinct from publish |
182
+ | Tagging (Step 6) | The planned tag list (umbrella + 11 per-package) | The log line a recovery diagnoses from |
183
+ | Pushing (Step 8) | The Step 7 F-N1 output + tag list + `origin/main..HEAD` count | F-N1's first real evidence — and its ERROR path still hard-stops unconditionally |
184
+ | Publishing (Step 9) | The current registry snapshot (versions + `dist-tags.latest`) | Ordering is verified against what's LIVE, mechanically |
185
+ | Deploying (Step 10) | The `deploy-site.yml` dispatch (never a raw rsync) | The workflow carries its own GitHub-environment human gate |
185
186
 
186
- `release-pack.mjs` implements this: `checkpoint(label, evidence, autoConfirmed)` always prints `evidence` first, then `[CHECKPOINT] <label> — proceed? [y/N]`; `--yes` auto-confirms checkpoint 1 ONLY, `--push` gates checkpoint 2, `--publish` gates checkpoints 3 AND 4 (a single `--yes` used to flatten all of them the defect this replaced). **F-N1 errors (not warns) hard-stop before checkpoint 2 even appears no flag, including `--push`, skips this.** A cosmetic F-N1 warn does not hard-stop, but it also blocks `--push` from auto-confirming checkpoint 2 only the interactive prompt may proceed past a warn (never past an error, which already exited).
187
+ `release-pack.mjs --go` auto-confirms all of these; the granular `--yes` / `--push` / `--publish` flags remain for cautious manual runs and prompt interactively when absent. **Two rules no flag or instruction wording skips:** an F-N1 *error* hard-stops before the push step exists at all, and a cosmetic F-N1 *warn* refuses auto-confirmation at the push boundary (with Step 4f mechanized, a warn appearing at Step 7 means something novel investigate, don't loop enrichment PRs).
187
188
 
188
- ## §Step 6Tag operator checkpoint 1 (before tagging)
189
+ ## §Step 4fPre-tag coverage `--fix` (the retag-loop killer)
189
190
 
190
- Show the operator the planned tag list; proceed only on their go (F-N1 can't run yet see the table above). Then tag **at `main`'s post-merge HEAD** (post-bump fixes belong in the tarball; the window's last merge is the tag point exception: batch push tags each version at its own release-merge SHA):
191
+ After the bump + lockfile, run the AUTHORITATIVE F-N1 matcher against the working tree same code, same `changelogMentions` patterns, all 11 packagesand let it append verified Maintenance bullets for any changed-but-unmentioned directory:
192
+
193
+ ```bash
194
+ node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
195
+ ```
196
+
197
+ Stage its CHANGELOG edits into the release commit (the Step-5 allowlist already covers `CHANGELOG.md`). It re-verifies its own output with the same matcher before writing — a `--fix` that doesn't satisfy the checker is a hard error, not a silent pass. Do NOT use `check-changelog-coverage.mjs` as the pre-tag gate: it carries a different matcher and a 9-package roster missing the 2 plugins — the drift that cost the v0.8.5 cut 3 enrichment PRs and 3 tag rewrites after "coverage clean" at cut time.
198
+
199
+ ## §Step 6 — Tag
200
+
201
+ Log the planned tag list (evidence table above), then tag **at `main`'s post-merge HEAD** (post-bump fixes belong in the tarball; the window's last merge is the tag point — exception: batch push tags each version at its own release-merge SHA):
191
202
 
192
203
  ```bash
193
204
  node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/tag-lockstep.mjs" \
@@ -200,16 +211,15 @@ node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/tag-lockstep.mjs" \
200
211
  node scripts/release/check-release.mjs --all-pending
201
212
  ```
202
213
 
203
- Per-package tags must be `✓ clean`; the umbrella-tag error is expected noise. On warns, run the enrichment pass ([`changelog-discipline.md`](changelog-discipline.md) §F-N1): fix the entry, land it as a follow-up commit through the PR flow (`--amend` is no longer possible — the release commit is already merged), delete + re-create the tags at the new post-merge SHA, re-run.
214
+ Per-package tags must be `✓ clean`; the umbrella-tag error is expected noise. **Expected outcome: clean — Step 4f already ran the same matcher pre-PR.** A warn here means something changed between 4f and the tag (an interleaved merge, a 4f skip) — investigate the cause, then recover via [`changelog-discipline.md`](changelog-discipline.md) §F-N1: fix the entry, land it as a follow-up commit through the PR flow (`--amend` is not possible — the release commit is already merged), delete + re-create the tags at the new post-merge SHA, re-run.
204
215
 
205
- ## §Step 8 — Push tags ← operator checkpoint 2 (before pushing tags)
216
+ ## §Step 8 — Push tags
206
217
 
207
218
  `main` is already on the remote (the release PR merged in Step 5.7) —
208
- only the tags push here. Show the Step 7 F-N1 results + the tag list (the
209
- evidence block for this checkpoint — see the table above) + confirm
210
- `git rev-list --count origin/main..HEAD` is 0 (a non-zero count means
211
- local commits bypassed the PR flow — stop and route them through a PR
212
- first); on go:
219
+ only the tags push here. Log the Step 7 F-N1 results + the tag list
220
+ (evidence table above) + confirm `git rev-list --count origin/main..HEAD`
221
+ is 0 (a non-zero count means local commits bypassed the PR flow — stop
222
+ and route them through a PR first); then:
213
223
 
214
224
  ```bash
215
225
  for t in web-components-vX.Y.Z web-modules-vX.Y.Z llm-vX.Y.Z a2ui-runtime-vX.Y.Z \
@@ -221,9 +231,9 @@ done # pushes drop the create event (Scenari
221
231
  git -C "$REPO" push origin vX.Y.Z # umbrella last; triggers nothing
222
232
  ```
223
233
 
224
- ## §Step 9 — Publish ← operator checkpoint 3 (before publishing)
234
+ ## §Step 9 — Publish
225
235
 
226
- Show the current registry snapshot (per-package versions + `dist-tags.latest`) as this checkpoint's evidence. For batch pushes, confirm ordering with the operator against that snapshot: **oldest version publishes and settles first** — `npm dist-tag latest` is set by publish order. Then:
236
+ Log the current registry snapshot (per-package versions + `dist-tags.latest`) before dispatching. For batch pushes, verify ordering against that snapshot: **oldest version publishes and settles first** — `npm dist-tag latest` is set by publish order. Then:
227
237
 
228
238
  ```bash
229
239
  node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/dispatch-publish.mjs" \
@@ -242,13 +252,15 @@ npm view @adia-ai/web-components dist-tags.latest # must equal X.Y.Z
242
252
 
243
253
  Zero workflows fired after a tag push → [`recovery-paths.md`](recovery-paths.md) §Scenario 7.
244
254
 
245
- ## §Step 10 — GH releases + site deploy ← operator checkpoint 4 (before deploying)
255
+ ## §Step 10 — GH releases + site deploy dispatch
246
256
 
247
257
  ```bash
248
258
  for pkg in <the 9>; do
249
259
  gh release create "$pkg-vX.Y.Z" --title "@adia-ai/$pkg vX.Y.Z" --notes-file <body>.md
250
260
  done
251
- # Site deploy goes through the pipeline, never a raw rsync (operator go required — deploy is checkpoint-class):
261
+ # Site deploy goes through the pipeline, never a raw rsync. The dispatch is
262
+ # covered by the cycle's single authorization; the workflow's own GitHub
263
+ # environment gate (production-site required reviewers) is the human stop:
252
264
  gh workflow run "Deploy site (ui-kit.exe.xyz)" --repo adiahealth/gen-ui-kit --ref main
253
265
  ```
254
266
 
@@ -274,7 +286,15 @@ Always author notes at end-of-cycle without being asked — context is freshest
274
286
 
275
287
  ## §Variant A shortcut
276
288
 
277
- Peer pre-cut the release commit: Step 1 (confirm HEAD is the `release(*): vX.Y.Z` commit) → Step 2 → Step 3 → skip 4–5 → resume at Step 6.
289
+ Peer pre-cut the release commit: Step 1 (confirm HEAD is the `release(*): vX.Y.Z` commit) → Step 2 → Step 3 → skip 4–5 → resume at Step 6. The peer's release commit must already be MERGED to `main` via its PR before tagging (invariant 3 — tag at post-merge HEAD, never at an unpushed local commit); an unmerged pre-cut commit goes through Step 5.7 first, it doesn't shortcut past it.
290
+
291
+ ## §Plugin cache — content between cuts is invisible until the next bump
292
+
293
+ The installed Claude Code plugin cache is keyed by the version string in `.claude-plugin/plugin.json` — `/reload-plugins` only refreshes when that string CHANGES. Lockstep forbids a solo plugin bump, so any skill/agent/doc content merged to `main` between cuts does NOT reach the installed plugin until the next lockstep cut (or a deliberate manual `rsync` of the plugin dir over `~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/`). Consequences:
294
+
295
+ - Shipping plugin-content changes mid-cycle is fine — just know they're repo-only until the next cut; don't report them as "live in the harness".
296
+ - The v0.8.5 case (PR #304): a full release-process rewrite merged with no bump, and the installed plugin silently kept executing the RETIRED procedure until a manual cache sync. If the merged content changes operational behavior an active session depends on, do the manual sync immediately and say so.
297
+ - At cut time nothing extra is needed — the lockstep bump itself is what invalidates the cache.
278
298
 
279
299
  ## §When to abort
280
300
 
@@ -21,7 +21,7 @@
21
21
  | Demo-site deploy | yes | **none** |
22
22
  | Publish trigger | tag-triggered per-package workflow | same mechanism (`.github/workflows/publish-adia-ui-{factory,forge}.yml`) |
23
23
 
24
- Class B keeps the operator checkpoints and the verify-against-the-registry discipline; it drops every lockstep-specific invariant.
24
+ Class B keeps the single-authorization model and the verify-against-the-registry discipline; it drops every lockstep-specific invariant.
25
25
 
26
26
  ## §New-package onboarding — the three trip-wires a FIRST cut hits
27
27
 
@@ -68,7 +68,7 @@ function buildStub(version, date, substantive, xref) {
68
68
  return `## [${version}] — ${date}
69
69
 
70
70
  ### Maintenance
71
- - **Lockstep version bump only.** No source changes in this package; bumped to maintain the 9-package version coherence enforced by \`scripts/release/check-lockstep.mjs\`. Substantive v${version} work shipped in ${substantive}. See \`${xref}\` for details.
71
+ - **Lockstep version bump only.** No source changes in this package; bumped to maintain the 11-package version coherence enforced by \`scripts/release/check-lockstep.mjs\`. Substantive v${version} work shipped in ${substantive}. See \`${xref}\` for details.
72
72
 
73
73
  `;
74
74
  }
@@ -4,8 +4,11 @@
4
4
  // Chains the 5 CLI helpers (bump · promote-unreleased · insert-stub ·
5
5
  // tag-lockstep · dispatch-publish) plus the non-helper steps (lockfile ·
6
6
  // pre-flight gates · git commit · F-N1 · push · GH releases · site
7
- // deploy) into one walked sequence with 3 operator checkpoints (before
8
- // tag, before push, before publish) per SKILL.md operator checkpoints.
7
+ // deploy) into one walked sequence with 4 confirmation boundaries (before
8
+ // tag, before push, before publish, before deploy dispatch). Under the
9
+ // single-authorization model (SKILL.md §Authorization, operator ruling
10
+ // 2026-07-17) `--go` auto-confirms all of them — the evidence blocks still
11
+ // print as a log; the granular flags below remain for cautious manual runs.
9
12
  //
10
13
  // MODES (two-phase since 2026-07-16 — invariant 3: release commits land via
11
14
  // PR, so the cut modes stop after the release commit; handoff runs the
@@ -35,22 +38,27 @@
35
38
  // --stub-packages a,b,c : packages getting the lockstep stub
36
39
  //
37
40
  // FLAGS:
41
+ // --go : single-authorization — the operator's cut-start go
42
+ // covers the whole cycle; equals --yes --push --publish.
43
+ // THE standard invocation for an operator-initiated
44
+ // release. An F-N1 warn still refuses auto-confirm at
45
+ // the push boundary (a gate failure, not ceremony).
38
46
  // --dry : preview all commands, no mutation, no prompts
39
- // --yes : auto-confirm CHECKPOINT 1 ONLY (before tagging). Tag
40
- // creation is the least destructive of the three
41
- // mutating boundaries (moving/deleting a local-only
42
- // tag is free); push and publish each need their own
43
- // explicit go — --yes does not cover them (H5/defect-2:
44
- // a single --yes used to flatten all 3 checkpoints).
45
- // --push : auto-confirm CHECKPOINT 2 (before pushing tags)
46
- // --publish : auto-confirm CHECKPOINT 3 (before dispatching publishes)
47
+ // --yes : auto-confirm the tag boundary ONLY. Tag creation is
48
+ // the least destructive of the mutating boundaries
49
+ // (moving/deleting a local-only tag is free); push and
50
+ // publish each need their own flag --yes does not
51
+ // cover them (H5/defect-2: a single --yes used to
52
+ // flatten every boundary).
53
+ // --push : auto-confirm the push-tags boundary
54
+ // --publish : auto-confirm the publish + deploy-dispatch boundaries
47
55
  // --skip-gates : (DEBUG ONLY) skip pre-flight (don't ship anything!)
48
56
  // --skip-site : skip the EXE deploy step (rare; for offline cycles)
49
57
  //
50
58
  // Part of the adia-release skill. Mechanizes the cut procedure from
51
- // references/cut-procedure.md while preserving operator judgment at
52
- // the 3 mutating-checkpoint boundaries. Every checkpoint prints its evidence
53
- // block BEFORE the prompt (H5) — never a bare y/N.
59
+ // references/cut-procedure.md. Every confirmation boundary prints its evidence
60
+ // block BEFORE the prompt (H5) never a bare y/N — whether it waits for input
61
+ // (manual flags) or auto-confirms (--go).
54
62
 
55
63
  import { execSync } from 'node:child_process';
56
64
  import { createInterface } from 'node:readline/promises';
@@ -108,6 +116,14 @@ function parseArgs(argv) {
108
116
  else if (k === '--yes') args.yes = true;
109
117
  else if (k === '--push') args.push = true;
110
118
  else if (k === '--publish') args.publish = true;
119
+ // --go: the single-authorization model (operator ruling 2026-07-17,
120
+ // replacing the 4-checkpoint ceremony after the v0.8.5 cut spent ~40
121
+ // minutes on approval relays that produced zero safety). The operator's
122
+ // cut-start instruction covers the WHOLE cycle; the run stops only on
123
+ // gate failures. Equivalent to --yes --push --publish; the F-N1
124
+ // error hard-stop and the warn-blocks-auto-confirm rule still apply —
125
+ // those are gates, not approvals, and no flag skips them.
126
+ else if (k === '--go') { args.yes = true; args.push = true; args.publish = true; }
111
127
  else if (k === '--skip-gates') args.skipGates = true;
112
128
  else if (k === '--skip-site') args.skipSite = true;
113
129
  else if (k === '-h' || k === '--help') { help(); process.exit(0); }
@@ -144,7 +160,10 @@ function help() {
144
160
  --substantive-packages web-components,web-modules,a2ui/corpus \\
145
161
  --stub-packages llm,a2ui/compose,a2ui/mcp,a2ui/retrieval,a2ui/runtime,a2ui/validator
146
162
 
147
- Flags: --dry (preview all) --yes (auto-confirm checkpoint 1 ONLY tag)
163
+ Flags: --go (single-authorization: the operator's cut-start go covers the
164
+ whole cycle — auto-confirms ALL checkpoints; stops only on
165
+ gate failures. THE DEFAULT for an operator-initiated release.)
166
+ --dry (preview all) --yes (auto-confirm checkpoint 1 ONLY — tag)
148
167
  --push (auto-confirm checkpoint 2 — push tags)
149
168
  --publish (auto-confirm checkpoint 3 — dispatch publishes)
150
169
  --skip-site (skip EXE deploy)
@@ -311,6 +330,15 @@ function step4PromoteAndBump(args) {
311
330
  sh(`node ${SCRIPT_DIR}/bump.mjs --from ${args.previous} --to ${args.version}`, args);
312
331
  sh('npm install --package-lock-only --no-audit --no-fund', args);
313
332
  sh('npm run check:lockstep', args);
333
+
334
+ // Step 4f — pre-tag F-N1 coverage with auto-fix, run with the AUTHORITATIVE
335
+ // matcher (check-release.mjs itself, not the drifted 9-package
336
+ // check-changelog-coverage.mjs). Appends verified Maintenance bullets for
337
+ // any changed-but-unmentioned directory so the post-tag F-N1 (Step 7) is a
338
+ // formality. The v0.8.5 cut lacked this and paid 3 enrichment PRs + 3
339
+ // delete/retag rounds discovering the same gaps only after tagging.
340
+ console.log('\n Step 4f — pre-tag coverage (+auto-fix) with the authoritative F-N1 matcher:');
341
+ sh(`node scripts/release/check-release.mjs --pending-version ${args.version} --fix`, args);
314
342
  }
315
343
 
316
344
  // ── Step 5 — Commit ──────────────────────────────────────────────
@@ -35,7 +35,7 @@ skill routes to it and enforces it, it does not restate it.
35
35
  | Task shape | Do |
36
36
  | --- | --- |
37
37
  | New page in an owned category | Read the convention doc's template section; copy the shared skeleton from a sibling page in the same category (narrative archetype vs. reference/gallery archetype). |
38
- | Callout / "meta content" block | `<alert-ui variant="warning\|info\|...">` with `<div slot="content">` (never `<span>` — the transpiler only treats `p`/`div`/`ul`/`ol` as prose; a `<span>` silently reorders mixed inline content on regen) for rich text — never a bare `data-*` attribute. A whole multi-heading section aimed at a different reader (not a short callout) is NOT `alert-ui`'s job either (wrong shape)currently there's no working distinguishing treatment for this case beyond the heading text itself; see the convention doc's rule 2 for what's been tried and why it doesn't render. |
38
+ | Callout / "meta content" block | `<alert-ui variant="warning\|info\|...">` with `<div slot="content">` (never `<span>` — the transpiler only treats `p`/`div`/`ul`/`ol` as prose; a `<span>` silently reorders mixed inline content on regen) for rich text — never a bare `data-*` attribute. A whole multi-heading section aimed at a different reader (not a short callout) is NOT `alert-ui`'s job either wrong shape — the convention doc's rule 2 carries the working treatment (eyebrow `<tag-ui>` title-row, TKT-0011). |
39
39
  | Tamed admin-shell demo | Add `class="demo-frame"` to the shell instance + a page-local `<style>` block setting only `--demo-frame-height` (and any genuinely page-specific extra). That's `site/site.css`'s `.demo-frame` utility already covering `position`/`border`/`overflow`/`.demo-body` padding. |
40
40
  | A surface needs to read as "its own distinct object" against the page background (a chip, a pill) | Reuse `--a-canvas-well-strong` (`packages/web-components/styles/colors/semantics/core.css`) — verified ≥3:1 (WCAG 2.2 SC 1.4.11) in both schemes. `--a-canvas-well` alone is for a subtly-sunken panel; a new candidate token always runs through `color:color-verify` first. |
41
41
  | "Is this page consistent?" / review request | Check the page against the convention doc's rules 1–4 by name; a finding names the specific rule violated, not just "this looks off." |
@@ -63,6 +63,11 @@ A check that cannot run (missing script, no network for a build step) is a
63
63
  named blocker in the report — flag it and stop; never mark the page done on
64
64
  an assumed pass.
65
65
 
66
+ The fresh-context critic for an authored page is the `framework-reviewer`
67
+ agent (its dogfood visual probe covers rendered site surfaces) — the author
68
+ never certifies their own page's rendered result; the mechanical checks
69
+ above plus that read-only pass together are the review.
70
+
66
71
  Done when the touched page(s) pass the checks above and, for a reviewed
67
72
  page, every finding cites the specific rule in `site-pages-authoring.md` it
68
73
  violates.
@@ -1,176 +1,38 @@
1
1
  {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "name": "adia-site-docs routing accuracy corpus",
4
- "version": "1.0.0",
5
- "purpose": "Routing-eval corpus for adia-site-docs (adia-forge plugin). Each phrase declares whether adia-site-docs SHOULD be the routing target. Scored by the estate's TF-IDF routing-eval runner against the skill's description (heuristic token overlap).",
6
- "scoring_notes": "Heuristic signal, not ground truth. Treat misroutes as a prompt to tighten the skill description, never as a reason to keyword-stuff it. Real harness routing is LLM-driven.",
7
- "license": "internal",
8
- "scope": "adia-site-docs routing does this phrase activate adia-site-docs?",
9
-
10
- "minimums_per_spec": {
11
- "trigger_phrases": 16,
12
- "adversarial_phrases": 6,
13
- "task_shapes_covered": "new-page, review-page, callout-fix, demo-frame-consistency, contrast-token, sibling-boundary",
14
- "adversarial_fraction": "27%"
15
- },
16
-
17
- "phrases": [
18
- {
19
- "id": "site-docs-review-01",
20
- "phrase": "review this site docs page for consistency",
21
- "should_route_to_site_docs": true,
22
- "expected_shape": "review-page",
23
- "rationale": "Canonical review-a-page task shape."
24
- },
25
- {
26
- "id": "site-docs-review-02",
27
- "phrase": "does this callout look like plain text to you",
28
- "should_route_to_site_docs": true,
29
- "expected_shape": "callout-fix",
30
- "rationale": "Symptom description matching Defect 2 (fabricated data-alert)."
31
- },
32
- {
33
- "id": "site-docs-review-03",
34
- "phrase": "why is the code background not visible on this page",
35
- "should_route_to_site_docs": true,
36
- "expected_shape": "contrast-token",
37
- "rationale": "Symptom description matching Defect 1 (inline-code contrast)."
38
- },
39
- {
40
- "id": "site-docs-new-page-01",
41
- "phrase": "add a new pattern page under site/pages/patterns",
42
- "should_route_to_site_docs": true,
43
- "expected_shape": "new-page",
44
- "rationale": "Explicit site/pages/patterns path mention."
45
- },
46
- {
47
- "id": "site-docs-new-page-02",
48
- "phrase": "author a new getting-started guide page",
49
- "should_route_to_site_docs": true,
50
- "expected_shape": "new-page",
51
- "rationale": "getting-started/ is one of this skill's 5 owned categories."
52
- },
53
- {
54
- "id": "site-docs-new-page-03",
55
- "phrase": "write a new architecture explainer page for the docs site",
56
- "should_route_to_site_docs": true,
57
- "expected_shape": "new-page",
58
- "rationale": "architecture/ is one of this skill's 5 owned categories."
59
- },
60
- {
61
- "id": "site-docs-new-page-04",
62
- "phrase": "create a reference page documenting the MCP tools",
63
- "should_route_to_site_docs": true,
64
- "expected_shape": "new-page",
65
- "rationale": "reference/ is one of this skill's 5 owned categories."
66
- },
67
- {
68
- "id": "site-docs-demo-frame-01",
69
- "phrase": "this demo page needs a tamed static frame like the other pattern pages",
70
- "should_route_to_site_docs": true,
71
- "expected_shape": "demo-frame-consistency",
72
- "rationale": "Matches the .demo-frame consolidation rule."
73
- },
74
- {
75
- "id": "site-docs-demo-frame-02",
76
- "phrase": "add a new admin-shell demo to this patterns page without duplicating the taming CSS",
77
- "should_route_to_site_docs": true,
78
- "expected_shape": "demo-frame-consistency",
79
- "rationale": "Direct match on rule 3 (reuse .demo-frame)."
80
- },
81
- {
82
- "id": "site-docs-review-04",
83
- "phrase": "is this site page consistent with our authoring conventions",
84
- "should_route_to_site_docs": true,
85
- "expected_shape": "review-page",
86
- "rationale": "Direct convention-compliance ask."
87
- },
88
- {
89
- "id": "site-docs-review-05",
90
- "phrase": "audit site/pages/guides for the same callout bug we found elsewhere",
91
- "should_route_to_site_docs": true,
92
- "expected_shape": "review-page",
93
- "rationale": "Explicit guides/ path + defect-class reference."
94
- },
95
- {
96
- "id": "site-docs-callout-01",
97
- "phrase": "this warning box on the docs page has no background at all",
98
- "should_route_to_site_docs": true,
99
- "expected_shape": "callout-fix",
100
- "rationale": "Symptom description matching the fabricated data-alert defect."
101
- },
102
- {
103
- "id": "site-docs-new-page-05",
104
- "phrase": "what's the shared skeleton every site docs page should follow",
105
- "should_route_to_site_docs": true,
106
- "expected_shape": "new-page",
107
- "rationale": "Direct ask about the template decomposition this skill carries."
108
- },
109
- {
110
- "id": "site-docs-contrast-01",
111
- "phrase": "what token should a new chip-like surface use to stay readable against the page background",
112
- "should_route_to_site_docs": true,
113
- "expected_shape": "contrast-token",
114
- "rationale": "Direct match on rule 1 (--a-canvas-well-strong)."
115
- },
116
- {
117
- "id": "site-docs-review-06",
118
- "phrase": "check the patterns pages for any other unstyled data attributes like data-alert",
119
- "should_route_to_site_docs": true,
120
- "expected_shape": "review-page",
121
- "rationale": "Direct defect-class sweep request."
122
- },
123
- {
124
- "id": "site-docs-new-page-06",
125
- "phrase": "scaffold a new getting-started/theming-dark-mode.html page",
126
- "should_route_to_site_docs": true,
127
- "expected_shape": "new-page",
128
- "rationale": "Explicit new-file-under-owned-category shape."
129
- },
130
-
131
- {
132
- "id": "site-docs-adversarial-01",
133
- "phrase": "review this component's own demo gallery in its .examples.html file",
134
- "should_route_to_site_docs": false,
135
- "expected_shape": "sibling-boundary",
136
- "rationale": "packages/web-components/components/*/*.examples.html is adia-author's remit, not this skill's."
137
- },
138
- {
139
- "id": "site-docs-adversarial-02",
140
- "phrase": "fix this gen-ui training exemplar page under site/pages/examples",
141
- "should_route_to_site_docs": false,
142
- "expected_shape": "sibling-boundary",
143
- "rationale": "site/pages/examples/** is the pure-primitive-composition training-harvest surface governed by composition-and-examples.md + adia-a2ui, explicitly fenced out."
144
- },
145
- {
146
- "id": "site-docs-adversarial-03",
147
- "phrase": "tune the zettel retrieval threshold for the chunk corpus",
148
- "should_route_to_site_docs": false,
149
- "expected_shape": "sibling-boundary",
150
- "rationale": "A2UI pipeline internals belong to adia-a2ui, unrelated to site/pages authoring."
151
- },
152
- {
153
- "id": "site-docs-adversarial-04",
154
- "phrase": "add a new prop to the button-ui primitive",
155
- "should_route_to_site_docs": false,
156
- "expected_shape": "sibling-boundary",
157
- "rationale": "Primitive authoring is adia-author's remit."
158
- },
159
- {
160
- "id": "site-docs-adversarial-05",
161
- "phrase": "cut the next npm release for the 9 @adia-ai packages",
162
- "should_route_to_site_docs": false,
163
- "expected_shape": "sibling-boundary",
164
- "rationale": "Release engineering is adia-release's remit, unrelated to docs-page authoring."
165
- },
166
- {
167
- "id": "site-docs-adversarial-06",
168
- "phrase": "deploy the docs site to ui-kit.exe.xyz",
169
- "should_route_to_site_docs": false,
170
- "expected_shape": "sibling-boundary",
171
- "rationale": "Deploy operations are adia-deploy's remit; this skill authors content, it doesn't ship it."
172
- }
2
+ "positives": [
3
+ "review this site docs page for consistency",
4
+ "does this callout look like plain text to you",
5
+ "why is the code background not visible on this page",
6
+ "add a new pattern page under site/pages/patterns",
7
+ "author a new getting-started guide page",
8
+ "write a new architecture explainer page for the docs site",
9
+ "create a reference page documenting the MCP tools",
10
+ "this demo page needs a tamed static frame like the other pattern pages",
11
+ "add a new admin-shell demo to this patterns page without duplicating the taming CSS",
12
+ "is this site page consistent with our authoring conventions",
13
+ "audit site/pages/guides for the same callout bug we found elsewhere",
14
+ "this warning box on the docs page has no background at all",
15
+ "what's the shared skeleton every site docs page should follow",
16
+ "what token should a new chip-like surface use to stay readable against the page background",
17
+ "check the patterns pages for any other unstyled data attributes like data-alert",
18
+ "scaffold a new getting-started/theming-dark-mode.html page"
173
19
  ],
174
-
175
- "evaluator_notes": "Adversarial phrases 1-2 specifically test the two hardest-to-distinguish fences (component .examples.html vs site/pages/patterns/*.html; site/pages/examples/** vs site/pages/{architecture,getting-started,guides,patterns,reference}/**) — both surfaces are literally *.html under similar-looking paths, so the description must lean on the explicit path lists, not just 'site pages' as a phrase."
20
+ "negatives": [
21
+ "review this component's own demo gallery in its .examples.html file",
22
+ "fix this gen-ui training exemplar page under site/pages/examples",
23
+ "tune the zettel retrieval threshold for the chunk corpus",
24
+ "add a new prop to the button-ui primitive",
25
+ "cut the next npm release for the 9 @adia-ai packages",
26
+ "deploy the docs site to ui-kit.exe.xyz",
27
+ "fix this gen-ui training exemplar page",
28
+ "add a demo to the patterns page for card-ui"
29
+ ],
30
+ "_measured": {
31
+ "as_of": "2026-07-18",
32
+ "scorer": "routing_eval.py (nonoun-plugins/forge)",
33
+ "f1": 0.733,
34
+ "precision": 0.786,
35
+ "recall": 0.688,
36
+ "exit_code": 0
37
+ }
176
38
  }