V0.31.0
Name:v0.31.0Status:planning

v0.31.0 — Transform engine facet decomposition

House-cleaning on the most central package in the project. transformRune in packages/transform/src/engine.ts resolves every universal rune axis — tint, density, width, spacing, reading, elevation, prominence, motion, background, frame, substrate, cover — in one ~800-line function whose steps are numbered 1, 1b, 1c … 1h, 2 … 9. This milestone replaces that section with a facet registry (SPEC-124): one module per axis, dependencies declared rather than implied by statement order, and a driver that merges their contributions.

No feature work. Every step is behaviour-preserving, and the governing rule is that the 630 pre-existing transform tests never change — they run through the public entry point, so an edit to accommodate a migration is a bug report, not a fix.

Not enough history yet — burndown needs at least one completed day of activity.

Progress 6/6 work items

Work Items

Done 6
WORK-528 main
Enforce identity fields on theme overrides
packages/transform/src/validate.ts already declares IDENTITY_FIELDS = ['block', 'modifiers', 'sections', 'variants'] and enforces it against SPEC-091 variant deltas — "a delta restructures a rune, never redefines it". The theme-override path does not: mergeRuneConfig shallow-merges { ...base, ...override } with no field restrictions, so a theme can write runes: { Card: { sections: {} } } and silently disable reading on every card in a site.One position, applied to one of two merge paths. This closes the other.
high simple
6/6 criteria
WORK-529 main
Correct section roles — core and marketing runes
Three runes whose sections map is missing a role their layout clearly has. Card is the case that surfaced the whole problem:
high moderate
7/7 criteria
WORK-530 main
Correct section roles — storytelling runes
Six runes in plugins/storytelling, in two families of three that will almost certainly resolve the same way as each other:
medium moderate
8/8 criteria
WORK-531 main
Correct section roles — media and places runes
The two remaining slot/role mismatches, in different plugins and unrelated to each other:
medium simple
7/7 criteria
WORK-532 main
Lint slot/role mismatches
The twelve corrections in WORK-529–WORK-531 were found by an ad-hoc script comparing each rune's declared slots (from layout, structure, autoLabel, blocks, contentWrapper) against its sections map. Nothing stops the same drift returning the next time a rune gains a body slot.Turn that comparison into a standing check.
medium simple
7/7 criteria
WORK-533 main
Declare join tables in tag modules
Move the schema↔engine join tables out of RuneConfig and into the tag modules that own them, with config referencing the declaration rather than owning it. This is what makes WORK-534 possible: createContentModelSchema needs the gating facts at construction time, and today it has none.
high complex
8/8 criteria