baldart 4.68.0 → 4.68.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/CHANGELOG.md +11 -0
- package/VERSION +1 -1
- package/framework/.claude/skills/design-system-init/SKILL.md +36 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,17 @@ 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
|
+
## [4.68.1] - 2026-06-24
|
|
9
|
+
|
|
10
|
+
**`/design-system-init` now actually ACTIVATES the closed-set gate it just populated — found on the first real `mayo` upgrade run.** The v4.68.0 upgrade correctly derived + confirmed the closed-set data (the two-header `page-header` family + a `range-slider` pair landed in the component HEADs with `canonical_for`/`selection_closed: true`), but `baldart ds-gate` stayed `no-policy` and never enforced. Root cause: step 6's serializer bundle merged "deterministic (step 3) + agentic (step 4)" but NOT the step-4b/4c selection-policy fields, so `emitSelectionPolicy` ran over components without `canonical_for` and generated an EMPTY `INDEX.md § "Selection Policy"` block (the HEADs got the fields via a side path; the gate reads the INDEX block). Data present, gate dormant.
|
|
11
|
+
|
|
12
|
+
**PATCH** — corrects the bootstrap write/verify flow; no schema/API change.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **Selection-policy fields flow into the `--index` bundle** (`design-system-init/SKILL.md` step 6 + workflow step 5) — the serializer bundle MUST carry `canonical_for`/`use_when`/`selection_closed` for ALL components so `emitSelectionPolicy` generates the populated `INDEX.md § "Selection Policy"` block. Building the bundle from `extract-manifest` only / pre-4c agentic JSON leaves the block empty.
|
|
17
|
+
- **New BLOCKING verification step 6b/5b** — when any closure was confirmed, the skill now asserts `INDEX.md` contains `## Selection Policy` AND `baldart ds-gate` no longer reports `no-policy` (the gate reads the COMMITTED baseline, so the INDEX block must be committed) before declaring the closed-set bootstrapped. Closes the "data in HEADs but gate dormant" gap that would otherwise ship silently.
|
|
18
|
+
|
|
8
19
|
## [4.68.0] - 2026-06-24
|
|
9
20
|
|
|
10
21
|
**Closed-Set Selection Policy — the third semantic layer that makes the "third header" structurally impossible.** Found on real `mayo` PRDs: every PRD ignored the two existing canonical headers (`SectionHeader` depth-0, `DrilldownHeader` depth-1+) and wrote new ones, requiring an expensive consolidation epic (`FEAT-0045` + an ADR) and leaving `Header.tsx` deprecated-but-live in 3 call-sites. Root cause (confirmed by a BALDART trace + 40-source 2026 research): the registry has a token layer and a component layer, but **no layer asserts the *boundary* of a category** — so adding a third header violated no rule, only an undiscovered convention. The registry-first cascade was advisory at generation-time + reactive at review-time; nothing prevented the duplicate at build-time. The 2026 market confirms the gap: no vendor (Figma Code Connect, Storybook MCP, shadcn) hard-gates the reuse decision, and no deterministic tool detects a semantically-equivalent rewrite — but BALDART already ships the machine-readable manifest signature, so it is "one manifest-signature-diff away".
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.68.
|
|
1
|
+
4.68.1
|
|
@@ -158,8 +158,17 @@ precedence caveats: `framework/agents/effort-protocol.md`.
|
|
|
158
158
|
Reconciliation gate: auto where confident, ask where it is the user's call.
|
|
159
159
|
5. **Bootstrap the DTCG token SSOT.** See § Token SSOT bootstrap below.
|
|
160
160
|
6. **Write the files — DETERMINISTICALLY (the HEAD is NEVER model-authored).**
|
|
161
|
-
Merge the deterministic JSON (step 3) with the agentic JSON (step 4)
|
|
162
|
-
|
|
161
|
+
Merge the deterministic JSON (step 3) with the agentic JSON (step 4) **and the
|
|
162
|
+
selection-policy fields from steps 4b/4c** (`canonical_for` / `use_when` /
|
|
163
|
+
`selection_closed`) per component into a bundle and run the serializer. The
|
|
164
|
+
bundle MUST carry the selection-policy fields — they are what
|
|
165
|
+
`emitSelectionPolicy` reads to GENERATE the `INDEX.md § "Selection Policy"`
|
|
166
|
+
block. Omitting them (e.g. building the bundle from `extract-manifest` only, or
|
|
167
|
+
from the pre-4c agentic JSON) writes the closed-set fields to the HEADs via a
|
|
168
|
+
side path but leaves the INDEX block EMPTY, so `baldart ds-gate` stays
|
|
169
|
+
`no-policy` and the gate never activates. On UPGRADE, the `--index` bundle MUST
|
|
170
|
+
include ALL components (not only the changed ones) so the regenerated router +
|
|
171
|
+
policy block are complete. Run the serializer:
|
|
163
172
|
```
|
|
164
173
|
node .framework/framework/.claude/skills/design-system-init/scripts/serialize-spec.mjs \
|
|
165
174
|
--bundle <bundle.json> --out-dir ${paths.design_system}/components \
|
|
@@ -186,6 +195,18 @@ precedence caveats: `framework/agents/effort-protocol.md`.
|
|
|
186
195
|
- `tokens-reference.md` — **generated** human view of `.tokens.json` (or pure
|
|
187
196
|
narrative). Not a third source of values.
|
|
188
197
|
- `patterns/.gitkeep` — empty dir for future pattern docs.
|
|
198
|
+
6b. **VERIFY the Selection Policy activated (BLOCKING when any closure was confirmed).**
|
|
199
|
+
If step 4c confirmed any `selection_closed: true`, then after the write:
|
|
200
|
+
- `grep -q '## Selection Policy' ${paths.design_system}/INDEX.md` MUST succeed —
|
|
201
|
+
the generated block lists the closed families. If it is ABSENT, the bundle
|
|
202
|
+
dropped the selection-policy fields (step 6): rebuild the `--index` bundle
|
|
203
|
+
INCLUDING `canonical_for`/`selection_closed` for ALL components and re-run.
|
|
204
|
+
- `npx baldart ds-gate --json` MUST NOT report `"reason":"no-policy"`. If it
|
|
205
|
+
still does, the committed INDEX lacks the block — the gate reads the COMMITTED
|
|
206
|
+
baseline, so the INDEX (with the policy block) must be committed for the gate
|
|
207
|
+
to enforce. Surface this in the next-steps so the user commits it.
|
|
208
|
+
Do NOT declare the closed-set bootstrapped until both pass — otherwise the data
|
|
209
|
+
is in the HEADs but the gate is dormant (the exact gap this check closes).
|
|
189
210
|
7. **Update config.** Set `features.has_design_system: true`,
|
|
190
211
|
`paths.design_system: <target>`, and (when tokens bootstrapped)
|
|
191
212
|
`paths.design_tokens` + `design_tokens.outputs`. Use the same YAML write path
|
|
@@ -225,11 +246,19 @@ precedence caveats: `framework/agents/effort-protocol.md`.
|
|
|
225
246
|
4. **Token SSOT bootstrap** — § Token SSOT bootstrap (derive `.tokens.json`,
|
|
226
247
|
set outputs, `baldart tokens build`, round-trip verify).
|
|
227
248
|
|
|
228
|
-
5. **Write files DETERMINISTICALLY** — merge deterministic+agentic
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
249
|
+
5. **Write files DETERMINISTICALLY** — merge deterministic+agentic+selection-policy
|
|
250
|
+
field data per component (the bundle MUST carry `canonical_for`/`use_when`/
|
|
251
|
+
`selection_closed` so the serializer GENERATES the `INDEX.md § Selection Policy`
|
|
252
|
+
block) and run `scripts/serialize-spec.mjs --index` over ALL components (emits
|
|
253
|
+
valid-YAML HEADs + thin INDEX router + policy block, self-validates, fails
|
|
254
|
+
closed). Never hand-write the HEAD. Then the generated tokens-reference +
|
|
255
|
+
`patterns/.gitkeep`. UPGRADE salvages agentic values from existing (even
|
|
256
|
+
malformed) HEADs before re-serializing.
|
|
257
|
+
|
|
258
|
+
5b. **Verify the Selection Policy activated** (§ What This Skill Does step 6b) —
|
|
259
|
+
when any closure was confirmed: `INDEX.md` MUST contain `## Selection Policy`
|
|
260
|
+
AND `baldart ds-gate` MUST NOT report `no-policy` (commit the INDEX — the gate
|
|
261
|
+
reads the committed baseline). Don't declare done until both pass.
|
|
233
262
|
|
|
234
263
|
6. **Persist config** — `features.has_design_system: true`, `paths.design_system`,
|
|
235
264
|
and (if tokens bootstrapped) `paths.design_tokens` + `design_tokens.outputs`.
|