@adia-ai/adia-ui-forge 0.1.3 → 0.8.1

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 (259) hide show
  1. package/.claude-plugin/plugin.json +4 -7
  2. package/CHANGELOG.md +35 -34
  3. package/README.md +35 -40
  4. package/agents/a2ui-engineer.md +22 -53
  5. package/agents/component-author.md +29 -0
  6. package/agents/framework-verifier.md +26 -0
  7. package/agents/release-engineer.md +21 -81
  8. package/agents/routing-corpus.json +293 -64
  9. package/bin/demo-postwrite-pattern-gate +94 -0
  10. package/bin/forge-lint +17 -2
  11. package/bin/sidecar-prewrite-guard +104 -0
  12. package/commands/deploy.md +9 -0
  13. package/commands/dogfood.md +10 -0
  14. package/commands/gen-review.md +9 -0
  15. package/commands/release.md +10 -0
  16. package/hooks/hooks.json +15 -0
  17. package/package.json +3 -6
  18. package/references/contracts/a2ui-mcp-surface.md +35 -0
  19. package/references/contracts/migration-guide-format.md +34 -0
  20. package/references/shared/content-trust.md +19 -74
  21. package/skills/adia-a2ui/SKILL.md +99 -0
  22. package/skills/{adia-ui-a2ui → adia-a2ui}/evals/routing-corpus.json +10 -10
  23. package/skills/adia-a2ui/references/anti-patterns.md +27 -0
  24. package/skills/adia-a2ui/references/chunk-authoring.md +71 -0
  25. package/skills/adia-a2ui/references/corpus-discipline.md +68 -0
  26. package/skills/adia-a2ui/references/eval-diagnostics.md +86 -0
  27. package/skills/adia-a2ui/references/format-extension-decisions.md +66 -0
  28. package/skills/adia-a2ui/references/leverage-rules.md +52 -0
  29. package/skills/adia-a2ui/references/mcp-pipeline-ops.md +83 -0
  30. package/skills/adia-a2ui/references/mcp-tool-reference.md +59 -0
  31. package/skills/adia-a2ui/references/pipeline-overview.md +115 -0
  32. package/skills/adia-a2ui/references/semantic-fail-lifting.md +74 -0
  33. package/skills/adia-a2ui/references/strategy-engines.md +109 -0
  34. package/skills/adia-a2ui/references/zettel-calibration.md +104 -0
  35. package/skills/adia-author/SKILL.md +112 -0
  36. package/skills/adia-author/evals/routing-corpus.json +222 -0
  37. package/skills/{adia-ui-authoring → adia-author}/references/anti-patterns.md +33 -4
  38. package/skills/{adia-ui-authoring → adia-author}/references/authoring-cycle.md +9 -11
  39. package/skills/adia-author/references/canonical-pattern-index.md +243 -0
  40. package/skills/{adia-ui-authoring → adia-author}/references/code-style.md +19 -21
  41. package/skills/adia-author/references/common-gotchas.md +129 -0
  42. package/skills/adia-author/references/composite-demo-protocol.md +271 -0
  43. package/skills/{adia-ui-authoring → adia-author}/references/css-patterns.md +19 -6
  44. package/skills/{adia-ui-authoring → adia-author}/references/lifecycle-patterns.md +1 -0
  45. package/skills/{adia-ui-authoring → adia-author}/references/llm-bridge.md +3 -5
  46. package/skills/{adia-ui-authoring → adia-author}/references/module-promotion.md +20 -38
  47. package/skills/{adia-ui-authoring → adia-author}/references/primitive-audit.md +2 -4
  48. package/skills/{adia-ui-authoring → adia-author}/references/shell-patterns.md +12 -18
  49. package/skills/{adia-ui-authoring → adia-author}/references/token-contract.md +5 -7
  50. package/skills/{adia-ui-authoring → adia-author}/references/worked-example.md +3 -3
  51. package/skills/{adia-ui-authoring → adia-author}/references/yaml-contract.md +3 -3
  52. package/skills/{adia-ui-authoring → adia-author}/scripts/build-canonical-pattern-index.mjs +3 -3
  53. package/skills/adia-deploy/SKILL.md +128 -0
  54. package/skills/{adia-ui-ops → adia-deploy}/references/deploy-playbooks.md +47 -30
  55. package/skills/adia-dogfood/SKILL.md +124 -0
  56. package/skills/adia-dogfood/references/admin-shell-anatomy.md +77 -0
  57. package/skills/adia-dogfood/references/app-shell-pitfalls.md +66 -0
  58. package/skills/adia-dogfood/references/card-anatomy-sweep.md +66 -0
  59. package/skills/adia-dogfood/references/html-attr-sweep.md +63 -0
  60. package/skills/adia-dogfood/references/native-leak-annotations.md +73 -0
  61. package/skills/adia-dogfood/references/visual-probe-triage.md +80 -0
  62. package/skills/{adia-ui-dogfood → adia-dogfood}/scripts/analyze.mjs +30 -14
  63. package/skills/adia-gen-review/SKILL.md +127 -0
  64. package/skills/adia-gen-review/references/corpus-html-patterns.md +279 -0
  65. package/skills/adia-gen-review/references/loop-protocol.md +216 -0
  66. package/skills/adia-gen-review/references/rubric-cosmetic.md +100 -0
  67. package/skills/adia-gen-review/references/rubric-decompose.md +101 -0
  68. package/skills/adia-gen-review/references/rubric-score.md +214 -0
  69. package/skills/{adia-ui-gen-review → adia-gen-review}/references/scores.schema.json +2 -2
  70. package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-coverage-audit.mjs +4 -4
  71. package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-decompose.mjs +10 -6
  72. package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-status.mjs +5 -5
  73. package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/validate-cycle-scores.mjs +5 -5
  74. package/skills/adia-llm-internals/SKILL.md +77 -0
  75. package/skills/{adia-ui-llm → adia-llm-internals}/references/adapter-contract.md +4 -2
  76. package/skills/{adia-ui-llm → adia-llm-internals}/references/add-a-provider.md +4 -5
  77. package/skills/{adia-ui-llm → adia-llm-internals}/references/bridge-facade.md +10 -3
  78. package/skills/{adia-ui-llm → adia-llm-internals}/references/browser-proxy-boundary.md +1 -1
  79. package/skills/{adia-ui-llm → adia-llm-internals}/references/model-registry.md +5 -3
  80. package/skills/{adia-ui-llm → adia-llm-internals}/references/streaming-sse.md +2 -2
  81. package/skills/adia-release/SKILL.md +72 -0
  82. package/skills/adia-release/references/changelog-discipline.md +119 -0
  83. package/skills/adia-release/references/cut-procedure.md +247 -0
  84. package/skills/adia-release/references/gates-catalog.md +222 -0
  85. package/skills/adia-release/references/independent-package-release.md +52 -0
  86. package/skills/adia-release/references/migration-guide-authoring.md +86 -0
  87. package/skills/adia-release/references/notes-authoring.md +90 -0
  88. package/skills/adia-release/references/recovery-paths.md +106 -0
  89. package/skills/{adia-ui-release → adia-release}/scripts/bump.mjs +28 -3
  90. package/skills/{adia-ui-release → adia-release}/scripts/dispatch-publish.mjs +10 -7
  91. package/skills/{adia-ui-release → adia-release}/scripts/insert-stub.mjs +1 -1
  92. package/skills/{adia-ui-release → adia-release}/scripts/package-paths.mjs +6 -0
  93. package/skills/{adia-ui-release → adia-release}/scripts/promote-unreleased.mjs +1 -1
  94. package/skills/{adia-ui-release → adia-release}/scripts/release-pack.mjs +38 -31
  95. package/skills/{adia-ui-release → adia-release}/scripts/tag-lockstep.mjs +7 -3
  96. package/skills/adia-site-docs/SKILL.md +68 -0
  97. package/skills/adia-site-docs/evals/audit-report.md +30 -0
  98. package/skills/adia-site-docs/evals/routing-corpus.json +176 -0
  99. package/skills/adia-site-docs/intent.md +72 -0
  100. package/agents/README.md +0 -209
  101. package/agents/author.md +0 -56
  102. package/agents/repo-steward.md +0 -56
  103. package/agents/spec-architect.md +0 -53
  104. package/agents/tech-lead.md +0 -57
  105. package/agents/verifier.md +0 -55
  106. package/bin/lib/audit-axes.mjs +0 -555
  107. package/bin/lib/dry-run-irreversible.mjs +0 -236
  108. package/bin/lib/run-skill-evals.mjs +0 -487
  109. package/bin/lib/teach-router.mjs +0 -250
  110. package/commands/adia-forge-a2ui.md +0 -10
  111. package/commands/adia-forge-author.md +0 -10
  112. package/commands/adia-forge-dogfood.md +0 -8
  113. package/commands/adia-forge-llm.md +0 -8
  114. package/commands/adia-forge-orient.md +0 -10
  115. package/commands/adia-forge-release.md +0 -8
  116. package/commands/adia-forge-review.md +0 -10
  117. package/references/shared/pev-rationale.md +0 -64
  118. package/references/shared/skill-conventions.md +0 -133
  119. package/skills/adia-ui-a2ui/CHANGELOG.md +0 -32
  120. package/skills/adia-ui-a2ui/SKILL.md +0 -243
  121. package/skills/adia-ui-a2ui/evals/adversarial-corpus.json +0 -75
  122. package/skills/adia-ui-a2ui/evals/teach-routing-cases.json +0 -100
  123. package/skills/adia-ui-a2ui/references/anti-patterns.md +0 -24
  124. package/skills/adia-ui-a2ui/references/chunk-authoring.md +0 -88
  125. package/skills/adia-ui-a2ui/references/corpus-discipline.md +0 -56
  126. package/skills/adia-ui-a2ui/references/eval-diagnostics.md +0 -127
  127. package/skills/adia-ui-a2ui/references/fragment-graph.md +0 -91
  128. package/skills/adia-ui-a2ui/references/mcp-pipeline-ops.md +0 -106
  129. package/skills/adia-ui-a2ui/references/mcp-tool-reference.md +0 -398
  130. package/skills/adia-ui-a2ui/references/pipeline-overview.md +0 -175
  131. package/skills/adia-ui-a2ui/references/semantic-fail-lifting.md +0 -120
  132. package/skills/adia-ui-a2ui/references/strategy-engines.md +0 -111
  133. package/skills/adia-ui-a2ui/references/teach-protocol.md +0 -220
  134. package/skills/adia-ui-a2ui/references/zettel-calibration.md +0 -93
  135. package/skills/adia-ui-a2ui/scripts/audit-a2ui-roster.mjs +0 -96
  136. package/skills/adia-ui-a2ui/scripts/teach-route.mjs +0 -157
  137. package/skills/adia-ui-a2ui/skill.json +0 -38
  138. package/skills/adia-ui-authoring/CHANGELOG.md +0 -32
  139. package/skills/adia-ui-authoring/SKILL.md +0 -256
  140. package/skills/adia-ui-authoring/assets/case-studies/admin-shell-decomposition.md +0 -101
  141. package/skills/adia-ui-authoring/assets/case-studies/maxtokens-32768-discovery.md +0 -109
  142. package/skills/adia-ui-authoring/assets/case-studies/theme-panel-promotion.md +0 -113
  143. package/skills/adia-ui-authoring/evals/adversarial-design-plan-gates.json +0 -138
  144. package/skills/adia-ui-authoring/evals/routing-corpus.json +0 -245
  145. package/skills/adia-ui-authoring/references/canonical-pattern-index.md +0 -179
  146. package/skills/adia-ui-authoring/references/common-gotchas.md +0 -93
  147. package/skills/adia-ui-authoring/references/composite-demo-protocol.md +0 -1084
  148. package/skills/adia-ui-authoring/references/teach-protocol.md +0 -428
  149. package/skills/adia-ui-authoring/scripts/audit-authoring-roster.mjs +0 -148
  150. package/skills/adia-ui-authoring/skill.json +0 -45
  151. package/skills/adia-ui-dogfood/CHANGELOG.md +0 -17
  152. package/skills/adia-ui-dogfood/README.md +0 -62
  153. package/skills/adia-ui-dogfood/SKILL.md +0 -866
  154. package/skills/adia-ui-dogfood/skill.json +0 -40
  155. package/skills/adia-ui-forge/SKILL.md +0 -88
  156. package/skills/adia-ui-forge/evals/routing-corpus.json +0 -30
  157. package/skills/adia-ui-gen-review/CHANGELOG.md +0 -108
  158. package/skills/adia-ui-gen-review/SKILL.md +0 -266
  159. package/skills/adia-ui-gen-review/references/loop-protocol.md +0 -712
  160. package/skills/adia-ui-gen-review/references/rubric-cosmetic.md +0 -144
  161. package/skills/adia-ui-gen-review/references/rubric-decompose.md +0 -117
  162. package/skills/adia-ui-gen-review/references/rubric-score.md +0 -249
  163. package/skills/adia-ui-gen-review/references/teach-protocol.md +0 -214
  164. package/skills/adia-ui-gen-review/skill.json +0 -23
  165. package/skills/adia-ui-llm/CHANGELOG.md +0 -25
  166. package/skills/adia-ui-llm/SKILL.md +0 -165
  167. package/skills/adia-ui-llm/evals/adversarial-corpus.json +0 -75
  168. package/skills/adia-ui-llm/evals/routing-corpus.json +0 -30
  169. package/skills/adia-ui-llm/evals/teach-routing-cases.json +0 -73
  170. package/skills/adia-ui-llm/references/teach-protocol.md +0 -78
  171. package/skills/adia-ui-llm/scripts/audit-llm-roster.mjs +0 -93
  172. package/skills/adia-ui-llm/scripts/teach-route.mjs +0 -119
  173. package/skills/adia-ui-llm/skill.json +0 -33
  174. package/skills/adia-ui-ops/CHANGELOG.md +0 -291
  175. package/skills/adia-ui-ops/SKILL.md +0 -401
  176. package/skills/adia-ui-ops/references/INDEX.md +0 -158
  177. package/skills/adia-ui-ops/references/audit-cadence.md +0 -263
  178. package/skills/adia-ui-ops/references/audit-patterns/archive-link-sweep.md +0 -96
  179. package/skills/adia-ui-ops/references/audit-patterns/audit-history-ledger.md +0 -162
  180. package/skills/adia-ui-ops/references/audit-patterns/browser-bundle-node-imports.md +0 -154
  181. package/skills/adia-ui-ops/references/audit-patterns/changelog-unreleased-bloat.md +0 -75
  182. package/skills/adia-ui-ops/references/audit-patterns/coverage-gaps.md +0 -187
  183. package/skills/adia-ui-ops/references/audit-patterns/entry-file-coverage.md +0 -122
  184. package/skills/adia-ui-ops/references/audit-patterns/format-hygiene.md +0 -217
  185. package/skills/adia-ui-ops/references/audit-patterns/lockstep-versioning.md +0 -113
  186. package/skills/adia-ui-ops/references/audit-patterns/memory-fragmentation.md +0 -180
  187. package/skills/adia-ui-ops/references/audit-patterns/orphan-detection.md +0 -202
  188. package/skills/adia-ui-ops/references/audit-patterns/pointer-validation.md +0 -180
  189. package/skills/adia-ui-ops/references/audit-patterns/redundancy-detection.md +0 -210
  190. package/skills/adia-ui-ops/references/audit-patterns/spec-dating-sweep.md +0 -91
  191. package/skills/adia-ui-ops/references/audit-patterns/stale-content.md +0 -182
  192. package/skills/adia-ui-ops/references/audit-patterns/staleness-tooling.md +0 -156
  193. package/skills/adia-ui-ops/references/audit-patterns/token-waste-detection.md +0 -196
  194. package/skills/adia-ui-ops/references/doc-types/adr-pattern.md +0 -210
  195. package/skills/adia-ui-ops/references/doc-types/architecture-md.md +0 -190
  196. package/skills/adia-ui-ops/references/doc-types/changelog.md +0 -183
  197. package/skills/adia-ui-ops/references/doc-types/decisions-log.md +0 -146
  198. package/skills/adia-ui-ops/references/doc-types/plan-roadmap.md +0 -182
  199. package/skills/adia-ui-ops/references/doc-types/postmortem-pattern.md +0 -206
  200. package/skills/adia-ui-ops/references/genres/prose-and-writing.md +0 -149
  201. package/skills/adia-ui-ops/references/guidance/context-budget.md +0 -137
  202. package/skills/adia-ui-ops/references/guidance/llm-doc-writing.md +0 -116
  203. package/skills/adia-ui-ops/references/guidance/reliability-dial.md +0 -186
  204. package/skills/adia-ui-ops/references/recipes/adr-introduction.md +0 -211
  205. package/skills/adia-ui-ops/references/recipes/audit-existing-repo.md +0 -234
  206. package/skills/adia-ui-ops/references/recipes/cold-start-harvest.md +0 -263
  207. package/skills/adia-ui-ops/references/recipes/concurrent-learnings-merge.md +0 -158
  208. package/skills/adia-ui-ops/references/recipes/continuous-learning-loop.md +0 -169
  209. package/skills/adia-ui-ops/references/recipes/external-reference-verification.md +0 -158
  210. package/skills/adia-ui-ops/references/recipes/findings-index-readout.md +0 -126
  211. package/skills/adia-ui-ops/references/recipes/greenfield-setup.md +0 -252
  212. package/skills/adia-ui-ops/references/recipes/harvest-repo-brain.md +0 -169
  213. package/skills/adia-ui-ops/references/recipes/import-repo-brain-harvest.md +0 -153
  214. package/skills/adia-ui-ops/references/recipes/memory-organization.md +0 -182
  215. package/skills/adia-ui-ops/references/recipes/recommend-then-validate.md +0 -199
  216. package/skills/adia-ui-ops/references/recipes/self-healing-hooks.md +0 -366
  217. package/skills/adia-ui-ops/references/recipes/skill-stewardship-loop.md +0 -113
  218. package/skills/adia-ui-ops/references/standards/agents-md-spec.md +0 -138
  219. package/skills/adia-ui-ops/references/standards/claude-md-convention.md +0 -123
  220. package/skills/adia-ui-ops/references/standards/cross-tool-matrix.md +0 -85
  221. package/skills/adia-ui-ops/references/standards/readme-conventions.md +0 -232
  222. package/skills/adia-ui-ops/references/teach-protocol.md +0 -215
  223. package/skills/adia-ui-ops/scripts/audit-ops-roster.mjs +0 -104
  224. package/skills/adia-ui-ops/skill.json +0 -65
  225. package/skills/adia-ui-release/CHANGELOG.md +0 -66
  226. package/skills/adia-ui-release/SKILL.md +0 -323
  227. package/skills/adia-ui-release/assets/case-studies/2026-05-20-batch-push-v0.6.14-v0.6.15.md +0 -144
  228. package/skills/adia-ui-release/assets/case-studies/2026-05-20-corpus-drift-remediation-v0.6.15.md +0 -155
  229. package/skills/adia-ui-release/assets/case-studies/2026-05-20-version-skip-correction-v0.6.12.md +0 -114
  230. package/skills/adia-ui-release/assets/case-studies/2026-05-21-author-from-scratch-v0.6.18.md +0 -139
  231. package/skills/adia-ui-release/assets/case-studies/2026-05-21-feedback37-retraction-v0.6.21.md +0 -124
  232. package/skills/adia-ui-release/assets/case-studies/2026-05-21-fn1-enrichment-pass-v0.6.19.md +0 -125
  233. package/skills/adia-ui-release/assets/case-studies/2026-05-21-stale-test-detection-v0.6.20.md +0 -142
  234. package/skills/adia-ui-release/assets/case-studies/2026-05-23-freshness-gate-recovery-v0.6.32.md +0 -97
  235. package/skills/adia-ui-release/assets/case-studies/2026-05-26-catalog-drift-recurring-v0.6.40.md +0 -147
  236. package/skills/adia-ui-release/assets/templates/stub-changelog.template.md +0 -22
  237. package/skills/adia-ui-release/evals/evals.json +0 -164
  238. package/skills/adia-ui-release/references/changelog-discipline.md +0 -250
  239. package/skills/adia-ui-release/references/cycle-happy-path.md +0 -520
  240. package/skills/adia-ui-release/references/exe-deploy.md +0 -149
  241. package/skills/adia-ui-release/references/gates-catalog.md +0 -778
  242. package/skills/adia-ui-release/references/independent-package-release.md +0 -129
  243. package/skills/adia-ui-release/references/ledger-discipline.md +0 -232
  244. package/skills/adia-ui-release/references/migration-guide-authoring.md +0 -174
  245. package/skills/adia-ui-release/references/multi-agent-baseline.md +0 -207
  246. package/skills/adia-ui-release/references/notes-authoring.md +0 -212
  247. package/skills/adia-ui-release/references/recovery-paths.md +0 -262
  248. package/skills/adia-ui-release/references/rollup-notes.md +0 -208
  249. package/skills/adia-ui-release/references/teach-protocol.md +0 -468
  250. package/skills/adia-ui-release/scripts/audit-gate-roster.mjs +0 -196
  251. package/skills/adia-ui-release/scripts/make-ledger.mjs +0 -200
  252. package/skills/adia-ui-release/skill.json +0 -77
  253. package/skills/dogfood-sweep/CHANGELOG.md +0 -37
  254. package/skills/dogfood-sweep/README.md +0 -105
  255. package/skills/dogfood-sweep/SKILL.md +0 -1000
  256. package/skills/dogfood-sweep/analyze.mjs +0 -600
  257. package/skills/dogfood-sweep/skill.json +0 -31
  258. /package/skills/{adia-ui-authoring → adia-author}/references/api-contract.md +0 -0
  259. /package/skills/{adia-ui-release → adia-release}/scripts/assert-monorepo-root.mjs +0 -0
