@adia-ai/adia-ui-forge 0.8.62 → 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 +300 -275
  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,31 @@
1
- # Changelog adia-ui-kit-forge
1
+ # Changelog, adia-ui-kit-forge
2
2
 
3
- ## [0.8.62] — 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
4
29
 
5
30
  ### Changed
6
31
  - chore: .claude-plugin, .codex-plugin and plugin.yaml manifests stamped 0.8.62 with the lockstep bump; no skill or script change
@@ -10,7 +35,7 @@
10
35
  - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
11
36
  - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
12
37
 
13
- ## [0.8.61] 2026-09-10
38
+ ## [0.8.61], 2026-09-10
14
39
 
15
40
  ### Changed
16
41
 
@@ -50,7 +75,7 @@
50
75
  - **`.claude-plugin/plugin.json` version bump**: moves in lockstep with package.json (the `/plugin update` cache key).
51
76
  - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`): carried by the entries above.
52
77
 
53
- ## [0.8.60] 2026-09-06
78
+ ## [0.8.60], 2026-09-06
54
79
 
55
80
  ### Changed
56
81
 
@@ -72,46 +97,46 @@
72
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)
73
98
 
74
99
  ### Maintenance
75
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
76
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
77
- - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`) carried by the entries above.
78
- - **`scripts/` touched in this release window** (1 file(s), e.g. `scripts/lint-rules.generated.mjs`) carried by the entries above.
79
- - **`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.
80
105
 
81
- ## [0.8.59] 2026-09-04
106
+ ## [0.8.59], 2026-09-04
82
107
 
83
108
  ### Added
84
- - **`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.
85
110
 
86
111
  ### Fixed
87
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.
88
- - 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)
89
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)
90
115
 
91
116
  ### Added
92
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.
93
- - **`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).
94
119
 
95
120
  ### Changed
96
- - **`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).
97
- - **`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).
98
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`.
99
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).
100
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)
101
- - 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)
102
127
 
103
128
  ### Docs
104
129
 
105
- - 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)
106
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)
107
132
  - docs: repair stale check:component-md-fresh PR-blocking claims in component-md-authoring skill (gh#3223) (#3226)
108
133
 
109
134
  ### Maintenance
110
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
111
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
112
- - **`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.
113
138
 
114
- ## [0.8.58] 2026-09-02
139
+ ## [0.8.58], 2026-09-02
115
140
  ### Fixed
116
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.
117
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.
@@ -138,35 +163,35 @@
138
163
  - **Author email in `package.json` updated to `kim.granlund@adia.ai`** (was a stale personal address).
139
164
 
140
165
  ### Maintenance
141
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
142
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
143
- - **`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.
144
169
 
145
- ## [0.8.57] 2026-09-01
170
+ ## [0.8.57], 2026-09-01
146
171
 
147
172
  ### Removed
148
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.
149
174
 
150
175
  ### Fixed
151
- - **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`.
152
177
 
153
178
  ### Changed
154
- - **`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`).
155
180
 
156
181
  ### Maintenance
157
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
158
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
159
- - **`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.
160
185
 
161
- ## [0.8.56] 2026-08-31
186
+ ## [0.8.56], 2026-08-31
162
187
 
163
188
  ### Added
164
- - **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.
165
- - **`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.
166
- - **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.
167
192
 
168
193
  ### Fixed
169
- - **`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.
170
195
 
171
196
  ### Changed
172
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.
@@ -175,67 +200,67 @@
175
200
  - **`HARNESS-NOTES.md`** pointer for non-Claude harnesses (gh#2449).
176
201
 
177
202
  ### Fixed
178
- - **`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`.
179
204
 
180
205
  ### Maintenance
181
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
182
- - **`.codex-plugin/` touched in this release window** (1 file(s), e.g. `.codex-plugin/plugin.json`) carried by the entries above.
183
- - **`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.
184
209
 
185
- ## [0.8.55] 2026-08-28
210
+ ## [0.8.55], 2026-08-28
186
211
 
187
212
  ### Changed
188
- - **`.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).
189
214
 
190
215
  ### Maintenance
191
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.
192
- - **`.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).
193
218
 
194
- ## [0.8.54] 2026-08-27
219
+ ## [0.8.54], 2026-08-27
195
220
 
196
221
  ### Fixed
197
- - **`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.
198
- - **`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`).
199
224
 
