V0.31.0
Name:v0.31.0Status:planning

v0.31.0 — Section-role correctness and applicability as identity

The first half of SPEC-125, governed by ADR-028: correct the section-role data, and make attribute applicability a rune-structural fact that a theme cannot change.

Nothing here breaks a build. The user-visible outcome is that reading and dropcap start working on runes where they were silently dropped — most obviously card, whose content model is literally "body (optional, repeatable any block)" but whose sections map never declared the role.

The half that does break — narrowing schemas so an inapplicable attribute is rejected rather than ignored — is v0.32.0.

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

Progress 0/6 work items

Work Items

Ready 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
0/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
0/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
0/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
0/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
0/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
0/8 criteria