@@ -0,0 +1,222 @@
1
+ # `gates-catalog.md` — pre-flight gate roster + failure → recovery map
2
+
3
+ > Load for a verify-only run or on any gate failure during a cut. Maps every
4
+ > release-flow gate × what it checks × typical failure × recovery. Gates are
5
+ > grouped by **failure category** — how the operator routes when one goes red —
6
+ > not by alphabetical namespace. Cited scripts live in the target monorepo's
7
+ > `package.json` (`check:*` / `verify:*` / `smoke:*` / `test:*`).
8
+
9
+ Row layout per gate: **What** · **Typical failure** · **Recovery**.
10
+
11
+ ---
12
+
13
+ ## §Category 1 — Release identity (hard-fail any cut)
14
+
15
+ ### `npm run check:lockstep`
16
+
17
+ - **What:** all 11 `@adia-ai/*` packages declare the same `version`; internal `@adia-ai/*` dep ranges match policy (`^X.Y.0` during PATCH cycles, bumped at MINOR).
18
+ - **Typical failure:** one package forgot to bump; a peer edited an internal range mid-PATCH; a `^0.0.x` range slipped in.
19
+ - **Recovery:** version drift → `scripts/bump.mjs` (bundled with this skill); range drift → `npm run check:lockstep:fix` auto-aligns, then re-run.
20
+ - **Why `^0.0.x` is forbidden:** npm pre-1.0 semver only widens the caret when major+minor aren't both zero — `^0.0.6` resolves to `>=0.0.6 <0.0.7`, locked to exactly 0.0.6. An internal dep pinned that way silently installs a *stale* sibling on every fresh `npm i` (this shipped a real ~4-day-latent bug before the lockstep policy). The `^X.Y.0` floor (Y≥1) widens correctly across patches; trust the gate, don't reason about caret semantics by hand. Moot at 1.0.0.
21
+
22
+ ### `node scripts/release/check-release.mjs --all-pending` (F-N1, the release trip-wire)
23
+
24
+ - **What:** for every unpushed tag, verifies CHANGELOG coverage of the diff between this tag and the package's previous tag.
25
+ - **Cosmetic failure:** "diff `packages/<pkg>/components/` touched but CHANGELOG `[X.Y.Z]` doesn't mention 'components'" — the entry names the component (`table-ui`) but not the literal path keyword. Regex miss, change IS documented.
26
+ - **Real failure:** a touched directory has NO matching CHANGELOG entry at all — the cycle missed documenting a change.
27
+ - **Recovery:** cosmetic → add the path keyword to a relevant entry (`table.yaml` → `components/table/table.yaml`); real → author the missing entry. Either way: amend the release commit, delete + re-create the tags at the new SHA, re-run. Full discipline: [`changelog-discipline.md`](changelog-discipline.md) §F-N1 enrichment.
28
+ - The umbrella tag's "doesn't match `<pkg>-v<version>`" **error is expected — ignore it**; only per-package warns need action.
29
+
30
+ ### `npm run check:changelog-coverage`
31
+
32
+ - **What:** every published package has a `[vX.Y.Z]` CHANGELOG block for the current `package.json` version.
33
+ - **Recovery:** add the block (stub if genuinely no source change — but classify by the diff first, see [`changelog-discipline.md`](changelog-discipline.md) §Detecting source-changing packages).
34
+
35
+ ---
36
+
37
+ ## §Category 2 — Generated-file coherence (hard-fail any cut)
38
+
39
+ ### `node scripts/build/components.mjs --verify`
40
+
41
+ - **What:** every component yaml has an up-to-date `.a2ui.json` sidecar; `.d.ts` codegen current. (Generated files are also hook-guarded against hand edits.)
42
+ - **Recovery:** `node scripts/build/components.mjs` (no `--verify`) regenerates; stage the sidecars.
43
+
44
+ ### `npm run verify:traits`
45
+
46
+ - **What:** `traits/_catalog.json` reflects every `defineTrait()` call; 100% coverage.
47
+ - **Recovery:** `npm run build:traits`; stage.
48
+
49
+ ### `npm run verify:a2ui-schema`
50
+
51
+ - **What:** the A2UI JSON Schema is in sync with the `@adia-ai/a2ui-runtime` TS types.
52
+ - **Recovery:** `node scripts/build/a2ui-schema-types.mjs`; stage.
53
+
54
+ ### `npm run verify:tsconfig-strictness`
55
+
56
+ - **What:** per-package `tsconfig.json` doesn't silently relax flags set strict in `tsconfig.base.json` (ADR-0029). A relaxation needs a `// TS-MIG-NNN` tracking comment.
57
+ - **Recovery:** remove the override, or add the tracking comment.
58
+
59
+ ---
60
+
61
+ ## §Category 3 — Component / primitive structural drift
62
+
63
+ ### `npm run check:demo-shells`
64
+
65
+ - **What:** every component demo `.html` imports all primitives named in its yaml `composes:` list.
66
+ - **Typical failure:** a yaml gained a `composes:` entry but the demo shell didn't get the matching `<script>` import.
67
+ - **Recovery:** add `<script type="module" src="../<tag>/<tag>.js">` to the demo shell. **Release-blocking: HIGH** — a commit failing this gate ships broken demo pages in its tarball. If the fix already landed later but entangled with `[Unreleased]` work → [`recovery-paths.md`](recovery-paths.md) §Scenario 4.
68
+
69
+ Smaller siblings in this category (same recovery shape — fix the declaration or regenerate the registry):
70
+
71
+ | Gate | What |
72
+ | --- | --- |
73
+ | `check:composes` | every yaml `composes:` entry resolves to a real primitive |
74
+ | `check:dts-sibling-presence` | every component `.js` has a sibling `.d.ts` |
75
+ | `check:registry-catalog-coherence` | runtime registry ↔ A2UI catalog parity (both directions) |
76
+ | `check:required-icons` | every referenced `<icon-ui>` name is registered |
77
+ | `check:standalone-html-phosphor` | standalone demos using Phosphor icons include the loader |
78
+ | `check:substitutable-set-drift` | substitutable-element registry in sync |
79
+
80
+ ---
81
+
82
+ ## §Category 4 — CSS spec compatibility
83
+
84
+ ### `npm run check:lightningcss-build`
85
+
86
+ - **What:** every CSS file under `packages/web-{components,modules}/` minifies cleanly under LightningCSS + current Vite default targets.
87
+ - **Recovery:** fix the offending CSS. Most common sub-case ↓
88
+
89
+ ### `npm run check:scope-bare-descendants`
90
+
91
+ - **What:** no `@scope { > X {} }` bare-combinator descendants (LightningCSS rejects as "Invalid empty selector").
92
+ - **Recovery:** `node scripts/build/codemod-scope-bare-descendants.mjs` rewrites `> X` → `& > X`.
93
+
94
+ Also: `check:no-self-import-css` (no transitively self-importing barrel) · `check:rolldown-glob` (`import.meta.glob` works under Rolldown).
95
+
96
+ ---
97
+
98
+ ## §Category 5 — Browser safety / module hygiene
99
+
100
+ ### `npm run check:browser-safe`
101
+
102
+ - **What:** no top-level `import 'node:*'` in browser-reachable modules (`packages/a2ui/{compose,retrieval,validator}`, `web-components/`, `web-modules/`, `apps/*/app/*.contents.js`).
103
+ - **Recovery:** dual-mode pattern (`IS_NODE` + dynamic `await import(/* @vite-ignore */ 'node:*')` + `import.meta.glob` browser branch); canonical impl: `packages/a2ui/retrieval/component-catalog.js`.
104
+
105
+ Siblings: `check:absolute-imports` (no leading-`/` imports — rewrite relative) · `check:template-interp` (template `${expr}` contract) · `check:yaml-events` (yaml `events:` match runtime `dispatchEvent` calls) · `check:yaml-impl-coverage` (every yaml prop implemented in the JS class).
106
+
107
+ ---
108
+
109
+ ## §Category 6 — Visual / structural integrity
110
+
111
+ | Gate | What |
112
+ | --- | --- |
113
+ | `check:card-structure` / `check:drawer-structure` | card/drawer body wraps in `<section>` (strict variants of the `audit:*` twins) |
114
+ | `check:with-css-pairing` | every shell with paired `.js` + `.css` has a `/with-css` companion + exports-map entry |
115
+ | `verify:no-legacy-shell-shapes` | no legacy `<main>` / `[data-content-*]` shapes under `<admin-shell>` (ADR-0032) |
116
+ | `audit:native-primitive-leak` | native `<button>`/`<input>`/… where a `*-ui` equivalent exists; criticals must be replaced or annotated `data-native-ok="<reason>"` |
117
+ | `audit:shell-composition` | admin-shell compositions missing canonical parts (statusbar, `[data-spacer]`/`[data-actions]`, …); escape hatch `data-shell-opt-out="<reason>"` |
118
+
119
+ The two `audit:*` probes are soft-fail pre-cut (exit-1 only on criticals); findings get folded into release notes if non-zero. Recovery for both is manual — slot/attr semantics need a human eyeball, never auto-fix.
120
+
121
+ ---
122
+
123
+ ## §Category 7 — Corpus / bundle freshness
124
+
125
+ ### `npm run verify:corpus`
126
+
127
+ - **What:** every chunk in `packages/a2ui/corpus/chunks/*.json` is reachable and well-formed.
128
+ - **Recovery:** corpus remediation routes to the A2UI-pipeline skill, not this one.
129
+
130
+ ### `npm run check:chunks-fresh`
131
+
132
+ - **What:** `chunks/_index.json` matches on-disk chunks and source fragments.
133
+ - **Recovery:** `npm run harvest:chunks`; stage the corpus outputs.
134
+
135
+ ### `npm run check:embeddings-fresh`
136
+
137
+ - **What:** `chunk-embeddings.json` at-or-newer-than `chunks/_index.json`.
138
+ - **Recovery:** `npm run build:embeddings:chunks` (needs `OPENAI_API_KEY`; ~6s). Stage `chunk-embeddings.json` + note the regen in the a2ui-corpus CHANGELOG `[vX.Y.Z]`.
139
+
140
+ ### `npm run check:css-bundles-fresh` / `npm run check:js-bundles-fresh`
141
+
142
+ - **What:** the `dist/` CDN bundles (`web-components.min.{css,js}`, `everything.min.js`, per-shell `*.min.js`, `icons-manifest.js`) match source. Stale bundles mean jsdelivr/unpkg serve yesterday's build. **Blocking in CI** (2026-06-08).
143
+ - **Recovery:** `npm run build -w @adia-ai/llm` **FIRST** (its `index.js` is a gitignored tsc artifact `build:bundle-js` resolves — a fresh worktree can't bundle without it), then `npm run build:bundles` (or `build:bundle-css` / `build:bundle-js` individually). Stage both `dist/` trees.
144
+ - **Manual spot-checks** (complement the gate; the v0.6.29–31 cycles shipped a shells-only `everything.min.js` that hard-crashed CDN consumers):
145
+
146
+ ```bash
147
+ grep "import '@adia-ai/web-components'" packages/web-modules/everything.js # must be present
148
+ grep -oE '"[a-z][a-z-]*-ui"' packages/web-modules/dist/everything.min.js | sort -u | wc -l # ≥100
149
+ node -e "const m=require('./packages/web-components/dist/icons-manifest.js'); \
150
+ console.log('regular:', m.default.regular.length, '| cdn:', m.default.cdn)" # non-empty + cdn key
151
+ ```
152
+
153
+ ### `npm run audit:chunk-reconcile`
154
+
155
+ - **What:** duplicate-reconciliation report for the chunk corpus (fingerprint collisions, near-duplicates, structural twins). Advisory, not blocking.
156
+
157
+ ---
158
+
159
+ ## §Category 8 — Tests + types + evals
160
+
161
+ ### `npm run test:unit`
162
+
163
+ - **What:** the vitest suite (~1000+ tests).
164
+ - **Stale-test failure:** the test asserts a behavior a peer deliberately changed (CHANGELOG-documented) without updating the assertion. Tell it apart by reading assertion vs CHANGELOG vs source: if the code matches the CHANGELOG's described behavior, the test is stale — update the assertion (see [`recovery-paths.md`](recovery-paths.md) §Scenario 5). Real regression → fix the regression.
165
+ - **Parallel-contention flake:** heavy web-modules composite suites can fail under full parallelism on a loaded machine (`signals: drain loop exceeded 100 iterations`). Load-dependent, not a code defect. **Gate on `npx vitest run --no-file-parallelism`** (sequential is the source of truth); don't treat a one-off parallel flake as a blocker, and don't raise the drain guard.
166
+
167
+ ### `npm run eval:diff -- --engine zettel`
168
+
169
+ - **What:** end-to-end gen-UI eval. Floors (preserve-not-regress):
170
+ - **Zettel**: cov ≥ 87%, avg ≥ 85, MRR ≥ 0.94
171
+ - **Free-form**: cov ≥ 90%, avg ≥ 83, F1 ≥ 55
172
+ - **Monolithic**: cov = 100%, avg ≥ 95
173
+ - **Dogfood**: 20/20, avg ≥ 95
174
+ - **Recovery:** retrieval/corpus regression — routes to the A2UI-pipeline skill.
175
+
176
+ Siblings: `typecheck` (`tsc --noEmit`) · `smoke:engines` (gen-UI engines + retrieval probes) · `smoke:register-engine` (11/11) · `test:a2ui` (22/22, +1 skipped OK).
177
+
178
+ ---
179
+
180
+ ## §Category 9 — Misc release safety
181
+
182
+ ### `npm run dogfood:status`
183
+
184
+ - **What:** aggregator over the component dogfood audits; classifies findings P0–P3 and regenerates the tracker at `qa/findings/dogfood-tracker.md`. Exit-1 when P0+P1 > 0; P2/P3 are advisory.
185
+ - **Pre-cut policy: must pass before tag.** Any P0/P1 means a paid-down bug class was re-introduced; open the tracker, apply the canonical fix template at the cited file:line, re-run. ~5s.
186
+
187
+ ### `npm run verify:pack`
188
+
189
+ - **What:** `npm pack --dry-run` succeeds per package — catches malformed `files`/`exports`. Note: the npm `files:` array supports negation (`!components/**/*.html`); verify tarball contents with `--dry-run` after touching it.
190
+
191
+ Siblings: `check:links` (intra-repo markdown links resolve) · `check:cdn-pins` (docs' CDN `@0.X` pins match the current minor — catches a stale `@0.6` after a `0.7` cut) · `verify:contrast` / `verify:palette` (WCAG pairs / OKLCH ramps).
192
+
193
+ ---
194
+
195
+ ## §Standard subsets
196
+
197
+ **Minimum 6 (verify-only default)** — fastest set that catches release-blockers:
198
+
199
+ ```bash
200
+ node scripts/build/components.mjs --verify
201
+ npm run check:lockstep
202
+ npm run verify:traits
203
+ npm run test:unit
204
+ npm run typecheck
205
+ npm run check:demo-shells
206
+ ```
207
+
208
+ Add `verify:corpus` + `check:embeddings-fresh` if chunks were touched; `check:lightningcss-build` if CSS was touched; F-N1 if unpushed release tags exist.
209
+
210
+ **Full pre-cut sweep** — the 17-gate roster in [`cut-procedure.md`](cut-procedure.md) §Step 3. ~90s wall time.
211
+
212
+ **Omnibus** — `npm run check` invokes everything. Heavy; use when re-baselining a stale checkout.
213
+
214
+ **Suffix variants:** most gates have `:strict` (warns fail), `:fix` (auto-apply, e.g. `check:lockstep:fix`), `:json` / `:quiet` (output form) variants.
215
+
216
+ ---
217
+
218
+ ## §Gate stewardship
219
+
220
+ - **This catalog must stay in sync with `package.json` `scripts`.** When a cycle meets a release-flow gate not listed here, add its row in the same change.
221
+ - **New CI gates ship advisory first** (`continue-on-error: true`), promoted to blocking after 5+ green runs. Two freshness-gate traps: mtime checks are permanently red on fresh `actions/checkout` (clone-time mtimes — need `fetch-depth: 0` + git-restore-mtime); a dir-watching gate needs its own workflow whose `pull_request: paths:` covers the watched dirs.
222
+ - **New/extended `scripts/release/check-*.mjs` slots run against `main` immediately**; close every finding same-cycle. Before adding a slot, grep the existing ones — the gap is often a regex limit in a current slot, not a missing slot.
@@ -0,0 +1,52 @@
1
+ # `independent-package-release.md` — class-B cut (independently-versioned package)
2
+
3
+ > Load when releasing a package versioned **independently** of the lockstep set —
4
+ > excluded from the lockstep gate, no umbrella tag, no demo-site deploy.
5
+ > **Class B currently has NO members** (2026-07-15 policy change, operator
6
+ > ruling): the Claude Code plugins under `packages/plugins/*` joined the
7
+ > lockstep after class-B independence let npm drift a full harness-reset
8
+ > behind the repo (npm served forge 0.1.3/factory 0.2.4 pre-reset content
9
+ > while the rewritten estate sat unpublished at a regressed 0.1.0). This
10
+ > procedure is retained for future genuinely-independent packages. The
11
+ > lockstep cut is [`cut-procedure.md`](cut-procedure.md).
12
+
13
+ ## §Two release classes in one monorepo
14
+
15
+ | | Class A — lockstep cut | Class B — independent package |
16
+ | --- | --- | --- |
17
+ | Versioning | whole set bumps together | own version line per package |
18
+ | Lockstep gate | enforced (`check:lockstep` 11/11) | **excluded** — a class-B package is not listed in `check-lockstep.mjs`'s `PACKAGES` (none currently exist; `packages/plugins/*` joined class A 2026-07-15) |
19
+ | Umbrella tag | `vX.Y.Z` + per-package | **none** — per-package tags only (versions differ) |
20
+ | `dist-tag` ordering | cross-package publish order matters | N/A |
21
+ | Demo-site deploy | yes | **none** |
22
+ | Publish trigger | tag-triggered per-package workflow | same mechanism (`.github/workflows/publish-adia-ui-{factory,forge}.yml`) |
23
+
24
+ Class B keeps the operator checkpoints and the verify-against-the-registry discipline; it drops every lockstep-specific invariant.
25
+
26
+ ## §New-package onboarding — the three trip-wires a FIRST cut hits
27
+
28
+ Substrate fixes (release scripts / lockfile / CHANGELOG), landed once as a normal PR on `main` *before* tagging:
29
+
30
+ 1. **Lockfile.** A new workspace package absent from the lockfile blocks the pre-commit hook and fails the workflow's `npm ci`. Fix: `npm install --package-lock-only && git add package-lock.json`.
31
+ 2. **Release-trip-wire package registry.** F-N1 validates each pushed tag against `scripts/release/check-release.mjs`'s hardcoded `PACKAGES` array; an unregistered tag fails the pre-push hook with `unknown package`. Fix: add `{ tagPrefix: '<name>', path: 'packages/plugins/<name>' }`.
32
+ 3. **CHANGELOG bracket form.** The trip-wire requires Keep-a-Changelog `## [<version>]` headings; bare `## <version>` fails with "no `## [<version>]` entry".
33
+
34
+ ## §Procedure
35
+
36
+ 1. **Re-baseline** — `git fetch`; confirm the checkout isn't on a peer's branch.
37
+ 2. **Land the package(s) on `main`** via PR; resolve every review thread before an admin-merge (this repo's merge gate).
38
+ 3. **Pre-publish gate.** `npm run verify:plugins` (package.json ↔ plugin-manifest versions synced). Plugin-specific structural gates: `npm run audit:plugin-coupling` + `npm run check:factory-bare-repo` (ADR-0040 — the plugin must work in a bare consumer repo, no monorepo coupling). The lockstep gate still passes for the lockstep set. First publish of a name: `npm view @adia-ai/<pkg> version` → `E404` means the name is free.
39
+ 4. **Tag at the published commit** — `git tag <pkg>-vX.Y.Z` per package; versions differ; no umbrella. Dry-run the trip-wire over the tags (`node scripts/release/check-release.mjs <tags>`) before pushing. If the shared working tree is on a peer's branch, push tags from a throwaway worktree on `origin/main`.
40
+ 5. **Push the tags** → the per-package workflows run `npm ci → verify:plugins → npm publish --access public`.
41
+ 6. **Verify against npm, not the workflow:** `npm view @adia-ai/<pkg> version` returns the new independent version for each package. Watch runs (`gh run watch <id> --exit-status`), but the registry is the source of truth.
42
+ 7. **Marketplace cut-over** (if a plugin marketplace repo exists): point the manifest's per-plugin `source` at npm (`{ "source": "npm", "package": "@adia-ai/<pkg>" }`), `git rm -r` vendored copies, validate the JSON, commit, push. Consumers then `/plugin marketplace add <org>/<repo>` → `/plugin install <pkg>@<repo>`.
43
+
44
+ ## §Verify target
45
+
46
+ The published package(s) on the **npm registry** at their independent versions, plus (if a marketplace exists) its manifest referencing npm. NOT "all 11 + the demo site" — that's class A.
47
+
48
+ ## §Gotchas (from the first independent cut, factory v0.2.2 + forge v0.1.2)
49
+
50
+ - Never add the package to the lockstep gate or tag it with the umbrella.
51
+ - Publish-workflow YAMLs are token-bearing — keep `persist-credentials: false` on the checkout step, matching the established workflows' action-pinning.
52
+ - A marketplace repo's org + visibility is an **operator call** — a public `gh repo create` is outward-facing; confirm first, and run a secret-scan of full history before pushing any repo public.
@@ -0,0 +1,86 @@
1
+ # `migration-guide-authoring.md` — authoring the MIGRATION GUIDE on a breaking cut
2
+
3
+ > Load whenever the cut is **MINOR** (an API-surface break) or on an explicit
4
+ > "author the migration guide" ask. This is the **producer** side of migrations:
5
+ > the release ships the breaking change, so the release authors the guide section
6
+ > consumers follow. The shared producer/consumer format contract is
7
+ > [`../../../references/contracts/migration-guide-format.md`](../../../references/contracts/migration-guide-format.md)
8
+ > — the factory's `adia-migrate` skill consumes exactly that shape.
9
+ >
10
+ > Scope split: **producer (this skill)** authors the guide section + migrates the
11
+ > framework's own in-repo surfaces. **Consumer** (a downstream app sweep) is the
12
+ > factory plugin's `adia-migrate` — decline and redirect. Designing the breaking
13
+ > change itself is a contract decision upstream of both.
14
+
15
+ The guide lives at **`.claude/docs/MIGRATION GUIDE.md`** (the space in the filename is intentional; it's a first-class consumer artifact). One section per breaking release, newest at top; a consumer jumping versions reads the merged span. Every cut — breaking or not — gets a version-scope bullet in the top index (see the format contract).
16
+
17
+ ## §When a section is owed
18
+
19
+ Author (or extend) a section when the cut removes or renames a **public API symbol**: a prop/attribute (`variant="danger"` → `color="danger"`), a slot or slot-semantics flip, an event name, a token (`--n-*` → `--a-*`), a tag, a Boolean → enum migration, or a default-value change wide enough that consumers must act. Same line as the PATCH-vs-MINOR rule: cutting MINOR almost certainly owes a section. Additive cuts need none — note "additive; no consumer sweep" in the version-coverage table and move on.
20
+
21
+ ## §The authoring workflow
22
+
23
+ **1. Enumerate the breaking surface** from the cut's diff + CHANGELOG `### Removed`/`### Changed` entries. Per item capture: the symbol · before → after · the kind (pure rename / semantic flip / Boolean→enum / removal) · the audit grep · the sweep (or "manual review").
24
+
25
+ **2. Write the section** — one `###` subsection per item:
26
+
27
+ ```markdown
28
+ ## Migrating to @adia-ai/web-components@X.Y.Z (YYYY-MM-DD)
29
+
30
+ <one-line scope: N breaking items, the headline.>
31
+
32
+ ### <item — bold headline> (`old` → `new`)
33
+
34
+ <one sentence: what changed and why.>
35
+
36
+ **Audit:**
37
+ git grep -nE '<pattern that surfaces call sites>'
38
+
39
+ **Sweep:**
40
+ git grep -nlE '<pattern>' | xargs perl -i -pe 's/<old>/<new>/g'
41
+ ```
42
+
43
+ Shape rules:
44
+
45
+ - **Audit grep first, sweep second** — the consumer always lists call sites before sweeping; author both.
46
+ - **Mechanical vs manual, explicitly labeled.** A pure rename ships a `perl -i -pe`; a semantic flip ships a "manual review — here's why" note (sed can't tell author intent).
47
+ - **One component per sweep regex** — alternation captures (`<(toast|alert)-ui`) don't preserve the matched alternative cleanly.
48
+ - **HTML-attribute regexes only match HTML/JSX** — author a separate JS-side regex when the symbol has a programmatic form (`el.variant = 'danger'`).
49
+
50
+ **3. Migrate the in-repo surfaces FIRST.** Before the cut ships, run the audit + sweep against `apps/`, `playgrounds/`, `catalog/`, `packages/web-components/components/*/*.html` — the release must not ship broken examples of the thing it changed, and dogfooding the recipe here is what proves it works for consumers.
51
+
52
+ **4. Verify.** Run the cut's normal gate roster; the structural/demo gates catch missed in-repo surfaces. Then the **sweep-verification grep** across ALL extensions — the trap is a vocabulary migration that touched markup but not the CSS selectors or JS comments referencing it:
53
+
54
+ ```bash
55
+ LEGACY_PATTERNS=( '<old-tag' 'old-attr=' '--old-token' )
56
+ for pat in "${LEGACY_PATTERNS[@]}"; do
57
+ echo "=== $pat ==="
58
+ grep -rln -E "$pat" apps playgrounds catalog \
59
+ --include='*.css' --include='*.html' --include='*.js' --include='*.yaml'
60
+ done # 0 hits = sweep verified clean
61
+ ```
62
+
63
+ **5. Cross-reference.** The breaking package's CHANGELOG entry names the symbol AND points at the guide section; the release notes carry a `⚠️` heads-up linking it. Anchors are stable — never retitle an existing section (release notes and consumer tooling link them).
64
+
65
+ ## §Manual-review classes (never auto-sweep)
66
+
67
+ - **Semantic flips** — a rename that inverts default behavior (`[open]` default-hidden → `[collapsed]` default-visible): the right migration depends on author intent. List occurrences, ask.
68
+ - **Opt-out Booleans defaulting true** — the migration only matters where a consumer explicitly disabled the affordance; sed can't tell.
69
+ - **Ownership moves** — a prop moving from wrapper to slotted child; the target child may not exist yet.
70
+ - **kebab-string property keys** — attribute name unchanged, only the JS programmatic form changed; audit programmatic access only.
71
+ - **Wide namespace renames (50+ symbols)** — tag/token/class rename waves: list by table, require human approval per cluster; blind sweeps hit false positives on shared prefixes.
72
+
73
+ ## §The version-coverage table
74
+
75
+ Maintained at the top of the guide; classifies every release so a gap-jumping consumer knows which sections apply: `additive` (bump and go) · `BREAKING (N items)` (has a section) · `structural` (import retargeting) · `rename` (wide namespace rename, manual-review by cluster). Note forward-looking volatile surfaces at the bottom of the guide so the next breaking-release author knows where churn concentrates.
76
+
77
+ ## §Anti-patterns
78
+
79
+ Authoring the guide after the cut ships (it's part of the release scope) · a `perl -i -pe` for a semantic flip · merged alternation sweeps · skipping the in-repo sweep · a CHANGELOG bullet with no guide section for a real break (the CHANGELOG says *what*, the guide says *how*) · doing the consumer sweep from here.
80
+
81
+ ## §Done when
82
+
83
+ 1. Every breaking item in the cut's CHANGELOG has a matching subsection (audit + sweep, or a labeled manual-review note).
84
+ 2. In-repo surfaces swept; the sweep-verification grep reports 0 legacy hits.
85
+ 3. The cut's structural/demo gates pass.
86
+ 4. The release notes carry the `⚠️` heads-up linking the section.
@@ -0,0 +1,90 @@
1
+ # `notes-authoring.md` — release notes: GH body · Slack post · multi-version rollup
2
+
3
+ > Load for the end-of-cycle notes step or a notes-only request. The GH release
4
+ > body attached to each per-package tag is the **durable record**; drafts live in
5
+ > the session scratch dir and the operator copy-pastes — the skill never posts to
6
+ > Slack directly.
7
+
8
+ ## §Author from the diff, not the intent
9
+
10
+ Draft every note from `git diff <prev-tag>..HEAD` — what actually shipped — never from an ADR's intent or a PR's plan. The first two commands of any draft:
11
+
12
+ ```bash
13
+ git log --oneline <prev-tag>..HEAD
14
+ git diff --stat <prev-tag>..HEAD
15
+ ```
16
+
17
+ If the diff contradicts the plan (a feature deferred, a refactor split across cuts), the notes follow the diff. This is a discipline because the inverse shipped a real defect: notes copied from an ADR once claimed features that were never staged into the cut. F-N1 catches *undocumented diff*, not *over-claimed notes* — that guard is the author's.
18
+
19
+ ## §The GH release body (single version, ~80–200 lines)
20
+
21
+ All 11 packages get the same body (`gh release create <pkg>-vX.Y.Z --notes-file …`).
22
+
23
+ ```markdown
24
+ ## vX.Y.Z — <one-line tagline>
25
+
26
+ 11-package lockstep **PATCH** cut. <One sentence on scope.>
27
+
28
+ ### `@adia-ai/<substantive-pkg>`
29
+ - **<Bold-prefix headline>.** <Why → what → inline file paths.> Closes <FEEDBACK-NN>.
30
+
31
+ ### Ride-along stubs
32
+ `@adia-ai/<pkg1>`, `@adia-ai/<pkg2>`, … — version bump only.
33
+
34
+ ### Verification
35
+ - `check:lockstep` OK at `X.Y.Z / ^X.Y.0`
36
+ - **N/N vitest** · typecheck clean · `components --verify` clean · `verify:traits` 100%
37
+ - `check:demo-shells` · `check:lightningcss-build` · `verify:corpus` 0/0 · `check:embeddings-fresh` OK
38
+ - `smoke:engines` · `smoke:register-engine` 11/11 · `eval:diff zettel` cov=N% avg=N · `check:links` clean
39
+
40
+ ### Install
41
+ npm i @adia-ai/web-components@X.Y.Z @adia-ai/web-modules@X.Y.Z
42
+ ```
43
+
44
+ Shape rules: open with the tagline, no preamble; group by `### @adia-ai/<pkg>`; bold-prefix every bullet then why → what → files; cite tickets by ID; before/after fenced blocks for consumer-facing markup changes; paste the verification block from the actual pre-flight output (the cycle-to-cycle repetition is a feature); a breaking cut adds a `⚠️` paragraph linking its MIGRATION GUIDE section. Anti-patterns: marketing language, vague verbs, missing file paths.
45
+
46
+ ## §The Slack post (~40–80 lines)
47
+
48
+ ```markdown
49
+ 🚀 **AdiaUI vX.Y.Z** is out — <tagline>
50
+
51
+ npm i @adia-ai/web-components@X.Y.Z @adia-ai/web-modules@X.Y.Z
52
+
53
+ 11-package lockstep PATCH cut. <One sentence.>
54
+
55
+ ## 🔷 `@adia-ai/<pkg>` — <headline>
56
+ <2–4 sentences.> Closes <FEEDBACK-NN>.
57
+
58
+ ## ✅ Verification
59
+ <one line>
60
+
61
+ ## 📚 Links
62
+ - GH Releases: https://github.com/adiahealth/gen-ui-kit/releases (filter `vX.Y.Z`)
63
+ - Live demos: https://ui-kit.exe.xyz/site/playground/gen-ui
64
+ ```
65
+
66
+ - **Install matrix is mandatory, npm + CDN, both packages**: npm always names `web-components` AND `web-modules`; the CDN block pins the `@0.X` minor range — `web-components@0.X/dist/web-components.min.{css,js}` plus `web-modules@0.X/dist/everything.min.js` as the all-in-one `<script>`.
67
+ - Section emojis: 🔷 feature · 🛠️ DX fix · 🎨 visual · 🧹 cleanup · ⚠️ breaking/behavior · ✅ verification · 📚 links.
68
+ - Slack renders standard markdown (fenced blocks, `-` bullets, `[text](URL)`); no legacy mrkdwn needed.
69
+ - **Every `https://ui-kit.exe.xyz/site/<route>` URL must be verified against `site/sitemap.json` first** — the docs site is an SPA; an unmatched route returns 200 and renders blank, so curl proves nothing. The Gen UI Canvas is `/site/playground/gen-ui`; there is no `/site/gen-ui/`.
70
+
71
+ Save drafts to the session scratch dir (e.g. `<scratch>/release-vX.Y.Z/notes.md`); strip nothing for Slack, and the GH body is the same content without the rocket header.
72
+
73
+ ## §Rollup — multi-version retrospective (≥2 versions since the last broadcast)
74
+
75
+ Audience: consumers or teammates catching up on a window (vA.B.C → vX.Y.Z). Five-section skeleton:
76
+
77
+ 1. **Header** — `🚀 AdiaUI vA.B.C → vX.Y.Z — <tagline>` + install snippet + 2–4 sentences on the window (releases count, what held across all of them, e.g. "internal deps held at ^0.X.0 throughout").
78
+ 2. **🧵 Framing section — pick ONE:**
79
+ - **A. The arcs** — 2–4 thematic strands, each naming its contributing versions. Best mid-cycle with no dominant theme.
80
+ - **B. The headline event** — one milestone (graduation, ADR ratification) with the package cuts as substrate. Best for milestone windows.
81
+ - **C. Net deltas** — what consumers see differently end-to-end: new primitives / new APIs / breaking-ish / retired, as a bullet list. Best when the window includes a MINOR or a consumer is jumping a big gap.
82
+ 3. **📦 Per-version breakdown** — one block per version: `### vN.M.X — <tagline>` + 3–5 bold-prefix bullets if substantive, 1–2 if small, a single sentence for stub-only versions. **Skip ride-along stubs entirely** — naming 6 no-change packages per version is noise.
83
+ 4. **⚠️ Behavior-changes table** (only if the window has ≥2): `| Version | Change | Opt-out / migration |`.
84
+ 5. **✅ Verification baseline** — one paragraph, not the full table: test-count growth across the window, gate roster held, eval floors held, F-N1 clean at every cut. Show the *growth* — it's the window's velocity signal. Close with one paragraph naming what the window accomplished, echoing the framing.
85
+
86
+ Save to `<scratch>/release-vA.B.C-vX.Y.Z/rollup.md`; announcement-grade rollups (milestone, MINOR) can also land as a GH "milestone" release body — operator's call.
87
+
88
+ ## §What NOT to put in notes
89
+
90
+ Internal ticket fields; implementation details with no consumer effect; "coming soon" futures; jokes — notes are a permanent artifact attached to a tag.
@@ -0,0 +1,106 @@
1
+ # `recovery-paths.md` — the 8 recovery scenarios
2
+
3
+ > Load on any F-N1 / pre-flight failure, for a batch push, or for post-release
4
+ > recovery. Each scenario: the **shape** (what the repo state looks like), the
5
+ > **resolution** (commands + judgment calls), and what to record. Every scenario
6
+ > is grounded in a real past incident; the durable record of a recovery is the
7
+ > fix commit's message + the PR description — write the "what happened / root
8
+ > cause / fix" there.
9
+
10
+ ---
11
+
12
+ ## §Scenario 1 — Version-skip correction
13
+
14
+ **Shape:** a peer's release commit mislabels the version — package.json bumped 0.6.X → 0.6.X+2, skipping X+1; the CHANGELOG body may narrate the work as two releases. No tags yet, npm latest still 0.6.X, commit unpushed. (Real case: a "v0.6.13" cut that was actually v0.6.12's work.)
15
+
16
+ **Resolution:**
17
+
18
+ 1. Verify the skip: `npm view <pkg> versions --json | tail` (no X+1 on npm) + `git tag --list 'vX.Y.*'` (no tags). Run pre-flight at the peer's commit to confirm it's shippable.
19
+ 2. Correct the version via a **new commit on top** (not amend — the peer's commit stays for history).
20
+ 3. Sweep every occurrence of the wrong version: 9 × package.json, 9 × CHANGELOG (headers + body refs), any doc/CSS-comment refs, then regenerate the lockfile. Preserve filename references that intentionally encode the original label.
21
+ 4. Commit as `fix(release): correct vX.Y.Z+1 version-skip → vX.Y.Z` documenting the discovery, then resume [`cut-procedure.md`](cut-procedure.md) at Step 5.
22
+
23
+ ## §Scenario 2 — Batch push
24
+
25
+ **Shape:** multiple unpushed `release(*): vX.Y.Z` commits since the last published tag; operator asks to "publish what's accumulated."
26
+
27
+ **Resolution:**
28
+
29
+ 1. Order the release commits oldest → newest.
30
+ 2. Per version: **tag at that version's release-commit SHA** (the batch-push exception to tag-at-HEAD), run F-N1 against each tag candidate.
31
+ 3. Push `main` once; push tags one-at-a-time (Scenario 7 prevention).
32
+ 4. **Publish in version order, oldest first, waiting for each version's workflows to settle** before dispatching the next — `npm dist-tag latest` is set by publish order. `dispatch-publish.mjs --after <prev-version>` gates on `dist-tag latest` to enforce it. If mis-ordered: `npm dist-tag add @adia-ai/<pkg>@<newest> latest` per package.
33
+ 5. One GH release note per version; site deploy once at the END (reflects HEAD).
34
+
35
+ ## §Scenario 3 — Author from scratch (`[Unreleased]` promotion)
36
+
37
+ **Shape:** source + CHANGELOG entries landed under `## [Unreleased]`, no bump, no release commit.
38
+
39
+ **Resolution:** [`cut-procedure.md`](cut-procedure.md) Variant B; `scripts/promote-unreleased.mjs` mechanizes the heading swap; fresh blocks per [`changelog-discipline.md`](changelog-discipline.md) §Authoring.
40
+
41
+ ## §Scenario 4 — `[Unreleased]` extension (early cut + entangled fix)
42
+
43
+ **Shape:** a peer pre-cut the release commit early, then landed more commits including a fix that **completes the early cut's own scope** (e.g. the demo-shell import its feature broke) entangled with unrelated `[Unreleased]` work. The early commit fails a release-blocking gate (`check:demo-shells`).
44
+
45
+ **Resolution — two options:**
46
+
47
+ 1. Cherry-pick the fix onto the release commit (off-mainline tag; messy archaeology). Only when the operator explicitly wants minimal scope.
48
+ 2. **Extend the release to HEAD** ← default. Verify HEAD passes all gates; promote the `[Unreleased]` content into `[vX.Y.Z]`; author fresh blocks for changed-but-unlogged packages; commit the CHANGELOG merge with a message documenting the boundary decision; tag at the new HEAD.
49
+
50
+ ## §Scenario 5 — Stale test detection
51
+
52
+ **Shape:** a pre-flight test fails, but it asserts a behavior a peer *deliberately* changed (the change is CHANGELOG-documented); the test was never updated.
53
+
54
+ **Resolution:** read three things — the assertion, the CHANGELOG entry, the production source. Code matches the CHANGELOG's described behavior → the test is stale: update the assertion, add an inline comment naming the vX.Y.Z change, optionally pin the new contract with an extra assertion, include the test update in the release allowlist. Code matches the test → real regression (or the CHANGELOG is wrong) — fix that instead.
55
+
56
+ ## §Scenario 6 — Concurrent peer mid-cycle
57
+
58
+ **Shape:** the working tree shifts between commands; `git stash pop` reports a conflict or "kept the stash."
59
+
60
+ **Resolution:** don't fight the peer. First confirm the release itself is fully shipped (tags pushed + npm + GH releases + site). Then for a kept stash: `git stash show -p stash@{0}` vs the file's recent `git log -p` — if the peer committed the same content, the stash is redundant → `git stash drop`; if not, leave the stash for the peer/operator to decide. Never blind-drop.
61
+
62
+ ## §Scenario 7 — Tags pushed, ZERO publish workflows fired
63
+
64
+ **Shape:** all 12 tags exist on origin, but no `publish-<pkg>.yml` run exists for them; npm latest unchanged; nothing errored.
65
+
66
+ **Root cause:** pushing many tags in **one** `git push` fires a single batched create event that GitHub Actions routinely drops. Re-pushing is a no-op (the tags already exist remotely).
67
+
68
+ **Resolution:**
69
+
70
+ ```bash
71
+ node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/dispatch-publish.mjs" \
72
+ --version X.Y.Z --verify-triggered # re-dispatches ONLY packages with no run; idempotent
73
+ ```
74
+
75
+ For a batch, preserve npm-latest ordering (`--after <prev>`). Verify against the registry, not the workflows. **Prevention:** push tags one-at-a-time ([`cut-procedure.md`](cut-procedure.md) §Step 8); `release-pack.mjs` does this automatically and follows with `--verify-triggered`.
76
+
77
+ ## §Scenario 8 — Cut on the wrong branch
78
+
79
+ **Shape:** the cut landed on a peer's local feature branch instead of `main`; caught at push (origin/main at a mid-window commit, tags pointing at the feature tip). (Real case: v0.7.4.)
80
+
81
+ **Resolution:** recovery is clean **while nothing has published** — publish is `workflow_dispatch`-driven, so npm stays put through the tangle. If the feature tip fast-forwards from main: `git branch -f main <release-sha>` → `git checkout main` → `git push origin main`. Verify `origin/main == vX.Y.Z tag == HEAD` **before** dispatching any publish. Moving tags while local is free (`tag-lockstep.mjs --delete` + re-tag); moving them after a publish is not. **Prevention:** the Step-1 `branch --show-current` check.
82
+
83
+ ---
84
+
85
+ ## §Decision flowchart
86
+
87
+ ```text
88
+ Pre-flight or F-N1 gate failed?
89
+ ├── check:demo-shells fails at the release-commit candidate?
90
+ │ └── a later fix exists but is entangled with [Unreleased] work → Scenario 4
91
+ │ otherwise → author the fix in this cycle (Variant B)
92
+ ├── check:lockstep fails → peer edited an internal range mid-PATCH → fix in place
93
+ ├── verify:corpus fails → corpus drift → route to the A2UI-pipeline skill
94
+ ├── check:embeddings-fresh fails → npm run build:embeddings:chunks; stage; note in
95
+ │ the a2ui-corpus CHANGELOG
96
+ ├── test:unit fails → Scenario 5 (stale test) OR real regression
97
+ │ (assertion vs CHANGELOG vs source tells them apart)
98
+ └── F-N1 cosmetic warns → enrichment pass (changelog-discipline.md)
99
+
100
+ Multiple unpushed release commits → Scenario 2 (batch push)
101
+ Commit's CHANGELOG version ≠ its bump → Scenario 1 (version skip)
102
+ Tags on origin, no publish runs, npm stale → Scenario 7 (batched tag push)
103
+ branch --show-current ≠ main → Scenario 8 (wrong branch)
104
+ Working tree dirty at cycle start → classify + stash per
105
+ cut-procedure.md §Step 2
106
+ ```
@@ -8,11 +8,11 @@
8
8
  // node bump.mjs --from 0.6.20 --to 0.6.21
9
9
  // node bump.mjs --from 0.6.20 --to 0.6.21 --dry
10
10
  //
11
- // Phase 1 of the adia-ui-release skill. Replaces the /tmp/vXXX-prep.mjs
11
+ // Part of the adia-release skill. Replaces the /tmp/vXXX-prep.mjs
12
12
  // improvisation pattern from the v0.6.13 → v0.6.21 cycles.
13
13
  //
14
14
  // Exits:
15
- // 0 — all 9 bumped successfully (or --dry succeeded)
15
+ // 0 — all 11 bumped successfully (or --dry succeeded)
16
16
  // 1 — at least one package not at --from (no mutation)
17
17
  // 2 — bad args / file I/O error
18
18
  // 3 — partial mutation (shouldn't happen if --from validation passes)
@@ -31,8 +31,21 @@ const PACKAGES = [
31
31
  'packages/a2ui/retrieval',
32
32
  'packages/a2ui/runtime',
33
33
  'packages/a2ui/validator',
34
+ // Plugins joined the lockstep 2026-07-15 (see check-lockstep.mjs's POLICY
35
+ // note). Each also carries a .claude-plugin/plugin.json whose version MUST
36
+ // move with package.json — plugin.json is the /plugin-update cache key
37
+ // (verify:plugins gates the sync).
38
+ 'packages/plugins/adia-ui-factory',
39
+ 'packages/plugins/adia-ui-forge',
34
40
  ];
35
41
 
42
+ // Sibling manifests bumped in the same pass as package.json (path relative to
43
+ // the package dir). Today: the Claude Code plugin manifests.
44
+ const SIBLING_MANIFESTS = {
45
+ 'packages/plugins/adia-ui-factory': '.claude-plugin/plugin.json',
46
+ 'packages/plugins/adia-ui-forge': '.claude-plugin/plugin.json',
47
+ };
48
+
36
49
  function parseArgs(argv) {
37
50
  const args = { from: null, to: null, dry: false, repo: process.cwd() };
38
51
  for (let i = 0; i < argv.length; i++) {
@@ -96,6 +109,18 @@ function bumpAll(packages, from, to, dry) {
96
109
  if (!dry) fs.writeFileSync(p.path, out);
97
110
  bumped++;
98
111
  console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}: ${from} → ${to}`);
112
+ const sibling = SIBLING_MANIFESTS[p.pkg];
113
+ if (sibling) {
114
+ const sibPath = path.join(path.dirname(p.path), sibling);
115
+ const sibTxt = fs.readFileSync(sibPath, 'utf8');
116
+ const sibOut = sibTxt.replace(FROM_PATTERN, TO_LITERAL);
117
+ if (sibOut === sibTxt) {
118
+ console.error(`error: ${p.pkg}/${sibling} — regex did not match (plugin.json out of sync?)`);
119
+ return -1;
120
+ }
121
+ if (!dry) fs.writeFileSync(sibPath, sibOut);
122
+ console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${sibling}: ${from} → ${to}`);
123
+ }
99
124
  }
100
125
  return bumped;
101
126
  }
@@ -106,7 +131,7 @@ function main() {
106
131
  if (!validateAllAtFrom(packages, args.from)) process.exit(1);
107
132
  const bumped = bumpAll(packages, args.from, args.to, args.dry);
108
133
  if (bumped < 0) process.exit(3);
109
- console.log(`\n[bump] ${bumped}/9 ${args.dry ? '(dry — no files written)' : 'bumped'}`);
134
+ console.log(`\n[bump] ${bumped}/${PACKAGES.length} ${args.dry ? '(dry — no files written)' : 'bumped'}`);
110
135
  if (!args.dry) {
111
136
  console.log(`\n[next] regenerate the lockfile:`);
112
137
  console.log(` npm install --package-lock-only --no-audit --no-fund`);