200
225
  ### Docs
201
- - **`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`.
202
- - **`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`.
203
- - **`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`.
204
- - **`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`.
205
- - **`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`.
206
231
 
207
232
  ### Maintenance
208
- - **`.claude-plugin/plugin.json` version bump only** moves in lockstep with package.json (the `/plugin update` cache key).
209
- - **`.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.
210
235
 
211
- ## [0.8.53] 2026-08-26
236
+ ## [0.8.53], 2026-08-26
212
237
 
213
238
  ### Changed
214
- - **`.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`.
215
240
 
216
241
  ### Maintenance
217
- - **`.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.
218
243
 
219
- ## [0.8.52] 2026-08-25
244
+ ## [0.8.52], 2026-08-25
220
245
 
221
246
  ### Added
222
- - **`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.
223
248
 
224
249
  ### Changed
225
- - **`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).
226
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.
227
252
 
228
253
  ### Fixed
229
- - **`__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).**
230
255
 
231
256
  ### Maintenance
232
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
233
- - **`.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.
234
259
 
235
- ## [0.8.51] 2026-08-24
260
+ ## [0.8.51], 2026-08-24
236
261
 
237
262
  ### Added
238
- - Hermes + Pi external-distribution manifests (gh#1954) `plugin.yaml` +
263
+ - Hermes + Pi external-distribution manifests (gh#1954), `plugin.yaml` +
239
264
  `__init__.py` (Hermes) and `prompts/*.md` + a `"pi"` field in
240
265
  `package.json` (Pi), derived from `.claude-plugin/plugin.json` +
241
266
  `skills/` + `commands/` via `npm run build:harness-manifests`
@@ -244,42 +269,42 @@
244
269
  neither harness's MCP story applies to it.
245
270
 
246
271
  ### Maintenance
247
- - **`.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.
248
273
 
249
- ## [0.8.50] 2026-08-23
274
+ ## [0.8.50], 2026-08-23
250
275
 
251
276
  ### Maintenance
252
- - **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.
253
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
254
- - **`.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.
255
280
 
256
281
  ### Fixed
257
- - **`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.
258
283
 
259
- ## [0.8.48] 2026-08-23
284
+ ## [0.8.48], 2026-08-23
260
285
 
261
286
  ### Added
262
- - OpenAI Codex plugin manifest (gh#1888) `.codex-plugin/plugin.json` +
287
+ - OpenAI Codex plugin manifest (gh#1888), `.codex-plugin/plugin.json` +
263
288
  a per-skill `skills/<name>/agents/openai.yaml`, derived from
264
289
  `.claude-plugin/plugin.json` via `npm run build:codex-manifests`
265
290
  (`check:codex-manifests-fresh` gates freshness). Additive: the Claude Code
266
291
  plugin surface is unchanged.
267
292
 
268
- ## [0.8.47] 2026-08-22
293
+ ## [0.8.47], 2026-08-22
269
294
 
270
295
  ### Maintenance
271
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.
272
- - **`.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).
273
298
 
274
- ## [0.8.46] 2026-08-22
299
+ ## [0.8.46], 2026-08-22
275
300
 
276
301
 
277
302
  ### Maintenance
278
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
279
- - **`agents/` touched in this release window** (4 file(s), e.g. `agents/demo-audit-agent.corpus.json`) carried by the entries above.
280
- - **`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.
281
306
 
282
- ## [0.8.45] 2026-08-20
307
+ ## [0.8.45], 2026-08-20
283
308
 
284
309
  ### Changed
285
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.
@@ -288,19 +313,19 @@
288
313
  `package-release` (was routing DEAD in the blind-judge sim). Closes #1731.
289
314
 
290
315
  ### Maintenance
291
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
292
- - **`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.
293
318
 
294
- ## [0.8.44] 2026-08-20
319
+ ## [0.8.44], 2026-08-20
295
320
 
296
321
  ### Maintenance
297
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.
298
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
299
- - **`agent-intents/` touched in this release window** (2 file(s), e.g. `agent-intents/framework-checker.intent.md`) carried by the entries above.
300
- - **`agents/` touched in this release window** (5 file(s), e.g. `agents/a2ui-maintenance-agent.md`) carried by the entries above.
301
- - **`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.
302
327
 
303
- ## [0.8.43] 2026-08-18
328
+ ## [0.8.43], 2026-08-18
304
329
 
305
330
  ### Changed
306
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).
@@ -308,66 +333,66 @@
308
333
  - token-selection references regenerated for the `--a-ui-bg-disabled` container-low retarget (gh#1596, #1599).
309
334
 
310
335
  ### Maintenance
311
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
312
- - **`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.
313
338
 
314
- ## [0.8.42] 2026-08-17
339
+ ## [0.8.42], 2026-08-17
315
340
 
316
341
  ### Maintenance
317
342
  - Knowledge packs harvest the ADR-0061..0070 ratifications (PR #1564: gen-ui-wiring + wave-coordination corpora); rename-wave W2 doc migration (PR #1567).
318
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
319
- - **`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.
320
345
 
321
- ## [0.8.41] 2026-08-17
346
+ ## [0.8.41], 2026-08-17
322
347
 
323
348
  ### Added
324
- - **`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.
325
- - **`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.
326
351
 
327
352
  ### Changed
328
- - **`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.
329
- - **`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.
330
- - **`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.
331
356
 
332
357
  ### Maintenance
333
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
334
- - **`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.
335
360
 
336
- ## [0.8.40] 2026-08-15
361
+ ## [0.8.40], 2026-08-15
337
362
 
338
363
  ### Maintenance
339
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.
340
- - **`.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).
341
366
 
342
- ## [0.8.39] 2026-08-15
367
+ ## [0.8.39], 2026-08-15
343
368
 
344
369
  ### Maintenance
345
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.
346
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
347
- - **`agent-intents/` touched in this release window** (3 file(s), e.g. `agent-intents/a2ui-planner-agent.intent.md`) carried by the entries above.
348
- - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-planner-agent.md`) carried by the entries above.
349
- - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`) carried by the entries above.
350
- - **`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.
351
376
 
352
- ## [0.8.38] 2026-08-15
377
+ ## [0.8.38], 2026-08-15
353
378
 
354
379
  ### Removed
355
- - **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).
356
381
 
357
382
  ### Changed
358
- - **`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.
359
384
 
