Separate the prose capability from the body role
body carries two meanings that were merged by accident of timing:
body carries two meanings that were merged by accident of timing:
Tracking started Sep 6 — check back for trends.
Declare the gate rather than inferring it, per SPEC-125's governing rule:
readingAxis.requires = 'prose' TextBlock: { provides: ['prose'] }
Only one axis needs it initially, so this is close to a bespoke field in cost. It is worth the general shape because SPEC-124 already gave every facet a declaration point — requires sits beside contract and describeForRune, and flows into the structure contract for free. A bespoke proseSection on RuneConfig solves the same case and leaves the next axis to invent its own.
reading and dropcap gate on a declared prose capability, not on the body rolebody role and every stylesheet keying on [data-section="body"] are unchangedDataTable, Showcase, Form, Api and Symbol no longer offer reading/dropcap; Blog, TextBlock, PullQuote, Sidenote and Lore still dounavailable reasons reflect the new gate rather than still citing the body rolenpm run build, the full repo suite, and refrakt contracts --check passSequenced after WORK-534, and the order is load-bearing. The design question is the default:
body role implies prose unless a rune opts out) keeps the migration tiny, but preserves the lossy proxy as the default — so this same bug recurs for the next non-prose rune.reading — today's failure mode returning.Default-off is right only once schemas have narrowed: with WORK-534 in place a forgotten declaration is no longer silent — the attribute is not offered and refrakt reference says so. Running this first would forfeit that, so take default-off and rely on the narrowing to make omissions discoverable.
Note Playlist may arrive here from WORK-531 with a newly-added structural body role and no prose — that is the intended interaction between the two items, not a conflict.