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

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 +3 -6
  2. package/CHANGELOG.md +27 -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 +27 -2
  90. package/skills/{adia-ui-release → adia-release}/scripts/dispatch-publish.mjs +4 -1
  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 +13 -21
  95. package/skills/{adia-ui-release → adia-release}/scripts/tag-lockstep.mjs +5 -1
  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
@@ -1,114 +0,0 @@
1
- # Case study — v0.6.12 version-skip correction
2
-
3
- **Cycle:** 2026-05-20 (v0.6.11 → v0.6.12) **Scenario:** `recovery-paths.md` § Scenario 1 (version-skip) **Source ledger:** `.brain/audit-history/2026-05-20-release-v0.6.12.json` **Outcome:** Peer commit mislabeled v0.6.13; corrected in-place to v0.6.12 across 25 files; shipped cleanly.
4
-
5
- ---
6
-
7
- ## §The shape
8
-
9
- User asked: _"prepare and initiate 0.6.12 release"_.
10
-
11
- Operator re-baselined and found:
12
-
13
- - All 9 `package.json` at version `0.6.13` (not `0.6.12`).
14
- - NO `v0.6.12` tags anywhere.
15
- - npm latest: `0.6.11` (operator had shipped it 1 turn earlier).
16
- - The most recent commit: `e8490d96d release(*): v0.6.13 lockstep — admin-shell composition anchors + legacy CSS bridges retired (FB-04 follow-up / FB-05 dogfood / ADR-0032)`. **Unpushed.**
17
-
18
- A peer agent had cut a release commit labeled v0.6.13, jumping straight from v0.6.11 → v0.6.13. The CHANGELOG bodies even referenced both _"the v0.6.12 dogfooding sweep"_ AND _"the v0.6.13 cut"_ as if they were separate releases. Inspecting the commit content showed they were the same work.
19
-
20
- ---
21
-
22
- ## §The diagnosis
23
-
24
- The peer had executed a multi-phase plan (`.brain/notes/2026-05-20-v0.6.13-admin-shell-composition-anchors.md`) that originally staged the work across v0.6.12 + v0.6.13 + v0.7.0, then collapsed all the phases into one commit but kept the v0.6.13 label.
25
-
26
- Symptoms confirming "single commit mislabeled" (vs "two separate releases, one missing"):
27
-
28
- - One release commit, not two.
29
- - `e8490d96d`'s file footprint matched the cumulative diff for both "phases" the CHANGELOGs described.
30
- - ADR-0032 named `v0.6.13` as the cut version (singular).
31
- - `.brain/notes/2026-05-20-v0.6.12-bespoke-css-coverage-audit.md` (the audit note) line 19 explicitly: _"Scope decision (corrected from plan (then-named v0.7.0, shipped as v0.6.13) §Phase 0 Step 4)"_ — the peer themselves had already flagged the misattribution but hadn't reconciled the version label.
32
-
33
- User wanted v0.6.12. The peer's work was v0.6.12-shape. The label was the only thing wrong.
34
-
35
- ---
36
-
37
- ## §The fix
38
-
39
- **One correction commit on top** of the peer's commit (NOT amending — the peer's commit is preserved for archaeology; `b62992aa0` is the repo precedent for forensic correction-commits).
40
-
41
- The correction rewrote every occurrence of the wrong version:
42
-
43
- | Category | Files | Touches |
44
- | --- | --- | --- |
45
- | `package.json` version field | 9 | 9 |
46
- | `CHANGELOG.md` headers + body refs | 9 | ~18 |
47
- | admin-shell CSS header comments | 4 | ~8 |
48
- | ADR-0032 (lockstep cut + Decision/Consequences/Verification refs) | 1 | ~6 |
49
- | FEEDBACK-05 ticket draft (status line) | 1 | 1 |
50
- | v0.6.12 audit note (factual ref) | 1 | 1 |
51
- | `package-lock.json` (regenerated via `npm install --package-lock-only`) | 1 | many |
52
- | **Total** | **25 files** | **~50 edits** |
53
-
54
- A Node script (`/tmp/v0612-correct.mjs`) handled the mechanical sweep with two regex patterns:
55
-
56
- ```js
57
- // Most files — replace 0.6.13 → 0.6.12 unconditionally
58
- txt.replace(/v0\.6\.13/g, 'v0.6.12');
59
-
60
- // ADR-0032 — preserve the plan-note filename ref while changing
61
- // version claims; negative-lookahead the filename pattern
62
- txt.replace(/v0\.6\.13(?!-admin-shell-composition-anchors)/g, 'v0.6.12');
63
- ```
64
-
65
- The plan note `.brain/notes/v0.6.13-admin-shell-composition-anchors-*` file was NOT renamed — it's archaeological planning material; renaming would cascade to every reference in ADR-0032 + the audit note. The correction commit kept the original filename and treated it as a plan-history artifact rather than a current-state claim.
66
-
67
- Commit message named the problem + the fix + the precedent:
68
-
69
- ```text
70
- fix(release): correct v0.6.13 version-skip → v0.6.12
71
-
72
- The preceding release commit e8490d96d ("release(*): v0.6.13 lockstep")
73
- bumped all 9 packages 0.6.11 → 0.6.13, skipping 0.6.12 entirely.
74
- 0.6.12 was never tagged, never published — npm latest is 0.6.11. The
75
- next contiguous version is 0.6.12, not 0.6.13.
76
-
77
- Corrected 0.6.13 → 0.6.12 across 25 files: ...
78
- ```
79
-
80
- Then the standard cycle resumed: tag v0.6.12 at the correction commit HEAD, F-N1, push, publish, GH releases, site deploy, ledger.
81
-
82
- ---
83
-
84
- ## §The lesson
85
-
86
- 1. **Re-baseline catches version-skip BEFORE you tag.** The user asked for v0.6.12; the operator checked package.json + tags + npm latest + git log; the mismatch surfaced in 3 commands.
87
- 2. **Correction commit, not amend.** A NEW commit on top preserves the peer's commit (and its message + SHA) as archaeology. The audit-history ledger documents what happened. Future cycles can trace.
88
- 3. **Don't rename filenames carrying historical context.** Plan notes with version-prefixed names are archaeological; their reference graph (ADRs, audit notes, ledgers) is brittle. Treat them as immutable once committed. Use the commit message + ledger to reconcile the version-label conflict.
89
- 4. **Negative-lookahead regex protects filename references** from a blanket version replace. `/v0\.6\.13(?!-admin-shell-...)/g` is the pattern.
90
-
91
- ---
92
-
93
- ## §Ledger fragment
94
-
95
- The v0.6.12 audit-history ledger captured this in a dedicated `version_skip_correction` block:
96
-
97
- ```json
98
- "version_skip_correction": {
99
- "issue": "Peer release commit e8490d96d ('release(*): v0.6.13 lockstep') bumped all 9 packages 0.6.11 → 0.6.13, skipping 0.6.12 entirely. 0.6.12 was never tagged or published (npm latest was 0.6.11). The commit's CHANGELOG bodies further framed the work as two separate releases ('v0.6.12 dogfooding sweep' + 'v0.6.13 cut') though it is a single commit.",
100
- "root_cause": "Original multi-phase plan staged work across v0.6.12 / v0.6.13 / v0.7.0; phases collapsed into one commit but the version label landed on 0.6.13 instead of the contiguous-next 0.6.12.",
101
- "fix": "Correction commit 2ee4a1f18 — 0.6.13 → 0.6.12 across 9 package.json + 9 CHANGELOG (headers/body/anchors) + 4 admin-shell CSS comment refs + ADR-0032 + FEEDBACK-05 + the v0.6.12 audit note + package-lock.json regen. The plan-note filename (v0.6.13-admin-shell-...) was intentionally left as archaeological planning material; authoritative records (CHANGELOG/ADR/package.json) are correct."
102
- }
103
- ```
104
-
105
- The presence of this block in a ledger is the signal — `grep -l "version_skip_correction" .brain/audit-history/*.json` lists every cycle that needed this scenario applied.
106
-
107
- ---
108
-
109
- ## §Cross-references
110
-
111
- - `../../references/recovery-paths.md` § Scenario 1 — the canonical resolution checklist
112
- - `../../references/multi-agent-baseline.md` § Re-baseline — the discipline that surfaces this scenario in the first 3 commands
113
- - `../../references/ledger-discipline.md` § What ELSE to capture per kind — the `version_skip_correction` block schema
114
- - Repo precedent: `b62992aa0 chore(forensic): v0.6.10 release-prep misattribution` — the prior cycle that established the forensic-correction-commit pattern.
@@ -1,139 +0,0 @@
1
- # Case study — v0.6.18 `[Unreleased]` promotion + demo-shell fix
2
-
3
- **Cycle:** 2026-05-21 (v0.6.17 → v0.6.18) **Scenario:** `recovery-paths.md` § Scenario 4 (`[Unreleased]` extension on incomplete release commit) **Source ledger:** `.brain/audit-history/2026-05-21-release-v0.6.18.json` **Outcome:** Peer's early release commit failed a release-blocking gate; cycle extended to HEAD via `[Unreleased]` → `[0.6.18]` promotion.
4
-
5
- ---
6
-
7
- ## §The shape
8
-
9
- User asked: _"prepare and initiate 0.6.18 release"_.
10
-
11
- Operator re-baselined and found 15 unpushed commits since the v0.6.17 ledger. Among them:
12
-
13
- - `f167b72bc release(*): v0.6.18 lockstep — loading state (FB-12 P2) + text-ui overlay attrs (FB-10)` — the peer's release commit, **cut early**.
14
- - 14 commits AFTER it, including:
15
- - `8da3825b7 skill v2.11.0`
16
- - `dfeb712d4 docs(admin-shell) sidebar gallery`
17
- - `9207e801e fix(*): resolve outbox tickets FB-14/15/16/17/18`
18
- - `d6d980072 fix(demo-shells): import skeleton-ui in stat + table demo shells` — ← **completes v0.6.18's own scope**
19
- - `fec55d82d skill v2.12.0`
20
- - `5c739a659 fix(check:skills)`
21
- - (and more)
22
-
23
- One of the post-commits had a CHANGELOG fragment naming itself "post-v0.6.18": _"docs(tickets): update TRIAGE-2026-05-21 + file FB-12 followup post-v0.6.18"_. The peer's intent was clear: `f167b72bc` IS v0.6.18; everything after is for a future release, staged under `## [Unreleased]`.
24
-
25
- ---
26
-
27
- ## §The diagnosis (the surprising part)
28
-
29
- Operator did a detached checkout to f167b72bc and ran the pre-flight gates AT THAT COMMIT:
30
-
31
- ```text
32
- === check:demo-shells (at f167b72bc) ===
33
- demo: packages/web-components/components/table/table.html
34
- missing: skeleton-ui
35
- declared: check-ui, icon-ui, progress-ui, pagination-ui, skeleton-ui, badge-ui
36
- ✗ FAIL
37
- ```
38
-
39
- **`f167b72bc` failed `check:demo-shells`.** The cycle's own substantive feature (FB-12 `stat-ui loading` + `table-ui loading` shipped via `<skeleton-ui>`) was used in the stat/table demo `.html` shells, but those shells didn't import `<skeleton-ui>`. The demo pages would render `<skeleton-ui>` as `HTMLUnknownElement` — unstyled, unregistered.
40
-
41
- The fix existed: `d6d980072 fix(demo-shells): import skeleton-ui in stat + table demo shells` — but it landed **10 commits later**, entangled with FB-13/14/15/17 `[Unreleased]` work.
42
-
43
- Two choices:
44
-
45
- - **Option A**: Cherry-pick `d6d980072` onto `f167b72bc` to make the release commit shippable in its original scope. Off-mainline tag (the new commit isn't on `main`'s mainline). Messy archaeology.
46
- - **Option B**: Extend v0.6.18 to HEAD by promoting the `[Unreleased]` content into `[0.6.18]`. The release becomes larger but ships everything consistent.
47
-
48
- Operator chose **Option B**. Rationale: the peer had clearly intended to ship `f167b72bc` as v0.6.18 + had documented further work as `[Unreleased]` for the next cut — but the demo-shell fix is **part of v0.6.18's own scope** (it completes the feature the cut introduced). Extending v0.6.18 to absorb everything is the honest framing.
49
-
50
- ---
51
-
52
- ## §The fix
53
-
54
- ### 1. Verify HEAD passes all gates
55
-
56
- ```bash
57
- git checkout main # return from detached HEAD
58
- npm run check:demo-shells # PASSES at HEAD
59
- ```
60
-
61
- ### 2. Promote `[Unreleased]` → `[0.6.18]` across affected CHANGELOGs
62
-
63
- The `[Unreleased]` blocks on `main` (post-`f167b72bc`) had:
64
-
65
- - `packages/web-components/CHANGELOG.md` — FB-14 (toggle-scheme `[data-scheme]`) + FB-15 (button-ui warn)
66
- - `packages/web-modules/CHANGELOG.md` — FB-17 (admin-sidebar resize-handle diagnostic) + sidebar-gallery docs
67
-
68
- The `[0.6.18]` block at line ~17 of each was a STUB ("Lockstep version bump only. No source changes in this package") — but the package DID change post-cut. The peer hadn't reconciled the stub.
69
-
70
- The merge:
71
-
72
- - web-components: delete the `## [Unreleased]` heading; FB-14 + FB-15 sections fall under `[0.6.18]` (with the existing FB-12 + FB-10 entries from the original cut).
73
- - web-modules: delete the `## [Unreleased]` heading AND the stub `## [0.6.18]` block; FB-17 + sidebar-gallery sections become the new `## [0.6.18]` block.
74
- - a2ui-corpus: had no `[Unreleased]` block but the catalog regenerated post-cut. Authored a fresh `## [0.6.18]` entry per `changelog-discipline.md` § Authoring.
75
-
76
- ### 3. Commit + tag
77
-
78
- ```bash
79
- git add packages/web-components/CHANGELOG.md \
80
- packages/web-modules/CHANGELOG.md \
81
- packages/a2ui/corpus/CHANGELOG.md
82
-
83
- git commit -m "$(cat <<'EOF'
84
- chore(release): promote [Unreleased] → [0.6.18] — v0.6.18 = HEAD
85
-
86
- The v0.6.18 release commit f167b72bc (loading state FB-12 + text-ui
87
- FB-10) cannot be tagged in isolation: it fails check:demo-shells —
88
- its own skeleton-ui demos (stat.html / table.html) don't import
89
- skeleton-ui. The fix landed 10 commits later in d6d980072,
90
- interleaved with unrelated [Unreleased] feedback work (FB-13/14/15/16/17),
91
- so the demo-shell fix cannot be cleanly cherry-picked onto f167b72bc.
92
-
93
- Resolution: v0.6.18 absorbs everything through HEAD. The peer parked
94
- post-f167b72bc work under ## [Unreleased] expecting the next release
95
- cut to promote it — this IS that cut. ...
96
- EOF
97
- )"
98
- ```
99
-
100
- Then tag v0.6.18 at THIS new commit (the `[Unreleased]` merge), **NOT** at f167b72bc. Per the standard tag-at-HEAD invariant.
101
-
102
- ```bash
103
- git tag v0.6.18
104
- # + 9 per-package tags
105
- ```
106
-
107
- ### 4. F-N1 + push + publish + GH releases + site + ledger
108
-
109
- Standard cycle from here. F-N1 was clean at 9/9 (the CHANGELOG promotion brought all the post-cut work under documented `[0.6.18]` entries).
110
-
111
- ### 5. Document the boundary decision in the ledger
112
-
113
- ```json
114
- "boundary_decision": {
115
- "issue": "Early release commit f167b72bc failed check:demo-shells. Fix landed in d6d980072, entangled with [Unreleased] work that includes FB-13/14/15/17.",
116
- "resolution": "v0.6.18 absorbs everything through HEAD. [Unreleased] CHANGELOG sections promoted to [0.6.18] across web-components + web-modules + a2ui-corpus. v0.6.18 tags land at the [Unreleased]-merge commit.",
117
- "verified": "f167b72bc check:demo-shells FAIL confirmed via detached checkout; HEAD check:demo-shells PASS confirmed (124 shells)."
118
- }
119
- ```
120
-
121
- ---
122
-
123
- ## §The lesson
124
-
125
- 1. **A release commit can fail its own scope.** When a new feature needs demo-shell updates and the cut happens before those updates land, the release commit is incomplete. Pre-flight the release-commit candidate, not just HEAD.
126
- 2. **Detached checkout is the rigorous diagnostic tool.** `git checkout <release-commit-sha>` + `npm run check:demo-shells` tells you the truth — does the tag candidate ship a working demo?
127
- 3. **Extending vs cherry-picking.** When the completing fix is ENTANGLED with unrelated `[Unreleased]` work (10 commits later, interleaved with feedback fixes), extension via `[Unreleased]` promotion is the clean path. Cherry-picking off-mainline produces messy archaeology.
128
- 4. **The peer's `[Unreleased]` parking IS the next-release signal.** Keep-a-Changelog's `[Unreleased]` block exists precisely so the NEXT release cut can promote it. When the peer cut early and continued building, the operator's job is to read `[Unreleased]` as v0.X.Y intent.
129
- 5. **The boundary-decision block in the ledger.** Every cycle that extends a release-commit's scope deserves a documented rationale. Future cycles reading `.brain/audit-history/` can trace what happened.
130
-
131
- ---
132
-
133
- ## §Cross-references
134
-
135
- - `../../references/recovery-paths.md` § Scenario 4 — the canonical checklist
136
- - `../../references/gates-catalog.md` § Category 3 § `check:demo-shells` — the gate that triggered this scenario; failure is **HIGH severity**
137
- - `../../references/changelog-discipline.md` § Promotion — the heading-swap mechanic that merged `[Unreleased]` into `[0.6.18]`
138
- - `../../references/changelog-discipline.md` § Authoring — the fresh-block authoring path for a2ui-corpus
139
- - `../../references/ledger-discipline.md` — the `boundary_decision` block schema (extended in this case study)
@@ -1,124 +0,0 @@
1
- # Case study — FEEDBACK-37 retraction (v0.6.20 → v0.6.21)
2
-
3
- **Cycles:** 2026-05-21 (v0.6.19 → v0.6.20 → v0.6.21) **Scenario:** `recovery-paths.md` § Scenario 6 (concurrent peer mid-cycle) + `../../references/recovery-paths.md` § post-publish revert **Source ledgers:** `2026-05-21-release-v0.6.20.json`, `2026-05-21-release-v0.6.21.json` **Outcome:** Feature shipped in v0.6.20; retracted one cycle later in v0.6.21 after a peer-led re-diagnosis ratified by ADR-0033.
4
-
5
- ---
6
-
7
- ## §The shape — v0.6.20 cycle
8
-
9
- User asked: _"prepare and initiate 0.6.20 release"_. The cycle was a substantial Mode 2 (author from scratch) with claims-ui-v5 feedback batch FB-34–39 already landed under `[Unreleased]`, plus a new `<admin-entity-item>` shell primitive.
10
-
11
- Among the FEEDBACK closures: **FEEDBACK-37** — _"admin-shell warns when `<admin-topbar>` / `<admin-statusbar>` is missing its slot."_ The fix added a `#checkSlotContracts()` method to `admin-shell.js` that emitted a one-shot `console.warn` when an `<admin-topbar>` or `<admin-statusbar>` element was placed inside `<admin-sidebar>` or `<admin-content>` without `slot="header"` / `slot="footer"`.
12
-
13
- The web-modules `[0.6.20]` CHANGELOG documented this as:
14
-
15
- > `### Added — admin-shell warns when <admin-topbar> / <admin-statusbar> is missing its slot (FEEDBACK-37)`
16
-
17
- ---
18
-
19
- ## §The mid-cycle discovery
20
-
21
- While operator was staging the v0.6.20 release commit, `git status` showed an UNEXPECTED uncommitted change:
22
-
23
- ```text
24
- M packages/web-modules/shell/admin-shell/admin-shell.js
25
- ```
26
-
27
- Diffing it: a peer had **uncommitted-staged a REVERT** of the FEEDBACK-37 method — `#checkSlotContracts()` was being removed, `static #warnedSlots = new WeakSet()` was being removed, the call site in `connected()` was being removed.
28
-
29
- But the v0.6.20 CHANGELOG documented FEEDBACK-37 as **added**. The peer's uncommitted revert directly contradicted the release's own documentation.
30
-
31
- Operator applied `multi-agent-baseline.md` § Discipline 4 (stash workflow for strays):
32
-
33
- ```bash
34
- git stash push packages/web-modules/shell/admin-shell/admin-shell.js \
35
- .agents/skills/<companion-skill>/SKILL.md \
36
- -m "v0.6.20-cycle: peer-in-flight FEEDBACK-37 revert in admin-shell.js + SKILL.md — excluded from release"
37
- ```
38
-
39
- v0.6.20 shipped with FEEDBACK-37 PRESENT (matching the CHANGELOG), the stashed revert preserved for the peer.
40
-
41
- ---
42
-
43
- ## §The post-publish discovery
44
-
45
- Right after v0.6.20 publishes settled, operator ran `git stash pop` to restore the peer's working state. The pop reported "kept the stash" — a conflict.
46
-
47
- Investigation:
48
-
49
- ```bash
50
- git log d7d44a727..HEAD --oneline
51
- # 664cb3f55 fix(*): 0.6.20 follow-up — revert admin-shell slot warn + toast/input fixes
52
- ```
53
-
54
- **The peer had committed the revert RIGHT AFTER v0.6.20 publishes settled.** The commit message named the intent: _"0.6.20 follow-up — revert admin-shell slot warn."_
55
-
56
- So FEEDBACK-37 shipped in v0.6.20 and the peer immediately reverted it for v0.6.21. The "follow-up" naming implied the peer had already diagnosed this as a misdiagnosis and wanted to retract.
57
-
58
- The stash became redundant — the peer committed the same content. Operator dropped the stash:
59
-
60
- ```bash
61
- git stash drop stash@{0}
62
- ```
63
-
64
- The v0.6.20 ledger named the situation in `notes`:
65
-
66
- > "PEER-IN-FLIGHT EXCLUDED: a concurrent peer had an uncommitted revert of the FEEDBACK-37 slot-contract diagnostic in admin-shell.js (removed #checkSlotContracts() + #warnedSlots). v0.6.20's CHANGELOG documents FEEDBACK-37 as ADDED, and the feature IS committed (d32e34b4f). The uncommitted revert directly contradicts the [0.6.20] CHANGELOG, so it was git-stashed and excluded — v0.6.20 ships the committed state (FEEDBACK-37 present). The revert + SKILL.md edit were restored to the working tree post-release for the peer. FLAGGED to operator: a peer may be reconsidering FEEDBACK-37; if the revert lands, v0.6.21 would remove what v0.6.20 adds."
67
-
68
- ---
69
-
70
- ## §The v0.6.21 cycle — retraction
71
-
72
- User asked: _"prepare and initiate 0.6.21 release"_.
73
-
74
- The v0.6.21 cycle was a normal Mode 2 (author from scratch). The web-modules `[Unreleased]` block now had:
75
-
76
- > `### Fixed — admin-shell no longer emits a spurious slot-contract console.warn`
77
-
78
- Phrased as a **fix** (a spurious warn was removed), not a **removal** (the feature was rescinded). The peer's framing: the v0.6.20 diagnostic had been **misdiagnosed**, and emitted false positives on legitimate compositions where `<admin-topbar>` / `<admin-statusbar>` landed in the default body slot LEGITIMATELY (per the Light-DOM substrate's `slot=` decorative-not-directive semantics).
79
-
80
- The cycle also ratified the framing as **ADR-0033 "Light-DOM substrate"** — making explicit the stance that `slot=` is decorative metadata, not a projection directive; positioning is by CSS rules matching tag + ancestor + DOM order. This is the _zeroth question_ to ask when output looks wrong: "am I treating `slot=` as if it's directive when the substrate is Light-DOM?"
81
-
82
- v0.6.21 shipped the retraction + ADR-0033. The release notes carried a **heads-up paragraph** naming the round-trip:
83
-
84
- > **Heads-up:** v0.6.20 shipped a FEEDBACK-37 slot-contract `console.warn` that was found to misdiagnose legitimate compositions. v0.6.21 retracts it. If you're on v0.6.20 and saw the warn fire, you can ignore it — upgrade to v0.6.21.
85
-
86
- ---
87
-
88
- ## §The lesson
89
-
90
- 1. **A peer's uncommitted revert is a SIGNAL.** Diff it, classify per `multi-agent-baseline.md` § Discipline 2, decide. Don't silently ship; don't silently revert.
91
- 2. **CHANGELOG-contradicting strays MUST be excluded.** v0.6.20's CHANGELOG documented FEEDBACK-37 as ADDED; shipping with the revert applied would have made the CHANGELOG dishonest.
92
- 3. **One-version round-trips are recoverable.** A feature shipped in vN.M.X and retracted in vN.M.Y+1 isn't catastrophic — the retraction note explains it. The cost is a one-line "if you saw X, upgrade" in the v0.6.21 release notes.
93
- 4. **Ratification via ADR.** When a retraction reveals a deeper framing issue (here, Light-DOM substrate mechanics), write an ADR. ADR-0033 is the durable artifact; the retracted feature becomes the prompt that surfaced the architectural decision.
94
- 5. **Stash-then-restore preserves peer work.** The stash workflow meant zero data loss for the peer; the peer committed the same content shortly after; the stash became redundant.
95
- 6. **The flagged-to-operator note in the v0.6.20 ledger correctly predicted v0.6.21.** Future cycles reading the ledger can trace "feature shipped + ledger flagged thrash risk + retracted next cycle" as a pattern.
96
-
97
- ---
98
-
99
- ## §Ledger fragments
100
-
101
- ### v0.6.20 ledger (the flag)
102
-
103
- ```json
104
- "notes": [
105
- "PEER-IN-FLIGHT EXCLUDED: a concurrent peer had an uncommitted revert of the FEEDBACK-37 slot-contract diagnostic in admin-shell.js. v0.6.20's CHANGELOG documents FEEDBACK-37 as ADDED, and the feature IS committed (d32e34b4f). The uncommitted revert directly contradicts the [0.6.20] CHANGELOG, so it was git-stashed and excluded — v0.6.20 ships the committed state (FEEDBACK-37 present). FLAGGED to operator: a peer may be reconsidering FEEDBACK-37; if the revert lands, v0.6.21 would remove what v0.6.20 adds."
106
- ]
107
- ```
108
-
109
- ### v0.6.21 ledger (the retraction)
110
-
111
- ```json
112
- "feedback_37_round_trip": "FEEDBACK-37 (admin-shell slot-contract diagnostic) shipped in v0.6.20 and is retracted in v0.6.21 — found to misdiagnose legitimate compositions. One-version round-trip. Post-mortem at journal §398; correction-loop discipline captured in a companion skill; Light-DOM substrate stance made explicit at ADR-0033."
113
- ```
114
-
115
- ---
116
-
117
- ## §Cross-references
118
-
119
- - `../../references/recovery-paths.md` § Scenario 6 — concurrent peer mid-cycle
120
- - `../../references/multi-agent-baseline.md` § Discipline 4 — stash workflow
121
- - `../../references/notes-authoring.md` § Cross-references — heads-up paragraph pattern in single-version notes
122
- - `../../references/ledger-discipline.md` § notes (the lesson log) — the PEER-IN-FLIGHT EXCLUDED phrasing
123
- - ADR-0033 — Light-DOM substrate
124
- - a companion consultant skill — the correction-loop discipline that generalizes the lesson (diagnose layer-of-origin before patching)
@@ -1,125 +0,0 @@
1
- # Case study — F-N1 diff-coverage enrichment pass (v0.6.19)
2
-
3
- **Cycle:** 2026-05-21 (v0.6.18 → v0.6.19) **Scenario:** `recovery-paths.md` § F-N1 cosmetic warns → enrich path keywords **Source ledger:** `.brain/audit-history/2026-05-21-release-v0.6.19.json` **Outcome:** 2 cosmetic warns converted to 9/9 clean via 2-line CHANGELOG wording tweaks + commit amend + re-tag.
4
-
5
- ---
6
-
7
- ## §The shape
8
-
9
- Operator authored v0.6.19 from scratch (claims-ui-v4 FB-22…33 batch). After tagging, F-N1 (`check:release --all-pending`) reported 2 warns:
10
-
11
- ```text
12
- ⚠ [warn] diff 'packages/a2ui/corpus/chunks/' touched between
13
- a2ui-corpus-v0.6.18 → a2ui-corpus-v0.6.19 but CHANGELOG [0.6.19]
14
- doesn't mention 'chunks'
15
-
16
- ⚠ [warn] diff 'packages/web-components/core/' touched between
17
- web-components-v0.6.18 → web-components-v0.6.19 but CHANGELOG [0.6.19]
18
- doesn't mention 'core'
19
- ```
20
-
21
- Both changes WERE documented:
22
-
23
- - a2ui-corpus entry described "~235 chunk JSON files re-harvested" + "Companion `chunk-reconcile` triage" — but neither literally used the keyword `chunks` (path token).
24
- - web-components entry described "`UIElement.ensure()` part-wipe invariant" — described `UIElement` extensively but didn't say `core` (path token).
25
-
26
- F-N1's diff-coverage regex matches **literal path tokens**. The entries were content-complete but missed the regex's keyword.
27
-
28
- ---
29
-
30
- ## §The diagnosis
31
-
32
- Cosmetic vs real failure decision (per `changelog-discipline.md` § F-N1 enrichment):
33
-
34
- > Read the CHANGELOG entry: does any bullet describe the touched files (by component name, by what the change does)? If yes → cosmetic → enrich. If no → real → author.
35
-
36
- Both bullets described the touched code — `~235 chunk JSON files` and `UIElement.ensure() part-wipe invariant`. Cosmetic warns.
37
-
38
- ---
39
-
40
- ## §The fix
41
-
42
- Two minimal wording tweaks to inject the path keywords naturally:
43
-
44
- ### a2ui-corpus entry
45
-
46
- Before:
47
-
48
- ```text
49
- Freshened the stale chunk corpus: ~235 chunk JSON files re-harvested/reconciled
50
- ```
51
-
52
- After:
53
-
54
- ```text
55
- Freshened the stale corpus chunks: ~235 JSON files under `chunks/` re-harvested/reconciled
56
- ```
57
-
58
- Word reorder ("chunk corpus" → "corpus chunks") + add the path reference `under \`chunks/\``. Both keywords now present; reads naturally; conveys the same information.
59
-
60
- ### web-components entry (FEEDBACK-31 section)
61
-
62
- Before:
63
-
64
- ```text
65
- - `ensure()` marks stamped structural parts with `_uiPart = true` and its
66
- doc comment states the invariant: ...
67
- ```
68
-
69
- After:
70
-
71
- ```text
72
- - `UIElement.ensure()` (`core/element.js`) marks stamped structural parts
73
- with `_uiPart = true` and its doc comment states the invariant: ...
74
- ```
75
-
76
- Add the file path inline as a parenthetical. Now mentions `core/`; also makes the entry more accurate (names the actual file).
77
-
78
- ### Amend + re-tag + re-run
79
-
80
- ```bash
81
- git add packages/a2ui/corpus/CHANGELOG.md packages/web-components/CHANGELOG.md
82
- git commit --amend --no-edit
83
-
84
- # Delete + re-create 10 tags (SHA moved)
85
- git tag -d v0.6.19 web-components-v0.6.19 web-modules-v0.6.19 ... # all 10
86
- git tag v0.6.19
87
- for pkg in web-components web-modules llm a2ui-runtime a2ui-compose \
88
- a2ui-corpus a2ui-mcp a2ui-retrieval a2ui-validator; do
89
- git tag "$pkg-v0.6.19"
90
- done
91
-
92
- # Re-run
93
- node scripts/release/check-release.mjs --all-pending
94
- # → 9/9 per-package ✓ clean (umbrella error expected)
95
- ```
96
-
97
- ---
98
-
99
- ## §The lesson
100
-
101
- 1. **F-N1 cosmetic warns are common and trivially fixed.** Two wording tweaks resolved both. Total work: ~5 minutes.
102
- 2. **Read the warn for the keyword.** The message says exactly what string is missing (`'chunks'`, `'core'`). Add that string to a natural place in the entry.
103
- 3. **Don't padding-pad.** Forcing a keyword into the entry as a sidecar parenthetical reads worse than weaving it in. The "components/table/table.yaml" path-reference style is the standard — it conveys file path AND makes the entry more accurate.
104
- 4. **Amend, don't add a new commit.** The CHANGELOG enrichment IS part of the release commit conceptually. `git commit --amend --no-edit` keeps the release commit clean. The tag SHA moves; just re-tag.
105
- 5. **Bonus — the v0.6.21 cycle adopted this discipline at authoring time.** Peer commit `d8cbbd30c` was explicitly named _"uses full path so F-N1 gate matches"_ — i.e. the peer learned the pattern and started authoring entries with full file paths from the start. By v0.6.21 the F-N1 cycle was 9/9 clean on first pass.
106
-
107
- ---
108
-
109
- ## §Ledger fragment
110
-
111
- ```json
112
- "notes": [
113
- "F-N1 flagged 2 cosmetic diff-coverage warns on the first tag pass (a2ui-corpus chunks/ + web-components core/ touched but CHANGELOG lacked the literal path keyword). Both fixed by minor wording tweaks; release commit amended; re-tagged at 8d48845ad; F-N1 re-run 9/9 clean."
114
- ]
115
- ```
116
-
117
- `grep -l "diff-coverage" .brain/audit-history/*.json` finds cycles that needed this enrichment pass.
118
-
119
- ---
120
-
121
- ## §Cross-references
122
-
123
- - `../../references/changelog-discipline.md` § F-N1 diff-coverage enrichment — the canonical procedure
124
- - `../../references/gates-catalog.md` § Category 1 § F-N1 — the gate definition + cosmetic-vs-real failure decision tree
125
- - Repo precedent: peer commit `d8cbbd30c docs(web-components/CHANGELOG): §403 table-ui entry uses full path so F-N1 gate matches` — the peer adopting the discipline at authoring time
@@ -1,142 +0,0 @@
1
- # Case study — stale test detection (v0.6.20)
2
-
3
- **Cycle:** 2026-05-21 (v0.6.19 → v0.6.20) **Scenario:** `recovery-paths.md` § Scenario 5 (stale test detection) **Source ledger:** `.brain/audit-history/2026-05-21-release-v0.6.20.json` **Outcome:** A v0.6.17 regression guard failed against v0.6.20's deliberate CSS change; assertion updated to match the new contract + a guard for the new behavior added.
4
-
5
- ---
6
-
7
- ## §The shape
8
-
9
- Operator ran `npm run test:unit` at HEAD as part of v0.6.20 pre-flight. Result: **1 fail / 1078 pass / 1079 total**.
10
-
11
- The failing test:
12
-
13
- ```text
14
- FAIL packages/web-modules/shell/admin-shell/admin-shell.test.js
15
- > admin-shell.collapsed.css — vanilla HTML fallback (v0.6.17)
16
- > contains the vanilla-HTML fallback block
17
-
18
- AssertionError: expected '/* ══...' to match /\[slot="heading"\]\s*\{[\s\S]*?display:\s*none/
19
- ```
20
-
21
- The test was a **v0.6.17 regression guard**: when v0.6.17 added the forgiving-fallback block to `admin-shell.collapsed.css` (clipping vanilla-HTML overflow when the sidebar collapses), the test was added to verify the block stays present. It asserted the rule existed via:
22
-
23
- ```js
24
- expect(collapsedCSS).toMatch(/\[slot="heading"\]\s*\{[\s\S]*?display:\s*none/);
25
- ```
26
-
27
- — i.e. `[slot="heading"]` IMMEDIATELY followed by `{ ... display: none`.
28
-
29
- ---
30
-
31
- ## §The diagnosis
32
-
33
- The v0.6.20 cycle's `[Unreleased]` block included:
34
-
35
- > `### Fixed — collapsed sidebar [slot="heading"] hide no longer wipes composed wrappers (FEEDBACK-38 addendum)`
36
-
37
- — a deliberate change to the CSS the test was asserting against.
38
-
39
- The OLD rule (v0.6.17):
40
-
41
- ```css
42
- [slot="heading"] {
43
- display: none;
44
- }
45
- ```
46
-
47
- The NEW rule (v0.6.20 FB-38 addendum):
48
-
49
- ```css
50
- :is(span, p, div, h1, h2, h3, h4, h5, h6)[slot="heading"],
51
- [slot="heading"]:not(:has(> [slot])) {
52
- display: none;
53
- }
54
- ```
55
-
56
- The new rule **narrows** the hide: plain-text headings (`<span slot="heading">`) are still hidden, but composed wrappers carrying their own slot contract (`<admin-entity-item slot="heading">`) survive collapse via the `:not(:has(> [slot]))` guard.
57
-
58
- The test's regex `\[slot="heading"\]\s*\{` requires `[slot="heading"]` to be immediately followed by `{`. In the new CSS, `[slot="heading"]` is followed by `:not(:has(> [slot]))` before `{`. **The test wasn't updated to match the deliberate change.**
59
-
60
- This is a **stale test**, not a regression. The peer shipped the CSS change but didn't update the regression guard.
61
-
62
- Decision per `recovery-paths.md` § Scenario 5:
63
-
64
- > Read the test's assertion + read the CHANGELOG entry that documents the change. Both should describe the same behavior. If they disagree → one of them is stale.
65
- >
66
- > Read the actual production code. If it matches the CHANGELOG entry's description → the test is stale.
67
-
68
- Confirmed: CHANGELOG describes the FB-38 addendum behavior; the CSS matches the CHANGELOG; the test is stale.
69
-
70
- ---
71
-
72
- ## §The fix
73
-
74
- Two assertion changes in `admin-shell.test.js`:
75
-
76
- ### 1. Update the existing assertion to the new shape
77
-
78
- Before:
79
-
80
- ```js
81
- expect(collapsedCSS).toMatch(/\[slot="heading"\]\s*\{[\s\S]*?display:\s*none/);
82
- ```
83
-
84
- After:
85
-
86
- ```js
87
- // v0.6.20 (FEEDBACK-38 addendum): the heading-hide rule narrowed from a
88
- // blanket `[slot="heading"]` to plain-text headings + headings without
89
- // slotted children, so composed wrappers (<admin-entity-item slot="heading">)
90
- // survive collapse. The rule still resolves to `display: none`.
91
- expect(collapsedCSS).toMatch(/\[slot="heading"\][^{]*\{\s*display:\s*none/);
92
- ```
93
-
94
- Change: `\s*\{` (whitespace then `{`) → `[^{]*\{` (any non-brace chars then `{`). This matches both the old blanket shape AND the new narrowed shape.
95
-
96
- ### 2. Add a guard assertion for the FB-38-addendum contract
97
-
98
- ```js
99
- expect(collapsedCSS).toMatch(/\[slot="heading"\]:not\(:has\(>\s*\[slot\]\)\)/);
100
- ```
101
-
102
- This asserts the `:not(:has(> [slot]))` composed-wrapper guard is present. If a future cycle accidentally reverts the FB-38 addendum, this assertion fires.
103
-
104
- ### Run the suite
105
-
106
- ```bash
107
- npx vitest run packages/web-modules/shell/admin-shell/admin-shell.test.js
108
- # Test Files 1 passed (1)
109
- # Tests 6 passed (6)
110
- ```
111
-
112
- Then ship — `admin-shell.test.js` is part of v0.6.20's release commit allowlist (it's a test update that completes the FB-38-addendum work).
113
-
114
- ---
115
-
116
- ## §The lesson
117
-
118
- 1. **Stale test ≠ regression.** When a test fails against a deliberate CHANGELOG-documented change, the test is stale. Don't "fix the regression" — update the test.
119
- 2. **The diagnostic triangle: assertion + CHANGELOG + source code.** Read all three. The two that agree are correct; the one that disagrees is stale.
120
- 3. **Update + add — don't just patch.** When the production behavior changes, the test should pin the NEW behavior. Add a guard assertion for the new contract so future regressions fire here.
121
- 4. **Inline comment with the cycle ref.** Add a comment in the test naming the cycle (v0.6.20) and the closed feedback (FEEDBACK-38 addendum). Future operators reading the test understand why the assertion has the new shape.
122
- 5. **The test update belongs in the release commit.** It's part of the work that ships the CSS change. Stage it explicitly in the release-commit allowlist.
123
-
124
- ---
125
-
126
- ## §Ledger fragment
127
-
128
- ```json
129
- "notes": [
130
- "STALE TEST FIXED: admin-shell.test.js 'contains the vanilla-HTML fallback block' (a v0.6.17 regression guard) asserted the old blanket [slot=heading] { display: none } shape. The v0.6.20 FEEDBACK-38-addendum fix deliberately narrowed that rule (:is(span,p,div,h1-6)[slot=heading] + [slot=heading]:not(:has(> [slot])) — composed wrappers survive collapse). The peer shipped the CSS change but did not update the test. Deploy session updated the assertion to match the new shape + added a guard assertion for the :not(:has(> [slot])) clause. Not a regression — a stale test."
131
- ]
132
- ```
133
-
134
- `grep -l "STALE TEST" .brain/audit-history/*.json` finds cycles that required this scenario.
135
-
136
- ---
137
-
138
- ## §Cross-references
139
-
140
- - `../../references/recovery-paths.md` § Scenario 5 — the canonical diagnosis checklist
141
- - `../../references/gates-catalog.md` § Category 8 § `test:unit` — the gate definition + the stale-test-vs-regression triage
142
- - `../../references/cycle-happy-path.md` § Step 5 — staging the test update alongside the release commit