baldart 5.5.0 → 5.7.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 (65) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/VERSION +1 -1
  3. package/framework/.claude/agents/CHANGELOG.md +16 -0
  4. package/framework/.claude/agents/prd-card-writer.md +37 -3
  5. package/framework/.claude/skills/capture/CHANGELOG.md +4 -0
  6. package/framework/.claude/skills/capture/SKILL.md +2 -1
  7. package/framework/.claude/skills/design-sync/CHANGELOG.md +4 -0
  8. package/framework/.claude/skills/design-sync/SKILL.md +2 -1
  9. package/framework/.claude/skills/ds-edit/CHANGELOG.md +5 -0
  10. package/framework/.claude/skills/ds-edit/SKILL.md +9 -10
  11. package/framework/.claude/skills/ds-handoff/CHANGELOG.md +5 -0
  12. package/framework/.claude/skills/ds-handoff/SKILL.md +3 -2
  13. package/framework/.claude/skills/ds-new/CHANGELOG.md +4 -0
  14. package/framework/.claude/skills/ds-new/SKILL.md +2 -1
  15. package/framework/.claude/skills/ds-render/CHANGELOG.md +4 -0
  16. package/framework/.claude/skills/ds-render/SKILL.md +2 -1
  17. package/framework/.claude/skills/e2e-review/CHANGELOG.md +4 -0
  18. package/framework/.claude/skills/e2e-review/SKILL.md +2 -1
  19. package/framework/.claude/skills/gamification-design/CHANGELOG.md +4 -0
  20. package/framework/.claude/skills/gamification-design/SKILL.md +2 -1
  21. package/framework/.claude/skills/graph-align/CHANGELOG.md +4 -0
  22. package/framework/.claude/skills/graph-align/SKILL.md +2 -1
  23. package/framework/.claude/skills/i18n/CHANGELOG.md +4 -0
  24. package/framework/.claude/skills/i18n/SKILL.md +2 -1
  25. package/framework/.claude/skills/motion-design/CHANGELOG.md +4 -0
  26. package/framework/.claude/skills/motion-design/SKILL.md +2 -1
  27. package/framework/.claude/skills/new/CHANGELOG.md +27 -0
  28. package/framework/.claude/skills/new/SKILL.md +2 -1
  29. package/framework/.claude/skills/new/references/commit.md +12 -8
  30. package/framework/.claude/skills/new/references/completeness.md +10 -0
  31. package/framework/.claude/skills/new/references/final-review.md +23 -0
  32. package/framework/.claude/skills/new/references/implement.md +14 -4
  33. package/framework/.claude/skills/new/references/merge-cleanup.md +35 -14
  34. package/framework/.claude/skills/new2/CHANGELOG.md +40 -0
  35. package/framework/.claude/skills/new2/SKILL.md +53 -12
  36. package/framework/.claude/skills/prd/CHANGELOG.md +40 -0
  37. package/framework/.claude/skills/prd/SKILL.md +18 -5
  38. package/framework/.claude/skills/prd/assets/state-template.md +8 -1
  39. package/framework/.claude/skills/prd/references/audit-phase.md +13 -1
  40. package/framework/.claude/skills/prd/references/backlog-phase.md +20 -0
  41. package/framework/.claude/skills/prd/references/discovery-phase.md +35 -0
  42. package/framework/.claude/skills/prd/references/ui-design-phase.md +28 -0
  43. package/framework/.claude/skills/prd/references/validation-phase.md +45 -1
  44. package/framework/.claude/skills/prd-add/CHANGELOG.md +4 -0
  45. package/framework/.claude/skills/prd-add/SKILL.md +2 -1
  46. package/framework/.claude/skills/skill-creator/references/skill-structure.md +31 -2
  47. package/framework/.claude/skills/skill-creator/scripts/quick_validate.py +25 -3
  48. package/framework/.claude/skills/ui-design/CHANGELOG.md +4 -0
  49. package/framework/.claude/skills/ui-design/SKILL.md +2 -1
  50. package/framework/.claude/skills/ui-implement/CHANGELOG.md +4 -0
  51. package/framework/.claude/skills/ui-implement/SKILL.md +2 -1
  52. package/framework/.claude/skills/worktree-manager/CHANGELOG.md +13 -0
  53. package/framework/.claude/skills/worktree-manager/SKILL.md +11 -1
  54. package/framework/.claude/skills/worktree-manager/scripts/merge-worktree.sh +82 -6
  55. package/framework/.claude/workflows/new-final-review.js +9 -7
  56. package/framework/.claude/workflows/new2-resolve.js +29 -1
  57. package/framework/.claude/workflows/new2.js +158 -18
  58. package/framework/agents/card-schema.md +18 -1
  59. package/framework/agents/research-protocol.md +6 -1
  60. package/framework/scripts/stamp-holistic-audit.js +53 -10
  61. package/package.json +1 -1
  62. package/src/commands/configure.js +9 -2
  63. package/src/commands/doctor.js +65 -0
  64. package/src/utils/skill-gate.js +139 -0
  65. package/src/utils/symlinks.js +72 -7