360
385
  ### Maintenance
361
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
362
- - **`references/` touched in this release window** (1 file(s), e.g. `contracts/a2ui-mcp-surface.md`) carried by the entries above.
363
- - **`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.
364
389
 
365
- ## [0.8.37] 2026-08-14
390
+ ## [0.8.37], 2026-08-14
366
391
 
367
392
  ### Changed
368
- - **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/`).**
369
394
  `PACKAGE_ROSTER` gains `a2ui`, `gen-ui`, `gen-ui-mcp` and re-marks the six old
370
- 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
371
396
  migration cut, 11 after. `bump.mjs`'s invariant-8 pin pattern and
372
397
  `lockstep-checks.mjs`'s `MCP_PIN_RE` now match EITHER generation-MCP name so
373
398
  the P7 name flip is gate-clean in both directions. `cut-procedure.md` gains
@@ -377,360 +402,360 @@
377
402
  of the hand-typed list that had gone stale against ADR-0048.
378
403
 
379
404
  ### Fixed
380
- - **`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.
381
- - **`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.
382
407
 
383
408
  ### Maintenance
384
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
385
- - **`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.
386
411
 
387
- ## [0.8.36] 2026-08-13
412
+ ## [0.8.36], 2026-08-13
388
413
 
389
414
  ### Maintenance
390
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.
391
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
392
- - **`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.
393
418
 
394
- ## [0.8.35] 2026-08-13
419
+ ## [0.8.35], 2026-08-13
395
420
 
396
421
  ### Added
397
- - **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).
398
- - **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.
399
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).
400
425
 
401
426
  ### Fixed
