@adia-ai/adia-ui-forge 0.8.25 → 0.8.27

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adia-ui-kit-forge",
3
- "version": "0.8.25",
3
+ "version": "0.8.27",
4
4
  "description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
5
5
  "author": {
6
6
  "name": "Kim",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog — adia-ui-kit-forge
2
2
 
3
+ ## [0.8.27] — 2026-08-05
4
+
5
+ ### Changed
6
+ - **Agent seats pin explicit models** — no seat rides the caller's tier (gh#618, PR #620).
7
+ - Release tooling: Step 4d.5 regenerates the derived genui catalog post-bump (gh#617, PR #619); publish workflows for `@adia-ai/agent`/`@adia-ai/persona` with tag↔manifest guards (v0.8.26 recovery, PR #624); `tag-lockstep` selftest derives its count from the roster.
8
+
9
+ ### Maintenance
10
+ - **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
11
+ - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-builder.md`) — carried by the entries above.
12
+ - **`skills/` touched in this release window** (2 file(s), e.g. `references/cut-procedure.md`) — carried by the entries above.
13
+
14
+ ## [0.8.26] — 2026-08-05
15
+
16
+ ### Maintenance
17
+ - **Lockstep version bump only.** No source changes in this package; bumped to maintain the lockstep version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.8.26 work shipped in WCH chat-harness wave + genui conformance train; first publish of @adia-ai/agent + @adia-ai/persona. See `packages/web-modules/CHANGELOG.md#0826--2026-08-05` for details.
18
+ - **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
19
+ - **`skills/` touched in this release window** (7 file(s), e.g. `adia-release/SKILL.md`) — carried by the entries above.
20
+
3
21
  ## [0.8.25] — 2026-07-31
4
22
 
5
23
  ### Maintenance
@@ -22,7 +22,10 @@ description: |
22
22
  tools: Read, Grep, Glob, Edit, Write, Bash
23
23
  skills:
24
24
  - adia-a2ui
25
- model: inherit
25
+ # Explicit pin (gh#618): never `inherit` — a Fable/planning caller would
26
+ # silently run this seat's pipeline-tuning and eval-diagnosis work on the
27
+ # caller's tier. Coding/execution seat → opus.
28
+ model: opus
26
29
  ---
27
30
 
28
31
  The a2ui-builder works the pipeline to the preloaded `adia-a2ui` procedure:
@@ -21,7 +21,10 @@ tools: Read, Grep, Glob, Bash
21
21
  skills:
22
22
  - adia-dogfood
23
23
  - adia-gen-review
24
- model: inherit
24
+ # Explicit pin (gh#618): a review/critic seat's verdict must not depend on
25
+ # the caller's model tier — never `inherit`. Sonnet matches the
26
+ # component-author precedent for framework-surface work.
27
+ model: sonnet
25
28
  ---
26
29
 
27
30
  The framework-reviewer runs the preloaded sweep and review procedures and
@@ -22,7 +22,10 @@ description: |
22
22
  tools: Read, Grep, Glob, Edit, Write, Bash
23
23
  skills:
24
24
  - adia-release
25
- model: inherit
25
+ # Explicit pin (gh#618): never `inherit` — this seat runs UNATTENDED cuts,
26
+ # where a cheap caller tier would make live gate-failure judgment calls
27
+ # with no operator watching. Execution seat with real judgment → opus.
28
+ model: opus
26
29
  ---
27
30
 
28
31
  The release-builder runs the preloaded `adia-release` procedure under its
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/adia-ui-forge",
3
- "version": "0.8.25",
3
+ "version": "0.8.27",
4
4
  "description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
5
5
  "keywords": [
6
6
  "adia-ui",
@@ -3,7 +3,7 @@ name: adia-release
3
3
  description: >-
4
4
  Release engineering for the @adia-ai lockstep monorepo. Use when asked to
5
5
  cut and ship a release, promote [Unreleased] CHANGELOG entries, tag and push the
6
- lockstep packages to origin, publish an 11-package release (9 npm
6
+ lockstep packages to origin, publish a 13-package release (11 npm
7
7
  libraries + 2 Claude Code plugins), batch-push piled-up release commits,
8
8
  recover a cut that landed wrong or whose publish workflows didn't fire,
9
9
  fix a check:lockstep bump failure or an F-N1 CHANGELOG-coverage warning,
@@ -17,7 +17,7 @@ user-invocable: true
17
17
 
18
18
  # adia-release
19
19
 
20
- Release engineering for an @adia-ai-style lockstep monorepo: the 11 `@adia-ai/*` packages — 9 npm libraries plus the 2 Claude Code plugins under `packages/plugins/*` version and publish together (class A; the plugins joined the lockstep 2026-07-15 after class-B independence let npm drift a full harness-reset behind the repo). Class B (independent versioning) currently has no members; the procedure is retained for future genuinely-independent packages. The substrate — `scripts/release/*`, the `check:*` gates, the tag-triggered publish workflows — encodes the invariants; this skill routes, sequences, and stops at the judgment calls.
20
+ Release engineering for an @adia-ai-style lockstep monorepo: the `@adia-ai/*` packages on the roster (`scripts/package-paths.mjs`, the single source 13 as of gh#607: 11 npm libraries plus the 2 Claude Code plugins under `packages/plugins/*`) version and publish together (class A; the plugins joined the lockstep 2026-07-15 after class-B independence let npm drift a full harness-reset behind the repo). Class B (independent versioning) currently has no members; the procedure is retained for future genuinely-independent packages. The substrate — `scripts/release/*`, the `check:*` gates, the tag-triggered publish workflows — encodes the invariants; this skill routes, sequences, and stops at the judgment calls.
21
21
 
22
22
  ## Authorization — one go, gates do the rest (operator ruling 2026-07-17)
23
23
 
@@ -31,7 +31,7 @@ Mechanics: `release-pack.mjs --go` auto-confirms all checkpoints (it equals `--y
31
31
 
32
32
  ## Invariants (class-A lockstep cut)
33
33
 
34
- 1. **Lockstep coherence** — all 11 packages bump together (`check:lockstep`): `web-components`, `web-modules`, `llm`, `a2ui-{runtime,compose,corpus,mcp,retrieval,validator}`, and the plugins `adia-ui-{factory,forge}` (each plugin's `.claude-plugin/plugin.json` version moves with its package.json — `bump.mjs` handles both; `verify:plugins` gates the sync).
34
+ 1. **Lockstep coherence** — every roster package bumps together (`check:lockstep`; the roster lives in `scripts/package-paths.mjs`, currently `web-components`, `web-modules`, `llm`, `agent`, `persona`, `a2ui-{runtime,compose,corpus,mcp,retrieval,validator}`, and the plugins `adia-ui-{factory,forge}`) (each plugin's `.claude-plugin/plugin.json` version moves with its package.json — `bump.mjs` handles both; `verify:plugins` gates the sync).
35
35
  2. **PATCH-cut asymmetry** — internal `@adia-ai/*` ranges hold at `^X.Y.0` during PATCH cuts; only MINOR bumps the floor. `^0.0.x` is forbidden (pre-1.0 caret locks exact — shipped a real stale-sibling bug).
36
36
  3. **Release commits land via PR, never a direct push to `main`** (repo policy, operator ruling 2026-07-12): commit on `release/vX.Y.Z` → PR → CI → merge — THEN tag at `main`'s post-merge HEAD, not at the bump commit; post-bump fixes merge before tagging and belong in the tarball. Exception: batch push tags each version at its own release-merge SHA.
37
37
  4. **One umbrella + one per-package tag per cut** (`vX.Y.Z` + 11 × `<pkg>-vX.Y.Z`); publish workflows key off the per-package tags. Push tags **one per `git push`** — a batched multi-tag push drops the trigger event.
@@ -72,7 +72,7 @@ Every cut reports, whether it ran inline or via `release-builder`:
72
72
 
73
73
  | Field | Value |
74
74
  | --- | --- |
75
- | Version | X.Y.Z — 11/11 packages at this version |
75
+ | Version | X.Y.Z — all roster packages at this version (`check:lockstep`) |
76
76
  | Commit / PR | release commit SHA, PR # (merged) |
77
77
  | Tags | umbrella `vX.Y.Z` + 11 per-package tags pushed (or: which are still pending, and why) |
78
78
  | Registry | `npm view @adia-ai/<pkg> version` per package, cited (not "publish workflow green") |
@@ -93,7 +93,7 @@ assumed pass, or "published" without the actual `npm view` output.
93
93
 
94
94
  ## Mechanization (bundled `scripts/`, stdlib Node, all support `--dry`)
95
95
 
96
- `release-pack.mjs` walks the cycle in two phases per invariant 3 — `--mode cut` / `--mode from-scratch` promote `[Unreleased]` (BOTH modes now — a peer's hand-authored section must be promoted whichever mode cut it, and a loud guard blocks the bump if any of the 11 packages still carries non-empty `[Unreleased]` content after promotion), run Step 4f (pre-tag coverage `--fix` with the authoritative F-N1 matcher), and stop at the release commit (PR → merge); `--mode handoff` tags/publishes/deploys from post-merge main. **`--go` is the standard invocation for an operator-initiated release** — the single authorization covers the cycle; evidence blocks print as a log; granular `--yes`/`--push`/`--publish` remain for cautious manual runs (`--push` still refuses to auto-fire past any F-N1 finding). `--mode batch` is not implemented — it hard-rejects with a pointer to [`recovery-paths.md`](references/recovery-paths.md) §Scenario 2 rather than silently misbehaving; a real batch tags each version at its own release-merge SHA, which this single-version orchestrator has no model for. Pre-flight (Step 3) runs the full 24-gate roster from the single shared list in `scripts/gate-roster.mjs` — the same list [`cut-procedure.md`](references/cut-procedure.md) §3.1 transcribes, so a subset run requires editing that one file, not two.
96
+ `release-pack.mjs` walks the cycle in two phases per invariant 3 — `--mode cut` / `--mode from-scratch` promote `[Unreleased]` (BOTH modes now — a peer's hand-authored section must be promoted whichever mode cut it, and a loud guard blocks the bump if any roster package still carries non-empty `[Unreleased]` content after promotion), run Step 4f (pre-tag coverage `--fix` with the authoritative F-N1 matcher), and stop at the release commit (PR → merge); `--mode handoff` tags/publishes/deploys from post-merge main. **`--go` is the standard invocation for an operator-initiated release** — the single authorization covers the cycle; evidence blocks print as a log; granular `--yes`/`--push`/`--publish` remain for cautious manual runs (`--push` still refuses to auto-fire past any F-N1 finding). `--mode batch` is not implemented — it hard-rejects with a pointer to [`recovery-paths.md`](references/recovery-paths.md) §Scenario 2 rather than silently misbehaving; a real batch tags each version at its own release-merge SHA, which this single-version orchestrator has no model for. Pre-flight (Step 3) runs the full 24-gate roster from the single shared list in `scripts/gate-roster.mjs` — the same list [`cut-procedure.md`](references/cut-procedure.md) §3.1 transcribes, so a subset run requires editing that one file, not two.
97
97
 
98
98
  The pieces are callable alone: `bump.mjs` (version fields + the factory `.mcp.json` a2ui-mcp pin, invariant 8), `promote-unreleased.mjs` / `insert-stub.mjs` (CHANGELOG blocks), `tag-lockstep.mjs` (12 tags, `--delete` to move), `dispatch-publish.mjs` (publish workflows; `--verify-triggered` re-dispatches only missing runs; `--after` enforces batch ordering — dispatch output states what WAS done, never a to-do phrased as if it hadn't fired), and `pr-bridge.mjs` (the two-phase bridge: pushes the release branch, opens the PR, waits out CI, and merges ONLY on all-non-fail-soft-checks-green + zero unresolved threads + no changes-requested; any other state stops with evidence — §5.7 mechanized, `--dry` to preview the decision). All fail fast outside a monorepo root (`assert-monorepo-root.mjs`); fork-configurable via `--host` / `--scope`. All 6 CLI scripts (plus `scripts/release/check-release.mjs`) have a `selftest` mode wired into CI's Plugin bin selftests step; the 3 helper modules (`assert-monorepo-root`, `gate-roster`, `package-paths`) are exercised through the CLIs' selftests, not their own.
99
99
 
@@ -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 11-package version coherence enforced by
88
+ maintain the lockstep 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
  ```
@@ -104,7 +104,7 @@ F-N1 (`node scripts/release/check-release.mjs --all-pending`) cross-checks the g
104
104
  node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
105
105
  ```
106
106
 
107
- 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
+ This is cut-procedure §Step 4f: the SAME matcher F-N1 uses at tag time (every roster package, 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.
108
108
 
109
109
  **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.
110
110
 
@@ -119,7 +119,7 @@ Any red → route via [`gates-catalog.md`](gates-catalog.md); fix at the source,
119
119
 
120
120
  ## §Step 4 — (Variant B, or ANY variant with uncommitted `[Unreleased]` content) Promote, bump, lockfile
121
121
 
122
- **Run 4a whenever a hand-authored `## [Unreleased]` section is still sitting uncommitted, not only on a strict Variant B.** `release-pack.mjs --mode cut` (a peer's pre-staged content, not yet promoted) needs it exactly as much as `--mode from-scratch` does — the v0.8.4 near-miss was `--mode cut` skipping this step entirely because the doc (and the script) only associated promotion with "from scratch". Both modes now run it and both hard-fail before the bump if any of the 11 packages still carries non-empty `[Unreleased]` content afterward.
122
+ **Run 4a whenever a hand-authored `## [Unreleased]` section is still sitting uncommitted, not only on a strict Variant B.** `release-pack.mjs --mode cut` (a peer's pre-staged content, not yet promoted) needs it exactly as much as `--mode from-scratch` does — the v0.8.4 near-miss was `--mode cut` skipping this step entirely because the doc (and the script) only associated promotion with "from scratch". Both modes now run it and both hard-fail before the bump if any roster package still carries non-empty `[Unreleased]` content afterward.
123
123
 
124
124
  **4a. Promote** `## [Unreleased]` → `## [vX.Y.Z] — YYYY-MM-DD` per package (`` `${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/promote-unreleased.mjs` ``); author fresh blocks for changed-but-unlogged packages; stub the pure ride-alongs (`` `${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/insert-stub.mjs` ``). Classification recipe + shapes: [`changelog-discipline.md`](changelog-discipline.md).
125
125
 
@@ -129,6 +129,8 @@ Any red → route via [`gates-catalog.md`](gates-catalog.md); fix at the source,
129
129
 
130
130
  **4d.** `npm run check:lockstep` → `OK — all packages at X.Y.Z, all internal ranges at ^X.Y.0`.
131
131
 
132
+ **4d.5. Regenerate the derived genui catalog** (gh#617): `node scripts/build/derive-genui-catalog.mjs`. Its `catalogId` embeds the lockstep version (`adia.base@X.Y.Z`), so the 4b bump just invalidated `packages/genui/adia-catalog/{base,adia-pack}.json` — regenerated pre-bump (§3.0) or not. The v0.8.26 cut skipped this and `check:genui-catalog` failed in CI one push later. Both files ride the release commit (Step 5 stages them).
133
+
132
134
  **4e. Release docs + team notes** (gated, not optional): review the entry
133
135
  files the release touches (root README/CHANGELOG, per-package READMEs —
134
136
  content currency is YOUR judgment; the gate only proves presence), then
@@ -165,6 +167,7 @@ section already names, in this order:
165
167
  node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/bump.mjs" --from X.Y.Z-1 --to X.Y.Z # 4b
166
168
  npm install --package-lock-only --no-audit --no-fund # 4c
167
169
  npm run check:lockstep # 4d
170
+ node scripts/build/derive-genui-catalog.mjs # 4d.5 — catalogId carries the bumped version (gh#617)
168
171
  node scripts/release/check-release.mjs --pending-version X.Y.Z --fix # 4f
169
172
  node scripts/release/generate-release-notes.mjs --version X.Y.Z --write # 4e
170
173
  node scripts/release/check-release-docs.mjs --version X.Y.Z # 4e gate
@@ -187,6 +190,7 @@ git -C "$REPO" checkout -b "release/vX.Y.Z"
187
190
  git -C "$REPO" reset HEAD >/dev/null 2>&1
188
191
  git -C "$REPO" add package-lock.json packages/*/package.json packages/*/CHANGELOG.md \
189
192
  packages/a2ui/*/package.json packages/a2ui/*/CHANGELOG.md \
193
+ packages/genui/adia-catalog/base.json packages/genui/adia-catalog/adia-pack.json \
190
194
  docs/releases/vX.Y.Z.md # + in-scope source + Step-3.0 regen outputs
191
195
  git -C "$REPO" diff --cached --stat | tail -3 # count must match the allowlist
192
196
  ```
@@ -247,7 +251,7 @@ The operator's initiating instruction covers the whole cycle — no per-step re-
247
251
 
248
252
  ## §Step 4f — Pre-tag coverage `--fix` (the retag-loop killer)
249
253
 
250
- 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:
254
+ After the bump + lockfile, run the AUTHORITATIVE F-N1 matcher against the working tree — same code, same `changelogMentions` patterns, every roster package — and let it append verified Maintenance bullets for any changed-but-unmentioned directory:
251
255
 
252
256
  ```bash
253
257
  node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
@@ -18,12 +18,12 @@ If the diff contradicts the plan (a feature deferred, a refactor split across cu
18
18
 
19
19
  ## §The GH release body (single version, ~80–200 lines)
20
20
 
21
- All 11 packages get the same body (`gh release create <pkg>-vX.Y.Z --notes-file …`).
21
+ Every roster package (package-paths.mjs) gets the same body (`gh release create <pkg>-vX.Y.Z --notes-file …`).
22
22
 
23
23
  ```markdown
24
24
  ## vX.Y.Z — <one-line tagline>
25
25
 
26
- 11-package lockstep **PATCH** cut. <One sentence on scope.>
26
+ Lockstep **PATCH** cut (all roster packages). <One sentence on scope.>
27
27
 
28
28
  ### `@adia-ai/<substantive-pkg>`
29
29
  - **<Bold-prefix headline>.** <Why → what → inline file paths.> Closes <FEEDBACK-NN>.
@@ -50,7 +50,7 @@ Shape rules: open with the tagline, no preamble; group by `### @adia-ai/<pkg>`;
50
50
 
51
51
  npm i @adia-ai/web-components@X.Y.Z @adia-ai/web-modules@X.Y.Z
52
52
 
53
- 11-package lockstep PATCH cut. <One sentence.>
53
+ Lockstep PATCH cut (all roster packages). <One sentence.>
54
54
 
55
55
  ## 🔷 `@adia-ai/<pkg>` — <headline>
56
56
  <2–4 sentences.> Closes <FEEDBACK-NN>.
@@ -22,7 +22,7 @@ import process from 'node:process';
22
22
  import { assertMonorepoRoot } from './assert-monorepo-root.mjs';
23
23
  import { PACKAGE_NAMES } from './package-paths.mjs';
24
24
 
25
- // Instance data — fork-configurable. The npm scope the 11 packages publish under.
25
+ // Instance data — fork-configurable. The npm scope the lockstep roster publishes under.
26
26
  // Default preserves @adia-ai behavior; override via --scope or $ADIA_NPM_SCOPE.
27
27
  const DEFAULT_SCOPE = '@adia-ai';
28
28
 
@@ -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 11-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 lockstep 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
  }
@@ -46,6 +46,8 @@ export const PACKAGE_ROSTER = [
46
46
  { name: 'web-components', dir: 'packages/web-components' },
47
47
  { name: 'web-modules', dir: 'packages/web-modules' },
48
48
  { name: 'llm', dir: 'packages/llm' },
49
+ { name: 'agent', dir: 'packages/agent' },
50
+ { name: 'persona', dir: 'packages/persona' },
49
51
  { name: 'a2ui-runtime', dir: 'packages/a2ui/runtime' },
50
52
  { name: 'a2ui-compose', dir: 'packages/a2ui/compose' },
51
53
  { name: 'a2ui-corpus', dir: 'packages/a2ui/corpus' },
@@ -408,6 +408,13 @@ function step4PromoteAndBump(args) {
408
408
  sh('npm install --package-lock-only --no-audit --no-fund', args);
409
409
  sh('npm run check:lockstep', args);
410
410
 
411
+ // Step 4d.5 — regenerate the derived genui catalog (gh#617): its catalogId
412
+ // embeds the lockstep version (`adia.base@X.Y.Z`), so the bump above just
413
+ // invalidated base.json/adia-pack.json. The v0.8.26 cut skipped this and
414
+ // check:genui-catalog failed in CI one push later. Step 5 stages both files.
415
+ console.log('\n Step 4d.5 — regenerate derived genui catalog (catalogId carries the lockstep version):');
416
+ sh('node scripts/build/derive-genui-catalog.mjs', args);
417
+
411
418
  // Step 4e — generate docs/releases/vX.Y.Z.md (gh#399: neither this step nor
412
419
  // its staging into the release commit existed before — check-cut-hygiene's
413
420
  // "notes present" claim (Step 4g, below) went unverified until
@@ -484,6 +491,10 @@ function step5Commit(args) {
484
491
  // gh#399: Step 4e generates this but never staged it before — it landed
485
492
  // in a second PR after the release commit instead (v0.8.11 cut).
486
493
  `docs/releases/v${args.version}.md`,
494
+ // gh#617: Step 4d.5 regenerates these post-bump (catalogId embeds the
495
+ // lockstep version); unstaged, check:genui-catalog fails in CI (v0.8.26).
496
+ 'packages/genui/adia-catalog/base.json',
497
+ 'packages/genui/adia-catalog/adia-pack.json',
487
498
  ...PACKAGE_ROSTER.flatMap(({ name, dir, plugin }) => {
488
499
  // Roster-driven (H3): each package stages its manifest + CHANGELOG;
489
500
  // plugins also stage .claude-plugin/plugin.json (the /plugin-update
@@ -61,7 +61,7 @@ function main() {
61
61
  const tags = buildTagList(args.version);
62
62
 
63
63
  if (args.deleteMode) {
64
- console.log(`Deleting 12 tags for v${args.version}:`);
64
+ console.log(`Deleting ${tags.length} tags for v${args.version}:`);
65
65
  for (const t of tags) {
66
66
  try {
67
67
  run(`git tag -d ${t}`, args.repo, args.dry);
@@ -75,7 +75,7 @@ function main() {
75
75
  }
76
76
 
77
77
  const targetSha = args.at || run('git rev-parse HEAD', args.repo, false).trim();
78
- console.log(`Creating 12 tags for v${args.version} at ${targetSha.slice(0, 9)}:`);
78
+ console.log(`Creating ${tags.length} tags for v${args.version} at ${targetSha.slice(0, 9)}:`);
79
79
  for (const t of tags) {
80
80
  try {
81
81
  run(`git tag ${t} ${args.at || ''}`.trim(), args.repo, args.dry);
@@ -106,8 +106,12 @@ function main() {
106
106
 
107
107
  function selftest() {
108
108
  const tags = buildTagList('1.2.3');
109
- if (tags.length !== 12) {
110
- console.error(`selftest FAIL: expected 12 tags (umbrella + 11 per-package), got ${tags.length}`); process.exit(1);
109
+ // Derive from the roster (package-paths.mjs is the single source) — a
110
+ // hard-coded count here is exactly the drift gh#612 removed from the docs;
111
+ // the v0.8.26 cut caught this one when agent+persona joined (11 → 13).
112
+ const expected = PACKAGE_NAMES.length + 1; // umbrella + one per package
113
+ if (tags.length !== expected) {
114
+ console.error(`selftest FAIL: expected ${expected} tags (umbrella + ${PACKAGE_NAMES.length} per-package), got ${tags.length}`); process.exit(1);
111
115
  }
112
116
  if (tags[0] !== 'v1.2.3') {
113
117
  console.error('selftest FAIL: umbrella tag must be first'); process.exit(1);