@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.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +13 -4
- package/agents/a2ui-builder.corpus.json +35 -0
- package/agents/a2ui-builder.md +37 -0
- package/agents/component-author.corpus.json +40 -0
- package/agents/component-author.md +10 -1
- package/agents/framework-reviewer.corpus.json +35 -0
- package/agents/{framework-verifier.md → framework-reviewer.md} +15 -7
- package/agents/release-builder.corpus.json +39 -0
- package/agents/release-builder.md +39 -0
- package/agents/routing-corpus.json +38 -38
- package/commands/release.md +5 -3
- package/package.json +1 -1
- package/skills/adia-a2ui/SKILL.md +27 -6
- package/skills/adia-a2ui/evals/routing-corpus.json +36 -29
- package/skills/adia-a2ui/references/zettel-calibration.md +5 -5
- package/skills/adia-author/SKILL.md +15 -8
- package/skills/adia-author/evals/routing-corpus.json +39 -218
- package/skills/adia-author/references/authoring-cycle.md +19 -0
- package/skills/adia-author/references/code-style.md +0 -1
- package/skills/adia-author/references/llm-bridge.md +7 -0
- package/skills/adia-author/references/worked-example.md +18 -2
- package/skills/adia-deploy/SKILL.md +33 -18
- package/skills/adia-deploy/evals/routing-corpus.json +33 -142
- package/skills/adia-dogfood/SKILL.md +10 -3
- package/skills/adia-dogfood/evals/routing-corpus.json +30 -142
- package/skills/adia-dogfood/references/admin-shell-anatomy.md +1 -1
- package/skills/adia-gen-review/SKILL.md +18 -7
- package/skills/adia-gen-review/evals/routing-corpus.json +30 -142
- package/skills/adia-gen-review/scripts/gen-review-decompose.mjs +5 -0
- package/skills/adia-llm-internals/SKILL.md +10 -6
- package/skills/adia-llm-internals/evals/routing-corpus.json +33 -142
- package/skills/adia-llm-internals/references/bridge-facade.md +2 -2
- package/skills/adia-llm-internals/references/streaming-sse.md +1 -1
- package/skills/adia-release/SKILL.md +40 -17
- package/skills/adia-release/evals/routing-corpus.json +35 -0
- package/skills/adia-release/references/changelog-discipline.md +14 -8
- package/skills/adia-release/references/cut-procedure.md +48 -28
- package/skills/adia-release/references/independent-package-release.md +1 -1
- package/skills/adia-release/scripts/insert-stub.mjs +1 -1
- package/skills/adia-release/scripts/release-pack.mjs +42 -14
- package/skills/adia-site-docs/SKILL.md +6 -1
- package/skills/adia-site-docs/evals/routing-corpus.json +35 -173
- package/skills/adia-ssr/SKILL.md +32 -14
- package/skills/adia-ssr/evals/routing-corpus.json +32 -136
- package/skills/adia-ssr/references/consumer-workarounds.md +33 -15
- package/skills/adia-ssr/references/failure-shapes.md +49 -7
- package/skills/adia-ssr/references/guard-patterns.md +41 -0
- package/skills/adia-ssr/references/status-ledger.md +5 -7
- package/skills/adia-ssr/references/test-without-linkedom.md +28 -12
- package/agents/a2ui-engineer.md +0 -26
- 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
|
|
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
|
|
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
|
-
**
|
|
100
|
+
**The coverage pass is mechanized — run it BEFORE the release PR, never discover gaps after tagging:**
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
```bash
|
|
103
|
+
node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
|
|
104
|
+
```
|
|
103
105
|
|
|
104
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
27
|
-
| 7 | F-N1 release trip-wire
|
|
28
|
-
| 8 | Push tags (one per push; `main` already merged)
|
|
29
|
-
| 9 | Dispatch publish workflows; wait; verify registry
|
|
30
|
-
| 10 | GH releases + site 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
|
-
## §
|
|
176
|
+
## §Single authorization + evidence log (operator ruling 2026-07-17)
|
|
176
177
|
|
|
177
|
-
|
|
178
|
+
The operator's initiating instruction covers the whole cycle — no 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
|
-
|
|
|
180
|
+
| Evidence logged before | Content | Why it's still printed |
|
|
180
181
|
| --- | --- | --- |
|
|
181
|
-
|
|
|
182
|
-
|
|
|
183
|
-
|
|
|
184
|
-
|
|
|
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
|
|
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
|
|
189
|
+
## §Step 4f — Pre-tag coverage `--fix` (the retag-loop killer)
|
|
189
190
|
|
|
190
|
-
|
|
191
|
+
After the bump + lockfile, run the AUTHORITATIVE F-N1 matcher against the working tree — same code, same `changelogMentions` patterns, all 11 packages — and 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.
|
|
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
|
|
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.
|
|
209
|
-
evidence
|
|
210
|
-
|
|
211
|
-
|
|
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
|
|
234
|
+
## §Step 9 — Publish
|
|
225
235
|
|
|
226
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8
|
-
// tag, before push, before publish
|
|
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
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
// --push : auto-confirm
|
|
46
|
-
// --publish : auto-confirm
|
|
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
|
|
52
|
-
// the
|
|
53
|
-
//
|
|
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: --
|
|
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
|
|
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
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
}
|