package/CHANGELOG.md CHANGED
@@ -5,6 +5,125 @@ All notable changes to BALDART will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [5.7.0] - 2026-07-06
9
+
10
+ **Feature-gated skill linking — stop wasting Codex's 2% skill-description budget.** Codex
11
+ reserves ~2% of its context window for skill descriptions; BALDART's ~40 skills alone
12
+ already exceed it (~6.5k tokens), so Codex warns *"Skill descriptions were shortened to fit
13
+ the 2% skills context budget"* and truncates them (degrading skill routing). Until now the
14
+ installer linked EVERY framework skill into a consumer — including ones whose gating
15
+ `features.*` flag is OFF (e.g. the `ds-*` cluster, `i18n`, `graph-align`, `e2e-review`),
16
+ which then merely refuse at runtime: dead weight on the budget. Now a skill is linked only
17
+ when its declared feature is enabled, trimming ~2.5k tokens (~40%) on a typical project
18
+ without design-system/i18n/code-graph/e2e.
19
+
20
+ - **`requires_feature` frontmatter (SSOT) + `src/utils/skill-gate.js`**: an OPTIONAL
21
+ `requires_feature: has_x` (string or list = AND) on a skill's `SKILL.md`. Makes
22
+ machine-readable a dependency the skills already declared in prose (their "Project
23
+ Context" header) — no second SSOT, same pattern as `version:`/`effort:`. `resolveSkillGate`
24
+ reads `features.*` **directly** from `baldart.config.yml` (NOT `agent-slots.resolveAgentFlags`,
25
+ which omits `has_prd_workflow`/`has_e2e_review`) and **fails open** globally (config
26
+ absent/unreadable → link everything) and per-skill (malformed frontmatter → link that skill).
27
+ - **Applied to BOTH runtimes from one code path** (`mergeSkills` in `src/utils/symlinks.js`):
28
+ the gate is shared SEMANTICS (which skills are relevant), not runtime mechanics, so Claude
29
+ (`.claude/skills/`) and Codex (`.agents/skills/`) stay identical by construction. Adds the
30
+ **prune** direction — a feature flipped off (or a fail-open first install) now removes stale
31
+ framework symlinks, never touching a user skill dir or a user-override symlink pointing
32
+ elsewhere.
33
+ - **17 skills gated**: `has_design_system` → ui-design, ui-implement, ds-new, ds-edit,
34
+ ds-render, design-sync, ds-handoff, motion-design, gamification-design · `has_i18n` → i18n ·
35
+ `has_code_graph` → graph-align · `has_e2e_review` → e2e-review · `has_prd_workflow` → prd,
36
+ prd-add · `has_backlog` → new, new2 · `has_wiki_overlay` → capture. The five bootstrap
37
+ skills (`design-system-init`, `i18n-adopt`, `graphify-bootstrap`, `lsp-bootstrap`,
38
+ `toolchain-bootstrap`) stay ALWAYS-linked so a feature can always be turned on — then
39
+ `configure`/`update` re-merge and the cluster appears.
40
+ - **Lifecycle wiring**: `configure` now re-runs `mergeSkills` after writing config (first
41
+ install linked fail-open before the config existed — this is what actually prunes);
42
+ `update` already re-merges (prune committed via `BALDART_MANAGED_PATTERNS`); `doctor` gains
43
+ a non-blocking `reconcile-skills` advisory when a gated-off skill is still linked, and its
44
+ skill sample-probe no longer samples gatable skills (`prd`/`capture`). `skill-creator`:
45
+ `quick_validate.py` allow-lists `requires_feature` (it previously HARD-FAILED on unknown
46
+ keys) + soft-warns unknown flags; `references/skill-structure.md` documents the field.
47
+ `new2.js` binding-gate now guards on `has_design_system`.
48
+ - **Behaviour change for Claude consumers**: a skill whose feature is off now *disappears*
49
+ from `.claude/skills/` instead of appearing and refusing at runtime. Mitigated: bootstraps
50
+ stay visible, and re-enabling the feature (then any merge) brings the cluster back.
51
+ - **Rider — two skill descriptions made `quick_validate`-clean** (pre-existing failures, both
52
+ among the heaviest so this also shrinks the Codex budget): `ds-edit` description trimmed
53
+ 1080→1014 chars (was over the 1024 max), `ds-handoff` angle-bracket placeholder
54
+ (`<screens-or-feature>`) rephrased bracket-free — no trigger phrases lost.
55
+ - Verified: unit-level gate partitioning (design_system-off/backlog-on → 15 gated off, `new`
56
+ linked, bootstrap present), YAML validity of all 17 frontmatters, `quick_validate` PASS.
57
+ - **No new `baldart.config.yml` key** (consumes existing `features.*`) → the schema-change
58
+ propagation rule does NOT apply; it is skill-frontmatter metadata like `version`/`effort`.
59
+ - **Codex parity: portable** — single semantic filter, both runtimes, install-time only;
60
+ `requires_feature` is ignored by both skill loaders (they read only name+description, as
61
+ they already do for `version`/`effort`).
62
+
63
+ ## [5.6.0] - 2026-07-04
64
+
65
+ **Outcome-integrity wave (FEAT-0068 post-mortem — mayo, 72.78M token, DONE falso).** Il
66
+ batch chiuse 6/6 card + epic come "✅ DONE, merged" mentre il goal dell'epic era invisibile
67
+ sul ~90% delle schermate: il root cause era in `/prd` (inventario ISA sui consumer del
68
+ meccanismo invece che sui proprietari della superficie; recipe ancorata su un componente
69
+ `@deprecated`; due gate phantom-stampati), attraversava card che nessun gate poteva salvare
70
+ (coverage passata vacuamente su un inventario sbagliato), e veniva sigillato da `/new`/`new2`
71
+ (chiusura epic al commit dell'ultima card — PRIMA della final review — con predicato
72
+ conta-figli, nessun verdetto PARTIAL, safety-commit che spazzava file non gated su develop,
73
+ commit agent in detour sul main checkout). 28 finding crit/high confermati adversarialmente;
74
+ ogni fix è ancorato a un'evidenza del run.
75
+
76
+ - **Chiusura epic v2 (`/new` 2.3.0 + `new2` 1.8.0)**: SOLO in merge phase (il gate
77
+ commit-time v4.99.0 è ritirato — aveva anche un anchor bug `^parent:` che lo rendeva
78
+ no-op); predicato esteso (figli **e follow-up** DONE + nessun residual bloccante +
79
+ **AC epic verificati con oracoli**); blocklist JS + guardia post-merge (F-029 twin) +
80
+ ramo **REOPEN** (il ratchet è bidirezionale); classe finding **closure-invalidating**
81
+ (un "goal not achieved" è un difetto di STATO — il fix di prosa non chiude).
82
+ - **Verdetto PARTIAL calcolato** (`final-review.md` + `buildReport`): residual HIGH+ /
83
+ epic aperta / AC epic `[ ]` ⇒ headline `⚠️ PARTIAL` col gap nominato; sezione
84
+ `## Epic goal`; severity sui residui; "nulla perso" mai come surrogato di "non finito".
85
+ - **Igiene git orchestrata**: `merge-worktree.sh --safety-sweep allowlist:` (worktree-manager
86
+ 1.2.0 — il codice non gated va in quarantena etichettata, mai nel trunk sotto un
87
+ "[safety]" opaco); isolamento worktree del commit agent esteso ai TOOL con evidenza
88
+ porcelain + guardia JS (era 7.1M di detour + stash dangling); divieto stash + audit
89
+ post-run dei commit non-card e degli stash del batch (mai "non miei da droppare").
90
+ - **Review**: relay Codex della final review in foreground `--wait` (il polling veniva
91
+ ucciso dall'enforcement structured-output a 83s/600s → fallback freddo da 3.68M);
92
+ esito **refuted** ratificato in `new2-resolve` (premessa falsa = zero edit) + divieto
93
+ di fix che disattivano verifiche mandate da AC (`verification-posture-change`);
94
+ suite aggiunte dalla card ESEGUITE targeted pre-commit (`completeness.md` 1b).
95
+ - **Routing**: `hasMockup` semantico (la card COSTRUISCE la UI mockata — un bare
96
+ `links.design` su card docs va all'owner router; era 6.55M di ui-expert su una card
97
+ docs+ADR).
98
+ - **`/prd` 1.6.0 (il root cause)**: categoria ISA **UI ROLE FAMILY (registry-first)**
99
+ (owner della superficie dal registry + flag BLOCK su `@deprecated`); §0 LOAD CONTRACT
100
+ su `discovery-phase.md` (vista PARTIAL ⇒ offset-Read fino in fondo — la coda persa
101
+ conteneva il Codex completeness cross-check mai eseguito); `module_read` stamps
102
+ ESEGUITI + item 0-ii Phase-evidence audit (2 gate phantom-stampati sul run reale);
103
+ `step_3_mode` enum chiuso + contratto `skipped` (mai design hand-authored fuori
104
+ `/ui-design`) + Reconciliation-lite senza mockup + trigger di ri-enumerazione ISA;
105
+ gate quantificatore-universale sugli AC epic (`invariant_owners:`); stamp holistic
106
+ **evidence-gated** (`stamp-holistic-audit.js --audit-report` → `agents_run`; senza
107
+ artefatto → `status: skipped` = ASSENTE per `/new`); card-writer 1.2.0
108
+ (self-validation eseguita, epic `ac_verification` obbligatoria, mai count hardcodato,
109
+ `links.design` solo su card UI, invariante baseline snapshot); HARD RULE mw-docs
110
+ (+ guardia `/mw` su `kind: docs`); EDIT CONTRACT dello state file (5 retry ciechi
111
+ da ~250k); `research-protocol.md` pre-flight libreria in difesa.
112
+ - **Tooling maintainer**: `new-session-audit.mjs` guadagna **EPIC_AC_UNMET** (FAIL —
113
+ retro-validato: il run FEAT-0068 ora fallisce l'audit invece di passarlo) e
114
+ **GATE_DISABLED_BY_FIX** (WARN) + fix del digest-writer su id workflow con `/`;
115
+ `check-new-parity.mjs` esteso a 21 policy (chiusura epic, PARTIAL, mockup semantico —
116
+ con token FORBIDDEN sui meccanismi ritirati).
117
+ - Deliberatamente rinviati (MED/LOW non verificati dal pass avversariale): digest
118
+ per-batch dei moduli di riferimento (tassa cache ~3-5M), card shape
119
+ VERIFY-ONLY/MECHANICAL-MIGRATION, sampling visivo del goal epic in final review,
120
+ script `update-state.mjs` per `/prd` (mitigato dall'EDIT CONTRACT).
121
+ - Codex parity: **portable** — le policy vivono nei moduli prose SSOT (`/new`, `/prd`)
122
+ e in script zero-dep/shell; i workflow Claude-only (`new2*`, `new-final-review`)
123
+ hanno ricevuto le STESSE policy dei twin prose (guardia di parity estesa a 21 regole).
124
+ Nessuna nuova chiave `baldart.config.yml` → la schema-change propagation rule non si
125
+ applica.
126
+
8
127
  ## [5.5.0] - 2026-07-03
9
128
 
10
129
  **Migration deploy chain hardened (FEAT-0067 post-mortem — mayo).** The batch's DB
package/VERSION CHANGED
@@ -1 +1 @@
1
- 5.5.0
1
+ 5.7.0
@@ -7,6 +7,22 @@ per-item agent merge, the doctor probes, and the discovery hooks — like
7
7
 
8
8
  Formato: [Keep a Changelog](https://keepachangelog.com/) · per-agent SemVer.
9
9
 
10
+ ## [prd-card-writer v1.2.0] — 2026-07-04 (framework v5.6.0 — FEAT-0068 post-mortem)
11
+
12
+ - **Epic AC rules**: mai count di figli hardcodato ("le 6 sub-card"); AC con
13
+ quantificatore universale su una superficie ⇒ `invariant_owners:` dal census
14
+ registry/ISA; `ac_verification` OBBLIGATORIA sull'epic (≥1 oracolo per goal AC —
15
+ consumata dal gate di chiusura epic).
16
+ - **`links.design` FORBIDDEN su card che non costruiscono UI mockata** (docs/test/
17
+ meta-only ⇒ owner coder, riferimenti di contesto in `canonical_docs.additional_refs`)
18
+ — un pointer vagante clampava la build a ui-expert (6.55M su una card docs).
19
+ - **Invariante snapshot-suite**: una card che CREA una suite visual-regression dichiara
20
+ il lifecycle delle baseline (generate+committate in-card, o assertion-based) — pena
21
+ BLOCKER di authoring.
22
+ - **Self-validation**: il writer ESEGUE `validate-card-baseline.js --prd` sul proprio
23
+ output e ritorna solo su exit 0 (token EARS sempre inglesi verbatim) — mai asserire
24
+ "YAML-valid" senza aver eseguito il validator.
25
+
10
26
  ## [prd-card-writer v1.1.0] — 2026-07-03 (framework v5.4.0)
11
27
 
12
28
  - **Proportionality lower-bound** in Card Atomicity Rules: a Tier-Gate TRIVIAL/LIGHT
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: prd-card-writer
3
- version: 1.1.0
3
+ version: 1.2.0
4
4
  description: "Generates atomic backlog cards from an approved PRD. Handles card YAML writing, dependency graph computation, parallel group assignment, and traceability matrices (FR/NFR, ISA, UI). Invoked by the /prd skill at Step 5 to offload the heaviest mechanical phase from the main context. Also runs in Standalone Single-Card Mode to author ONE baseline-conformant follow-up/CHORE/BUG/issue card (no epic+children) — invoked by /new (AC-deferral), new2/new2-resolve, and /issue-review. The canonical card writer: every card-creation path delegates here rather than hand-writing a partial stub."
5
5
  model: opus
6
6
  effort: high
@@ -335,7 +335,18 @@ applies even when N=1.
335
335
  - `business_rationale` (extended — full strategic context)
336
336
  - `scope.summary` + `scope_boundaries` (in_scope summary + out_of_scope deferrals)
337
337
  - `acceptance_criteria` as `[ ] [AC-EPIC-N]` items rolling up the PRD ACs (NOT
338
- duplicating child ACs — track end-to-end outcomes only)
338
+ duplicating child ACs — track end-to-end outcomes only). **v5.6.0 (FEAT-0068)
339
+ epic-AC rules:** (1) NEVER hardcode a child count ("all 6 sub-cards DONE" broke the
340
+ moment follow-ups appeared — write "all child cards **including any added later**");
341
+ (2) an AC with a universal quantifier over a surface ("every screen", "tutte le
342
+ route") MUST list its surface owners in `invariant_owners:` (from the ISA UI ROLE
343
+ FAMILY census) so the closure gate can re-verify them.
344
+ - `ac_verification` — **REQUIRED on the epic (v5.6.0)**: ≥1 executable oracle per
345
+ top-level goal AC (same grounding rule as child cards — only verified commands/greps;
346
+ else `manual:`). The `/new`/`new2` epic-closure gate RUNS these before flipping the
347
+ epic DONE — an epic with no oracle can only close via manual evidence, which is
348
+ slower. (FEAT-0068's goal was greppable at authoring time: "every top-edge family
349
+ member consumes `--safe-area-inset-top`".)
339
350
  - `definition_of_done`: epic-level (e.g. "all sub-card DONE", "PRD test scenarios
340
351
  executed", "ssot-registry entry added")
341
352
  - `execution_strategy` block with `recommended_mode`, `groups[]` (each with
@@ -505,6 +516,14 @@ Every card MUST include ALL fields from the template:
505
516
  `manual: <what a human checks>`. Genuinely undecidable → `[NEEDS CLARIFICATION: …]`.
506
517
  Non-manual oracles SHOULD also appear in `validation_commands` (the validator warns on
507
518
  drift). Consumed by `/new` Phase 2.5, which EXECUTES them.
519
+ - **Snapshot-suite lifecycle invariant (v5.6.0 — FEAT-0068):** a card whose scope CREATES a
520
+ visual-regression / snapshot / screenshot-diff suite MUST declare the baseline lifecycle in
521
+ its requirements + DoD: EITHER "baselines generated (`--update-snapshots` or equivalent) and
522
+ committed IN THIS CARD" (the generate command listed in `validation_commands`/MAY-EDIT
523
+ covering the baseline dir) OR "assertion-based checks with screenshots advisory-only". A
524
+ suite whose baselines "arrive later" with no declared bootstrap is a card-authoring BLOCKER
525
+ — on the real run it detonated as a merge-blocker and the 4.73M repair "fixed" it by
526
+ flag-gating the epic's only visual verification.
508
527
  - `definition_of_done` (checklist including doc invariants). **When `features.has_i18n: true`** AND the
509
528
  card introduces user-facing strings, the DoD MUST carry an i18n-completeness line — NOT merely "strings
510
529
  via `t()` + registered", but: *"new keys authored in the source locale + the i18n context registry (by
@@ -519,7 +538,12 @@ Every card MUST include ALL fields from the template:
519
538
  - `review_profile` (`skip`|`light`|`balanced`|`deep` — computed via Rule C, or honored if pre-set)
520
539
  - `files_likely_touched` (exact paths with NEW/MODIFY)
521
540
  - `links.prd` (path to PRD)
522
- - `links.design` (REQUIRED for any card with UI scope) the card's screen design
541
+ - `links.design` (REQUIRED for any card with UI scope; **FORBIDDEN on cards that build no
542
+ mocked UI — v5.6.0**: a docs/test/meta-only card, or one whose `files_likely_touched` has
543
+ no component/style path, must NOT carry `links.design` even "for context" — downstream the
544
+ `/new` mockup-first router treats it as a build target and clamps the card to `ui-expert`;
545
+ on FEAT-0068 the epic explainer stamped on a docs+ADR card cost 6.55M. Point context-only
546
+ references in `canonical_docs.additional_refs` instead) — the card's screen design
523
547
  reference, resolved to a path **that exists on disk in the worktree**:
524
548
  - **design.html when one was generated** for this screen (Step 3 produced it).
525
549
  - **ELSE the screen's canonical mockup PNG** under `${paths.prd_dir}/<slug>/mockups/`
@@ -732,6 +756,16 @@ The consumer (`new/SKILL.md`) reads `execution_strategy.groups[].level` and
732
756
 
733
757
  ## Output Format
734
758
 
759
+ **Self-validation BEFORE returning (v5.6.0 — you own your domain's deterministic hygiene).**
760
+ Run `node .framework/framework/scripts/validate-card-baseline.js --prd <your card files>` (or
761
+ the `VALIDATOR` path the caller passed) on your own output and fix every deterministic failure
762
+ (enum values, EARS keyword language — the tokens are ALWAYS English verbatim, only the clause
763
+ body follows `identity.language` —, forbidden patterns, missing required fields) IN THIS
764
+ CONTEXT before returning. Return only on exit 0, and state `validator: exit 0 (N cards)` in
765
+ the summary. NEVER assert "YAML-valid / pattern-clean" without having executed the validator —
766
+ on a real session that unexecuted claim cost a full orchestrator round-trip when Step 6
767
+ bounced all 6 children on Italian EARS tokens. Step 6 still re-runs it as the independent gate.
768
+
735
769
  Return to the caller a structured summary:
736
770
 
737
771
  1. **Card list** — IDs and titles of all cards created
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_wiki_overlay` frontmatter — this skill is now linked into a consumer only when `features.has_wiki_overlay` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.0 — 2026-07-01
6
10
 
7
11
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -2,7 +2,8 @@
2
2
  name: capture
3
3
  effort: medium
4
4
  description: Distilla una sintesi cross-document della conversazione recente in una synthesis page riusabile del wiki overlay (path da `paths.wiki_dir`/syntheses/ in `baldart.config.yml`). Usare quando l'utente invoca `/capture`, dice "capture synthesis", "salva sintesi", "distilla conversazione", "save this as wiki", "questa conversazione in wiki", o quando chiede di trasformare un ragionamento cross-document appena fatto in una pagina stabile. Due modalità — manual (sempre funzionante) e proactive (conditional sui candidati in `.claude/capture-queue/`). Implementa il loop query→wiki file-back di Karpathy.
5
- version: 1.0.0
5
+ version: 1.0.1
6
+ requires_feature: has_wiki_overlay
6
7
  ---
7
8
 
8
9
  # /capture — Synthesis Capture Skill
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.0 — 2026-07-01
6
10
 
7
11
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: design-sync
3
3
  effort: high
4
- version: 1.0.0
4
+ version: 1.0.1
5
+ requires_feature: has_design_system
5
6
  description: >
6
7
  Keep the in-repo design system (the SSOT) and its Claude Design satellite
7
8
  "mirror" project in sync — the code→design half of the closed loop. Three modes:
@@ -2,6 +2,11 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.1.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+ - **Description trimmed to pass `quick_validate`**: the `description` was 1080 chars (over the 1024 max); compressed to 1014 without losing any trigger phrase. Also shrinks the Codex skill-description budget.
9
+
5
10
  ## 1.1.0 — 2026-07-02
6
11
 
7
12
  - **P1 locate hardening.** Reso esplicito che lo step P1 è un lookup deterministico
@@ -1,23 +1,22 @@
1
1
  ---
2
2
  name: ds-edit
3
3
  effort: medium
4
- version: 1.1.0
4
+ version: 1.1.1
5
+ requires_feature: has_design_system
5
6
  description: >
6
7
  Update ONE existing canonical design-system element correctly — the deliberate
7
8
  edit twin of /ds-new. Classifies the change (resync the spec to changed source /
8
- extend with a new variant or prop / breaking change with migration / re-govern
9
- the closed-set role) and runs it end to end: apply the source change (delegated
10
- to ui-expert), regenerate the spec via the serializer (HEAD from source, agentic
11
- + prose PRESERVED, the canonical template
12
- framework/templates/component-spec.template.md filled if a spec is missing),
9
+ extend with a variant or prop / breaking change + migration / re-govern the
10
+ closed-set role) and runs it end to end: apply the source change (via ui-expert),
11
+ regenerate the spec via the serializer (HEAD from source, agentic + prose
12
+ PRESERVED, the canonical component-spec template filled if a spec is missing),
13
13
  re-govern if needed, verify. A THIN orchestrator — delegates every rule to the
14
14
  existing SSOTs, never hand-writes a spec HEAD. Use when the user says /ds-edit,
15
15
  "aggiorna un componente", "modifica una primitive", "aggiungi una variante",
16
16
  "estendi il componente", "resync dello spec", "breaking change su un
17
- componente", or when `/prd` confirms a REUSE+VARIANT extension. The pure
18
- mechanical doc-resync after a code change is ALREADY automatic (serializer +
19
- `DS_COMPONENT_STALE` gate) — this skill is for the DELIBERATE change. Gated on
20
- features.has_design_system.
17
+ componente", or when `/prd` confirms a REUSE+VARIANT extension. The mechanical
18
+ doc-resync after a code change is ALREADY automatic (`DS_COMPONENT_STALE` gate)
19
+ — this skill is for the DELIBERATE change. Gated on features.has_design_system.
21
20
  ---
22
21
 
23
22
  # DS Edit — update one existing canonical element
@@ -2,6 +2,11 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.2.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+ - **Description made `quick_validate`-clean**: removed the angle-bracket placeholder (`<screens-or-feature>`) the validator rejects, rephrased bracket-free without losing the standalone-invocation trigger.
9
+
5
10
  ## 1.2.0 — 2026-07-02
6
11
 
7
12
  - **Analysis-profile contract (framework v4.94.0)**: the standalone screen-resolution probe passes `PROFILE=ui` to `codebase-architect` per `framework/agents/analysis-profiles.md`. The Step 3 field-extraction retrieval order is unchanged.
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: ds-handoff
3
3
  effort: medium
4
- version: 1.2.0
4
+ version: 1.2.1
5
+ requires_feature: has_design_system
5
6
  description: >
6
7
  Produce a FIELD-LEVEL, 1:1, interaction-complete handoff brief for Claude Design
7
8
  — every screen's real fields (label, control type, required, validation, default,
@@ -9,7 +10,7 @@ description: >
9
10
  data schemas (Zod / TS types / form schemas) via a coverage gate that BLOCKS prompt
10
11
  emission when a backed screen's fields are unverified. The single SSOT for the
11
12
  Claude Design handoff prompt: `/prd` Step 3.0 Branch B delegates here; usable
12
- standalone via `/ds-handoff <screens-or-feature>`. A THIN orchestrator — cites
13
+ standalone via `/ds-handoff` with a screen list or feature. A THIN orchestrator — cites
13
14
  `design-system-protocol.md` (Functional Traceability Gate, Reference Tables) and
14
15
  reads `mockup_analysis` as input, never duplicating their rules; reuses existing
15
16
  retrieval (code-graph / LSP / codebase-architect / Grep) rather than shipping a
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.1.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.1.0 — 2026-07-02
6
10
 
7
11
  - **Reuse-first hardening.** Reso esplicito che lo step 1 reuse-first resta il
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: ds-new
3
3
  effort: medium
4
- version: 1.1.0
4
+ version: 1.1.1
5
+ requires_feature: has_design_system
5
6
  description: >
6
7
  Create ONE canonical design-system element — a component OR a token — end to
7
8
  end with the full discipline: reuse-first research, (optional) scaffold, then
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.0 — 2026-07-01
6
10
 
7
11
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: ds-render
3
3
  effort: medium
4
- version: 1.0.0
4
+ version: 1.0.1
5
+ requires_feature: has_design_system
5
6
  description: >
6
7
  Render the design-system primitives in ISOLATION (one component × variant at a
7
8
  time) and capture a PNG per entry — the render harness BALDART never had (today
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.3.2 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_e2e_review` frontmatter — this skill is now linked into a consumer only when `features.has_e2e_review` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.3.1 — 2026-07-03
6
10
 
7
11
  - Boundary pointer: "Not a design generator" ora punta solo a `ui-design`
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: e2e-review
3
3
  effort: medium
4
- version: 1.3.1
4
+ version: 1.3.2
5
+ requires_feature: has_e2e_review
5
6
  description: >
6
7
  Deterministic, BLOCKING end-to-end review run after a feature is implemented.
7
8
  Combines functional E2E (Playwright spec written by `coder`, executed via
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.2 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.1 — 2026-07-03
6
10
 
7
11
  - Related Skills: `ui-ux-pro-max` (superseded) sostituito con `ui-design` v2
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: gamification-design
3
3
  effort: medium
4
- version: 1.0.1
4
+ version: 1.0.2
5
+ requires_feature: has_design_system
5
6
  description: Use when designing or analyzing points systems, reward loops, progression mechanics, engagement features, or loyalty programs. Triggers include "points system," "rewards design," "progression," "engagement loop," "battle pass," "loyalty mechanics," "gamification," or "retention hooks." For B2C customer-facing features in this codebase, this skill invokes the hyper-gamification-designer agent.
6
7
  ---
7
8
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_code_graph` frontmatter — this skill is now linked into a consumer only when `features.has_code_graph` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.0 — 2026-07-01
6
10
 
7
11
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: graph-align
3
3
  effort: medium
4
- version: 1.0.0
4
+ version: 1.0.1
5
+ requires_feature: has_code_graph
5
6
  description: >
6
7
  On-demand documentation alignment via the Graphify code knowledge graph.
7
8
  Rebuilds the graph offline (graphify update .), then cross-checks graph
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_i18n` frontmatter — this skill is now linked into a consumer only when `features.has_i18n` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.0 — 2026-07-01
6
10
 
7
11
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: i18n
3
3
  effort: medium
4
- version: 1.0.0
4
+ version: 1.0.1
5
+ requires_feature: has_i18n
5
6
  description: >
6
7
  On-demand internationalization audit + context-aware translation. Audits the
7
8
  i18n context registry against the t() calls and native locale files (drift
@@ -2,6 +2,10 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.0.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_design_system` frontmatter — this skill is now linked into a consumer only when `features.has_design_system` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
5
9
  ## 1.0.0 — 2026-07-01
6
10
 
7
11
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -10,7 +10,8 @@ description: >
10
10
  license: MIT
11
11
  metadata:
12
12
  author: LottieFiles
13
- version: 1.0.0
13
+ version: 1.0.1
14
+ requires_feature: has_design_system
14
15
  ---
15
16
 
16
17
  # Motion Design Skill
@@ -2,6 +2,33 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 2.3.1 — 2026-07-06
6
+
7
+ - **Feature-gate**: added `requires_feature: has_backlog` frontmatter — this skill is now linked into a consumer only when `features.has_backlog` is enabled (it already refused at runtime otherwise). Trims Codex's ~2% skill-description budget on projects without the feature. Install-time gate, portable across Claude + Codex.
8
+
9
+ ## 2.3.0 — 2026-07-04 (FEAT-0068 post-mortem: integrità dell'esito)
10
+
11
+ - **Chiusura epic: solo in merge phase, predicato esteso** — `commit.md` c-bis RITIRATO
12
+ (timing: chiudeva PRIMA che la final review potesse smentire il goal; anchor bug:
13
+ `^parent:` non matchava il `parent:` annidato sotto `group:` → gate no-op).
14
+ `merge-cleanup.md` 5e ora richiede: figli **e follow-up** DONE + nessun residual
15
+ bloccante/finding closure-invalidating + **AC epic verificati con evidenza**
16
+ (oracoli `ac_verification`); ramo **REOPEN** per un'epic DONE con scope aperto.
17
+ - **Classe finding "closure-invalidating"** (`final-review.md` F.4): un finding
18
+ "goal/AC epic non raggiunto" è un difetto di STATO — il fix testuale non basta,
19
+ l'epic non chiude (o riapre) nello stesso repair commit.
20
+ - **Verdetto PARTIAL calcolato** (`final-review.md` § Report verdict): residual HIGH+ /
21
+ epic aperta / AC epic `[ ]` ⇒ prima riga `⚠️ PARTIAL` col gap nominato; ✅ riservato.
22
+ - **Routing mockup semantico** (`implement.md` 6a): `HAS_MOCKUP` = la card COSTRUISCE
23
+ la UI mockata (design_src, o design + bindings/file UI) — un bare `links.design` su
24
+ card docs/meta va all'owner router (era: clamp a ui-expert, 6.55M su una card docs).
25
+ - **Stamp holistic evidence-gated** (`implement.md` step 4 P1): uno stamp senza
26
+ `agents_run` non vuoto = ASSENTE → il plan-auditor gira (phantom stamp FEAT-0068).
27
+ - **Suite aggiunte dalla card: eseguite, non solo parse** (`completeness.md` 1b): uno
28
+ spec ADDED va RUN targeted pre-commit; suite snapshot senza lifecycle baseline
29
+ dichiarato = `Partial` → gap-fix subito (era: merge-blocker + repair da 4.73M che
30
+ flag-gatava la verifica dell'epic).
31
+
5
32
  ## 2.2.1 — 2026-07-03 (FEAT-0067 post-mortem: migration vocabulary aliases)
6
33
 
7
34
  - Il gate di delega `-auto` (condizione 4) e il Migration Gate Phase 0 1b (setup.md
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: new
3
3
  effort: medium
4
- version: 2.2.1
4
+ version: 2.3.1
5
+ requires_feature: has_backlog
5
6
  description: >
6
7
  Orchestrate a team of specialized agents to implement one or more backlog cards
7
8
  end-to-end inside a dedicated worktree, with code review, doc review, QA, and
@@ -33,14 +33,18 @@
33
33
  a. Edit the backlog YAML (`${paths.backlog_dir}/<CARD-ID>.yml`): set `status: DONE`, add `completed_date: <today>`, and add `provenance.implementation_session: <SESSION-ID>` (this run's session UUID — get it with `Bash(echo "${CLAUDE_CODE_SESSION_ID:-}")`; if empty, omit the field). Merge into any existing `provenance:` block written by `/prd` — do NOT overwrite `planning_session`. This makes an implementation bug traceable back to the session that produced it (`~/.claude/projects/*/<id>.jsonl`).
34
34
  b. Add implementation notes summarizing what was built.
35
35
  c. **Update `${paths.references_dir}/ssot-registry.md`** — add/update the entry for this card's feature area. The pre-commit doc-freshness hook BLOCKS commits that touch `${paths.backlog_dir}/` without a corresponding ssot-registry update. Always include ssot-registry.md in the same commit as the backlog YAML.
36
- c-bis. **Epic-closure gate (deterministic since v4.99.0)**: if the card YAML declares a parent epic (`parent:` field), check AFTER step a set this card DONE — whether it was the LAST open child. Deterministic count, no judgement:
37
- ```bash
38
- PARENT=$(awk '/^parent:/ {print $2; exit}' ${paths.backlog_dir}/<CARD-ID>.yml)
39
- if [ -n "$PARENT" ]; then
40
- PENDING=$(grep -l "^parent: ${PARENT}" ${paths.backlog_dir}/*.yml | xargs grep -L "^status: DONE" | wc -l)
41
- fi
42
- ```
43
- When `PENDING` is `0`: flip the PARENT epic's status in its ssot-registry.md entry to DONE **in the SAME commit**, and if the parent epic has its own backlog YAML, set its `status: DONE` + `completed_date` too. Non-triggers (do nothing, idempotent): the card has no `parent:`; siblings still pending (`PENDING > 0`); the parent entry is already DONE. This closes a recurring consumer gap: step 28c alone updates the CARD's feature-area entry, so epics stayed `IN_PROGRESS` after their last child closed and were only caught by the nightly doc routine (3 confirmed occurrences across two audit windows).
36
+ c-bis. **Epic closure does NOT happen here (v5.6.0 — the v4.99.0 commit-time gate is RETIRED).**
37
+ Two proven defects (FEAT-0068 post-mortem): (1) **timing** — closing at the last card's
38
+ commit runs structurally BEFORE the final review can disprove the epic goal (the FEAT-0068
39
+ epic closed DONE 13 minutes before the review proved the goal unmet on ~90% of screens),
40
+ and the commit context cannot see follow-up cards materialized later in the batch;
41
+ (2) **anchor bug** — the retired gate grepped `^parent:` but the card schema nests
42
+ `parent:` indented under `group:`, so it was a silent no-op on schema-conformant cards.
43
+ Epic closure now lives ONLY in the merge phase (`merge-cleanup.md` Phase 6b step 5e,
44
+ extended predicate: children **and follow-ups** DONE + no blocking residual + **epic ACs
45
+ verified**), which runs AFTER the final review. At commit time the parent epic and every
46
+ sibling card YAML are READ-ONLY. The epic-staleness safety net the v4.99.0 gate closed
47
+ stays closed by Phase 6b 5e + the nightly doc routine.
44
48
  d. **Verify the write**: re-read the YAML file and confirm `status: DONE` is present. If not, retry the edit.
45
49
  e. Stage BOTH the updated YAML AND ssot-registry.md, then commit (or as an immediate follow-up commit if the Phase 4 implementation commit already happened). When this produces a SECOND commit for the card, record BOTH hashes in the tracker (`commit: <impl-hash> + <done-hash>`) so traceability/bisect is unambiguous.
46
50
  29. **Update tracker**: move card to `## Completed Cards` with commit hash(es), summary, flags, **and `card_status: DONE (verified)`** — the tracker is the only state surface (§ "State surface — the tracker only"); do not also emit a TaskUpdate or Progress-Bar turn for the transition. If you surface the card completion to the user at all, do it as a short prose line folded into the commit turn, never a dedicated turn.
@@ -36,6 +36,16 @@ Before triggering any review, you MUST verify that the coder agent implemented *
36
36
  `conditional_items` section → flag as `Missing` (the coder must document the branch taken).
37
37
 
38
38
  1. **Enter Phase 2.5 (completeness)** — **no standalone tracker write** for phase entry (§ "Context Tracking" allowlist; the tracker records only `2.5-completeness DONE` at step 6, co-emitted). Proceed directly to the next step.
39
+ 1b. **Card-added test suites must RUN, not just parse (v5.6.0 — FEAT-0068).** If the card's diff
40
+ ADDS or modifies a test/spec file, the completeness evidence for that item is a targeted
41
+ EXECUTION of exactly that file (`npx vitest run <file>` / `npx playwright test <file>` / the
42
+ toolchain equivalent), in the worktree, before commit — a `--list`/parse check only proves the
43
+ file compiles, not that the suite can pass. A suite that cannot run yet by design (e.g. a
44
+ visual-regression suite whose baselines are generated later) is only `Done` if the card
45
+ EXPLICITLY declares that lifecycle (see `card-schema.md` § snapshot-suite invariant) AND the
46
+ declared bootstrap command is exercised; otherwise classify `Partial` and route to the
47
+ gap-fix loop NOW — the FEAT-0068 card shipped a baseline-less suite that detonated as a
48
+ merge-blocker and was "fixed" by flag-gating the epic's only visual verification (4.73M).
39
49
  2. Re-read the backlog card (`requirements`, `acceptance_criteria`, `unknowns`, and `definition_of_done` fields).
40
50
  3. Build a checklist — one row per item:
41
51