A formatted, sectioned rules/passage card — one new archetype that plugs into the existing Flashcard Carousel with a single RevealView case. Two decisions needed.
WordSense currently has five card archetypes (CA1–CA5). They all share one thing in common: the answer face is a handful of flat fields — definition, examples, translation, forms. None of them can render a long-form, headed, multi-section answer.
The Passage Card (CA6) fills that gap. It is a card whose answer is a formatted passage split into sections: each section has a heading and a body made up of paragraphs, lists, callouts, or key/value pairs. Think of it as a structured document that a learner must recall as a single unit.
The driving example is the Four Bodhisattva Vows — four titled vows each with a brief explanation, plus a collapsible "how to practice" section. But the archetype is content-agnostic:
One t310 row, one FSRS schedule, the same grade pipeline as every other card. The archetype only controls what the answer face displays — not how the card is scheduled.
qa-exploration/passage-card/passage-card-gallery.html — Dark Hero palette, 390-wide "phone" shells, live collapsed sections.case 'passage-sections' to RevealView.tsx switch dispatcherPassageSectionsBlock component — reuses existing Card/Heading/block primitivespassage?: PassageContent to CarouselWordData in types.ts + carousel-config.ts'passage' value to card_archetype CHECK constraint on t070 (ADR-081 slot)archetype_extras.passage jsonb — sections + blocks per sectionarchetype + passage through session-loader.ts → carousel-card-adapter.tsconfig.revealBlocks → switch(block.id) → per-block renderer. An archetype only changes which blocks render and what content shape they read. The prompt face (CardPrompt.tsx) already renders a passage title via the existing headword element. Nothing else in the carousel needs to know about this archetype.
t070.card_archetype CHECK constraint (ADR-081) and must stay stable — it is a data value in the database, not just a label. The display name is separate and softer.docs/vault/references/ directory naming — could create casual confusion in conversation.paragraph, list, callout, or kv (key/value pairs). Every text field is plain text — React renders it as a text node, which is auto-escaped. There is no HTML injection surface at all.react-markdown@10.1.0 + remark-gfm@4.0.1 + rehype-sanitize@6.0.0. Bundle: ~+90 KB unpacked. No rehype-raw, no MDX (those are rejected for answer content — see ADR-082 security table).