@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.
- package/.claude-plugin/plugin.json +4 -7
- package/CHANGELOG.md +35 -34
- package/README.md +35 -40
- package/agents/a2ui-engineer.md +22 -53
- package/agents/component-author.md +29 -0
- package/agents/framework-verifier.md +26 -0
- package/agents/release-engineer.md +21 -81
- package/agents/routing-corpus.json +293 -64
- package/bin/demo-postwrite-pattern-gate +94 -0
- package/bin/forge-lint +17 -2
- package/bin/sidecar-prewrite-guard +104 -0
- package/commands/deploy.md +9 -0
- package/commands/dogfood.md +10 -0
- package/commands/gen-review.md +9 -0
- package/commands/release.md +10 -0
- package/hooks/hooks.json +15 -0
- package/package.json +3 -6
- package/references/contracts/a2ui-mcp-surface.md +35 -0
- package/references/contracts/migration-guide-format.md +34 -0
- package/references/shared/content-trust.md +19 -74
- package/skills/adia-a2ui/SKILL.md +99 -0
- package/skills/{adia-ui-a2ui → adia-a2ui}/evals/routing-corpus.json +10 -10
- package/skills/adia-a2ui/references/anti-patterns.md +27 -0
- package/skills/adia-a2ui/references/chunk-authoring.md +71 -0
- package/skills/adia-a2ui/references/corpus-discipline.md +68 -0
- package/skills/adia-a2ui/references/eval-diagnostics.md +86 -0
- package/skills/adia-a2ui/references/format-extension-decisions.md +66 -0
- package/skills/adia-a2ui/references/leverage-rules.md +52 -0
- package/skills/adia-a2ui/references/mcp-pipeline-ops.md +83 -0
- package/skills/adia-a2ui/references/mcp-tool-reference.md +59 -0
- package/skills/adia-a2ui/references/pipeline-overview.md +115 -0
- package/skills/adia-a2ui/references/semantic-fail-lifting.md +74 -0
- package/skills/adia-a2ui/references/strategy-engines.md +109 -0
- package/skills/adia-a2ui/references/zettel-calibration.md +104 -0
- package/skills/adia-author/SKILL.md +112 -0
- package/skills/adia-author/evals/routing-corpus.json +222 -0
- package/skills/{adia-ui-authoring → adia-author}/references/anti-patterns.md +33 -4
- package/skills/{adia-ui-authoring → adia-author}/references/authoring-cycle.md +9 -11
- package/skills/adia-author/references/canonical-pattern-index.md +243 -0
- package/skills/{adia-ui-authoring → adia-author}/references/code-style.md +19 -21
- package/skills/adia-author/references/common-gotchas.md +129 -0
- package/skills/adia-author/references/composite-demo-protocol.md +271 -0
- package/skills/{adia-ui-authoring → adia-author}/references/css-patterns.md +19 -6
- package/skills/{adia-ui-authoring → adia-author}/references/lifecycle-patterns.md +1 -0
- package/skills/{adia-ui-authoring → adia-author}/references/llm-bridge.md +3 -5
- package/skills/{adia-ui-authoring → adia-author}/references/module-promotion.md +20 -38
- package/skills/{adia-ui-authoring → adia-author}/references/primitive-audit.md +2 -4
- package/skills/{adia-ui-authoring → adia-author}/references/shell-patterns.md +12 -18
- package/skills/{adia-ui-authoring → adia-author}/references/token-contract.md +5 -7
- package/skills/{adia-ui-authoring → adia-author}/references/worked-example.md +3 -3
- package/skills/{adia-ui-authoring → adia-author}/references/yaml-contract.md +3 -3
- package/skills/{adia-ui-authoring → adia-author}/scripts/build-canonical-pattern-index.mjs +3 -3
- package/skills/adia-deploy/SKILL.md +128 -0
- package/skills/{adia-ui-ops → adia-deploy}/references/deploy-playbooks.md +47 -30
- package/skills/adia-dogfood/SKILL.md +124 -0
- package/skills/adia-dogfood/references/admin-shell-anatomy.md +77 -0
- package/skills/adia-dogfood/references/app-shell-pitfalls.md +66 -0
- package/skills/adia-dogfood/references/card-anatomy-sweep.md +66 -0
- package/skills/adia-dogfood/references/html-attr-sweep.md +63 -0
- package/skills/adia-dogfood/references/native-leak-annotations.md +73 -0
- package/skills/adia-dogfood/references/visual-probe-triage.md +80 -0
- package/skills/{adia-ui-dogfood → adia-dogfood}/scripts/analyze.mjs +30 -14
- package/skills/adia-gen-review/SKILL.md +127 -0
- package/skills/adia-gen-review/references/corpus-html-patterns.md +279 -0
- package/skills/adia-gen-review/references/loop-protocol.md +216 -0
- package/skills/adia-gen-review/references/rubric-cosmetic.md +100 -0
- package/skills/adia-gen-review/references/rubric-decompose.md +101 -0
- package/skills/adia-gen-review/references/rubric-score.md +214 -0
- package/skills/{adia-ui-gen-review → adia-gen-review}/references/scores.schema.json +2 -2
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-coverage-audit.mjs +4 -4
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-decompose.mjs +10 -6
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-status.mjs +5 -5
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/validate-cycle-scores.mjs +5 -5
- package/skills/adia-llm-internals/SKILL.md +77 -0
- package/skills/{adia-ui-llm → adia-llm-internals}/references/adapter-contract.md +4 -2
- package/skills/{adia-ui-llm → adia-llm-internals}/references/add-a-provider.md +4 -5
- package/skills/{adia-ui-llm → adia-llm-internals}/references/bridge-facade.md +10 -3
- package/skills/{adia-ui-llm → adia-llm-internals}/references/browser-proxy-boundary.md +1 -1
- package/skills/{adia-ui-llm → adia-llm-internals}/references/model-registry.md +5 -3
- package/skills/{adia-ui-llm → adia-llm-internals}/references/streaming-sse.md +2 -2
- package/skills/adia-release/SKILL.md +72 -0
- package/skills/adia-release/references/changelog-discipline.md +119 -0
- package/skills/adia-release/references/cut-procedure.md +247 -0
- package/skills/adia-release/references/gates-catalog.md +222 -0
- package/skills/adia-release/references/independent-package-release.md +52 -0
- package/skills/adia-release/references/migration-guide-authoring.md +86 -0
- package/skills/adia-release/references/notes-authoring.md +90 -0
- package/skills/adia-release/references/recovery-paths.md +106 -0
- package/skills/{adia-ui-release → adia-release}/scripts/bump.mjs +28 -3
- package/skills/{adia-ui-release → adia-release}/scripts/dispatch-publish.mjs +10 -7
- package/skills/{adia-ui-release → adia-release}/scripts/insert-stub.mjs +1 -1
- package/skills/{adia-ui-release → adia-release}/scripts/package-paths.mjs +6 -0
- package/skills/{adia-ui-release → adia-release}/scripts/promote-unreleased.mjs +1 -1
- package/skills/{adia-ui-release → adia-release}/scripts/release-pack.mjs +38 -31
- package/skills/{adia-ui-release → adia-release}/scripts/tag-lockstep.mjs +7 -3
- package/skills/adia-site-docs/SKILL.md +68 -0
- package/skills/adia-site-docs/evals/audit-report.md +30 -0
- package/skills/adia-site-docs/evals/routing-corpus.json +176 -0
- package/skills/adia-site-docs/intent.md +72 -0
- package/agents/README.md +0 -209
- package/agents/author.md +0 -56
- package/agents/repo-steward.md +0 -56
- package/agents/spec-architect.md +0 -53
- package/agents/tech-lead.md +0 -57
- package/agents/verifier.md +0 -55
- package/bin/lib/audit-axes.mjs +0 -555
- package/bin/lib/dry-run-irreversible.mjs +0 -236
- package/bin/lib/run-skill-evals.mjs +0 -487
- package/bin/lib/teach-router.mjs +0 -250
- package/commands/adia-forge-a2ui.md +0 -10
- package/commands/adia-forge-author.md +0 -10
- package/commands/adia-forge-dogfood.md +0 -8
- package/commands/adia-forge-llm.md +0 -8
- package/commands/adia-forge-orient.md +0 -10
- package/commands/adia-forge-release.md +0 -8
- package/commands/adia-forge-review.md +0 -10
- package/references/shared/pev-rationale.md +0 -64
- package/references/shared/skill-conventions.md +0 -133
- package/skills/adia-ui-a2ui/CHANGELOG.md +0 -32
- package/skills/adia-ui-a2ui/SKILL.md +0 -243
- package/skills/adia-ui-a2ui/evals/adversarial-corpus.json +0 -75
- package/skills/adia-ui-a2ui/evals/teach-routing-cases.json +0 -100
- package/skills/adia-ui-a2ui/references/anti-patterns.md +0 -24
- package/skills/adia-ui-a2ui/references/chunk-authoring.md +0 -88
- package/skills/adia-ui-a2ui/references/corpus-discipline.md +0 -56
- package/skills/adia-ui-a2ui/references/eval-diagnostics.md +0 -127
- package/skills/adia-ui-a2ui/references/fragment-graph.md +0 -91
- package/skills/adia-ui-a2ui/references/mcp-pipeline-ops.md +0 -106
- package/skills/adia-ui-a2ui/references/mcp-tool-reference.md +0 -398
- package/skills/adia-ui-a2ui/references/pipeline-overview.md +0 -175
- package/skills/adia-ui-a2ui/references/semantic-fail-lifting.md +0 -120
- package/skills/adia-ui-a2ui/references/strategy-engines.md +0 -111
- package/skills/adia-ui-a2ui/references/teach-protocol.md +0 -220
- package/skills/adia-ui-a2ui/references/zettel-calibration.md +0 -93
- package/skills/adia-ui-a2ui/scripts/audit-a2ui-roster.mjs +0 -96
- package/skills/adia-ui-a2ui/scripts/teach-route.mjs +0 -157
- package/skills/adia-ui-a2ui/skill.json +0 -38
- package/skills/adia-ui-authoring/CHANGELOG.md +0 -32
- package/skills/adia-ui-authoring/SKILL.md +0 -256
- package/skills/adia-ui-authoring/assets/case-studies/admin-shell-decomposition.md +0 -101
- package/skills/adia-ui-authoring/assets/case-studies/maxtokens-32768-discovery.md +0 -109
- package/skills/adia-ui-authoring/assets/case-studies/theme-panel-promotion.md +0 -113
- package/skills/adia-ui-authoring/evals/adversarial-design-plan-gates.json +0 -138
- package/skills/adia-ui-authoring/evals/routing-corpus.json +0 -245
- package/skills/adia-ui-authoring/references/canonical-pattern-index.md +0 -179
- package/skills/adia-ui-authoring/references/common-gotchas.md +0 -93
- package/skills/adia-ui-authoring/references/composite-demo-protocol.md +0 -1084
- package/skills/adia-ui-authoring/references/teach-protocol.md +0 -428
- package/skills/adia-ui-authoring/scripts/audit-authoring-roster.mjs +0 -148
- package/skills/adia-ui-authoring/skill.json +0 -45
- package/skills/adia-ui-dogfood/CHANGELOG.md +0 -17
- package/skills/adia-ui-dogfood/README.md +0 -62
- package/skills/adia-ui-dogfood/SKILL.md +0 -866
- package/skills/adia-ui-dogfood/skill.json +0 -40
- package/skills/adia-ui-forge/SKILL.md +0 -88
- package/skills/adia-ui-forge/evals/routing-corpus.json +0 -30
- package/skills/adia-ui-gen-review/CHANGELOG.md +0 -108
- package/skills/adia-ui-gen-review/SKILL.md +0 -266
- package/skills/adia-ui-gen-review/references/loop-protocol.md +0 -712
- package/skills/adia-ui-gen-review/references/rubric-cosmetic.md +0 -144
- package/skills/adia-ui-gen-review/references/rubric-decompose.md +0 -117
- package/skills/adia-ui-gen-review/references/rubric-score.md +0 -249
- package/skills/adia-ui-gen-review/references/teach-protocol.md +0 -214
- package/skills/adia-ui-gen-review/skill.json +0 -23
- package/skills/adia-ui-llm/CHANGELOG.md +0 -25
- package/skills/adia-ui-llm/SKILL.md +0 -165
- package/skills/adia-ui-llm/evals/adversarial-corpus.json +0 -75
- package/skills/adia-ui-llm/evals/routing-corpus.json +0 -30
- package/skills/adia-ui-llm/evals/teach-routing-cases.json +0 -73
- package/skills/adia-ui-llm/references/teach-protocol.md +0 -78
- package/skills/adia-ui-llm/scripts/audit-llm-roster.mjs +0 -93
- package/skills/adia-ui-llm/scripts/teach-route.mjs +0 -119
- package/skills/adia-ui-llm/skill.json +0 -33
- package/skills/adia-ui-ops/CHANGELOG.md +0 -291
- package/skills/adia-ui-ops/SKILL.md +0 -401
- package/skills/adia-ui-ops/references/INDEX.md +0 -158
- package/skills/adia-ui-ops/references/audit-cadence.md +0 -263
- package/skills/adia-ui-ops/references/audit-patterns/archive-link-sweep.md +0 -96
- package/skills/adia-ui-ops/references/audit-patterns/audit-history-ledger.md +0 -162
- package/skills/adia-ui-ops/references/audit-patterns/browser-bundle-node-imports.md +0 -154
- package/skills/adia-ui-ops/references/audit-patterns/changelog-unreleased-bloat.md +0 -75
- package/skills/adia-ui-ops/references/audit-patterns/coverage-gaps.md +0 -187
- package/skills/adia-ui-ops/references/audit-patterns/entry-file-coverage.md +0 -122
- package/skills/adia-ui-ops/references/audit-patterns/format-hygiene.md +0 -217
- package/skills/adia-ui-ops/references/audit-patterns/lockstep-versioning.md +0 -113
- package/skills/adia-ui-ops/references/audit-patterns/memory-fragmentation.md +0 -180
- package/skills/adia-ui-ops/references/audit-patterns/orphan-detection.md +0 -202
- package/skills/adia-ui-ops/references/audit-patterns/pointer-validation.md +0 -180
- package/skills/adia-ui-ops/references/audit-patterns/redundancy-detection.md +0 -210
- package/skills/adia-ui-ops/references/audit-patterns/spec-dating-sweep.md +0 -91
- package/skills/adia-ui-ops/references/audit-patterns/stale-content.md +0 -182
- package/skills/adia-ui-ops/references/audit-patterns/staleness-tooling.md +0 -156
- package/skills/adia-ui-ops/references/audit-patterns/token-waste-detection.md +0 -196
- package/skills/adia-ui-ops/references/doc-types/adr-pattern.md +0 -210
- package/skills/adia-ui-ops/references/doc-types/architecture-md.md +0 -190
- package/skills/adia-ui-ops/references/doc-types/changelog.md +0 -183
- package/skills/adia-ui-ops/references/doc-types/decisions-log.md +0 -146
- package/skills/adia-ui-ops/references/doc-types/plan-roadmap.md +0 -182
- package/skills/adia-ui-ops/references/doc-types/postmortem-pattern.md +0 -206
- package/skills/adia-ui-ops/references/genres/prose-and-writing.md +0 -149
- package/skills/adia-ui-ops/references/guidance/context-budget.md +0 -137
- package/skills/adia-ui-ops/references/guidance/llm-doc-writing.md +0 -116
- package/skills/adia-ui-ops/references/guidance/reliability-dial.md +0 -186
- package/skills/adia-ui-ops/references/recipes/adr-introduction.md +0 -211
- package/skills/adia-ui-ops/references/recipes/audit-existing-repo.md +0 -234
- package/skills/adia-ui-ops/references/recipes/cold-start-harvest.md +0 -263
- package/skills/adia-ui-ops/references/recipes/concurrent-learnings-merge.md +0 -158
- package/skills/adia-ui-ops/references/recipes/continuous-learning-loop.md +0 -169
- package/skills/adia-ui-ops/references/recipes/external-reference-verification.md +0 -158
- package/skills/adia-ui-ops/references/recipes/findings-index-readout.md +0 -126
- package/skills/adia-ui-ops/references/recipes/greenfield-setup.md +0 -252
- package/skills/adia-ui-ops/references/recipes/harvest-repo-brain.md +0 -169
- package/skills/adia-ui-ops/references/recipes/import-repo-brain-harvest.md +0 -153
- package/skills/adia-ui-ops/references/recipes/memory-organization.md +0 -182
- package/skills/adia-ui-ops/references/recipes/recommend-then-validate.md +0 -199
- package/skills/adia-ui-ops/references/recipes/self-healing-hooks.md +0 -366
- package/skills/adia-ui-ops/references/recipes/skill-stewardship-loop.md +0 -113
- package/skills/adia-ui-ops/references/standards/agents-md-spec.md +0 -138
- package/skills/adia-ui-ops/references/standards/claude-md-convention.md +0 -123
- package/skills/adia-ui-ops/references/standards/cross-tool-matrix.md +0 -85
- package/skills/adia-ui-ops/references/standards/readme-conventions.md +0 -232
- package/skills/adia-ui-ops/references/teach-protocol.md +0 -215
- package/skills/adia-ui-ops/scripts/audit-ops-roster.mjs +0 -104
- package/skills/adia-ui-ops/skill.json +0 -65
- package/skills/adia-ui-release/CHANGELOG.md +0 -66
- package/skills/adia-ui-release/SKILL.md +0 -323
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-batch-push-v0.6.14-v0.6.15.md +0 -144
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-corpus-drift-remediation-v0.6.15.md +0 -155
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-version-skip-correction-v0.6.12.md +0 -114
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-author-from-scratch-v0.6.18.md +0 -139
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-feedback37-retraction-v0.6.21.md +0 -124
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-fn1-enrichment-pass-v0.6.19.md +0 -125
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-stale-test-detection-v0.6.20.md +0 -142
- package/skills/adia-ui-release/assets/case-studies/2026-05-23-freshness-gate-recovery-v0.6.32.md +0 -97
- package/skills/adia-ui-release/assets/case-studies/2026-05-26-catalog-drift-recurring-v0.6.40.md +0 -147
- package/skills/adia-ui-release/assets/templates/stub-changelog.template.md +0 -22
- package/skills/adia-ui-release/evals/evals.json +0 -164
- package/skills/adia-ui-release/references/changelog-discipline.md +0 -250
- package/skills/adia-ui-release/references/cycle-happy-path.md +0 -520
- package/skills/adia-ui-release/references/exe-deploy.md +0 -149
- package/skills/adia-ui-release/references/gates-catalog.md +0 -778
- package/skills/adia-ui-release/references/independent-package-release.md +0 -129
- package/skills/adia-ui-release/references/ledger-discipline.md +0 -232
- package/skills/adia-ui-release/references/migration-guide-authoring.md +0 -174
- package/skills/adia-ui-release/references/multi-agent-baseline.md +0 -207
- package/skills/adia-ui-release/references/notes-authoring.md +0 -212
- package/skills/adia-ui-release/references/recovery-paths.md +0 -262
- package/skills/adia-ui-release/references/rollup-notes.md +0 -208
- package/skills/adia-ui-release/references/teach-protocol.md +0 -468
- package/skills/adia-ui-release/scripts/audit-gate-roster.mjs +0 -196
- package/skills/adia-ui-release/scripts/make-ledger.mjs +0 -200
- package/skills/adia-ui-release/skill.json +0 -77
- package/skills/dogfood-sweep/CHANGELOG.md +0 -37
- package/skills/dogfood-sweep/README.md +0 -105
- package/skills/dogfood-sweep/SKILL.md +0 -1000
- package/skills/dogfood-sweep/analyze.mjs +0 -600
- package/skills/dogfood-sweep/skill.json +0 -31
- /package/skills/{adia-ui-authoring → adia-author}/references/api-contract.md +0 -0
- /package/skills/{adia-ui-release → adia-release}/scripts/assert-monorepo-root.mjs +0 -0
package/skills/adia-ui-release/assets/case-studies/2026-05-20-version-skip-correction-v0.6.12.md
DELETED
|
@@ -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.
|
package/skills/adia-ui-release/assets/case-studies/2026-05-21-author-from-scratch-v0.6.18.md
DELETED
|
@@ -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)
|
package/skills/adia-ui-release/assets/case-studies/2026-05-21-feedback37-retraction-v0.6.21.md
DELETED
|
@@ -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)
|
package/skills/adia-ui-release/assets/case-studies/2026-05-21-fn1-enrichment-pass-v0.6.19.md
DELETED
|
@@ -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
|
package/skills/adia-ui-release/assets/case-studies/2026-05-21-stale-test-detection-v0.6.20.md
DELETED
|
@@ -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
|