402
427
  - **`pr-bridge` retries transient network failures and pushes a local-ahead branch instead of failing the cycle** (this window's release-tooling hardening).
403
- - **`promote-unreleased` is now truly idempotent** a re-run after a completed promotion no-ops instead of double-promoting.
404
- - **`forge-lint` strips comments before scanning and anchors its web-components/web-modules scope check** ends a false-positive class on commented-out imports.
405
- - **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.
406
431
 
407
432
  ### Maintenance
408
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
409
- - **`agents/` touched in this release window** (4 file(s), e.g. `agents/a2ui-builder.md`) carried by the entries above.
410
- - **`commands/` touched in this release window** (4 file(s), e.g. `commands/deploy.md`) carried by the entries above.
411
- - **`scripts/` touched in this release window** (2 file(s), e.g. `scripts/forge-lint`) carried by the entries above.
412
- - **`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.
413
438
 
414
- ## [0.8.34] 2026-08-11
439
+ ## [0.8.34], 2026-08-11
415
440
 
416
441
  ### Fixed
417
- - **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.
418
443
 
419
444
  ### Maintenance
420
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
421
- - **`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.
422
447
 
423
- ## [0.8.33] 2026-08-11
448
+ ## [0.8.33], 2026-08-11
424
449
 
425
450
  ### Fixed
426
- - **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.
427
- - **`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.
428
- - **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.
429
454
 
430
455
  ### Maintenance
431
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
432
- - **`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.
433
458
 
434
- ## [0.8.32] 2026-08-09
459
+ ## [0.8.32], 2026-08-09
435
460
 
436
461
  ### Fixed
437
- - **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).
438
- - **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.
439
- - **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.
440
465
 
441
466
  ### Maintenance
442
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
443
- - **`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.
444
469
 
445
- ## [0.8.31] 2026-08-07
470
+ ## [0.8.31], 2026-08-07
446
471
 
447
472
  ### Maintenance
448
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.
449
- - **`.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).
450
475
 
451
- ## [0.8.30] 2026-08-07
476
+ ## [0.8.30], 2026-08-07
452
477
 
453
478
  ### Maintenance
454
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.
455
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
456
- - **`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.
457
482
 
458
- ## [0.8.29] 2026-08-06
483
+ ## [0.8.29], 2026-08-06
459
484
 
460
485
  ### Maintenance
461
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.
462
- - **`.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).
463
488
 
464
- ## [0.8.28] 2026-08-05
489
+ ## [0.8.28], 2026-08-05
465
490
 
466
491
  ### Maintenance
467
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.
468
- - **`.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).
469
494
 
470
- ## [0.8.27] 2026-08-05
495
+ ## [0.8.27], 2026-08-05
471
496
 
472
497
  ### Changed
473
- - **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).
474
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.
475
500
 
476
501
  ### Maintenance
477
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
478
- - **`agents/` touched in this release window** (3 file(s), e.g. `agents/a2ui-builder.md`) carried by the entries above.
479
- - **`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.
480
505
 
481
- ## [0.8.26] 2026-08-05
506
+ ## [0.8.26], 2026-08-05
482
507
 
483
508
  ### Maintenance
484
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.
485
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
486
- - **`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.
487
512
 
488
- ## [0.8.25] 2026-07-31
513
+ ## [0.8.25], 2026-07-31
489
514
 
490
515
  ### Maintenance
491
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.
492
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
493
- - **`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.
494
519
 
495
- ## [0.8.24] 2026-07-30
520
+ ## [0.8.24], 2026-07-30
496
521
 
497
522
  ### Maintenance
498
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.
499
- - **`.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).
500
525
 
501
- ## [0.8.23] 2026-07-30
526
+ ## [0.8.23], 2026-07-30
502
527
 
503
528
  ### Changed
504
- - **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.
505
530
 
506
531
  ### Changed
507
- - **`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.
508
533
 
509
534
  ### 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/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.
512
537
 
513
- ## [0.8.22] 2026-07-29
538
+ ## [0.8.22], 2026-07-29
514
539
 
515
540
  ### Fixed
516
- - **`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.
517
- - **`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).
518
543
 
519
544
  ### Maintenance
