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 8 — check back for trends.
87cf634Declare 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 passThe criteria above said "~21" when this item was written. Phase 1 added a body role to twelve more runes, so the audit covers 32:
AccordionItem, Annotate, Api, BentoCell, Blog, Bond, Bug, Card, Character, CharacterSection, DataTable, Decision, Drawer, Event, Faction, FactionSection, Form, ItineraryStop, Lore, MediaText, Milestone, Organization, Playlist, PullQuote, Realm, RealmSection, Showcase, Sidenote, Spec, Symbol, TextBlock, Work.
The expected non-provider list is unchanged. All twelve additions are prose-bearing regions — a card's body, a bento cell's body, an accordion answer, a storytelling entity's or section's prose, an itinerary stop's note, the prose after a playlist's track list — so DataTable, Showcase, Form, Api and Symbol remain the five expected to lose reading/dropcap. The larger number is more runes to confirm, not more exceptions to find.
One caveat on Character: its body role is correct but its slot is always empty — prose written directly inside {% character %} is dropped by its content model (BUG-003). It provides prose in principle and none in practice until that is fixed; audit it on the intent, not on the current output.
Sequenced 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.