@adia-ai/adia-ui-forge 0.8.61 → 0.8.63

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 (142) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/.codex-plugin/plugin.json +3 -3
  3. package/CHANGELOG.md +309 -274
  4. package/README.md +54 -18
  5. package/__init__.py +8 -8
  6. package/agents/a2ui-maintenance-agent.corpus.json +7 -7
  7. package/agents/a2ui-maintenance-agent.md +6 -6
  8. package/agents/a2ui-planner-agent.md +11 -11
  9. package/agents/demo-audit-agent.corpus.json +4 -4
  10. package/agents/demo-audit-agent.md +8 -9
  11. package/agents/framework-checker.md +10 -11
  12. package/agents/framework-planner-agent.md +9 -10
  13. package/agents/gen-ui-review-agent.corpus.json +4 -4
  14. package/agents/gen-ui-review-agent.md +8 -8
  15. package/agents/package-release-agent.corpus.json +4 -4
  16. package/agents/package-release-agent.md +9 -10
  17. package/agents/primitive-authoring-agent.corpus.json +1 -1
  18. package/agents/primitive-authoring-agent.md +5 -5
  19. package/agents/routing-corpus.json +46 -46
  20. package/codex.interface.json +1 -1
  21. package/commands/gen-ui-review.md +1 -1
  22. package/commands/package-release.md +2 -2
  23. package/package.json +1 -1
  24. package/plugin.yaml +2 -2
  25. package/prompts/gen-ui-review.md +1 -1
  26. package/prompts/package-release.md +2 -2
  27. package/references/contracts/a2ui-mcp-surface.md +7 -7
  28. package/references/contracts/migration-guide-format.md +6 -7
  29. package/references/shared/content-trust.md +3 -5
  30. package/skills/a2ui-maintenance/SKILL.md +13 -16
  31. package/skills/a2ui-maintenance/evals/evals.json +2 -2
  32. package/skills/a2ui-maintenance/evals/routing-corpus.json +1 -1
  33. package/skills/a2ui-maintenance/references/anti-patterns.md +10 -10
  34. package/skills/a2ui-maintenance/references/chunk-authoring.md +11 -12
  35. package/skills/a2ui-maintenance/references/corpus-discipline.md +13 -14
  36. package/skills/a2ui-maintenance/references/data-model-reactivity.md +22 -25
  37. package/skills/a2ui-maintenance/references/eval-diagnostics.md +21 -21
  38. package/skills/a2ui-maintenance/references/format-extension-decisions.md +12 -13
  39. package/skills/a2ui-maintenance/references/leverage-rules.md +6 -6
  40. package/skills/a2ui-maintenance/references/mcp-pipeline-ops.md +9 -10
  41. package/skills/a2ui-maintenance/references/mcp-tool-reference.md +11 -12
  42. package/skills/a2ui-maintenance/references/pipeline-overview.md +33 -38
  43. package/skills/a2ui-maintenance/references/semantic-fail-lifting.md +13 -14
  44. package/skills/a2ui-maintenance/references/strategy-engines.md +14 -16
  45. package/skills/a2ui-maintenance/references/surface-lifecycle.md +10 -11
  46. package/skills/a2ui-maintenance/references/zettel-calibration.md +14 -16
  47. package/skills/component-md-authoring/SKILL.md +20 -21
  48. package/skills/component-md-authoring/agents/openai.yaml +1 -1
  49. package/skills/cross-harness-authoring-standards/SKILL.md +19 -21
  50. package/skills/cross-harness-authoring-standards/agents/openai.yaml +1 -1
  51. package/skills/cross-harness-compatibility-standards/SKILL.md +34 -35
  52. package/skills/cross-harness-compatibility-standards/agents/openai.yaml +1 -1
  53. package/skills/demo-audit/SKILL.md +38 -38
  54. package/skills/demo-audit/evals/routing-corpus.json +1 -1
  55. package/skills/demo-audit/references/admin-shell-anatomy.md +21 -25
  56. package/skills/demo-audit/references/app-shell-pitfalls.md +11 -13
  57. package/skills/demo-audit/references/auto-fix-allowlist.md +3 -3
  58. package/skills/demo-audit/references/card-anatomy-sweep.md +10 -11
  59. package/skills/demo-audit/references/chat-shell-anatomy.md +25 -26
  60. package/skills/demo-audit/references/editor-shell-anatomy.md +25 -28
  61. package/skills/demo-audit/references/html-attr-sweep.md +12 -13
  62. package/skills/demo-audit/references/mode7-status-battery.md +4 -4
  63. package/skills/demo-audit/references/native-leak-annotations.md +8 -8
  64. package/skills/demo-audit/references/output-contract-worked-example.md +8 -8
  65. package/skills/demo-audit/references/probe-discipline-and-escalation.md +2 -2
  66. package/skills/demo-audit/references/visual-probe-triage.md +21 -23
  67. package/skills/gen-ui-review/SKILL.md +27 -27
  68. package/skills/gen-ui-review/agents/openai.yaml +1 -1
  69. package/skills/gen-ui-review/evals/routing-corpus.json +1 -1
  70. package/skills/gen-ui-review/references/corpus-html-patterns.md +28 -29
  71. package/skills/gen-ui-review/references/exit-gate-mechanics.md +5 -5
  72. package/skills/gen-ui-review/references/lookup-maintenance.md +2 -2
  73. package/skills/gen-ui-review/references/loop-protocol.md +25 -25
  74. package/skills/gen-ui-review/references/rubric-cosmetic.md +10 -10
  75. package/skills/gen-ui-review/references/rubric-decompose.md +15 -16
  76. package/skills/gen-ui-review/references/rubric-score.md +23 -24
  77. package/skills/gen-ui-review/references/scorecard-worked-examples.md +12 -12
  78. package/skills/gen-ui-review/references/scores.schema.json +2 -2
  79. package/skills/llm-client-maintenance/SKILL.md +12 -12
  80. package/skills/llm-client-maintenance/evals/routing-corpus.json +1 -1
  81. package/skills/llm-client-maintenance/references/adapter-contract.md +27 -27
  82. package/skills/llm-client-maintenance/references/add-a-provider.md +25 -25
  83. package/skills/llm-client-maintenance/references/bridge-facade.md +31 -31
  84. package/skills/llm-client-maintenance/references/browser-proxy-boundary.md +17 -17
  85. package/skills/llm-client-maintenance/references/model-registry.md +14 -14
  86. package/skills/llm-client-maintenance/references/streaming-sse.md +21 -21
  87. package/skills/package-release/SKILL.md +21 -23
  88. package/skills/package-release/evals/evals.json +2 -2
  89. package/skills/package-release/evals/routing-corpus.json +2 -2
  90. package/skills/package-release/references/authorization-model.md +6 -8
  91. package/skills/package-release/references/changelog-discipline.md +25 -27
  92. package/skills/package-release/references/cut-procedure.md +129 -136
  93. package/skills/package-release/references/gates-catalog.md +42 -43
  94. package/skills/package-release/references/independent-package-release.md +14 -15
  95. package/skills/package-release/references/invariants-detail.md +9 -9
  96. package/skills/package-release/references/mechanization.md +11 -12
  97. package/skills/package-release/references/migration-guide-authoring.md +20 -20
  98. package/skills/package-release/references/notes-authoring.md +20 -20
  99. package/skills/package-release/references/recovery-paths.md +28 -28
  100. package/skills/primitive-authoring/SKILL.md +19 -19
  101. package/skills/primitive-authoring/agents/openai.yaml +1 -1
  102. package/skills/primitive-authoring/evals/evals.json +2 -2
  103. package/skills/primitive-authoring/evals/routing-corpus.json +2 -2
  104. package/skills/primitive-authoring/references/INDEX.md +22 -22
  105. package/skills/primitive-authoring/references/anti-patterns.md +76 -77
  106. package/skills/primitive-authoring/references/api-contract.md +63 -65
  107. package/skills/primitive-authoring/references/authoring-cycle.md +47 -50
  108. package/skills/primitive-authoring/references/canonical-pattern-index.md +118 -118
  109. package/skills/primitive-authoring/references/code-style.md +50 -52
  110. package/skills/primitive-authoring/references/common-gotchas.md +23 -23
  111. package/skills/primitive-authoring/references/composite-demo-protocol.md +42 -45
  112. package/skills/primitive-authoring/references/css-patterns.md +97 -97
  113. package/skills/primitive-authoring/references/for-attribute-event-contract.md +12 -12
  114. package/skills/primitive-authoring/references/form-control-sizing.md +16 -18
  115. package/skills/primitive-authoring/references/lifecycle-patterns.md +42 -42
  116. package/skills/primitive-authoring/references/llm-bridge.md +21 -21
  117. package/skills/primitive-authoring/references/module-promotion.md +51 -51
  118. package/skills/primitive-authoring/references/primitive-audit.md +16 -16
  119. package/skills/primitive-authoring/references/shell-patterns.md +81 -81
  120. package/skills/primitive-authoring/references/svg-authoring.md +62 -66
  121. package/skills/primitive-authoring/references/token-contract.md +45 -49
  122. package/skills/primitive-authoring/references/trait-pages.md +8 -8
  123. package/skills/primitive-authoring/references/worked-example.md +39 -39
  124. package/skills/primitive-authoring/references/yaml-contract.md +139 -143
  125. package/skills/site-deployment/SKILL.md +25 -26
  126. package/skills/site-deployment/agents/openai.yaml +1 -1
  127. package/skills/site-deployment/evals/routing-corpus.json +1 -1
  128. package/skills/site-deployment/references/deploy-playbooks.md +51 -53
  129. package/skills/site-docs-authoring/SKILL.md +14 -14
  130. package/skills/site-docs-authoring/agents/openai.yaml +1 -1
  131. package/skills/site-docs-authoring/evals/evals.json +1 -1
  132. package/skills/site-docs-authoring/evals/routing-corpus.json +1 -1
  133. package/skills/site-docs-authoring/intent.md +18 -18
  134. package/skills/ssr-compatibility/SKILL.md +24 -25
  135. package/skills/ssr-compatibility/agents/openai.yaml +1 -1
  136. package/skills/ssr-compatibility/evals/evals.json +1 -1
  137. package/skills/ssr-compatibility/evals/routing-corpus.json +1 -1
  138. package/skills/ssr-compatibility/references/consumer-workarounds.md +22 -23
  139. package/skills/ssr-compatibility/references/failure-shapes.md +84 -91
  140. package/skills/ssr-compatibility/references/guard-patterns.md +54 -58
  141. package/skills/ssr-compatibility/references/status-ledger.md +17 -17
  142. package/skills/ssr-compatibility/references/test-without-linkedom.md +26 -27
package/CHANGELOG.md CHANGED
@@ -1,6 +1,41 @@
1
- # Changelog adia-ui-kit-forge
1
+ # Changelog, adia-ui-kit-forge
2
2
 