520
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
521
- - **`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.
522
547
 
523
- ## [0.8.21] 2026-07-28
548
+ ## [0.8.21], 2026-07-28
524
549
 
525
550
  ### Fixed
526
- - **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).
527
552
 
528
- - **`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.
529
554
 
530
555
  ### Maintenance
531
- - **`.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).
532
557
 
533
- ## [0.8.20] 2026-07-28
558
+ ## [0.8.20], 2026-07-28
534
559
 
535
560
  ### Maintenance
536
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.
537
- - **`.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).
538
563
 
539
- ## [0.8.19] 2026-07-27
564
+ ## [0.8.19], 2026-07-27
540
565
 
541
566
  ### Fixed
542
- - **`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).
543
568
 
544
569
  ### Maintenance
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** (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.
547
572
 
548
- ## [0.8.18] 2026-07-27
573
+ ## [0.8.18], 2026-07-27
549
574
 
550
575
  ### Added
551
- - **`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.
552
577
 
553
578
  ### Maintenance
554
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
555
- - **`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.
556
581
 
557
- ## [0.8.17] 2026-07-27
582
+ ## [0.8.17], 2026-07-27
558
583
 
559
584
  ### Changed
560
- - **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).
561
586
 
562
587
  ### Maintenance
563
- - **`.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).
564
589
 
565
- ## [0.8.16] 2026-07-26
590
+ ## [0.8.16], 2026-07-26
566
591
 
567
592
  ### Fixed
568
- - **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/*`.
569
594
 
570
595
  ### Changed
571
- - **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.
572
597
 
573
598
  ### Maintenance
574
- - **`.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).
575
600
 
576
- ## [0.8.15] 2026-07-26
601
+ ## [0.8.15], 2026-07-26
577
602
 
578
603
  ### Maintenance
579
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.
580
- - **`.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).
581
606
 
582
- ## [0.8.14] 2026-07-25
607
+ ## [0.8.14], 2026-07-25
583
608
 
584
609
  ### Fixed
585
- - **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}`.
586
- - **`.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`.
587
- - **`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.
588
613
 
589
614
  ### Added
590
- - **`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.
591
616
 
592
617
  ### Maintenance
593
- - **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.
594
619
 
595
- ## [0.8.13] 2026-07-25
620
+ ## [0.8.13], 2026-07-25
596
621
 
597
622
  ### Maintenance
598
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.
599
- - **`.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).
600
625
 
601
- ## [0.8.12] 2026-07-24
626
+ ## [0.8.12], 2026-07-24
602
627
 
603
628
  ### Fixed
604
- - **`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.
605
630
 
606
631
  ### Maintenance
607
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
608
- - **`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.
609
634
 
610
- ## [0.8.11] 2026-07-23
635
+ ## [0.8.11], 2026-07-23
611
636
 
612
637
  ### Fixed
613
- - **`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.
614
- - **`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.
615
- - **`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.
616
- - **`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`.
617
- - **`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.
618
643
 
619
644
  ### Maintenance
620
- - **`.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).
621
646
 
622
- ## [0.8.10] 2026-07-20
647
+ ## [0.8.10], 2026-07-20
623
648
 
624
649
  ### Added
625
- - **`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).
626
651
 
627
652
  ### Fixed
628
- - **`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.
629
654
 
630
655
  ### Maintenance
631
- - **`.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).
632
657
 
633
- ## [0.8.9] 2026-07-19
658
+ ## [0.8.9], 2026-07-19
634
659
 
635
660
  ### Fixed
636
- - **`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.
637
- - **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.
638
- - **`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.
639
664
 
640
665
  ### Maintenance
641
- - **`.claude-plugin/plugin.json` version bump** moves in lockstep with package.json (the `/plugin update` cache key).
642
- - **`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.
643
668
 
644
- ## [0.8.8] 2026-07-19
669
+ ## [0.8.8], 2026-07-19
645
670
 
646
671
  ### Added
647
- - **`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.
648
673
 
649
674
  ### Changed
650
- - **`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.
651
- - **`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.
652
677
 
653
678
  ### Fixed
654
- - **`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).
655
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.
656
681
 
657
682
  ### Maintenance
658
- - **`.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).
659
684
 
660
- ## [0.8.7] 2026-07-19
685
+ ## [0.8.7], 2026-07-19
661
686
 
662
687
  ### Added
663
- - **`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.
664
689
 
665
690
  ### Changed
666
- - **`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).
667
- - **`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.
668
- - **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.
669
- - **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).
670
695
 
671
696
  ### Maintenance
672
- - **`.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).
673
698
 
674
- ## [0.8.6] 2026-07-18
699
+ ## [0.8.6], 2026-07-18
675
700
 
676
701
  ### Changed
677
- - **`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.
678
- - **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.
679
- - **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.
680
- - **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).
681
706
 
682
707
  ### Maintenance
683
- - **`.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).
684
709
 
685
- ## [0.8.5] 2026-07-17
710
+ ## [0.8.5], 2026-07-17
686
711
 
687
712
  ### Fixed
688
- - **`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.
689
714
 
690
715
  ### Added
691
- - **`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.
692
- - **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`).
693
- - **`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.
694
719
 
695
720
  ### Maintenance
696
721
  - **Lockstep version bump** (`.claude-plugin/plugin.json` version field, 0.8.4 → 0.8.5).
697
722
 
698
723
 
699
- ## [0.8.4] 2026-07-16
724
+ ## [0.8.4], 2026-07-16
700
725
 
701
726
  ### Changed
702
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.
703
728
 
704
- ## [0.8.3] 2026-07-16
729
+ ## [0.8.3], 2026-07-16
705
730
 
706
731
  ### Fixed
707
- - **`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).
708
733
  - **`commands/release.md` + `agents/release-engineer.md`**: the retired "9-package lockstep + independent plugins" framing → the 11-package reality.
709
- - **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.
710
735
 
711
736
  ### Maintenance
712
737
  - `packages/plugins/adia-ui-forge/.claude-plugin/plugin.json` moves in lockstep (the `/plugin update` cache key).
713
- ## [0.8.2] 2026-07-16
738
+ ## [0.8.2], 2026-07-16
714
739
 
715
740
  ### Maintenance
716
- - **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.
717
- ## [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
718
743
 
719
744
  ### Fixed
720
- - **`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).
721
- - **`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).
722
747
 
723
748
  ### Maintenance
724
749
  - **`packages/plugins/adia-ui-forge/.claude-plugin/plugin.json` version → 0.8.1** in lockstep with package.json (the `/plugin update` cache key).
725
750
 
726
- ## [0.8.0] 2026-07-15
751
+ ## [0.8.0], 2026-07-15
727
752
 
728
- ### Changed joins the @adia-ai lockstep (policy change, operator ruling 2026-07-15)
729
- - **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.
730
- - **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).
731
- - **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.
732
757
 
733
- ## 0.1.0 2026-07-10
758
+ ## 0.1.0, 2026-07-10
734
759
 
735
760
  Initial cut, replacing `adia-ui-forge@0.1.3` (harness reset Phase 2; design:
736
761
  `.claude/docs/specs/plugin-estate-v2.md`).
@@ -741,10 +766,10 @@ Initial cut, replacing `adia-ui-forge@0.1.3` (harness reset Phase 2; design:
741
766
  `adia-llm-internals` (kills the cross-plugin name collision).
742
767
  - Estate-wide: §Teach/§SelfAudit/PEV meta-machinery deleted; both invocation
743
768
  dials explicit; descriptions ≤350 chars; canonical eval floors restored
744
- (zettel cov≥87 the source stated cov≥40).
769
+ (zettel cov≥87, the source stated cov≥40).
745
770
  - Agents 7 → 4 thin shells with `skills:` preloads (tech-lead, spec-architect,
746
771
  repo-steward retired with the multi-agent claim protocol).
747
772
  - Hooks 1 → 3: + `sidecar-prewrite-guard`, + `demo-postwrite-pattern-gate`
748
773
  (former prose rules, now enforced).
749
- - New `references/contracts/` producer↔consumer contract for the MIGRATION
774
+ - New `references/contracts/`, producer↔consumer contract for the MIGRATION
750
775
  GUIDE format + a2ui MCP surface (the 2026-06 red-team's strategic gap).