3
- ## [0.8.61] — 2026-09-10
3
+ ## [0.8.63] — 2026-09-12
4
+
5
+ ### Changed
6
+
7
+ - chore: accept release_gate G15 (harness overlay convention mismatch) per conductor ruling, file tickets 10035/10036 (ticket 10026) (#4403)
8
+ - chore: bulk em dash removal across the plugin (em-dash-clean, 3059 findings), mechanical rewrite via sdlc's em_dash_sweep.py, no logic change (#4388)
9
+
10
+ ### Fixed
11
+
12
+ - fix: add missing component-md-authoring row to the plugin README's skill inventory (release-gate G10) (#4387)
13
+
14
+ ### Docs
15
+
16
+ - docs: updated the ssr-compatibility skill's failure-shapes/guard-patterns/test-without-linkedom reference docs so their quoted describe() names stay byte-identical to the renamed web-components test names, and removed a residual prose em dash (ticket 10029) (local ticket 10029)
17
+
18
+ ### Maintenance
19
+ - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
20
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
21
+ - **`agent-intents/` touched in this release window** (3 file(s), e.g. `agent-intents/a2ui-planner-agent.intent.md`): carried by the entries above.
22
+ - **`agents/` touched in this release window** (14 file(s), e.g. `agents/a2ui-maintenance-agent.corpus.json`): carried by the entries above.
23
+ - **`commands/` touched in this release window** (2 file(s), e.g. `commands/gen-ui-review.md`): carried by the entries above.
24
+ - **`prompts/` touched in this release window** (2 file(s), e.g. `prompts/gen-ui-review.md`): carried by the entries above.
25
+ - **`references/` touched in this release window** (3 file(s), e.g. `contracts/a2ui-mcp-surface.md`): carried by the entries above.
26
+ - **`skills/` touched in this release window** (113 file(s), e.g. `a2ui-maintenance/SKILL.md`): carried by the entries above.
27
+
28
+ ## [0.8.62], 2026-09-10
29
+
30
+ ### Changed
31
+ - chore: .claude-plugin, .codex-plugin and plugin.yaml manifests stamped 0.8.62 with the lockstep bump; no skill or script change
32
+
33
+ ### Maintenance
34
+ - **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.62 work shipped in the icon-ui premature settle-notify drain-loop fix (ticket 10015, PR #4361), the regression that blocked v0.8.61's site deploy. See `packages/web-components/CHANGELOG.md#0862--2026-09-10` for details.
35
+ - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
36
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
37
+
38
+ ## [0.8.61], 2026-09-10
4
39
 
5
40
  ### Changed
6
41
 
@@ -40,7 +75,7 @@
40
75
  - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
41
76
  - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
42
77
 
43
- ## [0.8.60] 2026-09-06
78
+ ## [0.8.60], 2026-09-06
44
79
 
45
80
  ### Changed
46
81
 
@@ -62,46 +97,46 @@
62
97
  - docs: cut-procedure step 4a-pre notes the changes/gh-<issue>.md fragment form and how assembly credits it to the merging PR (gh#3638) (#3653)
63
98
 
64
99
  ### Maintenance
65
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
66
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
67
- - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`) carried by the entries above.
68
- - **`scripts/` touched in this release window** (1 file(s), e.g. `scripts/lint-rules.generated.mjs`) carried by the entries above.
69
- - **`skills/` touched in this release window** (8 file(s), e.g. `references/pipeline-overview.md`) carried by the entries above.
100
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
101
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
102
+ - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`), carried by the entries above.
103
+ - **`scripts/` touched in this release window** (1 file(s), e.g. `scripts/lint-rules.generated.mjs`), carried by the entries above.
104
+ - **`skills/` touched in this release window** (8 file(s), e.g. `references/pipeline-overview.md`), carried by the entries above.
70
105
 
71
- ## [0.8.59] 2026-09-04
106
+ ## [0.8.59], 2026-09-04
72
107
 
73
108
  ### Added
74
- - **`package-release`'s cut procedure gains Step 4a-pre: assemble `changes/<pr>.md` fragments into the right CHANGELOG's `[Unreleased]` before promotion (gh#2931).** New repo-root `scripts/release/assemble-changelog-fragments.mjs` (own selftest) reads every queued fragment, routes it to a package's own CHANGELOG (via an optional `(<package>)` parenthetical naming a `PACKAGE_ROSTER` entry) or the repo-root CHANGELOG.md (the plain, no-parenthetical form every fragment filed to date), appends under the kind-mapped Keep-a-Changelog subsection (feature→Added, fix→Fixed, chore→Changed, docs→Docs), then deletes the consumed fragments. `references/cut-procedure.md` gains the new step (table row + detail + resume-path note); no new pre-cut roster gate pending fragments are a normal between-PRs state, not a freshness defect a standing gate should flag.
109
+ - **`package-release`'s cut procedure gains Step 4a-pre: assemble `changes/<pr>.md` fragments into the right CHANGELOG's `[Unreleased]` before promotion (gh#2931).** New repo-root `scripts/release/assemble-changelog-fragments.mjs` (own selftest) reads every queued fragment, routes it to a package's own CHANGELOG (via an optional `(<package>)` parenthetical naming a `PACKAGE_ROSTER` entry) or the repo-root CHANGELOG.md (the plain, no-parenthetical form, every fragment filed to date), appends under the kind-mapped Keep-a-Changelog subsection (feature→Added, fix→Fixed, chore→Changed, docs→Docs), then deletes the consumed fragments. `references/cut-procedure.md` gains the new step (table row + detail + resume-path note); no new pre-cut roster gate, pending fragments are a normal between-PRs state, not a freshness defect a standing gate should flag.
75
110
 
76
111
  ### Fixed
77
112
  - **`package-release` skill's `release-pack.mjs` rejects any `--substantive-packages`/`--stub-packages` name whose `scripts/package-paths.mjs` `PACKAGE_ROSTER` entry is unknown or `lockstep: false`, at parse time, before Step 1 runs (gh#2894).** The 0.8.58 cut passed `adia-plugins` (lockstep:false, gh#1133) in `--substantive-packages`, letting `promote-unreleased.mjs` rewrite that package's `[Unreleased]` header to a version it never ships; the cut only caught it at Step 5.6's unstaged-tracked-files guard, after the 34-gate pre-flight had already run. `selftest()` gains two new cases (a non-lockstep name, an unknown name); `references/cut-procedure.md` §Step 4a notes the guard.
78
- - fix: check-changelog-pr-gate.mjs refuses a direct package [Unreleased] edit require a changes/<pr>.md fragment tagged (<package>) instead; validate every changes/*.md fragment's grammar unconditionally (kind, roster scope) rather than only on the coverage path; cut-procedure.md doc refresh (gh#3123, gh#3132) (#3148)
113
+ - fix: check-changelog-pr-gate.mjs refuses a direct package [Unreleased] edit, require a changes/<pr>.md fragment tagged (<package>) instead; validate every changes/*.md fragment's grammar unconditionally (kind, roster scope) rather than only on the coverage path; cut-procedure.md doc refresh (gh#3123, gh#3132) (#3148)
79
114
  - fix: package-release's bump script now rewrites icons-cdn.js's PACKAGE_VERSION literal (the jsDelivr manifest-fallback URL pin, gh#3228) on every lockstep bump, alongside the existing .mcp.json/README pins (gh#3240) (#3250)
80
115
 
81
116
  ### Added
82
117
  - **`package-release`'s pre-cut roster gains gate 36 (gh#2912, plan-top-priority-verification.md item 4): `npm run check:treeshake`, the single-import build matrix (esbuild+rollup) over 10 representative `@adia-ai/web-components` components.** `gate-roster.mjs` appended (identities never renumber); `references/cut-procedure.md` §3.1 transcribed to match. See the root CHANGELOG and gh#2912's PR body for what the gate checks and its current known-red cells.
83
- - **`package-release` skill's pre-cut roster gains gate 37, `check:lint-efficacy` (gh#2911)** the repo root's new seeded-violation/false-positive/mutation-hardening lint-bank gate (`scripts/verify/check-lint-efficacy.mjs`, not itself part of this package). `gate-roster.mjs` and `references/cut-procedure.md` §3.1 both updated; not wired into `npm run check` (the false-positive sweep alone measured ~100s, over the 60s bar see repo-root CHANGELOG.md for the gate's own detail).
118
+ - **`package-release` skill's pre-cut roster gains gate 37, `check:lint-efficacy` (gh#2911)**, the repo root's new seeded-violation/false-positive/mutation-hardening lint-bank gate (`scripts/verify/check-lint-efficacy.mjs`, not itself part of this package). `gate-roster.mjs` and `references/cut-procedure.md` §3.1 both updated; not wired into `npm run check` (the false-positive sweep alone measured ~100s, over the 60s bar, see repo-root CHANGELOG.md for the gate's own detail).
84
119
 
85
120
  ### Changed
86
- - **`scripts/lint-rules.generated.mjs` (vendored lint-rule bank) regenerated after gh#2939's EXAMPLE-PROP-CONTRACT `data-*` exemption and GENUI-DOC-CONFLICT self-scope fix landed in the shared rule sources.** Derived-only, no source change in this package; the vendored bank picks up both predicate narrowings full-corpus warn count 1413 → 1410 (see repo-root CHANGELOG.md for the gate's own detail).
87
- - **`scripts/lint-rules.generated.mjs` (vendored lint-rule bank) regenerated after gh#2937's `tagTree()` memoization landed in `scripts/lint/engine/primitives.mjs` (root).** Derived-only, no source change in this package; the vendored bank picks up the shared engine's single-slot memo, so the 48 generated `COMPOSITION-*` rules now share one tag-tree parse per file instead of each re-parsing it full golden-corpus `check:lint-efficacy`: 110.9s → 9.45s. Byte-identical rule semantics (38/38 seeded-fixture catch rate, 0 error-severity across 438 files, unchanged).
121
+ - **`scripts/lint-rules.generated.mjs` (vendored lint-rule bank) regenerated after gh#2939's EXAMPLE-PROP-CONTRACT `data-*` exemption and GENUI-DOC-CONFLICT self-scope fix landed in the shared rule sources.** Derived-only, no source change in this package; the vendored bank picks up both predicate narrowings, full-corpus warn count 1413 → 1410 (see repo-root CHANGELOG.md for the gate's own detail).
122
+ - **`scripts/lint-rules.generated.mjs` (vendored lint-rule bank) regenerated after gh#2937's `tagTree()` memoization landed in `scripts/lint/engine/primitives.mjs` (root).** Derived-only, no source change in this package; the vendored bank picks up the shared engine's single-slot memo, so the 48 generated `COMPOSITION-*` rules now share one tag-tree parse per file instead of each re-parsing it, full golden-corpus `check:lint-efficacy`: 110.9s → 9.45s. Byte-identical rule semantics (38/38 seeded-fixture catch rate, 0 error-severity across 438 files, unchanged).
88
123
  - **`scripts/lint-rules.generated.mjs` (vendored lint-rule bank) regenerated to carry `enum_meta` tier data for gh#2831 batch 2's 9 components** (feed-item-ui, inline-message-ui, link-ui, loading-overlay-ui, mark-ui, menu-item-ui, nav-group-ui, nav-item-ui, nav-ui). Derived-only, no source change in this package; the vendored bank follows the yaml `enum_meta` authored in `@adia-ai/web-components`.
89
124
  - **`scripts/lint-rules.generated.mjs` (vendored lint-rule bank) regenerated to carry `enum_meta` tier data for gh#2831 batch 3's 13 components** (pagination-ui, preview-ui, rating-ui, select-ui, shader-texture-ui, spinner-ui, table-toolbar-ui, tabs-ui, tag-ui, text-ui, timeline-item-ui, toast-ui, toggle-scheme-ui). Derived-only, no source change in this package; the vendored bank follows the yaml `enum_meta` authored in `@adia-ai/web-components`. Closes the 31-component sweep (gh#2831).
90
125
  - chore: cut-procedure.md §Step 3 cross-references the new read-only preflight-dry-run.mjs runner as the no-cut alternative to a real release pre-flight (gh#3063) (#3203)
91
- - chore: demo-audit mode 5 now censuses `<chat-shell>` / `<editor-shell>` anatomy alongside `<admin-shell>` closes the blind spot where `apps/genui` (chat-shell + editor-shell only, no admin-shell) was never mechanically swept (gh#3207) (#3207)
126
+ - chore: demo-audit mode 5 now censuses `<chat-shell>` / `<editor-shell>` anatomy alongside `<admin-shell>`, closes the blind spot where `apps/genui` (chat-shell + editor-shell only, no admin-shell) was never mechanically swept (gh#3207) (#3207)
92
127
 
93
128
  ### Docs
94
129
 
95
- - docs: a2ui-maintenance pipeline-overview names registry.js as Class R (gh#3055) new components enter through their yaml, aliases through registry.exceptions.json, never a hand edit (#3194)
130
+ - docs: a2ui-maintenance pipeline-overview names registry.js as Class R (gh#3055), new components enter through their yaml, aliases through registry.exceptions.json, never a hand edit (#3194)
96
131
  - docs: add admin-roster-ui and table-toolbar-ui rows to demo-audit's app-shell-pitfalls.md composite table, and document audit-app-shells.mjs's new --playgrounds flag (gh#3197) (#3214)
97
132
  - docs: repair stale check:component-md-fresh PR-blocking claims in component-md-authoring skill (gh#3223) (#3226)
98
133
 
99
134
  ### Maintenance
100
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
101
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
102
- - **`skills/` touched in this release window** (11 file(s), e.g. `references/pipeline-overview.md`) carried by the entries above.
135
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
136
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
137
+ - **`skills/` touched in this release window** (11 file(s), e.g. `references/pipeline-overview.md`), carried by the entries above.
103
138
 
104
- ## [0.8.58] 2026-09-02
139
+ ## [0.8.58], 2026-09-02
105
140
  ### Fixed
106
141
  - **`forge-lint.mjs`'s PostToolUse hook gains a `timeout: 90` key (gh#2709), matching its Python siblings (`sidecar-prewrite-guard`, `release-pretag-docs-gate`) that already carry one.** Both `hooks.json` and the derived `adapters/claude/hooks.json` mirror updated.
107
142
  - **ATTR-TYPO/LLM-KEY-IN-CLIENT/NATIVE-PRIMITIVE matcher hardening (gh#2708)**, propagated to this plugin's vendored `scripts/lint-rules.generated.mjs` via `npm run build:lint-rules`, byte-identical to the shared lint-rule bank, no change to `forge-lint`'s own hook contract.
@@ -128,35 +163,35 @@
128
163
  - **Author email in `package.json` updated to `kim.granlund@adia.ai`** (was a stale personal address).
129
164
 
130
165
  ### Maintenance
131
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
132
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
133
- - **`skills/` touched in this release window** (13 file(s), e.g. `references/pipeline-overview.md`) carried by the entries above.
166
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
167
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
168
+ - **`skills/` touched in this release window** (13 file(s), e.g. `references/pipeline-overview.md`), carried by the entries above.
134
169
 
135
- ## [0.8.57] 2026-09-01
170
+ ## [0.8.57], 2026-09-01
136
171
 
137
172
  ### Removed
138
173
  - **`package-release`'s release-roster gate 19 (`verify:site-a2ui`) retired with the site-a2ui mechanism itself (ADR-0072 Decision 2, gh#2410 active drain).** `gate-roster.mjs` drops the gate 19 entry (33 gates → 32; gate number left unassigned rather than renumbering 20+, per the roster's own no-renumber discipline for gate identities cited in shipped release notes); `cut-procedure.md` §3.1's transcription and its `.examples.html`-generator trigger prose updated to match. The `site-postwrite-derivation-gate` hook's fragment-staleness half (the site-a2ui regeneration nudge) is removed; its sitemap-staleness half (`site/sitemap.json` → `build:llms`/`build:patterns-index`), unrelated to site-a2ui, is unchanged. `a2ui-maintenance`'s `pipeline-overview.md` and `site-docs-authoring`'s `SKILL.md`/`primitive-authoring`'s `yaml-contract.md` no longer instruct regenerating a compiled A2UI artifact that no longer exists.
139
174
 
140
175
  ### Fixed
141
- - **Plugin passes `author-cross-harness-plugins`'s cross-harness validator, modulo one documented, permanent, irreconcilable exception (gh#2668).** `${CLAUDE_PLUGIN_ROOT}`/`$ARGUMENTS`/the `` !`command` `` auto-injection syntax removed from shared `gen-ui-review/SKILL.md`, the four `commands/*.md` bodies, and their linked reference docs (`demo-audit/references/visual-probe-triage.md`, `package-release/references/{cut-procedure,changelog-discipline,gates-catalog,recovery-paths}.md`, `gen-ui-review/references/loop-protocol.md`) portable `<plugin-root>` prose / "named in the current request" phrasing throughout; command frontmatter, including `package-release`/`site-deployment`'s deliberate `disable-model-invocation: true` (AGENTS.md-ruled), is untouched since the validator never scans command frontmatter. `hooks/hooks.json` moved to `adapters/claude/hooks.json` (unchanged, `${CLAUDE_PLUGIN_ROOT}`-based); new root `hooks.json` mirrors the same event/matcher/action signature with monorepo-root-relative command paths for Codex's convention-discovered hook surface an unverified-but-honest fallback documented in `HARNESS-NOTES.md`. **The one exception:** every skill's `disable-model-invocation:`/`user-invocable:` frontmatter required, explicitly, by this repo's own blocking `check:skills` gate (`plugin-estate-v2.md`'s species-pinning charter) collides head-on with the validator's opposite requirement on the exact same file, and Codex is hard-pinned to read root `skills/` directly (no adapter escape). The repo's own charter is not weakened; `npm run check:cross-harness-plugins` (`scripts/verify/check-cross-harness-plugins.mjs`, wrapping the vendored `scripts/verify/vendor/validate_cross_harness.py`) treats only this one exact finding shape as accepted (logged as INFO) and still fails on every other portability class. Full reasoning in `HARNESS-NOTES.md`.
176
+ - **Plugin passes `author-cross-harness-plugins`'s cross-harness validator, modulo one documented, permanent, irreconcilable exception (gh#2668).** `${CLAUDE_PLUGIN_ROOT}`/`$ARGUMENTS`/the `` !`command` `` auto-injection syntax removed from shared `gen-ui-review/SKILL.md`, the four `commands/*.md` bodies, and their linked reference docs (`demo-audit/references/visual-probe-triage.md`, `package-release/references/{cut-procedure,changelog-discipline,gates-catalog,recovery-paths}.md`, `gen-ui-review/references/loop-protocol.md`), portable `<plugin-root>` prose / "named in the current request" phrasing throughout; command frontmatter, including `package-release`/`site-deployment`'s deliberate `disable-model-invocation: true` (AGENTS.md-ruled), is untouched since the validator never scans command frontmatter. `hooks/hooks.json` moved to `adapters/claude/hooks.json` (unchanged, `${CLAUDE_PLUGIN_ROOT}`-based); new root `hooks.json` mirrors the same event/matcher/action signature with monorepo-root-relative command paths for Codex's convention-discovered hook surface, an unverified-but-honest fallback documented in `HARNESS-NOTES.md`. **The one exception:** every skill's `disable-model-invocation:`/`user-invocable:` frontmatter, required, explicitly, by this repo's own blocking `check:skills` gate (`plugin-estate-v2.md`'s species-pinning charter), collides head-on with the validator's opposite requirement on the exact same file, and Codex is hard-pinned to read root `skills/` directly (no adapter escape). The repo's own charter is not weakened; `npm run check:cross-harness-plugins` (`scripts/verify/check-cross-harness-plugins.mjs`, wrapping the vendored `scripts/verify/vendor/validate_cross_harness.py`) treats only this one exact finding shape as accepted (logged as INFO) and still fails on every other portability class. Full reasoning in `HARNESS-NOTES.md`.
142
177
 
143
178
  ### Changed
144
- - **`forge-lint` rewritten as a thin Node CLI (`forge-lint.mjs`) consuming a shared generated lint-rule bank, retiring the Python script (gh#2638, LLD-0016, ADR-0099).** The framework-authoring structural checks (SHADOW-DOM, SLOTTED, RAW-COLOR, RAW-PX, SCOPE-EXTENT, DEAD-FONT-TOKEN, BOOL-DEFAULT-TRUE, ATTR-TYPO, NATIVE-PRIMITIVE, LEGACY-SHELL, MISSING-SCOPE) now live as individually-fixtured rule modules under `scripts/lint/rules/` in the repo root, built into `scripts/lint/generated/rule-bank.mjs` and vendored byte-identically into this plugin, `adia-ui-factory`, and the gen-ui MCP's factory vendor tree (`npm run build:lint-rules`, freshness gated by `npm run check:lint-rules-fresh`). `hooks/hooks.json`'s PostToolUse command changes from `python3 ".../forge-lint" --hook` to `node ".../forge-lint.mjs" --hook`; the CLI contract, exit codes, and PostToolUse never-block invariant are unchanged. `npm run check:lint-rules-selftest` proves finding-parity against the retired script's own `selftest()` fixtures. New `npm run lint` (`scripts/lint/lint-repo.mjs`) runs the full bank against every git-tracked lintable file standalone for now, not yet wired into `npm run check` (a first repo-wide run surfaced 330 error-severity pre-existing findings that need triage first gh#2646). The suppression comment (`/* adia-lint-disable <rule-id> <reason> */`) is now load-bearing, not cosmetic: it drops the matching finding, and a bare disable with no reason is itself a finding (`SUPPRESS-NO-REASON`).
179
+ - **`forge-lint` rewritten as a thin Node CLI (`forge-lint.mjs`) consuming a shared generated lint-rule bank, retiring the Python script (gh#2638, LLD-0016, ADR-0099).** The framework-authoring structural checks (SHADOW-DOM, SLOTTED, RAW-COLOR, RAW-PX, SCOPE-EXTENT, DEAD-FONT-TOKEN, BOOL-DEFAULT-TRUE, ATTR-TYPO, NATIVE-PRIMITIVE, LEGACY-SHELL, MISSING-SCOPE) now live as individually-fixtured rule modules under `scripts/lint/rules/` in the repo root, built into `scripts/lint/generated/rule-bank.mjs` and vendored byte-identically into this plugin, `adia-ui-factory`, and the gen-ui MCP's factory vendor tree (`npm run build:lint-rules`, freshness gated by `npm run check:lint-rules-fresh`). `hooks/hooks.json`'s PostToolUse command changes from `python3 ".../forge-lint" --hook` to `node ".../forge-lint.mjs" --hook`; the CLI contract, exit codes, and PostToolUse never-block invariant are unchanged. `npm run check:lint-rules-selftest` proves finding-parity against the retired script's own `selftest()` fixtures. New `npm run lint` (`scripts/lint/lint-repo.mjs`) runs the full bank against every git-tracked lintable file, standalone for now, not yet wired into `npm run check` (a first repo-wide run surfaced 330 error-severity pre-existing findings that need triage first, gh#2646). The suppression comment (`/* adia-lint-disable <rule-id>, <reason> */`) is now load-bearing, not cosmetic: it drops the matching finding, and a bare disable with no reason is itself a finding (`SUPPRESS-NO-REASON`).
145
180
 
146
181
  ### Maintenance
147
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
148
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
149
- - **`prompts/` touched in this release window** (4 file(s), e.g. `prompts/demo-audit.md`) carried by the entries above.
182
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
183
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
184
+ - **`prompts/` touched in this release window** (4 file(s), e.g. `prompts/demo-audit.md`), carried by the entries above.
150
185
 
151
- ## [0.8.56] 2026-08-31
186
+ ## [0.8.56], 2026-08-31
152
187
 
153
188
  ### Added
154
- - **New `component-md-authoring` skill (gh#2615).** Authors the two judgment sections of a component's `component.md` Screen-reader spec and Behavioral spec typed directly into the yaml's new `screenReader:`/`behavioral:` fields (component.md itself is a generated shell, never hand-edited). Sits next to `primitive-authoring` in `packages/plugins/adia-ui-forge/skills/`; Codex (`agents/openai.yaml`) and Hermes/Pi (`__init__.py`) manifests regenerated to register it.
155
- - **`primitive-authoring`'s `yaml-contract.md` gains a semantic-id grammar for `examples[].a2ui` component ids (gh#2492 Phase 1).** The `.claude/docs/specs/a2ui-editor.md:170` "free-form" id convention was written for editor-generated ids only, not authored yaml examples reading it as license for both produced a corpus-wide drift toward cryptic, positional ids (`q`, `k1`, `k1v`) reported against `blockquote.yaml`, `badge.yaml`, `aside.yaml`, `alert.yaml`, and `anchor-bar.yaml`. New `## examples: field` section documents the grammar (kebab-case, role-descriptive, unique per example, a short-real-word root/wrapper exception) with before/after examples; `a2ui-editor.md:170` amended to scope its own claim to editor-generated ids and cross-reference the new grammar. Phase 2 (a separate dispatch) sweeps the corpus to match.
156
- - **Phase 2 (gh#2492): the corpus-wide sweep landed and `check-example-ids.mjs` flips from advisory to `npm run check:example-ids:strict` in the `npm run check` chain.** 526 violations across 48 yamls (`packages/web-components`, `packages/web-modules`) renamed to the Phase 1 grammar see `packages/web-components/CHANGELOG.md` and `packages/web-modules/CHANGELOG.md` for the file list. `yaml-contract.md`'s `## examples: field` section updated to describe the gate as enforced, plus a noted known gap (the checker's positional regex doesn't catch a `letter-digit-letter-digit` chain like `g1i1`, out of scope for this sweep since nothing flagged it). `check-example-ids.mjs` itself gained an entrypoint guard (`if (import.meta.url === ...)`) the CLI's `main()` was running as a side effect of importing `checkExampleIds` as a library function, which the sweep tooling does.
189
+ - **New `component-md-authoring` skill (gh#2615).** Authors the two judgment sections of a component's `component.md`, Screen-reader spec and Behavioral spec, typed directly into the yaml's new `screenReader:`/`behavioral:` fields (component.md itself is a generated shell, never hand-edited). Sits next to `primitive-authoring` in `packages/plugins/adia-ui-forge/skills/`; Codex (`agents/openai.yaml`) and Hermes/Pi (`__init__.py`) manifests regenerated to register it.
190
+ - **`primitive-authoring`'s `yaml-contract.md` gains a semantic-id grammar for `examples[].a2ui` component ids (gh#2492 Phase 1).** The `.claude/docs/specs/a2ui-editor.md:170` "free-form" id convention was written for editor-generated ids only, not authored yaml examples, reading it as license for both produced a corpus-wide drift toward cryptic, positional ids (`q`, `k1`, `k1v`) reported against `blockquote.yaml`, `badge.yaml`, `aside.yaml`, `alert.yaml`, and `anchor-bar.yaml`. New `## examples: field` section documents the grammar (kebab-case, role-descriptive, unique per example, a short-real-word root/wrapper exception) with before/after examples; `a2ui-editor.md:170` amended to scope its own claim to editor-generated ids and cross-reference the new grammar. Phase 2 (a separate dispatch) sweeps the corpus to match.
191
+ - **Phase 2 (gh#2492): the corpus-wide sweep landed and `check-example-ids.mjs` flips from advisory to `npm run check:example-ids:strict` in the `npm run check` chain.** 526 violations across 48 yamls (`packages/web-components`, `packages/web-modules`) renamed to the Phase 1 grammar, see `packages/web-components/CHANGELOG.md` and `packages/web-modules/CHANGELOG.md` for the file list. `yaml-contract.md`'s `## examples: field` section updated to describe the gate as enforced, plus a noted known gap (the checker's positional regex doesn't catch a `letter-digit-letter-digit` chain like `g1i1`, out of scope for this sweep since nothing flagged it). `check-example-ids.mjs` itself gained an entrypoint guard (`if (import.meta.url === ...)`): the CLI's `main()` was running as a side effect of importing `checkExampleIds` as a library function, which the sweep tooling does.
157
192
 
158
193
  ### Fixed
159
- - **`package-release`'s Step 5 staging allowlist was missing the factory README's own prose echo of the generation-MCP pin bump.mjs's `A2UI_MCP_PIN` rewrites both `adia-ui-factory/.mcp.json` and its README, but Step 5 only ever staged `.mcp.json`, so the README edit rode uncommitted through every cut (gh#2473).** `release-pack.mjs`'s Step 5 now also stages `packages/plugins/adia-ui-factory/README.md`. Added a new Step 5.6 unstaged-tracked-files guard right after staging (numbered 5.6, not 5.5 `cut-procedure.md`'s own §Step 5.5 already names a different, pre-existing manual freshness trip-wire): it fails the cut loudly if any tracked file bump.mjs or a cut-hygiene step touched is still modified-in-the-worktree after Step 5's allowlist ran, so the next allowlist gap is caught at cut time instead of discovered by hand later. `selftest` extended with a direct unit test of the new `unstagedTrackedLeftovers()` parser (plain modifies/deletes, staged-only and untracked exclusions, C-quoted paths, rename/copy new-side reporting) plus a marker asserting the guard's `--dry` code path runs.
194
+ - **`package-release`'s Step 5 staging allowlist was missing the factory README's own prose echo of the generation-MCP pin, bump.mjs's `A2UI_MCP_PIN` rewrites both `adia-ui-factory/.mcp.json` and its README, but Step 5 only ever staged `.mcp.json`, so the README edit rode uncommitted through every cut (gh#2473).** `release-pack.mjs`'s Step 5 now also stages `packages/plugins/adia-ui-factory/README.md`. Added a new Step 5.6 unstaged-tracked-files guard right after staging (numbered 5.6, not 5.5, `cut-procedure.md`'s own §Step 5.5 already names a different, pre-existing manual freshness trip-wire): it fails the cut loudly if any tracked file bump.mjs or a cut-hygiene step touched is still modified-in-the-worktree after Step 5's allowlist ran, so the next allowlist gap is caught at cut time instead of discovered by hand later. `selftest` extended with a direct unit test of the new `unstagedTrackedLeftovers()` parser (plain modifies/deletes, staged-only and untracked exclusions, C-quoted paths, rename/copy new-side reporting) plus a marker asserting the guard's `--dry` code path runs.
160
195
 
161
196
  ### Changed
162
197
  - **`package-release`: gate 4 retries once on host-contention timeout (Mode A, gh#2195, #2362)**; `cut-procedure.md` fails fast on a pnpm-shaped `node_modules` in Step 1 and adds Step 12 (restore the pnpm dev layout after a cut) (#2197, #2202); `gates-catalog.md` follows.
@@ -165,67 +200,67 @@
165
200
  - **`HARNESS-NOTES.md`** pointer for non-Claude harnesses (gh#2449).
166
201
 
167
202
  ### Fixed
168
- - **`generate-release-notes.mjs` (gh#2474): two bugs found and hand-fixed live during the v0.8.56 cut, now fixed at the source.** (1) When a CHANGELOG `[X.Y.Z]` section carries two same-named `### Changed`/`### Fixed` blocks (one at cut time, another added by a later hand-fix), the generator now merges them into one heading in first-occurrence order before demoting to `####` the duplicate `####` heading that tripped CodeRabbit's MD024 (db13eaebb) can't recur. (2) The Slack post's per-package headline now prefers a bullet starting with `- **BREAKING` over document order, falling back to the first bullet only when none is BREAKING (b378b5fd9). Added `mergeDuplicateHeadings()`, unit coverage in `scripts/release/generate-release-notes.test.js`, and `selftest` regression cases for both. `scripts/release/generate-release-notes.mjs`.
203
+ - **`generate-release-notes.mjs` (gh#2474): two bugs found and hand-fixed live during the v0.8.56 cut, now fixed at the source.** (1) When a CHANGELOG `[X.Y.Z]` section carries two same-named `### Changed`/`### Fixed` blocks (one at cut time, another added by a later hand-fix), the generator now merges them into one heading in first-occurrence order before demoting to `####`, the duplicate `####` heading that tripped CodeRabbit's MD024 (db13eaebb) can't recur. (2) The Slack post's per-package headline now prefers a bullet starting with `- **BREAKING` over document order, falling back to the first bullet only when none is BREAKING (b378b5fd9). Added `mergeDuplicateHeadings()`, unit coverage in `scripts/release/generate-release-notes.test.js`, and `selftest` regression cases for both. `scripts/release/generate-release-notes.mjs`.
169
204
 
170
205
  ### Maintenance
171
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
172
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
173
- - **`skills/` touched in this release window** (14 file(s), e.g. `a2ui-maintenance/SKILL.md`) carried by the entries above.
206
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
207
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
208
+ - **`skills/` touched in this release window** (14 file(s), e.g. `a2ui-maintenance/SKILL.md`), carried by the entries above.
174
209
 
175
- ## [0.8.55] 2026-08-28
210
+ ## [0.8.55], 2026-08-28
176
211
 
177
212
  ### Changed
178
- - **`.codex-plugin/` regenerated for the release window** `.codex-plugin/plugin.json`'s embedded `version` moves with the lockstep bump (derived from `.claude-plugin/plugin.json`, not an independent edit).
213
+ - **`.codex-plugin/` regenerated for the release window**, `.codex-plugin/plugin.json`'s embedded `version` moves with the lockstep bump (derived from `.claude-plugin/plugin.json`, not an independent edit).
179
214
 
180
215
  ### Maintenance
181
216
  - **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.55 work shipped in button-ui flex-shrink:0 default fix (gh#2180/gh#2181). See `packages/web-components/CHANGELOG.md#0855--2026-08-28` for details.
182
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
217
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
183
218
 
184
- ## [0.8.54] 2026-08-27
219
+ ## [0.8.54], 2026-08-27
185
220
 
186
221
  ### Fixed
187
- - **`package-release`'s cut pipeline was missing a post-bump regen step for both plugins' Hermes/Pi manifest tree the same gap gh#1899 already closed for the Codex tree (discovered live during the v0.8.53 release PR #2138: it shipped stale `plugin.yaml`/`__init__.py`, caught by CI's `check:harness-manifests-fresh` and fixed by hand on the release branch).** `release-pack.mjs`'s Step 4 now runs `scripts/build/harness-manifests.mjs` after the version bump and verifies with `npm run check:harness-manifests-fresh` before continuing (`skills/package-release/scripts/release-pack.mjs`); Step 5's staging pathspec now carries both plugins' `plugin.yaml`, `__init__.py`, `prompts/*.md`, and (adia-ui-factory only) `hermes-mcp.yaml`, so the regen actually lands in the release commit instead of riding untracked. `selftest` extended to assert the new step and its staging pathspec.
188
- - **`patterns-index.md` (both `@adia-ai/mcp`'s `factory/resources/` copy and `adia-ui-factory`'s `skills/pattern-catalog/references/` copy) had no freshness gate at all it went undetected-stale through the entire v0.8.53 cut, only regenerated as a side effect of an unrelated F-N1 CHANGELOG-coverage fix, never because a gate asserted it.** Added gate 33 (`npm run verify:patterns-index`) to the pre-flight roster, appended after gate 32 with the same numbering discipline as gates 30-32 (`skills/package-release/scripts/gate-roster.mjs`).
222
+ - **`package-release`'s cut pipeline was missing a post-bump regen step for both plugins' Hermes/Pi manifest tree, the same gap gh#1899 already closed for the Codex tree (discovered live during the v0.8.53 release PR #2138: it shipped stale `plugin.yaml`/`__init__.py`, caught by CI's `check:harness-manifests-fresh` and fixed by hand on the release branch).** `release-pack.mjs`'s Step 4 now runs `scripts/build/harness-manifests.mjs` after the version bump and verifies with `npm run check:harness-manifests-fresh` before continuing (`skills/package-release/scripts/release-pack.mjs`); Step 5's staging pathspec now carries both plugins' `plugin.yaml`, `__init__.py`, `prompts/*.md`, and (adia-ui-factory only) `hermes-mcp.yaml`, so the regen actually lands in the release commit instead of riding untracked. `selftest` extended to assert the new step and its staging pathspec.
223
+ - **`patterns-index.md` (both `@adia-ai/mcp`'s `factory/resources/` copy and `adia-ui-factory`'s `skills/pattern-catalog/references/` copy) had no freshness gate at all, it went undetected-stale through the entire v0.8.53 cut, only regenerated as a side effect of an unrelated F-N1 CHANGELOG-coverage fix, never because a gate asserted it.** Added gate 33 (`npm run verify:patterns-index`) to the pre-flight roster, appended after gate 32 with the same numbering discipline as gates 30-32 (`skills/package-release/scripts/gate-roster.mjs`).
189
224
 
190
225
  ### Docs
191
- - **`a2ui-maintenance/references/pipeline-overview.md`'s Critical Rule #5 stated a stale, now-superseded claim that A2UI never carries CSS corrected per ADR-0022's 2026-08-24 amendment.** `UpdateStylesMessage`/`RemoveStylesMessage` are ratified protocol scope (a first-class CSS channel, not a carve-out); what still holds is narrower compose/zettel LLM-synthesis itself never emits `updateStyles`, so the GENERATION-pipeline claim stays correct while the PROTOCOL-scope claim needed the fix. `skills/a2ui-maintenance/references/pipeline-overview.md`.
192
- - **`gen-ui-review/references/corpus-html-patterns.md` carried the same stale ADR-0022 claim as a secondary citation corrected alongside the primary fix above.** `skills/gen-ui-review/references/corpus-html-patterns.md`.
193
- - **`primitive-authoring/references/yaml-contract.md`'s `category:` field documentation was missing ADR-0065's ratified 12-value canonical category vocabulary entirely (`action|agent|container|data|display|feedback|form|input|layout|navigation|shells|utility`) added as a new passage, including the fold table for the 6 one-off drift values ADR-0065 retired.** `skills/primitive-authoring/references/yaml-contract.md`.
194
- - **`primitive-authoring/references/lifecycle-patterns.md`'s `slot="caret"` compliant-component list corrected twice this cycle, net result: `drilldown-ui` added.** ADR-0085 first added `drilldown-ui` to the exemption list (kept `slot="chevron"`); ADR-0092 then reversed that ruling (gh#1977 migrate, don't exempt) and drilldown-ui's row chevron actually migrated to `slot="caret"` (see `@adia-ai/web-components`'s own 0.8.54 entry) this file now lists `drilldown-ui` as compliant alongside `tree-item-ui`, `pane-ui`, `accordion-item-ui`, `nav-group-ui`, `select-ui`, citing ADR-0036 + ADR-0092. `skills/primitive-authoring/references/lifecycle-patterns.md`.
195
- - **`primitive-authoring/references/module-promotion.md` was missing a second, distinct ADR-0012 correction: ADR-0015 (ADR-0087) reclassifies 6 nav elements from modules-tier to primitives-tier (consolidated to 3 `nav-ui`/`nav-group-ui`/`nav-item-ui`) and retires 4 legacy element names added near the file's existing, unrelated ADR-0012 citation so a future reader classifying nav elements doesn't land them in the wrong tier.** `skills/primitive-authoring/references/module-promotion.md`.
226
+ - **`a2ui-maintenance/references/pipeline-overview.md`'s Critical Rule #5 stated a stale, now-superseded claim that A2UI never carries CSS, corrected per ADR-0022's 2026-08-24 amendment.** `UpdateStylesMessage`/`RemoveStylesMessage` are ratified protocol scope (a first-class CSS channel, not a carve-out); what still holds is narrower, compose/zettel LLM-synthesis itself never emits `updateStyles`, so the GENERATION-pipeline claim stays correct while the PROTOCOL-scope claim needed the fix. `skills/a2ui-maintenance/references/pipeline-overview.md`.
227
+ - **`gen-ui-review/references/corpus-html-patterns.md` carried the same stale ADR-0022 claim as a secondary citation, corrected alongside the primary fix above.** `skills/gen-ui-review/references/corpus-html-patterns.md`.
228
+ - **`primitive-authoring/references/yaml-contract.md`'s `category:` field documentation was missing ADR-0065's ratified 12-value canonical category vocabulary entirely (`action|agent|container|data|display|feedback|form|input|layout|navigation|shells|utility`), added as a new passage, including the fold table for the 6 one-off drift values ADR-0065 retired.** `skills/primitive-authoring/references/yaml-contract.md`.
229
+ - **`primitive-authoring/references/lifecycle-patterns.md`'s `slot="caret"` compliant-component list corrected twice this cycle, net result: `drilldown-ui` added.** ADR-0085 first added `drilldown-ui` to the exemption list (kept `slot="chevron"`); ADR-0092 then reversed that ruling (gh#1977, migrate, don't exempt) and drilldown-ui's row chevron actually migrated to `slot="caret"` (see `@adia-ai/web-components`'s own 0.8.54 entry), this file now lists `drilldown-ui` as compliant alongside `tree-item-ui`, `pane-ui`, `accordion-item-ui`, `nav-group-ui`, `select-ui`, citing ADR-0036 + ADR-0092. `skills/primitive-authoring/references/lifecycle-patterns.md`.
230
+ - **`primitive-authoring/references/module-promotion.md` was missing a second, distinct ADR-0012 correction: ADR-0015 (ADR-0087) reclassifies 6 nav elements from modules-tier to primitives-tier (consolidated to 3, `nav-ui`/`nav-group-ui`/`nav-item-ui`) and retires 4 legacy element names, added near the file's existing, unrelated ADR-0012 citation so a future reader classifying nav elements doesn't land them in the wrong tier.** `skills/primitive-authoring/references/module-promotion.md`.
196
231
 
197
232
  ### Maintenance
198
- - **`.claude-plugin/plugin.json` version bump only** moves in lockstep with package.json (the `/plugin update` cache key).
199
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
233
+ - **`.claude-plugin/plugin.json` version bump only**, moves in lockstep with package.json (the `/plugin update` cache key).
234
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
200
235
 
201
- ## [0.8.53] 2026-08-26
236
+ ## [0.8.53], 2026-08-26
202
237
 
203
238
  ### Changed
204
- - **`.claude-plugin/plugin.json` version bump only** moves in lockstep with package.json (the `/plugin update` cache key). No skill/agent/hook content changed in this package this cut; substantive v0.8.53 work shipped in `@adia-ai/web-components`/`web-modules`/`gen-ui` see `packages/web-components/CHANGELOG.md#0853--2026-08-26`.
239
+ - **`.claude-plugin/plugin.json` version bump only**, moves in lockstep with package.json (the `/plugin update` cache key). No skill/agent/hook content changed in this package this cut; substantive v0.8.53 work shipped in `@adia-ai/web-components`/`web-modules`/`gen-ui`, see `packages/web-components/CHANGELOG.md#0853--2026-08-26`.
205
240
 
206
241
  ### Maintenance
207
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
242
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
208
243
 
209
- ## [0.8.52] 2026-08-25
244
+ ## [0.8.52], 2026-08-25
210
245
 
211
246
  ### Added
212
- - **`cross-harness-authoring-standards` (renamed from `writing-harness-install-instructions`, which had only ever existed as uncommitted worktree content) + new sibling skill `cross-harness-compatibility-standards` (gh#1975, PR #2003).** The rename is byte-faithful aside from the three self-referential mentions (frontmatter name, H1, one in-body reference). The new skill is the upstream engineering standard for actually building a capability that works across Claude Code, Codex, Pi, and Hermes distinct from the renamed sibling's downstream consumer-facing install-docs concern extracted from ADR-0091 and the four PRs (#1997-#2000) that built and shipped it: the skill-vs-thin-adapter classification rule, verify-before-coding per harness, one authored skill body with every runtime as a thin consumer, one contract grammar (record-lint family) instead of a schema per runtime, and naming distribution channels distinctly. Codex and Hermes derived manifests regenerated for both skills; README/`AGENTS.md` skill-roster and count updated.
247
+ - **`cross-harness-authoring-standards` (renamed from `writing-harness-install-instructions`, which had only ever existed as uncommitted worktree content) + new sibling skill `cross-harness-compatibility-standards` (gh#1975, PR #2003).** The rename is byte-faithful aside from the three self-referential mentions (frontmatter name, H1, one in-body reference). The new skill is the upstream engineering standard for actually building a capability that works across Claude Code, Codex, Pi, and Hermes, distinct from the renamed sibling's downstream consumer-facing install-docs concern, extracted from ADR-0091 and the four PRs (#1997-#2000) that built and shipped it: the skill-vs-thin-adapter classification rule, verify-before-coding per harness, one authored skill body with every runtime as a thin consumer, one contract grammar (record-lint family) instead of a schema per runtime, and naming distribution channels distinctly. Codex and Hermes derived manifests regenerated for both skills; README/`AGENTS.md` skill-roster and count updated.
213
248
 
214
249
  ### Changed
215
- - **`package-release`'s pre-cut roster runs in three phases instead of one serial for-loop (gh#2006, follow-up from gh#1987's audit)** `release-pack.mjs`'s `step3PreFlight()` now runs gate 4 (`test:unit:serial`) solo, the eval-health chain (gates 16 → 27 → 28 a real CSS-before-JS-shaped file-write ordering dependency: gate 28 reads whichever `evals/mcp/runs/` directory sorts lexically last, so gate 27's free-form run must land uninterrupted) strictly in order, and every other gate in a concurrency-capped pool (`PREFLIGHT_CONCURRENCY`, default 4) all concurrent with the chain. Cuts real wall-clock with zero coverage loss: no gate dropped, none renumbered, none silently skipped. `--dry` previews are unchanged (still the original flat serial walk, byte-for-byte, so `selftest`'s exact-output assertions keep passing).
250
+ - **`package-release`'s pre-cut roster runs in three phases instead of one serial for-loop (gh#2006, follow-up from gh#1987's audit)**, `release-pack.mjs`'s `step3PreFlight()` now runs gate 4 (`test:unit:serial`) solo, the eval-health chain (gates 16 → 27 → 28, a real CSS-before-JS-shaped file-write ordering dependency: gate 28 reads whichever `evals/mcp/runs/` directory sorts lexically last, so gate 27's free-form run must land uninterrupted) strictly in order, and every other gate in a concurrency-capped pool (`PREFLIGHT_CONCURRENCY`, default 4), all concurrent with the chain. Cuts real wall-clock with zero coverage loss: no gate dropped, none renumbered, none silently skipped. `--dry` previews are unchanged (still the original flat serial walk, byte-for-byte, so `selftest`'s exact-output assertions keep passing).
216
251
  - **All agent seats pinned to `sonnet` + `xhigh` reasoning effort, replacing the prior fable/opus ceiling-ladder pins (PR #1999).** Operator's direct standing instruction, applied across `a2ui-maintenance-agent`, `a2ui-planner-agent`, `demo-audit-agent`, `framework-checker`, `framework-planner-agent`, `gen-ui-review-agent`, `package-release-agent`, `primitive-authoring-agent`. See root `CHANGELOG.md` for the cross-plugin note.
217
252
 
218
253
  ### Fixed
219
- - **`__init__.py`'s Hermes manifest generator's `register_skill` call passed a plain string where the runtime requires a `pathlib.Path` (calls `path.exists()`) wrapped, discovered incidentally while building `adia-ui-factory`'s Hermes `delegate_task` command (PR #2000).**
254
+ - **`__init__.py`'s Hermes manifest generator's `register_skill` call passed a plain string where the runtime requires a `pathlib.Path` (calls `path.exists()`), wrapped, discovered incidentally while building `adia-ui-factory`'s Hermes `delegate_task` command (PR #2000).**
220
255
 
221
256
  ### Maintenance
222
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
223
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
257
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
258
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
224
259
 
225
- ## [0.8.51] 2026-08-24
260
+ ## [0.8.51], 2026-08-24
226
261
 
227
262
  ### Added
228
- - Hermes + Pi external-distribution manifests (gh#1954) `plugin.yaml` +
263
+ - Hermes + Pi external-distribution manifests (gh#1954), `plugin.yaml` +
229
264
  `__init__.py` (Hermes) and `prompts/*.md` + a `"pi"` field in
230
265
  `package.json` (Pi), derived from `.claude-plugin/plugin.json` +
231
266
  `skills/` + `commands/` via `npm run build:harness-manifests`
@@ -234,42 +269,42 @@
234
269
  neither harness's MCP story applies to it.
235
270
 
236
271
  ### Maintenance
237
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
272
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
238
273
 
239
- ## [0.8.50] 2026-08-23
274
+ ## [0.8.50], 2026-08-23
240
275
 
241
276
  ### Maintenance
242
- - **Lockstep bump riding the v0.8.50 cut** (`scripts/release/check-lockstep.mjs`); the headline v0.8.50 work ships in @adia-ai/web-components (prose/verse sheet removal gh#1885 / PR #1918, input/search fill-default posture gh#1856 see `packages/web-components/CHANGELOG.md#0850--2026-08-23`). Package-local changes are listed below.
243
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
244
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
277
+ - **Lockstep bump riding the v0.8.50 cut** (`scripts/release/check-lockstep.mjs`); the headline v0.8.50 work ships in @adia-ai/web-components (prose/verse sheet removal gh#1885 / PR #1918, input/search fill-default posture gh#1856, see `packages/web-components/CHANGELOG.md#0850--2026-08-23`). Package-local changes are listed below.
278
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
279
+ - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`), carried by the entries above.
245
280
 
246
281
  ### Fixed
247
- - **`skills/package-release` regenerates Codex plugin manifests in Step 4 (gh#1899, PR #1917)** `release-pack.mjs` + `cut-procedure.md` gain the post-bump `build:codex-manifests` regen so `check:codex-manifests-fresh` stays green through a cut; `a2ui-maintenance` (`mcp-pipeline-ops.md`) and `primitive-authoring` (`api-contract.md`) references refreshed in the same window.
282
+ - **`skills/package-release` regenerates Codex plugin manifests in Step 4 (gh#1899, PR #1917)**, `release-pack.mjs` + `cut-procedure.md` gain the post-bump `build:codex-manifests` regen so `check:codex-manifests-fresh` stays green through a cut; `a2ui-maintenance` (`mcp-pipeline-ops.md`) and `primitive-authoring` (`api-contract.md`) references refreshed in the same window.
248
283
 
249
- ## [0.8.48] 2026-08-23
284
+ ## [0.8.48], 2026-08-23
250
285
 
251
286
  ### Added
252
- - OpenAI Codex plugin manifest (gh#1888) `.codex-plugin/plugin.json` +
287
+ - OpenAI Codex plugin manifest (gh#1888), `.codex-plugin/plugin.json` +
253
288
  a per-skill `skills/<name>/agents/openai.yaml`, derived from
254
289
  `.claude-plugin/plugin.json` via `npm run build:codex-manifests`
255
290
  (`check:codex-manifests-fresh` gates freshness). Additive: the Claude Code
256
291
  plugin surface is unchanged.
257
292
 
258
- ## [0.8.47] 2026-08-22
293
+ ## [0.8.47], 2026-08-22
259
294
 
260
295
  ### Maintenance
261
296
  - **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.47 work shipped in table-toolbar size/chrome fixes, anchor popover reuse guard, token-layer light-dark cleanup (gh#1852), side-by-side docs demos. See `packages/web-components/CHANGELOG.md#0847--2026-08-22` for details.
262
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
297
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
263
298
 
264
- ## [0.8.46] 2026-08-22
299
+ ## [0.8.46], 2026-08-22
265
300
 
266
301
 
267
302
  ### Maintenance
268
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
269
- - **`agents/` touched in this release window** (4 file(s), e.g. `agents/demo-audit-agent.corpus.json`) carried by the entries above.
270
- - **`skills/` touched in this release window** (2 file(s), e.g. `references/authoring-cycle.md`) carried by the entries above.
303
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
304
+ - **`agents/` touched in this release window** (4 file(s), e.g. `agents/demo-audit-agent.corpus.json`), carried by the entries above.
305
+ - **`skills/` touched in this release window** (2 file(s), e.g. `references/authoring-cycle.md`), carried by the entries above.
271
306
 
272
- ## [0.8.45] 2026-08-20
307
+ ## [0.8.45], 2026-08-20
273
308
 
274
309
  ### Changed
275
310
  - **`framework-reviewer` split into `demo-audit-agent` + `gen-ui-review-agent` (gh#1733), retiring the `naming.manifest.json` exemption it carried since the ADR-0011 D10 rename wave.** The retired agent preloaded both `demo-audit` and `gen-ui-review` under one read-only critic; each new agent preloads exactly one, keeping the same no-Write/no-Edit critic wall and `fable`+`high` review-row pin. Every live cross-reference re-keyed: `README.md`, `.claude/docs/specs/plugin-estate-v2.md`'s agent roster table, `agents/routing-corpus.json`'s expected-agent labels, the sibling `framework-checker`/`demo-audit`/`site-docs-authoring` bodies, the `a2ui-maintenance-agent`/`primitive-authoring-agent` corpus sidecars' sibling-territory mentions, and three active plan docs (`plan-charts-2-0-waves.md`, `plan-table-toolbar-compaction.md`, `plan-form-control-sizing.md`). `site/pages/getting-started/forge-plugin.html`'s gated agent roster (count + set, `check:plugin-count-claims`) updated and its derived `site-a2ui` row regenerated. Two fresh M2 sidecar corpora (`demo-audit-agent.corpus.json`, `gen-ui-review-agent.corpus.json`) split from `framework-reviewer.corpus.json`'s positives, marked unmeasured pending their own `routing_eval.py` pass. Closes #1733.
@@ -278,19 +313,19 @@
278
313
  `package-release` (was routing DEAD in the blind-judge sim). Closes #1731.
279
314
 
280
315
  ### Maintenance
281
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
282
- - **`skills/` touched in this release window** (9 file(s), e.g. `demo-audit/SKILL.md`) carried by the entries above.
316
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
317
+ - **`skills/` touched in this release window** (9 file(s), e.g. `demo-audit/SKILL.md`), carried by the entries above.
283
318
 
284
- ## [0.8.44] 2026-08-20
319
+ ## [0.8.44], 2026-08-20
285
320
 
286
321
  ### Maintenance
287
322
  - **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.44 work shipped in charts y-domain pins, table-toolbar compaction ladder, text mono roles, pagination SSR adoption. See `packages/web-components/CHANGELOG.md#0844--2026-08-20` for details.
288
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
289
- - **`agent-intents/` touched in this release window** (2 file(s), e.g. `agent-intents/framework-checker.intent.md`) carried by the entries above.
290
- - **`agents/` touched in this release window** (5 file(s), e.g. `agents/a2ui-maintenance-agent.md`) carried by the entries above.
291
- - **`skills/` touched in this release window** (26 file(s), e.g. `a2ui-maintenance/SKILL.md`) carried by the entries above.
323
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
324
+ - **`agent-intents/` touched in this release window** (2 file(s), e.g. `agent-intents/framework-checker.intent.md`), carried by the entries above.
325
+ - **`agents/` touched in this release window** (5 file(s), e.g. `agents/a2ui-maintenance-agent.md`), carried by the entries above.
326
+ - **`skills/` touched in this release window** (26 file(s), e.g. `a2ui-maintenance/SKILL.md`), carried by the entries above.
292
327
 
293
- ## [0.8.43] 2026-08-18
328
+ ## [0.8.43], 2026-08-18
294
329
 
295
330
  ### Changed
296
331
  - Knowledge packs harvested for ADR-0061..0074: surface-lifecycle reference (a2ui-maintenance), site-package-registry playbook, attribute-grammar/role-class/tier-model sections, disabled-state token convention (gh#1564, #1609, #1625).
@@ -298,66 +333,66 @@
298
333
  - token-selection references regenerated for the `--a-ui-bg-disabled` container-low retarget (gh#1596, #1599).
299
334
 
300
335
  ### Maintenance
301
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
302
- - **`skills/` touched in this release window** (5 file(s), e.g. `references/corpus-html-patterns.md`) carried by the entries above.
336
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
337
+ - **`skills/` touched in this release window** (5 file(s), e.g. `references/corpus-html-patterns.md`), carried by the entries above.
303
338
 
304
- ## [0.8.42] 2026-08-17
339
+ ## [0.8.42], 2026-08-17
305
340
 
306
341
  ### Maintenance
307
342
  - Knowledge packs harvest the ADR-0061..0070 ratifications (PR #1564: gen-ui-wiring + wave-coordination corpora); rename-wave W2 doc migration (PR #1567).
308
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
309
- - **`skills/` touched in this release window** (7 file(s), e.g. `a2ui-maintenance/SKILL.md`) carried by the entries above.
343
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
344
+ - **`skills/` touched in this release window** (7 file(s), e.g. `a2ui-maintenance/SKILL.md`), carried by the entries above.
310
345
 
311
- ## [0.8.41] 2026-08-17
346
+ ## [0.8.41], 2026-08-17
312
347
 
313
348
  ### Added
314
- - **`primitive-authoring` gains `references/svg-authoring.md` (#1401)** chart/SVG-specific quirks (viewBox scaling, token-driven stroke/fill, text measurement) that kept recurring in chart-family reviews.
315
- - **`primitive-authoring` harvests ADR-0052/0055/0056/0057 into references (#1407)** leading-scale, native-input conformance, `[selected]` convention, and attribute-grammar decisions now load with the skill instead of living only in the ADR tree.
349
+ - **`primitive-authoring` gains `references/svg-authoring.md` (#1401)**, chart/SVG-specific quirks (viewBox scaling, token-driven stroke/fill, text measurement) that kept recurring in chart-family reviews.
350
+ - **`primitive-authoring` harvests ADR-0052/0055/0056/0057 into references (#1407)**, leading-scale, native-input conformance, `[selected]` convention, and attribute-grammar decisions now load with the skill instead of living only in the ADR tree.
316
351
 
317
352
  ### Changed
318
- - **`package-release` tracks the 0.8.41-window release-machinery changes.** `scripts/gate-roster.mjs` gains `check:catalog-tiers` (gh#1494); `scripts/release-pack.mjs`'s Step 4d.5 regen list adds catalog-tiers + a conditional corpus chunk re-harvest (#1396); gate 17 (`dogfood:status`) tolerates the npm-ci layout gate 9 needs (gh#1359); `references/cut-procedure.md` + `references/gates-catalog.md` transcribe the ADR-0069 regen-on-main gate split (derived Class-R artifacts re-derive on main, `dist/` stays committed #1477) and the `docs/releases` → `docs/ops/releases` move (#1532/#1539), which `scripts/release-pretag-docs-gate` now enforces against the new path.
319
- - **`ssr-compatibility` references updated to the gh#1430/gh#1436 shape-1 sweep's state** `guard-patterns.md` (feature-detect over `typeof window`; `isNode()`/`isElement()` over bare `instanceof`), `failure-shapes.md`, `status-ledger.md`, `consumer-workarounds.md`, `test-without-linkedom.md`, and SKILL.md route SSR reports through the new `ssr-seam-report` issue template + `ssr` label (#1404) and the `scripts/dev/ssr-linkedom-smoke.mjs` gate first.
320
- - **`a2ui-maintenance` stale `packages/gen-ui/a2ui/corpus` paths corrected to the engine's `corpus/` home (#1392), and the zettel-engine eval floor file is committed so `eval:diff --engine zettel` has a baseline (gh#1391)**; `chunk-authoring.md`/`eval-diagnostics.md`/`mcp-pipeline-ops.md`/`pipeline-overview.md` track the same paths.
353
+ - **`package-release` tracks the 0.8.41-window release-machinery changes.** `scripts/gate-roster.mjs` gains `check:catalog-tiers` (gh#1494); `scripts/release-pack.mjs`'s Step 4d.5 regen list adds catalog-tiers + a conditional corpus chunk re-harvest (#1396); gate 17 (`dogfood:status`) tolerates the npm-ci layout gate 9 needs (gh#1359); `references/cut-procedure.md` + `references/gates-catalog.md` transcribe the ADR-0069 regen-on-main gate split (derived Class-R artifacts re-derive on main, `dist/` stays committed, #1477) and the `docs/releases` → `docs/ops/releases` move (#1532/#1539), which `scripts/release-pretag-docs-gate` now enforces against the new path.
354
+ - **`ssr-compatibility` references updated to the gh#1430/gh#1436 shape-1 sweep's state**, `guard-patterns.md` (feature-detect over `typeof window`; `isNode()`/`isElement()` over bare `instanceof`), `failure-shapes.md`, `status-ledger.md`, `consumer-workarounds.md`, `test-without-linkedom.md`, and SKILL.md route SSR reports through the new `ssr-seam-report` issue template + `ssr` label (#1404) and the `scripts/dev/ssr-linkedom-smoke.mjs` gate first.
355
+ - **`a2ui-maintenance`, stale `packages/gen-ui/a2ui/corpus` paths corrected to the engine's `corpus/` home (#1392), and the zettel-engine eval floor file is committed so `eval:diff --engine zettel` has a baseline (gh#1391)**; `chunk-authoring.md`/`eval-diagnostics.md`/`mcp-pipeline-ops.md`/`pipeline-overview.md` track the same paths.
321
356
 
322
357
  ### Maintenance
323
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
324
- - **`skills/` touched in this release window** (28 file(s), e.g. `a2ui-maintenance/SKILL.md`) carried by the entries above.
358
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
359
+ - **`skills/` touched in this release window** (28 file(s), e.g. `a2ui-maintenance/SKILL.md`), carried by the entries above.
325
360
 
326
- ## [0.8.40] 2026-08-15
361
+ ## [0.8.40], 2026-08-15
327
362
 
328
363
  ### Maintenance
329
364
  - **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.40 work shipped in the ADR-0052/0053/0054/0056 attribute-grammar and token-convention breaking wave. See `packages/web-components/CHANGELOG.md#0840--2026-08-15` for details.
330
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
365
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
331
366
 
332
- ## [0.8.39] 2026-08-15
367
+ ## [0.8.39], 2026-08-15
333
368
 
334
369
  ### Maintenance
335
370
  - **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.39 work shipped in overnight board-clear: tiered catalogs complete, modal close root fix, ADR-0025 input conformance, [selected] convergence, nav collapse-on-select, caret family sizing. See `packages/web-components/CHANGELOG.md#0839--2026-08-15` for details.
336
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
337
- - **`agent-intents/` touched in this release window** (3 file(s), e.g. `agent-intents/a2ui-planner-agent.intent.md`) carried by the entries above.
338
- - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-planner-agent.md`) carried by the entries above.
339
- - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`) carried by the entries above.
340
- - **`skills/` touched in this release window** (5 file(s), e.g. `references/mcp-tool-reference.md`) carried by the entries above.
371
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
372
+ - **`agent-intents/` touched in this release window** (3 file(s), e.g. `agent-intents/a2ui-planner-agent.intent.md`), carried by the entries above.
373
+ - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-planner-agent.md`), carried by the entries above.
374
+ - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`), carried by the entries above.
375
+ - **`skills/` touched in this release window** (5 file(s), e.g. `references/mcp-tool-reference.md`), carried by the entries above.
341
376
 
342
- ## [0.8.38] 2026-08-15
377
+ ## [0.8.38], 2026-08-15
343
378
 
344
379
  ### Removed
345
- - **ADR-0048 P7 close-out the estate-split bridge leaves the release skill (the cut-procedure §0.8.37 follow-up PR).** `package-paths.mjs` drops the six `shim: true` roster rows (lockstep roster 16 → 10) and `resolvePackageDir`'s dead `shims/` + `a2ui/<x>` fallbacks; `cut-procedure.md` deletes its §The 0.8.37 estate-split cut section (per its own "ONE cut, then delete this section" contract §The 0.8.38 cut stays until that cut lands).
380
+ - **ADR-0048 P7 close-out, the estate-split bridge leaves the release skill (the cut-procedure §0.8.37 follow-up PR).** `package-paths.mjs` drops the six `shim: true` roster rows (lockstep roster 16 → 10) and `resolvePackageDir`'s dead `shims/` + `a2ui/<x>` fallbacks; `cut-procedure.md` deletes its §The 0.8.37 estate-split cut section (per its own "ONE cut, then delete this section" contract, §The 0.8.38 cut stays until that cut lands).
346
381
 
347
382
  ### Changed
348
- - **`bump.mjs`'s invariant-8 generation-MCP pin pattern narrowed back to the single live name `@adia-ai/mcp`** (matching `lockstep-checks.mjs`'s `MCP_PIN_RE`) a retired bridge name in the factory pin is no longer bumped along; it fails the lockstep gate loudly. Selftests updated to the post-flip fixtures plus a retired-name negative control.
383
+ - **`bump.mjs`'s invariant-8 generation-MCP pin pattern narrowed back to the single live name `@adia-ai/mcp`** (matching `lockstep-checks.mjs`'s `MCP_PIN_RE`), a retired bridge name in the factory pin is no longer bumped along; it fails the lockstep gate loudly. Selftests updated to the post-flip fixtures plus a retired-name negative control.
349
384
 
350
385
  ### Maintenance
351
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
352
- - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`) carried by the entries above.
353
- - **`skills/` touched in this release window** (36 file(s), e.g. `a2ui-maintenance/SKILL.md`) carried by the entries above.
386
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
387
+ - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`), carried by the entries above.
388
+ - **`skills/` touched in this release window** (36 file(s), e.g. `a2ui-maintenance/SKILL.md`), carried by the entries above.
354
389
 
355
- ## [0.8.37] 2026-08-14
390
+ ## [0.8.37], 2026-08-14
356
391
 
357
392
  ### Changed
358
- - **ADR-0048 P5 `adia-release` carries the estate-split roster (`scripts/`, `skills/`, `references/`).**
393
+ - **ADR-0048 P5, `adia-release` carries the estate-split roster (`scripts/`, `skills/`, `references/`).**
359
394
  `PACKAGE_ROSTER` gains `a2ui`, `gen-ui`, `gen-ui-mcp` and re-marks the six old
360
- names `shim: true` (the retirement marker P7 deletes by) 17 lockstep for the
395
+ names `shim: true` (the retirement marker P7 deletes by), 17 lockstep for the
361
396
  migration cut, 11 after. `bump.mjs`'s invariant-8 pin pattern and
362
397
  `lockstep-checks.mjs`'s `MCP_PIN_RE` now match EITHER generation-MCP name so
363
398
  the P7 name flip is gate-clean in both directions. `cut-procedure.md` gains
@@ -367,360 +402,360 @@
367
402
  of the hand-typed list that had gone stale against ADR-0048.
368
403
 
369
404
  ### Fixed
370
- - **`references/contracts/a2ui-mcp-surface.md` gains a `plan_app_state` row (REQ-03, gh#1208).** The consumer-load-bearing subset table named `generate_ui`/`refine_ui` and five other tools but not `plan_app_state` the agent operator's (P4's) only Reasoning Ladder surface even though it feeds `generate_ui` directly. Also notes the `experience.shell` enum's reconciliation with the Orientation Record's Shell axis (a breaking change under this contract's own stability rule). Re-landed on `packages/gen-ui-mcp/` after ADR-0048 P2 moved the server there. Twin copy in `adia-ui-factory` updated identically.
371
- - **`release-pack.mjs` Step 5 now stages gate 28's committed health record (gh#1197).** `evals/health/<version>.json` (write-eval-health.mjs, gate 28) rode through pre-flight uncommitted on both the v0.8.35 and v0.8.36 cuts Step 5's staging pathspec never named it, so it sat untracked in the working tree until a session close-out swept it by hand (PR #1196). Added to the `git add` list, named after `args.version` (gate 28 is a `targetVersionArg` gate, so it always writes at the cut version). `release-pack.mjs selftest` now asserts the file appears in the assembled `--mode cut --dry` plan.
405
+ - **`references/contracts/a2ui-mcp-surface.md` gains a `plan_app_state` row (REQ-03, gh#1208).** The consumer-load-bearing subset table named `generate_ui`/`refine_ui` and five other tools but not `plan_app_state`, the agent operator's (P4's) only Reasoning Ladder surface, even though it feeds `generate_ui` directly. Also notes the `experience.shell` enum's reconciliation with the Orientation Record's Shell axis (a breaking change under this contract's own stability rule). Re-landed on `packages/gen-ui-mcp/` after ADR-0048 P2 moved the server there. Twin copy in `adia-ui-factory` updated identically.
406
+ - **`release-pack.mjs` Step 5 now stages gate 28's committed health record (gh#1197).** `evals/health/<version>.json` (write-eval-health.mjs, gate 28) rode through pre-flight uncommitted on both the v0.8.35 and v0.8.36 cuts, Step 5's staging pathspec never named it, so it sat untracked in the working tree until a session close-out swept it by hand (PR #1196). Added to the `git add` list, named after `args.version` (gate 28 is a `targetVersionArg` gate, so it always writes at the cut version). `release-pack.mjs selftest` now asserts the file appears in the assembled `--mode cut --dry` plan.
372
407
 
373
408
  ### Maintenance
374
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
375
- - **`agents/` touched in this release window** (8 file(s), e.g. `agents/a2ui-maintenance-agent.corpus.json`) carried by the entries above.
409
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
410
+ - **`agents/` touched in this release window** (8 file(s), e.g. `agents/a2ui-maintenance-agent.corpus.json`), carried by the entries above.
376
411
 
377
- ## [0.8.36] 2026-08-13
412
+ ## [0.8.36], 2026-08-13
378
413
 
379
414
  ### Maintenance
380
415
  - **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.36 work shipped in a2ui chain standalone-installable (gh#1186: unpublishable dep removed, 143 packed-import escapes fixed, packed-imports gate + boot probe) + ui-architect coordinator agent + MCP doc consolidation. See `packages/a2ui/mcp/CHANGELOG.md#0836--2026-08-13` for details.
381
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
382
- - **`skills/` touched in this release window** (6 file(s), e.g. `adia-release/SKILL.md`) carried by the entries above.
416
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
417
+ - **`skills/` touched in this release window** (6 file(s), e.g. `adia-release/SKILL.md`), carried by the entries above.
383
418
 
384
- ## [0.8.35] 2026-08-13
419
+ ## [0.8.35], 2026-08-13
385
420
 
386
421
  ### Added
387
- - **Release pre-flight gains its 27th and 28th gates (gh#1135, WS-4 SPEC REQ-06): committed pipeline health per cut.** `npm run eval:diff -- --engine free-form` (gate 27) refreshes the eval artifact `write-eval-health.mjs` (gate 28) reads; the latter commits `evals/health/<version>.json` `{version, date, rubricVersion, engines: {free-form: {coverage, avgF1WhenEmitted, avgScoreWhenEmitted}}, acceptance: {gateWiredAssertion, negativeTestAssertion}}` with the `acceptance` assertions produced by actually running `auto-acceptance.test.js`'s AC-01/AC-02 cases, never inferred from an earlier gate's success. `gate-roster.mjs` grows a `targetVersionArg` flag (distinct from `versionArg`, gate 24's pre/post-bump claim-validation concern): this gate always names the file after the cut's target version from the start. Roster: 25 → 28 gates across this window (gate 26, `check-dx-sweep-freshness.mjs`, landed separately below).
388
- - **Gate 26 `check-dx-sweep-freshness.mjs`: the DX sweep record must be fresh and not a regression-RED before a cut.** Passes on a RED-but-not-regression baseline by design (the honest-floors case); authored without a live adia-release sign-off and flagged as such in its own header the flag stands until a cut confirms it.
422
+ - **Release pre-flight gains its 27th and 28th gates (gh#1135, WS-4 SPEC REQ-06): committed pipeline health per cut.** `npm run eval:diff -- --engine free-form` (gate 27) refreshes the eval artifact `write-eval-health.mjs` (gate 28) reads; the latter commits `evals/health/<version>.json`, `{version, date, rubricVersion, engines: {free-form: {coverage, avgF1WhenEmitted, avgScoreWhenEmitted}}, acceptance: {gateWiredAssertion, negativeTestAssertion}}`, with the `acceptance` assertions produced by actually running `auto-acceptance.test.js`'s AC-01/AC-02 cases, never inferred from an earlier gate's success. `gate-roster.mjs` grows a `targetVersionArg` flag (distinct from `versionArg`, gate 24's pre/post-bump claim-validation concern): this gate always names the file after the cut's target version from the start. Roster: 25 → 28 gates across this window (gate 26, `check-dx-sweep-freshness.mjs`, landed separately, below).
423
+ - **Gate 26, `check-dx-sweep-freshness.mjs`: the DX sweep record must be fresh and not a regression-RED before a cut.** Passes on a RED-but-not-regression baseline by design (the honest-floors case); authored without a live adia-release sign-off and flagged as such in its own header, the flag stands until a cut confirms it.
389
424
  - **Class-B (independently-versioned) packages join the roster model (gh#1133/gh#1160).** `package-paths.mjs` carries `lockstep: false` members (first: `@adia-ai/adia-plugins`, the npm marketplace-manifest package); every lockstep consumer (`bump`/`check-lockstep`/`tag-lockstep`/`dispatch-publish`/`release-pack`) filters them out, `release-pretag-docs-gate` learns per-package class-B tag routing via `--tag-prefix` (with class-B inference when the cached hook omits it), and `check-release.mjs` alone keeps the full unfiltered roster (the one consumer that must recognize class-B tags).
390
425
 
391
426
  ### Fixed
392
427
  - **`pr-bridge` retries transient network failures and pushes a local-ahead branch instead of failing the cycle** (this window's release-tooling hardening).
393
- - **`promote-unreleased` is now truly idempotent** a re-run after a completed promotion no-ops instead of double-promoting.
394
- - **`forge-lint` strips comments before scanning and anchors its web-components/web-modules scope check** ends a false-positive class on commented-out imports.
395
- - **humanQA retires per-cycle (REQ-11)** a stale humanQA verdict from a prior cycle can no longer satisfy the current one.
428
+ - **`promote-unreleased` is now truly idempotent**, a re-run after a completed promotion no-ops instead of double-promoting.
429
+ - **`forge-lint` strips comments before scanning and anchors its web-components/web-modules scope check**, ends a false-positive class on commented-out imports.
430
+ - **humanQA retires per-cycle (REQ-11)**, a stale humanQA verdict from a prior cycle can no longer satisfy the current one.
396
431
 
397
432
  ### Maintenance
398
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
399
- - **`agents/` touched in this release window** (4 file(s), e.g. `agents/a2ui-builder.md`) carried by the entries above.
400
- - **`commands/` touched in this release window** (4 file(s), e.g. `commands/deploy.md`) carried by the entries above.
401
- - **`scripts/` touched in this release window** (2 file(s), e.g. `scripts/forge-lint`) carried by the entries above.
402
- - **`skills/` touched in this release window** (35 file(s), e.g. `adia-a2ui/SKILL.md`) carried by the entries above.
433
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
434
+ - **`agents/` touched in this release window** (4 file(s), e.g. `agents/a2ui-builder.md`), carried by the entries above.
435
+ - **`commands/` touched in this release window** (4 file(s), e.g. `commands/deploy.md`), carried by the entries above.
436
+ - **`scripts/` touched in this release window** (2 file(s), e.g. `scripts/forge-lint`), carried by the entries above.
437
+ - **`skills/` touched in this release window** (35 file(s), e.g. `adia-a2ui/SKILL.md`), carried by the entries above.
403
438
 
404
- ## [0.8.34] 2026-08-11
439
+ ## [0.8.34], 2026-08-11
405
440
 
406
441
  ### Fixed
407
- - **Top-level `bin/` directory renamed to `scripts/` claude.ai-hosted plugin validation was rejecting this plugin outright (gh#934).** claude.ai auto-adds any plugin's top-level `bin/` to PATH on the CLI, which isn't shown on the admin approval surface, so hosted validation refused to approve the plugin at all ("2 plugins found, 2 failed validation" alongside `adia-ui-kit-factory`, same defect). `bin/demo-postwrite-pattern-gate`, `bin/forge-lint`, `bin/release-pretag-docs-gate`, `bin/sidecar-prewrite-guard`, `bin/site-postwrite-derivation-gate` moved to `scripts/` with executable bits preserved; `hooks/hooks.json`'s `${CLAUDE_PLUGIN_ROOT}/bin/...` commands and `scripts/forge-lint`'s cross-reference to the factory plugin's vendored lint copy updated to `scripts/...`; `package.json`'s `files` array updated so the published tarball ships the renamed directory. Hook gates still fire the same scripts, just from a non-PATH-reserved location.
442
+ - **Top-level `bin/` directory renamed to `scripts/`, claude.ai-hosted plugin validation was rejecting this plugin outright (gh#934).** claude.ai auto-adds any plugin's top-level `bin/` to PATH on the CLI, which isn't shown on the admin approval surface, so hosted validation refused to approve the plugin at all ("2 plugins found, 2 failed validation" alongside `adia-ui-kit-factory`, same defect). `bin/demo-postwrite-pattern-gate`, `bin/forge-lint`, `bin/release-pretag-docs-gate`, `bin/sidecar-prewrite-guard`, `bin/site-postwrite-derivation-gate` moved to `scripts/` with executable bits preserved; `hooks/hooks.json`'s `${CLAUDE_PLUGIN_ROOT}/bin/...` commands and `scripts/forge-lint`'s cross-reference to the factory plugin's vendored lint copy updated to `scripts/...`; `package.json`'s `files` array updated so the published tarball ships the renamed directory. Hook gates still fire the same scripts, just from a non-PATH-reserved location.
408
443
 
409
444
  ### Maintenance
410
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
411
- - **`skills/` touched in this release window** (1 file(s), e.g. `references/canonical-pattern-index.md`) carried by the entries above.
445
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
446
+ - **`skills/` touched in this release window** (1 file(s), e.g. `references/canonical-pattern-index.md`), carried by the entries above.
412
447
 
413
- ## [0.8.33] 2026-08-11
448
+ ## [0.8.33], 2026-08-11
414
449
 
415
450
  ### Fixed
416
- - **adia-release `release-pack.mjs` resume completes missing stubs, defers versionArg gates, warns on stale cache copy.** The half-cut-tree resume path (all 13 package versions already bumped) previously assumed Step 4a's promote/stub pass had also fully completed but a stub package's `[Unreleased]` reads empty either way, so a resume after an abort mid-stub silently skipped it rather than completing it, leaving that package's `[X.Y.Z]` section missing entirely at tag time. Resume now re-runs `insert-stub.mjs` for any package still missing its `[X.Y.Z]` heading before continuing to the idempotent substeps, defers gates that need the CUT-version hygiene check until after that repair, and warns when the plugin's own bundled copy of this script differs from the repo's live one (a stale marketplace cache silently running old release logic). `cut-procedure.md`'s 4-resume section documents the corrected sequencing.
417
- - **`adia-gen-review`'s corpus-HTML pattern reference no longer teaches the retired `badge-ui variant="accent"` (gh#873-876).** Its worked example used the value the variant/color/tone convention cut retired in favor of `primary` updated so the reference doesn't contradict the shipped contract.
418
- - **adia-release `release-pack.mjs` Step 5 now stages `catalog-data.js`, the third file `derive-genui-catalog.mjs` writes.** Found live during this cut: Step 4d.5 regenerates `base.json`/`adia-pack.json`/`catalog-data.js` together (the latter is the browser-safe ES-module projection of the first two), but the Step 5 file allowlist (gh#617) only ever named the first two `catalog-data.js` sat modified-but-uncommitted in the release commit, invisible in a local working tree (the file exists, just stale) but caught immediately by CI's fresh checkout via `check:genui-catalog`'s drift check. Added to the allowlist alongside its siblings.
451
+ - **adia-release `release-pack.mjs` resume completes missing stubs, defers versionArg gates, warns on stale cache copy.** The half-cut-tree resume path (all 13 package versions already bumped) previously assumed Step 4a's promote/stub pass had also fully completed, but a stub package's `[Unreleased]` reads empty either way, so a resume after an abort mid-stub silently skipped it rather than completing it, leaving that package's `[X.Y.Z]` section missing entirely at tag time. Resume now re-runs `insert-stub.mjs` for any package still missing its `[X.Y.Z]` heading before continuing to the idempotent substeps, defers gates that need the CUT-version hygiene check until after that repair, and warns when the plugin's own bundled copy of this script differs from the repo's live one (a stale marketplace cache silently running old release logic). `cut-procedure.md`'s 4-resume section documents the corrected sequencing.
452
+ - **`adia-gen-review`'s corpus-HTML pattern reference no longer teaches the retired `badge-ui variant="accent"` (gh#873-876).** Its worked example used the value the variant/color/tone convention cut retired in favor of `primary`, updated so the reference doesn't contradict the shipped contract.
453
+ - **adia-release `release-pack.mjs` Step 5 now stages `catalog-data.js`, the third file `derive-genui-catalog.mjs` writes.** Found live during this cut: Step 4d.5 regenerates `base.json`/`adia-pack.json`/`catalog-data.js` together (the latter is the browser-safe ES-module projection of the first two), but the Step 5 file allowlist (gh#617) only ever named the first two, `catalog-data.js` sat modified-but-uncommitted in the release commit, invisible in a local working tree (the file exists, just stale) but caught immediately by CI's fresh checkout via `check:genui-catalog`'s drift check. Added to the allowlist alongside its siblings.
419
454
 
420
455
  ### Maintenance
421
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
422
- - **`skills/` touched in this release window** (3 file(s), e.g. `references/corpus-html-patterns.md`) carried by the entries above.
456
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
457
+ - **`skills/` touched in this release window** (3 file(s), e.g. `references/corpus-html-patterns.md`), carried by the entries above.
423
458
 
424
- ## [0.8.32] 2026-08-09
459
+ ## [0.8.32], 2026-08-09
425
460
 
426
461
  ### Fixed
427
- - **adia-release `release-pack.mjs` deploy-settle wait tracks the dispatched run, requires success, and names the blocking run (gh#762).** The handoff's "waiting for the deploy workflow to settle" loop polled the NEWEST run's status in silence it could settle on the previous completed run before the dispatch registered, accepted failure/cancelled as settled, and gave no signal while a forgotten run WAITING at the `production-site` gate held the `deploy-site` concurrency group (56h on Aug 5–8). Now: the newest run id is captured before dispatch, the handoff waits for the NEW run to appear, polls that run by id, requires `conclusion=success` (anything else fails the handoff), and each poll reports the gate-waiting blocker's id, wait-start, and URL ("BLOCKED BEHIND run X approve or cancel it"). Pairs with the repo-level `reap-stale-deploy-gate.yml` auto-cancel (root CHANGELOG).
428
- - **adia-release `release-pack.mjs` from-scratch guard rails (gh#765).** Three fixes from the v0.8.29 cut's failure modes: (1) a parse-time guard `--mode from-scratch` whose `--substantive-packages` ∪ `--stub-packages` doesn't cover the 13-package roster now fails immediately, naming the ride-alongs that would be missing a `[VERSION]` CHANGELOG section, instead of dying at Step 4e after the ~15-min pre-flight (mirrors the handoff `--gh-notes-file` guard); (2) `sh()`/`shQuiet()` failures now print the failing command, exit status, and the inner command's captured stdout/stderr instead of a bare execSync stack; (3) a half-cut tree (all versions bumped + CHANGELOGs promoted by an aborted Step-4 run) is detected before pre-flight and the run RESUMES hygiene gates validate at the cut version and Step 4 skips promote/stub/bump instead of false-failing gate 24; a mixed partial bump hard-stops with a recovery pointer.
429
- - **adia-release `dispatch-publish.mjs --verify-triggered` is conclusion-aware and registry-gated (gh#763).** The verify used to count ANY run for the tag as "triggered" after the v0.8.29 runner-starvation wave stamped 5 publish runs `cancelled`, it would have reported all 13 packages fine and refused to re-dispatch the dead ones. Now: a run satisfies the check only on `conclusion: success`; in-progress/queued runs get a bounded wait (6 × 20s rechecks); cancelled/failed/timed-out runs and missing runs are re-dispatch candidates. Every re-dispatch is additionally gated behind `npm view <pkg>@<version>` a version already on the registry is published regardless of run conclusion (the v0.8.29 compose run published, then got stamped cancelled by the 10m job clock), so re-dispatching over it would only 403. Registry remains the final arbiter; workflow conclusions are explicitly not publish truth. Selftest extended with negative controls for both the run-classification and the registry-gate decision tables.
462
+ - **adia-release `release-pack.mjs` deploy-settle wait tracks the dispatched run, requires success, and names the blocking run (gh#762).** The handoff's "waiting for the deploy workflow to settle" loop polled the NEWEST run's status in silence, it could settle on the previous completed run before the dispatch registered, accepted failure/cancelled as settled, and gave no signal while a forgotten run WAITING at the `production-site` gate held the `deploy-site` concurrency group (56h on Aug 5–8). Now: the newest run id is captured before dispatch, the handoff waits for the NEW run to appear, polls that run by id, requires `conclusion=success` (anything else fails the handoff), and each poll reports the gate-waiting blocker's id, wait-start, and URL ("BLOCKED BEHIND run X, approve or cancel it"). Pairs with the repo-level `reap-stale-deploy-gate.yml` auto-cancel (root CHANGELOG).
463
+ - **adia-release `release-pack.mjs` from-scratch guard rails (gh#765).** Three fixes from the v0.8.29 cut's failure modes: (1) a parse-time guard, `--mode from-scratch` whose `--substantive-packages` ∪ `--stub-packages` doesn't cover the 13-package roster now fails immediately, naming the ride-alongs that would be missing a `[VERSION]` CHANGELOG section, instead of dying at Step 4e after the ~15-min pre-flight (mirrors the handoff `--gh-notes-file` guard); (2) `sh()`/`shQuiet()` failures now print the failing command, exit status, and the inner command's captured stdout/stderr instead of a bare execSync stack; (3) a half-cut tree (all versions bumped + CHANGELOGs promoted by an aborted Step-4 run) is detected before pre-flight and the run RESUMES, hygiene gates validate at the cut version and Step 4 skips promote/stub/bump, instead of false-failing gate 24; a mixed partial bump hard-stops with a recovery pointer.
464
+ - **adia-release `dispatch-publish.mjs --verify-triggered` is conclusion-aware and registry-gated (gh#763).** The verify used to count ANY run for the tag as "triggered", after the v0.8.29 runner-starvation wave stamped 5 publish runs `cancelled`, it would have reported all 13 packages fine and refused to re-dispatch the dead ones. Now: a run satisfies the check only on `conclusion: success`; in-progress/queued runs get a bounded wait (6 × 20s rechecks); cancelled/failed/timed-out runs and missing runs are re-dispatch candidates. Every re-dispatch is additionally gated behind `npm view <pkg>@<version>`, a version already on the registry is published regardless of run conclusion (the v0.8.29 compose run published, then got stamped cancelled by the 10m job clock), so re-dispatching over it would only 403. Registry remains the final arbiter; workflow conclusions are explicitly not publish truth. Selftest extended with negative controls for both the run-classification and the registry-gate decision tables.
430
465
 
431
466
  ### Maintenance
432
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
433
- - **`skills/` touched in this release window** (13 file(s), e.g. `adia-author/SKILL.md`) carried by the entries above.
467
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
468
+ - **`skills/` touched in this release window** (13 file(s), e.g. `adia-author/SKILL.md`), carried by the entries above.
434
469
 
435
- ## [0.8.31] 2026-08-07
470
+ ## [0.8.31], 2026-08-07
436
471
 
437
472
  ### Maintenance
438
473
  - **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.31 work shipped in post-0.8.30 fix wave: double-submit boundaries, list-item render gate, segmented allow-empty + adapter kebab-case booleans, MCP multi-session + idle TTL, feedback signal:none, swatch auto-contrast, tabs strip-gap spacing + vertical clearance. See `packages/web-components/CHANGELOG.md#0831--2026-08-07` for details.
439
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
474
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
440
475
 
441
- ## [0.8.30] 2026-08-07
476
+ ## [0.8.30], 2026-08-07
442
477
 
443
478
  ### Maintenance
444
479
  - **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.30 work shipped in agent-harness v1 wave: MCP-client mode, guardrails/tracing/memory hardening, auto engine, chat agent-event rendering, human feedback loop. See `packages/agent/CHANGELOG.md#0830--2026-08-07` for details.
445
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
446
- - **`skills/` touched in this release window** (1 file(s), e.g. `references/mcp-pipeline-ops.md`) carried by the entries above.
480
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
481
+ - **`skills/` touched in this release window** (1 file(s), e.g. `references/mcp-pipeline-ops.md`), carried by the entries above.
447
482
 
448
- ## [0.8.29] 2026-08-06
483
+ ## [0.8.29], 2026-08-06
449
484
 
450
485
  ### Maintenance
451
486
  - **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.29 work shipped in web-components (icon-ui tone prop gh#652) + web-modules (plan-envelope chrome gh#648) + a2ui-runtime (registry drift fix gh#645) + a2ui-compose (plan-turn executor gh#648) + a2ui-corpus (chunk re-harvest). See `0829--2026-08-06` for details.
452
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
487
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
453
488
 
454
- ## [0.8.28] 2026-08-05
489
+ ## [0.8.28], 2026-08-05
455
490
 
456
491
  ### Maintenance
457
492
  - **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.28 work shipped in sideEffects tree-shaking fix + CSS barrel regen (gh#625/632). See `0828--2026-08-05` for details.
458
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
493
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
459
494
 
460
- ## [0.8.27] 2026-08-05
495
+ ## [0.8.27], 2026-08-05
461
496
 
462
497
  ### Changed
463
- - **Agent seats pin explicit models** no seat rides the caller's tier (gh#618, PR #620).
498
+ - **Agent seats pin explicit models**, no seat rides the caller's tier (gh#618, PR #620).
464
499
  - 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.
465
500
 
466
501
  ### Maintenance
467
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
468
- - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-builder.md`) carried by the entries above.
469
- - **`skills/` touched in this release window** (2 file(s), e.g. `references/cut-procedure.md`) carried by the entries above.
502
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
503
+ - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-builder.md`), carried by the entries above.
504
+ - **`skills/` touched in this release window** (2 file(s), e.g. `references/cut-procedure.md`), carried by the entries above.
470
505
 
471
- ## [0.8.26] 2026-08-05
506
+ ## [0.8.26], 2026-08-05
472
507
 
473
508
  ### Maintenance
474
509
  - **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.
475
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
476
- - **`skills/` touched in this release window** (7 file(s), e.g. `adia-release/SKILL.md`) carried by the entries above.
510
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
511
+ - **`skills/` touched in this release window** (7 file(s), e.g. `adia-release/SKILL.md`), carried by the entries above.
477
512
 
478
- ## [0.8.25] 2026-07-31
513
+ ## [0.8.25], 2026-07-31
479
514
 
480
515
  ### Maintenance
481
516
  - **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 v0.8.25 work shipped in theme-panel scoped-target [parametric] density/radius fix (gh#570) + System scheme option; anchor-bar-ui; stat-ui band chart layout; chart-ui dots/series-emphasis. See `packages/web-components/CHANGELOG.md#0825--2026-07-31` for details.
482
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
483
- - **`skills/` touched in this release window** (1 file(s), e.g. `references/common-gotchas.md`) carried by the entries above.
517
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
518
+ - **`skills/` touched in this release window** (1 file(s), e.g. `references/common-gotchas.md`), carried by the entries above.
484
519
 
485
- ## [0.8.24] 2026-07-30
520
+ ## [0.8.24], 2026-07-30
486
521
 
487
522
  ### Maintenance
488
523
  - **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 v0.8.24 work shipped in requiredIcons drift cleared across 16 components + checker comment handling (gh#550), worktree bootstrap workspace-link hardening + retrieval corpus-pin fix (gh#554), list-item two-line icon centering (gh#558), card footer bottom-pinning (gh#559). See `packages/web-components/CHANGELOG.md#0824--2026-07-30` for details.
489
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
524
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
490
525
 
491
- ## [0.8.23] 2026-07-30
526
+ ## [0.8.23], 2026-07-30
492
527
 
493
528
  ### Changed
494
- - **Plugin renamed: `adia-forge` → `adia-ui-kit-forge`** (gh#520, operator ruling 2026-07-30). The in-repo marketplace renames `adia` → `adia-ui-kit`; the install pattern becomes `adia-ui-kit-forge@adia-ui-kit`. Directory and npm package identity (`@adia-ai/…`) unchanged. A new manifest name means a FRESH install consumers re-add the marketplace under the new key and re-enable `adia-ui-kit-forge@adia-ui-kit`; old `adia-forge@adia` refs no longer resolve.
529
+ - **Plugin renamed: `adia-forge` → `adia-ui-kit-forge`** (gh#520, operator ruling 2026-07-30). The in-repo marketplace renames `adia` → `adia-ui-kit`; the install pattern becomes `adia-ui-kit-forge@adia-ui-kit`. Directory and npm package identity (`@adia-ai/…`) unchanged. A new manifest name means a FRESH install, consumers re-add the marketplace under the new key and re-enable `adia-ui-kit-forge@adia-ui-kit`; old `adia-forge@adia` refs no longer resolve.
495
530
 
496
531
  ### Changed
497
- - **`bump.mjs` moves web-modules' exact peer pins each cut** (gh#489) a `PINNED_REFS` entry rewrites the three `@adia-ai/*` peers alongside the version fields, with a mutation-free pre-flight and selftest coverage (digit-safe package-name matcher; no prefix-match on longer versions). Pairs with `check:lockstep`'s new `peer-exact-mismatch` rule so a pin left a cut behind fails the gate instead of shipping.
532
+ - **`bump.mjs` moves web-modules' exact peer pins each cut** (gh#489), a `PINNED_REFS` entry rewrites the three `@adia-ai/*` peers alongside the version fields, with a mutation-free pre-flight and selftest coverage (digit-safe package-name matcher; no prefix-match on longer versions). Pairs with `check:lockstep`'s new `peer-exact-mismatch` rule so a pin left a cut behind fails the gate instead of shipping.
498
533
 
499
534
  ### Maintenance
500
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
501
- - **`skills/` touched in this release window** (1 file(s), e.g. `scripts/bump.mjs`) carried by the entries above.
535
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
536
+ - **`skills/` touched in this release window** (1 file(s), e.g. `scripts/bump.mjs`), carried by the entries above.
502
537
 
503
- ## [0.8.22] 2026-07-29
538
+ ## [0.8.22], 2026-07-29
504
539
 
505
540
  ### Fixed
506
- - **`release-pack.mjs` Step 10 failures name their reason** `shOk` discarded stderr, so a release-create that failed twice reported "could not be created" with an expired gh token, a network reset, and a bad notes file all indistinguishable. Create calls now pass `{ report: true }` (stderr surfaced, first 3 lines); existence probes stay silent since their failure is the answer.
507
- - **`release-pack.mjs` Step 10 is idempotent and resumable** the GH-release loop called `gh release create` unconditionally, so ONE network blip aborted the whole handoff. The v0.8.21 cut hit exactly that: `connection reset by peer` with 4 of 11 releases made, *after* tags were pushed and all 9 packages published the irreversible half done, the bookkeeping half stranded, and a plain re-run then failing on "release already exists" for the first 4 (repaired by hand). Now: a non-throwing `shOk()` probe skips releases that already exist, one retry absorbs a transient reset, and a genuine failure reports created/skipped/failed counts plus the fact that tags and publishes are unaffected re-running the same handoff command finishes the job. Verified against the live v0.8.21 releases: 11 detected as existing, 0 would be re-created, and the probe returns false for a bogus tag (no false-positive skips).
541
+ - **`release-pack.mjs` Step 10 failures name their reason**, `shOk` discarded stderr, so a release-create that failed twice reported "could not be created" with an expired gh token, a network reset, and a bad notes file all indistinguishable. Create calls now pass `{ report: true }` (stderr surfaced, first 3 lines); existence probes stay silent since their failure is the answer.
542
+ - **`release-pack.mjs` Step 10 is idempotent and resumable**, the GH-release loop called `gh release create` unconditionally, so ONE network blip aborted the whole handoff. The v0.8.21 cut hit exactly that: `connection reset by peer` with 4 of 11 releases made, *after* tags were pushed and all 9 packages published, the irreversible half done, the bookkeeping half stranded, and a plain re-run then failing on "release already exists" for the first 4 (repaired by hand). Now: a non-throwing `shOk()` probe skips releases that already exist, one retry absorbs a transient reset, and a genuine failure reports created/skipped/failed counts plus the fact that tags and publishes are unaffected, re-running the same handoff command finishes the job. Verified against the live v0.8.21 releases: 11 detected as existing, 0 would be re-created, and the probe returns false for a bogus tag (no false-positive skips).
508
543
 
509
544
  ### Maintenance
510
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
511
- - **`skills/` touched in this release window** (1 file(s), e.g. `scripts/release-pack.mjs`) carried by the entries above.
545
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
546
+ - **`skills/` touched in this release window** (1 file(s), e.g. `scripts/release-pack.mjs`), carried by the entries above.
512
547
 
513
- ## [0.8.21] 2026-07-28
548
+ ## [0.8.21], 2026-07-28
514
549
 
515
550
  ### Fixed
516
- - **Pre-cut gate roster 23 → 24** (`skills/package-release/scripts/gate-roster.mjs`) adds `check:brand-assets` (the Adia mark must be token-driven, never a baked `agent-ui-*.svg`; gh#473). `cut-procedure.md` §3.1's transcribed table and the SKILL/gates-catalog counts moved with it, and the cut-hygiene gate renumbered 23 → 24; doc-vs-module equality re-verified programmatically (24/24 in sync, contiguous numbering).
551
+ - **Pre-cut gate roster 23 → 24** (`skills/package-release/scripts/gate-roster.mjs`), adds `check:brand-assets` (the Adia mark must be token-driven, never a baked `agent-ui-*.svg`; gh#473). `cut-procedure.md` §3.1's transcribed table and the SKILL/gates-catalog counts moved with it, and the cut-hygiene gate renumbered 23 → 24; doc-vs-module equality re-verified programmatically (24/24 in sync, contiguous numbering).
517
552
 
518
- - **`release-pack.mjs` stages the root CHANGELOG it promotes** the gh#453 machinery renamed root `[Unreleased]` → `[X.Y.Z]` at Step 4 but the Step 5 stage roster predated it, so the v0.8.20 cut promoted the heading and shipped without it (main kept `[Unreleased]`; the rename sat uncommitted in the cutter's working tree). `CHANGELOG.md` joins `releaseFiles`; the stranded v0.8.20 rename rides this same PR.
553
+ - **`release-pack.mjs` stages the root CHANGELOG it promotes**, the gh#453 machinery renamed root `[Unreleased]` → `[X.Y.Z]` at Step 4 but the Step 5 stage roster predated it, so the v0.8.20 cut promoted the heading and shipped without it (main kept `[Unreleased]`; the rename sat uncommitted in the cutter's working tree). `CHANGELOG.md` joins `releaseFiles`; the stranded v0.8.20 rename rides this same PR.
519
554
 
520
555
  ### Maintenance
521
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
556
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
522
557
 
523
- ## [0.8.20] 2026-07-28
558
+ ## [0.8.20], 2026-07-28
524
559
 
525
560
  ### Maintenance
526
561
  - **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 v0.8.20 work shipped in form/ subpath exports (gh#457) + tarball test-file hygiene, 7 packages (gh#462). See `packages/web-modules/CHANGELOG.md#0820--2026-07-28` for details.
527
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
562
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
528
563
 
529
- ## [0.8.19] 2026-07-27
564
+ ## [0.8.19], 2026-07-27
530
565
 
531
566
  ### Fixed
532
- - **`adia-release` promotes the repo-root CHANGELOG at cut time** (operator directive 2026-07-27). The cut promoted the 11 package changelogs but never the root one, so repo-level entries accumulated under `[Unreleased]` across five release windows (0.8.7 → 0.8.18) until an operator caught the pile-up in the site's Changelog panel. `promote-unreleased.mjs` gains the special target `root` (repo-root `CHANGELOG.md`, deliberately outside `PACKAGE_ROSTER` the roster feeds publish/tag consumers); `release-pack.mjs` adds `root` to the promote list by detection whenever that file's `[Unreleased]` carries content no flag, since root entries are optional per window and the post-promotion loud guard now sweeps `root` too, which also catches a duplicate `[Unreleased]` heading (the promote swaps only the first; the second trips the guard).
567
+ - **`adia-release` promotes the repo-root CHANGELOG at cut time** (operator directive 2026-07-27). The cut promoted the 11 package changelogs but never the root one, so repo-level entries accumulated under `[Unreleased]` across five release windows (0.8.7 → 0.8.18) until an operator caught the pile-up in the site's Changelog panel. `promote-unreleased.mjs` gains the special target `root` (repo-root `CHANGELOG.md`, deliberately outside `PACKAGE_ROSTER`, the roster feeds publish/tag consumers); `release-pack.mjs` adds `root` to the promote list by detection whenever that file's `[Unreleased]` carries content, no flag, since root entries are optional per window, and the post-promotion loud guard now sweeps `root` too, which also catches a duplicate `[Unreleased]` heading (the promote swaps only the first; the second trips the guard).
533
568
 
534
569
  ### Maintenance
535
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
536
- - **`skills/` touched in this release window** (3 file(s), e.g. `references/changelog-discipline.md`) carried by the entries above.
570
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
571
+ - **`skills/` touched in this release window** (3 file(s), e.g. `references/changelog-discipline.md`), carried by the entries above.
537
572
 
538
- ## [0.8.18] 2026-07-27
573
+ ## [0.8.18], 2026-07-27
539
574
 
540
575
  ### Added
541
- - **`adia-author` writes down the tag-naming rule across tiers** (`references/code-style.md`) primitives and standalone feature composites carry `-ui`; shell/bespoke-cluster children and runtime roots are bare, namespaced by their cluster prefix. Ratified when `form-popover` shipped as the only unsuffixed standalone composite (renamed `form-popover-ui` the next release); `theme-panel` is explicitly grandfathered, not precedent.
576
+ - **`adia-author` writes down the tag-naming rule across tiers** (`references/code-style.md`), primitives and standalone feature composites carry `-ui`; shell/bespoke-cluster children and runtime roots are bare, namespaced by their cluster prefix. Ratified when `form-popover` shipped as the only unsuffixed standalone composite (renamed `form-popover-ui` the next release); `theme-panel` is explicitly grandfathered, not precedent.
542
577
 
543
578
  ### Maintenance
544
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
545
- - **`skills/` touched in this release window** (1 file(s), e.g. `references/code-style.md`) carried by the entries above.
579
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
580
+ - **`skills/` touched in this release window** (1 file(s), e.g. `references/code-style.md`), carried by the entries above.
546
581
 
547
- ## [0.8.17] 2026-07-27
582
+ ## [0.8.17], 2026-07-27
548
583
 
549
584
  ### Changed
550
- - **Pre-cut gate roster 22 → 23** (`skills/package-release/scripts/gate-roster.mjs`) adds `check:demo-routes` (demo surfaces routed + patterns indexed; operator directive 2026-07-27). `cut-procedure.md` §3.1's transcribed table and the SKILL/gates-catalog counts moved with it; doc-vs-module equality re-verified programmatically (23/23 in sync).
585
+ - **Pre-cut gate roster 22 → 23** (`skills/package-release/scripts/gate-roster.mjs`), adds `check:demo-routes` (demo surfaces routed + patterns indexed; operator directive 2026-07-27). `cut-procedure.md` §3.1's transcribed table and the SKILL/gates-catalog counts moved with it; doc-vs-module equality re-verified programmatically (23/23 in sync).
551
586
 
552
587
  ### Maintenance
553
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
588
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
554
589
 
555
- ## [0.8.16] 2026-07-26
590
+ ## [0.8.16], 2026-07-26
556
591
 
557
592
  ### Fixed
558
- - **The cut's harvest preamble now names `.examples.html` and the two generators it feeds** (`skills/package-release/references/cut-procedure.md` §3.0; gh#421) the trigger list covered component yaml, `.a2ui.json`, `*.contents.html`, and `data-chunk-*`-annotated pages, so an `.examples.html` edit read as out of scope. It isn't: it feeds `.examples.md`, the `site-a2ui` converted rows, **and** the chunk harvest's source hashes. The v0.8.14 cut edited two components' `.examples.html`, ran every freshness gate the doc named, saw them clean, and still lost a CI round-trip to `🔴 stale /site/components/{menu,popover}` plus two changed-since-harvest sources. The regen block now lists `generate-examples-md.mjs`, `site-a2ui.mjs --stale`, and `check-token-semantics-sync.mjs --fix`, and the trigger list adds `styles/colors/*`.
593
+ - **The cut's harvest preamble now names `.examples.html` and the two generators it feeds** (`skills/package-release/references/cut-procedure.md` §3.0; gh#421), the trigger list covered component yaml, `.a2ui.json`, `*.contents.html`, and `data-chunk-*`-annotated pages, so an `.examples.html` edit read as out of scope. It isn't: it feeds `.examples.md`, the `site-a2ui` converted rows, **and** the chunk harvest's source hashes. The v0.8.14 cut edited two components' `.examples.html`, ran every freshness gate the doc named, saw them clean, and still lost a CI round-trip to `🔴 stale /site/components/{menu,popover}` plus two changed-since-harvest sources. The regen block now lists `generate-examples-md.mjs`, `site-a2ui.mjs --stale`, and `check-token-semantics-sync.mjs --fix`, and the trigger list adds `styles/colors/*`.
559
594
 
560
595
  ### Changed
561
- - **The pre-cut gate roster grows 18 → 22** (`skills/package-release/scripts/gate-roster.mjs`) `check:examples-md-fresh`, `verify:site-a2ui`, `verify:contrast`, and `check:token-semantics-sync` all shipped in the `npm run check` aggregate but were never in the release roster, so a gate added to CI silently never reached a cut. `verify:contrast` matters most: gh#427 widened it from 42 to 90 pairs, and without it in the roster a sub-AA token could ship past a green pre-flight. `cut-procedure.md` §3.1's transcribed table and the SKILL/gates-catalog counts moved with it verified programmatically that the doc table and the module list are entry-for-entry identical.
596
+ - **The pre-cut gate roster grows 18 → 22** (`skills/package-release/scripts/gate-roster.mjs`), `check:examples-md-fresh`, `verify:site-a2ui`, `verify:contrast`, and `check:token-semantics-sync` all shipped in the `npm run check` aggregate but were never in the release roster, so a gate added to CI silently never reached a cut. `verify:contrast` matters most: gh#427 widened it from 42 to 90 pairs, and without it in the roster a sub-AA token could ship past a green pre-flight. `cut-procedure.md` §3.1's transcribed table and the SKILL/gates-catalog counts moved with it, verified programmatically that the doc table and the module list are entry-for-entry identical.
562
597
 
563
598
  ### Maintenance
564
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
599
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
565
600
 
566
- ## [0.8.15] 2026-07-26
601
+ ## [0.8.15], 2026-07-26
567
602
 
568
603
  ### Maintenance
569
604
  - **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 v0.8.15 work shipped in hover darkens in both schemes (600/550 role + filled-button wiring); find-unused adoption skill + measured routing evals. See `packages/web-components/CHANGELOG.md#0815--2026-07-26` for details.
570
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
605
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
571
606
 
572
- ## [0.8.14] 2026-07-25
607
+ ## [0.8.14], 2026-07-25
573
608
 
574
609
  ### Fixed
575
- - **The in-repo plugin marketplace resolves again** (`.claude-plugin/marketplace.json`, relocated to the repo root; PR #412) `claude plugin marketplace add` looks for the manifest at the checkout **root** unconditionally (the `owner/repo` shorthand and a git URL alike, `--sparse` or not; `--sparse` only limits which directories are checked out, it does not relocate the lookup). The old `packages/plugins/.claude-plugin/marketplace.json` location never resolved, so the documented install command had never worked. The manifest's two `source` fields were repointed at `./packages/plugins/adia-ui-{factory,forge}`.
576
- - **`.claude/settings.json`'s directory marketplace repointed at the repo root** it still pointed at `./packages/plugins` after that relocation, so the repo's own dogfood plugins silently stopped loading (which is what the hooks and skills in this plugin are served through). The manifest's `name` is `adia`, so the enabled ids are `adia-forge@adia` / `adia-factory@adia`.
577
- - **`release-pack.mjs` generates and stages `docs/releases/vX.Y.Z.md` during the cut** (gh#399; PR #415) the cut/from-scratch modes never produced the release-notes doc, and `check-cut-hygiene`'s success message claimed it was present without ever checking, so the gap surfaced a full cycle later at `release-pretag-docs-gate`. The v0.8.11 cut paid for it with a second PR and v0.8.13 hit the identical stop. New Step 4e runs `generate-release-notes.mjs --write` right after the bump (so the doc reads post-bump state) and Step 5 stages it; `check-cut-hygiene.mjs` gained a real `checkReleaseNotesPresent()` existence check.
610
+ - **The in-repo plugin marketplace resolves again** (`.claude-plugin/marketplace.json`, relocated to the repo root; PR #412), `claude plugin marketplace add` looks for the manifest at the checkout **root** unconditionally (the `owner/repo` shorthand and a git URL alike, `--sparse` or not; `--sparse` only limits which directories are checked out, it does not relocate the lookup). The old `packages/plugins/.claude-plugin/marketplace.json` location never resolved, so the documented install command had never worked. The manifest's two `source` fields were repointed at `./packages/plugins/adia-ui-{factory,forge}`.
611
+ - **`.claude/settings.json`'s directory marketplace repointed at the repo root**, it still pointed at `./packages/plugins` after that relocation, so the repo's own dogfood plugins silently stopped loading (which is what the hooks and skills in this plugin are served through). The manifest's `name` is `adia`, so the enabled ids are `adia-forge@adia` / `adia-factory@adia`.
612
+ - **`release-pack.mjs` generates and stages `docs/releases/vX.Y.Z.md` during the cut** (gh#399; PR #415), the cut/from-scratch modes never produced the release-notes doc, and `check-cut-hygiene`'s success message claimed it was present without ever checking, so the gap surfaced a full cycle later at `release-pretag-docs-gate`. The v0.8.11 cut paid for it with a second PR and v0.8.13 hit the identical stop. New Step 4e runs `generate-release-notes.mjs --write` right after the bump (so the doc reads post-bump state) and Step 5 stages it; `check-cut-hygiene.mjs` gained a real `checkReleaseNotesPresent()` existence check.
578
613
 
579
614
  ### Added
580
- - **`adia-author` records the LightningCSS remote-`@import` failure** (`skills/primitive-authoring/references/authoring-cycle.md`; PR #418) `bundleAsync` resolves every `@import` as a local file, `http(s)` URLs included, with no option to skip or externalize one, so a CSS-level `@import` of a Google Fonts URL breaks `npm run build:bundle-css`. It bit the 12-theme work twice; the note lives in the bundle-regen paragraph, where the failure actually surfaces.
615
+ - **`adia-author` records the LightningCSS remote-`@import` failure** (`skills/primitive-authoring/references/authoring-cycle.md`; PR #418), `bundleAsync` resolves every `@import` as a local file, `http(s)` URLs included, with no option to skip or externalize one, so a CSS-level `@import` of a Google Fonts URL breaks `npm run build:bundle-css`. It bit the 12-theme work twice; the note lives in the bundle-regen paragraph, where the failure actually surfaces.
581
616
 
582
617
  ### Maintenance
583
- - **Plugin README version footer corrected** it read v0.8.5 against a 0.8.13 manifest. Known gap, deliberately not fixed here: `check-cut-hygiene`'s doc-currency regex does not match that line's phrasing, which is why it drifted silently past every prior cut.
618
+ - **Plugin README version footer corrected**, it read v0.8.5 against a 0.8.13 manifest. Known gap, deliberately not fixed here: `check-cut-hygiene`'s doc-currency regex does not match that line's phrasing, which is why it drifted silently past every prior cut.
584
619
 
585
- ## [0.8.13] 2026-07-25
620
+ ## [0.8.13], 2026-07-25
586
621
 
587
622
  ### Maintenance
588
623
  - **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 v0.8.13 work shipped in 12 named theme identities + select-menu Theme row in theme-panel; fixes scale.css wiring, Preset/Reset UX, and a Theme-select XSS finding. See `packages/web-modules/CHANGELOG.md#0813--2026-07-25` for details.
589
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
624
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
590
625
 
591
- ## [0.8.12] 2026-07-24
626
+ ## [0.8.12], 2026-07-24
592
627
 
593
628
  ### Fixed
594
- - **`AGENTS.md`, `adia-author/SKILL.md`, `adia-author/references/code-style.md`: primitive count corrected 127 → 125** the actual `packages/web-components/components/*/` directory count (excluding `index.js`/`index.d.ts`/`overview.*`); `AGENTS.md` had two separate stale mentions, one already partially corrected in a prior pass and one missed.
629
+ - **`AGENTS.md`, `adia-author/SKILL.md`, `adia-author/references/code-style.md`: primitive count corrected 127 → 125**, the actual `packages/web-components/components/*/` directory count (excluding `index.js`/`index.d.ts`/`overview.*`); `AGENTS.md` had two separate stale mentions, one already partially corrected in a prior pass and one missed.
595
630
 
596
631
  ### Maintenance
597
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
598
- - **`skills/` touched in this release window** (2 file(s), e.g. `adia-author/SKILL.md`) carried by the entries above.
632
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
633
+ - **`skills/` touched in this release window** (2 file(s), e.g. `adia-author/SKILL.md`), carried by the entries above.
599
634
 
600
- ## [0.8.11] 2026-07-23
635
+ ## [0.8.11], 2026-07-23
601
636
 
602
637
  ### Fixed
603
- - **`adia-author`: dist-bundle regen joins the structural-gate sequence** (`skills/primitive-authoring/SKILL.md`, `references/authoring-cycle.md`) a new/changed component CSS `@import` or barrel export drifts `dist/` bundles, and the skill's verify sequence never said so; gh#390's PR failed CI's `check:css-bundles-fresh`/`check:js-bundles-fresh` exactly this way. The gate sequence and the barrel-registration step now both name `build:bundle-css`/`build:bundle-js` + the two freshness checks.
604
- - **`adia-release`: `release-pack.mjs --mode handoff` validates `--gh-notes-file` at parse time** the flag was only checked at Step 10 (GH releases), AFTER tags and npm publish were irreversible; the v0.8.10 cut died there live. Selftest case added.
605
- - **`adia-release`: mid-Step-4 resume path documented** (`references/cut-procedure.md` §4-resume) once any CHANGELOG promotion lands, re-invoking the orchestrator hard-errors on the idempotency guard ("already has ## [X.Y.Z]") forever; the doc now names the standalone-pieces sequence (bump → lockfile → lockstep → 4f → 4e → Step 5/5.7) instead of leaving the operator to reverse-engineer it mid-cut.
606
- - **`adia-release`: stub-package ownership rule** (`references/changelog-discipline.md` §Stubs) `insert-stub.mjs` inserts, never promotes; a hand-written `[Unreleased]` in a `--stub-packages` target survives as an orphaned second block and fails the loud guard (v0.8.10 lost a cycle to this across 6 packages). Rule: the tool owns stub packages; hand-written content means the package belongs in `--substantive-packages`.
607
- - **`release-pretag-docs-gate`: a `cd <path> && …` command prefix now resolves the gate against THAT checkout, not the session cwd** (`bin/release-pretag-docs-gate`) a session pinned to a stale worktree (own copy of the gate script, branch without the release's CHANGELOG sections) false-FAILed the v0.8.10 handoff even though the command explicitly cd'd to the clean primary checkout. Selftest fixtures added for the prefix resolution.
638
+ - **`adia-author`: dist-bundle regen joins the structural-gate sequence** (`skills/primitive-authoring/SKILL.md`, `references/authoring-cycle.md`), a new/changed component CSS `@import` or barrel export drifts `dist/` bundles, and the skill's verify sequence never said so; gh#390's PR failed CI's `check:css-bundles-fresh`/`check:js-bundles-fresh` exactly this way. The gate sequence and the barrel-registration step now both name `build:bundle-css`/`build:bundle-js` + the two freshness checks.
639
+ - **`adia-release`: `release-pack.mjs --mode handoff` validates `--gh-notes-file` at parse time**: the flag was only checked at Step 10 (GH releases), AFTER tags and npm publish were irreversible; the v0.8.10 cut died there live. Selftest case added.
640
+ - **`adia-release`: mid-Step-4 resume path documented** (`references/cut-procedure.md` §4-resume), once any CHANGELOG promotion lands, re-invoking the orchestrator hard-errors on the idempotency guard ("already has ## [X.Y.Z]") forever; the doc now names the standalone-pieces sequence (bump → lockfile → lockstep → 4f → 4e → Step 5/5.7) instead of leaving the operator to reverse-engineer it mid-cut.
641
+ - **`adia-release`: stub-package ownership rule** (`references/changelog-discipline.md` §Stubs), `insert-stub.mjs` inserts, never promotes; a hand-written `[Unreleased]` in a `--stub-packages` target survives as an orphaned second block and fails the loud guard (v0.8.10 lost a cycle to this across 6 packages). Rule: the tool owns stub packages; hand-written content means the package belongs in `--substantive-packages`.
642
+ - **`release-pretag-docs-gate`: a `cd <path> && …` command prefix now resolves the gate against THAT checkout, not the session cwd** (`bin/release-pretag-docs-gate`), a session pinned to a stale worktree (own copy of the gate script, branch without the release's CHANGELOG sections) false-FAILed the v0.8.10 handoff even though the command explicitly cd'd to the clean primary checkout. Selftest fixtures added for the prefix resolution.
608
643
 
609
644
  ### Maintenance
610
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
645
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
611
646
 
612
- ## [0.8.10] 2026-07-20
647
+ ## [0.8.10], 2026-07-20
613
648
 
614
649
  ### Added
615
- - **`evals/evals.json` behavioral test-case files for 8 skills** (gh#369) the file `release_gate.py`'s G7 coverage check actually reads (a schema distinct from `evals/routing-corpus.json`). Derived from each skill's already-vetted `routing-corpus.json` phrases, with real judgment applied the forge side required genuine authoring since its corpus phrases are terse fragments, not natural-language prompts (independently reviewed, sampled).
650
+ - **`evals/evals.json` behavioral test-case files for 8 skills** (gh#369), the file `release_gate.py`'s G7 coverage check actually reads (a schema distinct from `evals/routing-corpus.json`). Derived from each skill's already-vetted `routing-corpus.json` phrases, with real judgment applied, the forge side required genuine authoring since its corpus phrases are terse fragments, not natural-language prompts (independently reviewed, sampled).
616
651
 
617
652
  ### Fixed
618
- - **`evals/routing-corpus.json` unified onto one schema across all skills** (gh#355) converged forge's `{positives,negatives}` shape and factory's `{phrases}` shape onto the `{phrases:[...]}` form `scripts/skills/run-skill-evals.mjs` actually reads. `run-skill-evals.mjs` extended to aggregate the global corpus with every per-skill corpus (per-skill wins on id collision) instead of reading only the 97-phrase global file; added a `selftest` subcommand. Does NOT touch `routing_eval.py`/`release_gate.py` those live in an externally-installed marketplace plugin, out of this repo's reach; gh#369 is the separate, real fix for G7's actual coverage check.
653
+ - **`evals/routing-corpus.json` unified onto one schema across all skills** (gh#355), converged forge's `{positives,negatives}` shape and factory's `{phrases}` shape onto the `{phrases:[...]}` form `scripts/skills/run-skill-evals.mjs` actually reads. `run-skill-evals.mjs` extended to aggregate the global corpus with every per-skill corpus (per-skill wins on id collision) instead of reading only the 97-phrase global file; added a `selftest` subcommand. Does NOT touch `routing_eval.py`/`release_gate.py`, those live in an externally-installed marketplace plugin, out of this repo's reach; gh#369 is the separate, real fix for G7's actual coverage check.
619
654
 
620
655
  ### Maintenance
621
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
656
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
622
657
 
623
- ## [0.8.9] 2026-07-19
658
+ ## [0.8.9], 2026-07-19
624
659
 
625
660
  ### Fixed
626
- - **`release-pack.mjs` now actually creates `release/vX.Y.Z`** before staging `step5Commit()` previously committed on whatever branch was checked out (the v0.8.8 cut landed its release commit on local `main`, caught and recovered by hand). Idempotent (checkout if the branch exists a resumed run create with `-b` otherwise); `step1ReBaseline()` now asserts the starting branch is `main` or the release branch itself for cut modes. Guarded: checking out an *existing* release branch on a dirty tree now fails with a real diagnostic (which files, what to do) instead of an opaque git error.
627
- - **Step 9's settle-wait polls the registry itself**, not one proxy workflow the old code waited for `publish-a2ui-validator.yml` alone as a stand-in for all 11 publishes; a straggler on any other package made the immediately-following fail-closed registry check abort on a pure timing false alarm (hit live on the v0.8.8 cut). Now polls all 11 packages + `latest` directly, every 15s up to ~10-18min, per the skill's own doctrine ("the registry is the verify target, never a workflow's green check"). The existing fail-closed check remains as a final confirmation.
628
- - **`pr-bridge.mjs` refuses to merge a DRAFT PR** a real incident: it attempted to merge an author-marked draft, which GitHub's API rejects, and the old code (no `isDraft` check anywhere) crashed uncaught. `bridgeDecision()` now treats `isDraft` as an unconditional stop; the `gh pr merge` call and the top-level `main().catch` are both wrapped so no rejection reason draft or otherwise can crash invisibly under the script's own documented `grep -E "pr-bridge" | tail -N` usage pattern.
661
+ - **`release-pack.mjs` now actually creates `release/vX.Y.Z`** before staging, `step5Commit()` previously committed on whatever branch was checked out (the v0.8.8 cut landed its release commit on local `main`, caught and recovered by hand). Idempotent (checkout if the branch exists, a resumed run, create with `-b` otherwise); `step1ReBaseline()` now asserts the starting branch is `main` or the release branch itself for cut modes. Guarded: checking out an *existing* release branch on a dirty tree now fails with a real diagnostic (which files, what to do) instead of an opaque git error.
662
+ - **Step 9's settle-wait polls the registry itself**, not one proxy workflow, the old code waited for `publish-a2ui-validator.yml` alone as a stand-in for all 11 publishes; a straggler on any other package made the immediately-following fail-closed registry check abort on a pure timing false alarm (hit live on the v0.8.8 cut). Now polls all 11 packages + `latest` directly, every 15s up to ~10-18min, per the skill's own doctrine ("the registry is the verify target, never a workflow's green check"). The existing fail-closed check remains as a final confirmation.
663
+ - **`pr-bridge.mjs` refuses to merge a DRAFT PR**, a real incident: it attempted to merge an author-marked draft, which GitHub's API rejects, and the old code (no `isDraft` check anywhere) crashed uncaught. `bridgeDecision()` now treats `isDraft` as an unconditional stop; the `gh pr merge` call and the top-level `main().catch` are both wrapped so no rejection reason, draft or otherwise, can crash invisibly under the script's own documented `grep -E "pr-bridge" | tail -N` usage pattern.
629
664
 
630
665
  ### Maintenance
631
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
632
- - **`skills/` touched in this release window** (2 file(s), e.g. `scripts/pr-bridge.mjs`) carried by the entries above.
666
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
667
+ - **`skills/` touched in this release window** (2 file(s), e.g. `scripts/pr-bridge.mjs`), carried by the entries above.
633
668
 
634
- ## [0.8.8] 2026-07-19
669
+ ## [0.8.8], 2026-07-19
635
670
 
636
671
  ### Added
637
- - **`pr-bridge.mjs`** (adia-release `skills/package-release/scripts/`): the cut's two-phase PR bridge, mechanized pushes the release branch, opens/reuses the PR, polls CI, and admin-merges ONLY on all-non-fail-soft-checks-green + zero unresolved review threads + no changes-requested + MERGEABLE; anything else waits or stops with full evidence (`--dry` previews the decision). Independently reviewed and hardened pre-ship: never merges on an empty gating-check set ("nothing failed" ≠ "something passed"); operator-supplied args go through `execFileSync` arg arrays (no shell); the merge-landing proof never skips silently. 14-case selftest; registered in CI's Plugin bin selftests; battle-tested on 8 real merges before first release use. cut-procedure §5.7 documents both the mechanized and manual forms.
672
+ - **`pr-bridge.mjs`** (adia-release `skills/package-release/scripts/`): the cut's two-phase PR bridge, mechanized, pushes the release branch, opens/reuses the PR, polls CI, and admin-merges ONLY on all-non-fail-soft-checks-green + zero unresolved review threads + no changes-requested + MERGEABLE; anything else waits or stops with full evidence (`--dry` previews the decision). Independently reviewed and hardened pre-ship: never merges on an empty gating-check set ("nothing failed" ≠ "something passed"); operator-supplied args go through `execFileSync` arg arrays (no shell); the merge-landing proof never skips silently. 14-case selftest; registered in CI's Plugin bin selftests; battle-tested on 8 real merges before first release use. cut-procedure §5.7 documents both the mechanized and manual forms.
638
673
 
639
674
  ### Changed
640
- - **`package-paths.mjs` is now the single source of the 11-package roster** (`PACKAGE_ROSTER` + `PACKAGE_NAMES`/`PACKAGE_DIRS`): the lockstep list was re-declared in 8 scripts (bump, tag-lockstep, dispatch-publish, release-pack, and the repo-side check-release/check-lockstep/check-release-docs/generate-release-notes), each with its own projection the same list-drift class the gate-roster incident proved out. Skill-side home is deliberate: cache-executed skill scripts can't import repo modules; repo scripts import the skill module by its stable in-repo path.
641
- - **`gate-roster.mjs` grew gate 18** (`check-cut-hygiene --version X.Y.Z`, via the new `versionArg` field release-pack substitutes) and **gate 4 now runs `test:unit:serial`** (`vitest --no-file-parallelism` gates-catalog §Cat 8's documented source of truth IS now the gate). References updated same-change: cut-procedure §3.1 (18-gate table), gates-catalog Cat 1/7/8/9.
675
+ - **`package-paths.mjs` is now the single source of the 11-package roster** (`PACKAGE_ROSTER` + `PACKAGE_NAMES`/`PACKAGE_DIRS`): the lockstep list was re-declared in 8 scripts (bump, tag-lockstep, dispatch-publish, release-pack, and the repo-side check-release/check-lockstep/check-release-docs/generate-release-notes), each with its own projection, the same list-drift class the gate-roster incident proved out. Skill-side home is deliberate: cache-executed skill scripts can't import repo modules; repo scripts import the skill module by its stable in-repo path.
676
+ - **`gate-roster.mjs` grew gate 18** (`check-cut-hygiene --version X.Y.Z`, via the new `versionArg` field release-pack substitutes) and **gate 4 now runs `test:unit:serial`** (`vitest --no-file-parallelism`, gates-catalog §Cat 8's documented source of truth IS now the gate). References updated same-change: cut-procedure §3.1 (18-gate table), gates-catalog Cat 1/7/8/9.
642
677
 
643
678
  ### Fixed
644
- - **`bump.mjs` moves every cross-file version reference in the same pass**: the factory `.mcp.json` `@adia-ai/a2ui-mcp@X.Y.Z` pin (invariant 8 hand-fixed on BOTH the 0.8.6 and 0.8.7 cuts; `check:lockstep` now guards it too) and the root README "Current version" claim (`REPO_PINNED_REFS` gate 18 exact-matches it, so a hand-set value fails the next cut by construction). All pins pre-flight-validated alongside `validateAllAtFrom`, so a doomed bump writes NOTHING (reviewer finding: the mid-loop check fired only after two files were already written).
679
+ - **`bump.mjs` moves every cross-file version reference in the same pass**: the factory `.mcp.json` `@adia-ai/a2ui-mcp@X.Y.Z` pin (invariant 8, hand-fixed on BOTH the 0.8.6 and 0.8.7 cuts; `check:lockstep` now guards it too) and the root README "Current version" claim (`REPO_PINNED_REFS`, gate 18 exact-matches it, so a hand-set value fails the next cut by construction). All pins pre-flight-validated alongside `validateAllAtFrom`, so a doomed bump writes NOTHING (reviewer finding: the mid-loop check fired only after two files were already written).
645
680
  - **adia-release docs**: SKILL.md Mechanization + cut-procedure §5.7/§3.1 + gates-catalog reflect pr-bridge, the 18-gate roster, the umbrella tag's `info` classification (the repo-side `check-release.mjs` fix that killed the Step-7 false-stop which forced manual handoffs on 0.8.6/0.8.7), and the deleted superseded `check-changelog-coverage` gate.
646
681
 
647
682
  ### Maintenance
648
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
683
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
649
684
 
650
- ## [0.8.7] 2026-07-19
685
+ ## [0.8.7], 2026-07-19
651
686
 
652
687
  ### Added
653
- - **`site-postwrite-derivation-gate` hook** (`bin/`, registered PostToolUse·Write|Edit in `hooks/hooks.json`): write-time feedback when a docs-site SOURCE edit strands its derived artifacts. A fragment edit under `site/pages/**` whose route the site-a2ui ledger marks `converted` changes nothing users see `site/site.js` keeps serving the now-stale `site-a2ui/pages/<slug>.a2ui.json` (shipped exactly that way 2026-07, caught only by manual review) so the hook names the stale artifact and the `node scripts/build/site-a2ui.mjs --page <route>` regeneration; `site/sitemap.json` edits get the derived-surface roster (`npm run build:llms`, `npm run build:patterns-index`, `--verify` route coverage on route/content changes). Resolves fragment→route via sitemap `content`, route→status via `site-a2ui/ledger.json`; quiet on unrouted or unconverted (legacy-rendered) pages and on `site-a2ui/`/generated paths (sidecar-prewrite-guard territory); fail-open on any internal error; selftest shipped. The hard repo-wide gate is the site-a2ui verify wired separately.
688
+ - **`site-postwrite-derivation-gate` hook** (`bin/`, registered PostToolUse·Write|Edit in `hooks/hooks.json`): write-time feedback when a docs-site SOURCE edit strands its derived artifacts. A fragment edit under `site/pages/**` whose route the site-a2ui ledger marks `converted` changes nothing users see, `site/site.js` keeps serving the now-stale `site-a2ui/pages/<slug>.a2ui.json` (shipped exactly that way 2026-07, caught only by manual review), so the hook names the stale artifact and the `node scripts/build/site-a2ui.mjs --page <route>` regeneration; `site/sitemap.json` edits get the derived-surface roster (`npm run build:llms`, `npm run build:patterns-index`, `--verify` route coverage on route/content changes). Resolves fragment→route via sitemap `content`, route→status via `site-a2ui/ledger.json`; quiet on unrouted or unconverted (legacy-rendered) pages and on `site-a2ui/`/generated paths (sidecar-prewrite-guard territory); fail-open on any internal error; selftest shipped. The hard repo-wide gate is the site-a2ui verify wired separately.
654
689
 
655
690
  ### Changed
656
- - **`bin/sidecar-prewrite-guard`** (PreToolUse deny hook) extended the GENERATED-artifact allowlist to the new patterns/templates index (`site/patterns-index.json`, `site/pages/patterns/index.html`, `adia-patterns/references/pattern-index.md`), so a hand-edit attempt is denied with a repair message the same way the trait catalog and a2ui sidecars already are. Selftest extended with matching/non-matching cases (annotations.yaml stays editable).
657
- - **`skills/demo-audit/SKILL.md`, `references/visual-probe-triage.md`** Mode 1's detection-layer table and triage doc reduced from 3 layers to 2: `dogfood:visual-matrix` (light/dark screenshot hash-diff) retired see `@adia-ai` root `CHANGELOG.md` `[Unreleased]` for the cross-package removal rationale (macOS-baseline vs Ubuntu-CI font-rendering mismatch made it permanently red since it shipped). `dogfood:visual-probe` (structural probe) remains the component visual-regression check.
658
- - **Agent cross-references re-keyed** (`agents/routing-corpus.json`, `references/contracts/a2ui-mcp-surface.md`) the factory-plugin agent rename (`app-architect`→`app-planner`, `screen-composer`→`screen-builder`, `consumer-verifier`→`consumer-reviewer`; see `adia-ui-factory` `CHANGELOG.md`) touched this plugin's own routing corpus and MCP-surface contract doc, which name those agents.
659
- - **A2UI/GenUI terminology detangle** (`agents/framework-reviewer.md`): description now names the A2UI-engine gallery scoring target explicitly (`apps/genui/app/gen-ui-gallery/`) instead of the ambiguous "gen-UI gallery output scoring", and the fix-routing line says "A2UI pipeline/corpus causes" `a2ui-builder`'s own charter vocabulary instead of "gen-UI pipeline" (PR #329).
691
+ - **`bin/sidecar-prewrite-guard`** (PreToolUse deny hook), extended the GENERATED-artifact allowlist to the new patterns/templates index (`site/patterns-index.json`, `site/pages/patterns/index.html`, `adia-patterns/references/pattern-index.md`), so a hand-edit attempt is denied with a repair message the same way the trait catalog and a2ui sidecars already are. Selftest extended with matching/non-matching cases (annotations.yaml stays editable).
692
+ - **`skills/demo-audit/SKILL.md`, `references/visual-probe-triage.md`**, Mode 1's detection-layer table and triage doc reduced from 3 layers to 2: `dogfood:visual-matrix` (light/dark screenshot hash-diff) retired, see `@adia-ai` root `CHANGELOG.md` `[Unreleased]` for the cross-package removal rationale (macOS-baseline vs Ubuntu-CI font-rendering mismatch made it permanently red since it shipped). `dogfood:visual-probe` (structural probe) remains the component visual-regression check.
693
+ - **Agent cross-references re-keyed** (`agents/routing-corpus.json`, `references/contracts/a2ui-mcp-surface.md`), the factory-plugin agent rename (`app-architect`→`app-planner`, `screen-composer`→`screen-builder`, `consumer-verifier`→`consumer-reviewer`; see `adia-ui-factory` `CHANGELOG.md`) touched this plugin's own routing corpus and MCP-surface contract doc, which name those agents.
694
+ - **A2UI/GenUI terminology detangle** (`agents/framework-reviewer.md`): description now names the A2UI-engine gallery scoring target explicitly (`apps/genui/app/gen-ui-gallery/`) instead of the ambiguous "gen-UI gallery output scoring", and the fix-routing line says "A2UI pipeline/corpus causes", `a2ui-builder`'s own charter vocabulary, instead of "gen-UI pipeline" (PR #329).
660
695
 
661
696
  ### Maintenance
662
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
697
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
663
698
 
664
- ## [0.8.6] 2026-07-18
699
+ ## [0.8.6], 2026-07-18
665
700
 
666
701
  ### Changed
667
- - **`adia-release` moves to the single-authorization model** (`skills/package-release/SKILL.md`, `references/{cut-procedure,changelog-discipline,independent-package-release}.md`, `scripts/release-pack.mjs`, `agents/release-engineer.md`; operator ruling 2026-07-17): the operator's initiating instruction covers the entire cycle (tag → push → publish → deploy dispatch); the 4-checkpoint per-step sign-off ceremony and the consent-relay doctrine are retired the v0.8.5 cut spent ~40 minutes on approval relays that produced zero safety while every real protection (release-pretag-docs-gate hook, pre-push F-N1 trip-wire, one-tag-per-push, registry verify) fired deterministically. Releases run INLINE in the operator's session; `release-engineer` is refocused as the unattended seat (scheduled/batch/CI) where the dispatch carries the authorization, with an explicit serial-seat rule (a resumed dispatch continues the same cut, never forks a parallel worker 3 raced the v0.8.5 worktree). New `release-pack.mjs --go` flag auto-confirms all checkpoints; evidence blocks still print as the audit log; the F-N1 error hard-stop and warn-blocks-auto-confirm rules remain non-skippable.
668
- - **F-N1 coverage mechanized at cut time** (`scripts/release/check-release.mjs --pending-version X.Y.Z [--fix]`, repo-side; wired into `release-pack.mjs` cut modes as Step 4f): the authoritative matcher same `changelogMentions` patterns, all 11 packages now runs pre-PR against the working tree and `--fix` auto-appends `### Maintenance` bullets it re-verifies against its own matcher before writing. Kills the post-tag enrichment retag loop (v0.8.5: 3 enrichment PRs + 3 delete/retag rounds, caused by hand-authored prose that read correctly but lacked the literal substrings, and by the drifted 9-package `check-changelog-coverage.mjs` now marked superseded for cut-time use). Selftest extended with the section-finder, bullet-generator, and append fixtures including the `.claude-plugin` leading-dot case.
669
- - **Release-script permission allowlist** (`.claude/settings.json`): the bundled release scripts + `git tag` are allowlisted so the executing session isn't hard-blocked mid-cut by the permission classifier (bit the v0.8.5 checkpoint 1 the agent was denied even a `--dry` run). `git push` deliberately stays under the normal permission flow.
670
- - **gh#268 modernization campaign, W0–W3** (PRs #312, #313, #317): the retried 5-auditor deep sweep's findings applied across the whole plugin. `agents/` renamed to the registered role vocabulary `a2ui-engineer`→`a2ui-builder`, `release-engineer`→`release-builder`, `framework-verifier`→`framework-reviewer` with every live cross-reference re-keyed (routing corpora both plugins, README, skill bodies) and per-agent sidecar corpora checked in. All 9 `skills/` gained a `routing_eval.py`-schema routing corpus with a measured `_measured` block; descriptions rewrote to the trigger vocabulary the tool named; content-currency fixes landed in adia-llm-internals (stale key-fallback/stopReason/stub claims), adia-gen-review (5 missing TAG_TO_COMPONENT tags coverage 140/140 exit-gate claim made honest, 2 cause codes routed), adia-site-docs (stale TKT-0011 claim, named critic), adia-a2ui (stale count, rotted line anchors → grep anchors, new Pipeline Change Record), adia-dogfood (severity twin aligned to the enforcing script, AskUserQuestion escalation template), adia-author (yaml-SoT Step 4b `yaml-contract.md` was reachable from nothing real 9-file anatomy in the worked example, @adia-ai/llm territory ceded to adia-llm-internals), adia-release (Cut Record output contract, 11-package stub text, honest selftest count), adia-deploy (real Deploy Record example replacing a placeholder, live-verified environment-gate status), adia-ssr (gh#284/#288 resync to the shipped fixes). `commands/release.md` no longer teaches the retired per-step sign-off model. `README.md` skills table 7→9 + version footer; `cut-procedure.md` gains §Plugin cache (content merged between lockstep cuts is cache-invisible until the next bump).
702
+ - **`adia-release` moves to the single-authorization model** (`skills/package-release/SKILL.md`, `references/{cut-procedure,changelog-discipline,independent-package-release}.md`, `scripts/release-pack.mjs`, `agents/release-engineer.md`; operator ruling 2026-07-17): the operator's initiating instruction covers the entire cycle (tag → push → publish → deploy dispatch); the 4-checkpoint per-step sign-off ceremony and the consent-relay doctrine are retired, the v0.8.5 cut spent ~40 minutes on approval relays that produced zero safety while every real protection (release-pretag-docs-gate hook, pre-push F-N1 trip-wire, one-tag-per-push, registry verify) fired deterministically. Releases run INLINE in the operator's session; `release-engineer` is refocused as the unattended seat (scheduled/batch/CI) where the dispatch carries the authorization, with an explicit serial-seat rule (a resumed dispatch continues the same cut, never forks a parallel worker, 3 raced the v0.8.5 worktree). New `release-pack.mjs --go` flag auto-confirms all checkpoints; evidence blocks still print as the audit log; the F-N1 error hard-stop and warn-blocks-auto-confirm rules remain non-skippable.
703
+ - **F-N1 coverage mechanized at cut time** (`scripts/release/check-release.mjs --pending-version X.Y.Z [--fix]`, repo-side; wired into `release-pack.mjs` cut modes as Step 4f): the authoritative matcher, same `changelogMentions` patterns, all 11 packages, now runs pre-PR against the working tree and `--fix` auto-appends `### Maintenance` bullets it re-verifies against its own matcher before writing. Kills the post-tag enrichment retag loop (v0.8.5: 3 enrichment PRs + 3 delete/retag rounds, caused by hand-authored prose that read correctly but lacked the literal substrings, and by the drifted 9-package `check-changelog-coverage.mjs`, now marked superseded for cut-time use). Selftest extended with the section-finder, bullet-generator, and append fixtures including the `.claude-plugin` leading-dot case.
704
+ - **Release-script permission allowlist** (`.claude/settings.json`): the bundled release scripts + `git tag` are allowlisted so the executing session isn't hard-blocked mid-cut by the permission classifier (bit the v0.8.5 checkpoint 1: the agent was denied even a `--dry` run). `git push` deliberately stays under the normal permission flow.
705
+ - **gh#268 modernization campaign, W0–W3** (PRs #312, #313, #317): the retried 5-auditor deep sweep's findings applied across the whole plugin. `agents/` renamed to the registered role vocabulary, `a2ui-engineer`→`a2ui-builder`, `release-engineer`→`release-builder`, `framework-verifier`→`framework-reviewer`, with every live cross-reference re-keyed (routing corpora both plugins, README, skill bodies) and per-agent sidecar corpora checked in. All 9 `skills/` gained a `routing_eval.py`-schema routing corpus with a measured `_measured` block; descriptions rewrote to the trigger vocabulary the tool named; content-currency fixes landed in adia-llm-internals (stale key-fallback/stopReason/stub claims), adia-gen-review (5 missing TAG_TO_COMPONENT tags, coverage 140/140, exit-gate claim made honest, 2 cause codes routed), adia-site-docs (stale TKT-0011 claim, named critic), adia-a2ui (stale count, rotted line anchors → grep anchors, new Pipeline Change Record), adia-dogfood (severity twin aligned to the enforcing script, AskUserQuestion escalation template), adia-author (yaml-SoT Step 4b, `yaml-contract.md` was reachable from nothing, real 9-file anatomy in the worked example, @adia-ai/llm territory ceded to adia-llm-internals), adia-release (Cut Record output contract, 11-package stub text, honest selftest count), adia-deploy (real Deploy Record example replacing a placeholder, live-verified environment-gate status), adia-ssr (gh#284/#288 resync to the shipped fixes). `commands/release.md` no longer teaches the retired per-step sign-off model. `README.md` skills table 7→9 + version footer; `cut-procedure.md` gains §Plugin cache (content merged between lockstep cuts is cache-invisible until the next bump).
671
706
 
672
707
  ### Maintenance
673
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
708
+ - **`.claude-plugin/plugin.json` version bump**, moves in lockstep with package.json (the `/plugin update` cache key).
674
709
 
675
- ## [0.8.5] 2026-07-17
710
+ ## [0.8.5], 2026-07-17
676
711
 
677
712
  ### Fixed
678
- - **`adia-ssr` skill's gh#284 status corrected narrowed, not fixed, not open** (`skills/ssr-compatibility/`, 2026-07-17): verified against 0.8.4 that every component named in the issue (`nav-ui`, `admin-shell`, `admin-sidebar`, `text-ui`, `badge-ui`, `avatar-ui`) has `static template = () => null`, so `connectedCallback`'s destructive `stamp()` never runs against their light-DOM children a framework-wide survey (150 components) found every component WITH a non-null template derives content from properties only, never light-DOM children. Zero shipped components are exposed to the originally-reported symptom. Rather than patching `stamp()`/`connectedCallback` (rejected as disproportionate changes every primitive's render lifecycle for a currently-zero-instance risk), shipped a forward-looking static audit, `scripts/dev/audit-template-child-conflict.mjs` (in `@adia-ai/web-components`, wired into `adia-author`'s structural-gate sequence), that flags a FUTURE component reintroducing the conflict shape. `SKILL.md`'s worked example, `references/failure-shapes.md` §2, `references/guard-patterns.md` §2, `references/status-ledger.md`, and `references/consumer-workarounds.md` all updated the worked example previously answered "yes, known issue" for the exact `<text-ui>` case that no longer reproduces, which would have misled a future consult.
713
+ - **`adia-ssr` skill's gh#284 status corrected, narrowed, not fixed, not open** (`skills/ssr-compatibility/`, 2026-07-17): verified against 0.8.4 that every component named in the issue (`nav-ui`, `admin-shell`, `admin-sidebar`, `text-ui`, `badge-ui`, `avatar-ui`) has `static template = () => null`, so `connectedCallback`'s destructive `stamp()` never runs against their light-DOM children, a framework-wide survey (150 components) found every component WITH a non-null template derives content from properties only, never light-DOM children. Zero shipped components are exposed to the originally-reported symptom. Rather than patching `stamp()`/`connectedCallback` (rejected as disproportionate, changes every primitive's render lifecycle for a currently-zero-instance risk), shipped a forward-looking static audit, `scripts/dev/audit-template-child-conflict.mjs` (in `@adia-ai/web-components`, wired into `adia-author`'s structural-gate sequence), that flags a FUTURE component reintroducing the conflict shape. `SKILL.md`'s worked example, `references/failure-shapes.md` §2, `references/guard-patterns.md` §2, `references/status-ledger.md`, and `references/consumer-workarounds.md` all updated, the worked example previously answered "yes, known issue" for the exact `<text-ui>` case that no longer reproduces, which would have misled a future consult.
679
714
 
680
715
  ### Added
681
- - **`adia-ssr` knowledge skill** (`skills/ssr-compatibility/`: `SKILL.md`, `references/{failure-shapes,guard-patterns,consumer-workarounds,status-ledger,test-without-linkedom}.md`, `evals/{routing-corpus.json,audit-report.md}`; PR #293): NEW consumer-facing skill answering SSR-support questions for AdiaUI the gh#284 narrowing above is this skill's flagship finding, corrected before the skill's first ship rather than after.
682
- - **gh#268 campaign W1+W2 (forge estate)** adia-release periphery surgery (`skills/package-release/scripts/{promote-unreleased,bump,tag-lockstep,insert-stub,release-pack,dispatch-publish}.mjs`, `references/cut-procedure.md`: promote-unreleased in cut mode + the unpromoted-[Unreleased] guard; --yes scoped to checkpoint 1 with dedicated --push/--publish; evidence-first reordered checkpoints; site deploy via workflow dispatch, raw rsync gone; --mode batch hard-rejects; the 17-gate roster data-driven from `scripts/gate-roster.mjs`; retired --amend teachings replaced with the PR→retag flow); selftests on all 6 release scripts + check-release + the embeddings gate (content-hash freshness) (`skills/package-release/evals/evals.json`), wired into CI; adia-author's fictional `Adia*` grammar (24 occurrences) and nonexistent-token worked example corrected to the real `UI*`/token surface (`skills/primitive-authoring/references/{anti-patterns,worked-example,api-contract,authoring-cycle,code-style,lifecycle-patterns,token-contract,yaml-contract}.md`); adia-a2ui's corpus manifest now written by the harvest + gated, eval floors re-grounded to their gate scripts, reserved engine list corrected (also in AGENTS.md) (`skills/a2ui-maintenance/SKILL.md`, `references/pipeline-overview.md`); adia-dogfood scope reconciled with its aggregator (Mode 7) and the perl -i auto-fix rows made BUILDER-ONLY with the framework-verifier seat's mutating-Bash prohibition (generator≠critic) (`skills/demo-audit/SKILL.md`, `agents/framework-verifier.md`); typed records (Dogfood Findings, Gen-Review Scorecard, Deploy Record) + the deploy-freshness cadence rule (`skills/{adia-dogfood,adia-gen-review,adia-deploy}/SKILL.md`); routing/eval corpora for release, deploy, dogfood, gen-review, llm-internals (`skills/{adia-release,adia-deploy,adia-dogfood,adia-gen-review,adia-llm-internals}/evals/routing-corpus.json`).
683
- - **`release-pretag-docs-gate` hook** (`bin/`, registered PreToolUse·Bash in `hooks/hooks.json`): denies irreversible release commands (tag-lockstep without `--delete`, release-tag pushes, `dispatch-publish`, `release-pack --mode handoff`) until the repo's `scripts/release/check-release-docs.mjs` passes every lockstep CHANGELOG carries the version's section with no leftover `[Unreleased]` content, entry READMEs exist, and the generated team notes (`docs/releases/vX.Y.Z.md`) are present. Quiet outside the monorepo and on reversible commands; selftest shipped. Born from the v0.8.4 near-miss (tarballs shipped with unpromoted CHANGELOG headers). `skills/package-release` cut procedure gains Step 4e (docs review + notes generation) accordingly.
716
+ - **`adia-ssr` knowledge skill** (`skills/ssr-compatibility/`: `SKILL.md`, `references/{failure-shapes,guard-patterns,consumer-workarounds,status-ledger,test-without-linkedom}.md`, `evals/{routing-corpus.json,audit-report.md}`; PR #293): NEW consumer-facing skill answering SSR-support questions for AdiaUI: the gh#284 narrowing above is this skill's flagship finding, corrected before the skill's first ship rather than after.
717
+ - **gh#268 campaign W1+W2 (forge estate)**, adia-release periphery surgery (`skills/package-release/scripts/{promote-unreleased,bump,tag-lockstep,insert-stub,release-pack,dispatch-publish}.mjs`, `references/cut-procedure.md`: promote-unreleased in cut mode + the unpromoted-[Unreleased] guard; --yes scoped to checkpoint 1 with dedicated --push/--publish; evidence-first reordered checkpoints; site deploy via workflow dispatch, raw rsync gone; --mode batch hard-rejects; the 17-gate roster data-driven from `scripts/gate-roster.mjs`; retired --amend teachings replaced with the PR→retag flow); selftests on all 6 release scripts + check-release + the embeddings gate (content-hash freshness) (`skills/package-release/evals/evals.json`), wired into CI; adia-author's fictional `Adia*` grammar (24 occurrences) and nonexistent-token worked example corrected to the real `UI*`/token surface (`skills/primitive-authoring/references/{anti-patterns,worked-example,api-contract,authoring-cycle,code-style,lifecycle-patterns,token-contract,yaml-contract}.md`); adia-a2ui's corpus manifest now written by the harvest + gated, eval floors re-grounded to their gate scripts, reserved engine list corrected (also in AGENTS.md) (`skills/a2ui-maintenance/SKILL.md`, `references/pipeline-overview.md`); adia-dogfood scope reconciled with its aggregator (Mode 7) and the perl -i auto-fix rows made BUILDER-ONLY with the framework-verifier seat's mutating-Bash prohibition (generator≠critic) (`skills/demo-audit/SKILL.md`, `agents/framework-verifier.md`); typed records (Dogfood Findings, Gen-Review Scorecard, Deploy Record) + the deploy-freshness cadence rule (`skills/{adia-dogfood,adia-gen-review,adia-deploy}/SKILL.md`); routing/eval corpora for release, deploy, dogfood, gen-review, llm-internals (`skills/{adia-release,adia-deploy,adia-dogfood,adia-gen-review,adia-llm-internals}/evals/routing-corpus.json`).
718
+ - **`release-pretag-docs-gate` hook** (`bin/`, registered PreToolUse·Bash in `hooks/hooks.json`): denies irreversible release commands (tag-lockstep without `--delete`, release-tag pushes, `dispatch-publish`, `release-pack --mode handoff`) until the repo's `scripts/release/check-release-docs.mjs` passes, every lockstep CHANGELOG carries the version's section with no leftover `[Unreleased]` content, entry READMEs exist, and the generated team notes (`docs/releases/vX.Y.Z.md`) are present. Quiet outside the monorepo and on reversible commands; selftest shipped. Born from the v0.8.4 near-miss (tarballs shipped with unpromoted CHANGELOG headers). `skills/package-release` cut procedure gains Step 4e (docs review + notes generation) accordingly.
684
719
 
685
720
  ### Maintenance
686
721
  - **Lockstep version bump** (`.claude-plugin/plugin.json` version field, 0.8.4 → 0.8.5).
687
722
 
688
723
 
689
- ## [0.8.4] 2026-07-16
724
+ ## [0.8.4], 2026-07-16
690
725
 
691
726
  ### Changed
692
727
  - **`adia-llm-internals` references re-synced to the shipped fixes** (`skills/llm-client-maintenance/references/`, `.claude-plugin/plugin.json` version): `bridge-facade.md` documents the new provider-resolution precedence (model id outranks env detection, `detectProviderFromModel`), `browser-proxy-boundary.md` documents origin-only passthrough URL swapping + the provider-prefix proxy map, `adapter-contract.md`/`model-registry.md`/`add-a-provider.md` carry the gemini raw-stopReason and keys-must-match-registry invariants.
693
728
 
694
- ## [0.8.3] 2026-07-16
729
+ ## [0.8.3], 2026-07-16
695
730
 
696
731
  ### Fixed
697
- - **`skills/package-release` reconciled with invariant 3** (release commits land via PR): `scripts/release-pack.mjs` is now two-phase the cut modes STOP at the release commit; `--mode handoff` runs tag→publish→deploy from post-merge main; `git push origin main` is gone from the flow. Also fixed a latent Step-5 staging bug (the plugins mapped to wrong paths; both `plugin.json` files + the factory `.mcp.json` were never staged an orchestrated cut would have committed an incomplete release).
732
+ - **`skills/package-release` reconciled with invariant 3** (release commits land via PR): `scripts/release-pack.mjs` is now two-phase, the cut modes STOP at the release commit; `--mode handoff` runs tag→publish→deploy from post-merge main; `git push origin main` is gone from the flow. Also fixed a latent Step-5 staging bug (the plugins mapped to wrong paths; both `plugin.json` files + the factory `.mcp.json` were never staged, an orchestrated cut would have committed an incomplete release).
698
733
  - **`commands/release.md` + `agents/release-engineer.md`**: the retired "9-package lockstep + independent plugins" framing → the 11-package reality.
699
- - **Skill descriptions language-passed** (`skills/a2ui-maintenance` 499→325 chars the estate's last listing-budget warn plus gen-review/llm-internals/release): canonical "Use when…" trigger form, no fence lost. `check:skills` now reports 0 errors, 0 warns estate-wide.
734
+ - **Skill descriptions language-passed** (`skills/a2ui-maintenance` 499→325 chars, the estate's last listing-budget warn, plus gen-review/llm-internals/release): canonical "Use when…" trigger form, no fence lost. `check:skills` now reports 0 errors, 0 warns estate-wide.
700
735
 
701
736
  ### Maintenance
702
737
  - `packages/plugins/adia-ui-forge/.claude-plugin/plugin.json` moves in lockstep (the `/plugin update` cache key).
703
- ## [0.8.2] 2026-07-16
738
+ ## [0.8.2], 2026-07-16
704
739
 
705
740
  ### Maintenance
706
- - **Lockstep version bump only** (`packages/plugins/adia-ui-forge/.claude-plugin/plugin.json` moves with package.json the `/plugin update` cache key). No source changes this cut; the v0.8.2 substance is the sibling adia-ui-factory's modernization campaign (gh#259) and @adia-ai/web-components' button-ellipsis fix.
707
- ## [0.8.1] 2026-07-15
741
+ - **Lockstep version bump only** (`packages/plugins/adia-ui-forge/.claude-plugin/plugin.json` moves with package.json, the `/plugin update` cache key). No source changes this cut; the v0.8.2 substance is the sibling adia-ui-factory's modernization campaign (gh#259) and @adia-ai/web-components' button-ellipsis fix.
742
+ ## [0.8.1], 2026-07-15
708
743
 
709
744
  ### Fixed
710
- - **`skills/package-release`: fail-closed registry verification.** `release-pack.mjs` Step 9 now compares every package's published version AND `dist-tags.latest` against the cut version and aborts before GH releases/deploy on any miss (was print-only with suppressed npm errors a missing or stale package sailed through).
711
- - **`skills/package-release`: stale 9/10-package references swept to 11/12.** `release-pack.mjs`'s own `PACKAGES` array was still 9 entries a cut run through the orchestrator would have left the 2 plugins behind, the exact drift the 2026-07-15 lockstep-join closes. Plus SKILL.md verify targets + description, gates-catalog, notes templates, and the tag/dispatch checkpoint strings (10→12 tags, 9→11 publishes).
745
+ - **`skills/package-release`: fail-closed registry verification.** `release-pack.mjs` Step 9 now compares every package's published version AND `dist-tags.latest` against the cut version and aborts before GH releases/deploy on any miss (was print-only with suppressed npm errors, a missing or stale package sailed through).
746
+ - **`skills/package-release`: stale 9/10-package references swept to 11/12.** `release-pack.mjs`'s own `PACKAGES` array was still 9 entries, a cut run through the orchestrator would have left the 2 plugins behind, the exact drift the 2026-07-15 lockstep-join closes. Plus SKILL.md verify targets + description, gates-catalog, notes templates, and the tag/dispatch checkpoint strings (10→12 tags, 9→11 publishes).
712
747
 
713
748
  ### Maintenance
714
749
  - **`packages/plugins/adia-ui-forge/.claude-plugin/plugin.json` version → 0.8.1** in lockstep with package.json (the `/plugin update` cache key).
715
750
 
716
- ## [0.8.0] 2026-07-15
751
+ ## [0.8.0], 2026-07-15
717
752
 
718
- ### Changed joins the @adia-ai lockstep (policy change, operator ruling 2026-07-15)
719
- - **Version jumps 0.1.0 → 0.8.0 to adopt the lockstep version line.** The plugins were class-B (independently versioned) which left npm serving the pre-harness-reset `adia-ui-forge@0.1.3` content while the repo's rewritten estate sat unpublished at a REGRESSED 0.1.0. Plugins now bump, tag, and publish with every lockstep cut (release-policy change in `scripts/release/check-lockstep.mjs` + the adia-release skill), so the shipped plugin can never silently drift from the framework it teaches.
720
- - **Token teachings updated for the v0.8.0 Material color-token adoption** `adia-author`'s SKILL + 6 references no longer teach the removed `--a-accent-*` vocabulary (swept to `--a-primary-*`); the stale "accent-fg resolves near-black" rationale corrected (post-adoption the on-color is fixed-light).
721
- - **npm consumers jumping from `adia-ui-forge@0.1.3`:** this version also delivers the full harness-reset estate rewrite documented under `[0.1.0]` below the `skills/`, `agents/`, `commands/`, `hooks/`, and `reviews/` trees were all replaced wholesale (design: `.claude/docs/specs/plugin-estate-v2.md`). Read `[0.1.0]` for that scope; `[0.8.0]` adds only the items above.
753
+ ### Changed, joins the @adia-ai lockstep (policy change, operator ruling 2026-07-15)
754
+ - **Version jumps 0.1.0 → 0.8.0 to adopt the lockstep version line.** The plugins were class-B (independently versioned), which left npm serving the pre-harness-reset `adia-ui-forge@0.1.3` content while the repo's rewritten estate sat unpublished at a REGRESSED 0.1.0. Plugins now bump, tag, and publish with every lockstep cut (release-policy change in `scripts/release/check-lockstep.mjs` + the adia-release skill), so the shipped plugin can never silently drift from the framework it teaches.
755
+ - **Token teachings updated for the v0.8.0 Material color-token adoption**, `adia-author`'s SKILL + 6 references no longer teach the removed `--a-accent-*` vocabulary (swept to `--a-primary-*`); the stale "accent-fg resolves near-black" rationale corrected (post-adoption the on-color is fixed-light).
756
+ - **npm consumers jumping from `adia-ui-forge@0.1.3`:** this version also delivers the full harness-reset estate rewrite documented under `[0.1.0]` below, the `skills/`, `agents/`, `commands/`, `hooks/`, and `reviews/` trees were all replaced wholesale (design: `.claude/docs/specs/plugin-estate-v2.md`). Read `[0.1.0]` for that scope; `[0.8.0]` adds only the items above.
722
757
 
723
- ## 0.1.0 2026-07-10
758
+ ## 0.1.0, 2026-07-10
724
759
 
725
760
  Initial cut, replacing `adia-ui-forge@0.1.3` (harness reset Phase 2; design:
726
761
  `.claude/docs/specs/plugin-estate-v2.md`).
@@ -731,10 +766,10 @@ Initial cut, replacing `adia-ui-forge@0.1.3` (harness reset Phase 2; design:
731
766
  `adia-llm-internals` (kills the cross-plugin name collision).
732
767
  - Estate-wide: §Teach/§SelfAudit/PEV meta-machinery deleted; both invocation
733
768
  dials explicit; descriptions ≤350 chars; canonical eval floors restored
734
- (zettel cov≥87 the source stated cov≥40).
769
+ (zettel cov≥87, the source stated cov≥40).
735
770
  - Agents 7 → 4 thin shells with `skills:` preloads (tech-lead, spec-architect,
736
771
  repo-steward retired with the multi-agent claim protocol).
737
772
  - Hooks 1 → 3: + `sidecar-prewrite-guard`, + `demo-postwrite-pattern-gate`
738
773
  (former prose rules, now enforced).
739
- - New `references/contracts/` producer↔consumer contract for the MIGRATION
774
+ - New `references/contracts/`, producer↔consumer contract for the MIGRATION
740
775
  GUIDE format + a2ui MCP surface (the 2026-06 red-team's strategic gap).