Every WordSense study card carries two labels at once: one for what it shows the learner, one for where it sits in a word's family tree. You suspected the two labels mostly repeat each other. We checked every combination — you're largely right, and along the way we found 12 places where our own documents contradict each other. This page walks through it in plain language and ends with the questions only you can answer.
What happened. In WordSense, everything a learner studies is a "card". Behind the scenes every card carries two labels at once. One says what kind of content it shows — a word meaning, a spelling variant, a phrase, an alphabet letter. The other says where its database row sits in a word's family tree — the whole dictionary word at the top, one meaning of it underneath, one spelling of that meaning underneath that. The two labeling systems grew up separately. Last round you said they look redundant, and that a future vocabulary deck would need its own full tree.
What we did. We cross-checked all 21 possible combinations of the two labels against what our documents promise and what the running app actually does. You were largely right — the labels overlap heavily, though not completely. We also found 12 places where our own documents contradict each other or contradict the app.
What we're deciding. Whether to untangle the two labeling systems now, and if so which of two ways (question M1 — the big one). Plus follow-on rulings: how a vocabulary deck should be structured (M2), whether a dictionary headword can itself be a study card (M3), where the proposed "Passage card" fits (M4, A4), how to fix the 12 document conflicts (M6), and how to keep our master list of official documents from going stale again (M5).
What changes depending on your answers. Nothing a learner sees today, and no learner progress data is touched. This is foundation work: your answers decide how cheap or expensive it is to add the next card types (vocabulary decks, passage cards) and how much confusion future work inherits. Doing it now, before launch, is cheap. Every new card type built on the tangled version raises the price.
CA ("Card Archetype") — the what-it-shows label. CA1 = one meaning of a word. CA2 = a spelling variant (e.g. "running" under "run"). CA3 = a phrase. CA4 = a plain vocabulary pair, like tech jargon (future). CA5 = an alphabet letter. CA6 = a formatted passage revealed section by section (proposed, not built).
CT ("Card Tier") — the where-it-sits label. CT1 = the dictionary headword itself (also called a lemma — e.g. "run"). CT2 = one meaning of it ("run" = manage a business). CT3 = one spelling/inflection of that meaning ("running").
FSRS — the scheduling engine that decides when each card comes back for review. It never reads either label, which is why this cleanup can't damage anyone's learning progress.
t070 / t310 — database tables. t070 holds the cards; t310 holds each learner's per-card progress. t310 (the protected learner data) is untouched by everything on this page.
ADR-NNN — a numbered written decision record. ADR-081 (3 weeks old) decided to store the what-it-shows label in its own database column. ADR-082 proposes the new Passage card. ADR-057 is an old, retired design doc that keeps getting cited by mistake.
F1–F12 — the twelve document conflicts found this round, listed in section 2d.
The registry — our master list of "which document is the official truth for what" (a file called _CANONICAL-DOCS.md). It has itself gone stale; question M5 asks how to keep it alive.
CP-005 — an earlier review page like this one; some of your answers from it are quoted below. TERMINOLOGY — the project glossary document. Shape α / Shape β — the two candidate ways to untangle the labels, explained in section 3.
The two labels in full, then the shared machinery every card rides on. This is the vocabulary the rest of the page uses.
These are display labels only — in code, every card is the same kind of thing; the label just decides what content it shows and which screen renders it. Each card row stores its label in one database column (values in use today: lemma | sense | form | script_unit; reserved for later: phrase | vocab; proposed: passage).
| ID | Name | Plain-English | Tier | Shipped? |
|---|---|---|---|---|
| CA1 | Sense card | One discrete meaning of a word — the primary card | CT2 | ✅ |
| CA2 | Family (form) card | An inflected/derived spelling, drilled as its own card | CT3 | 🟡 label ships, studiable-forms deferred (F6) |
| CA3 | Phrase card | Multi-word sense / collocation, same renderer | CT2 | ✅ |
| CA4 | Vocab card | L1=L2 vocab / domain jargon ("merge conflict") | CT2 per docs — but your framing wants all 3 tiers | 📋 future |
| CA5 | Character card | A letter/cluster/script unit + pronunciation; alphabet renderer, not sense renderer | CT2 | ✅ (31 live, Indonesian) |
| CA6 | Passage card (proposed) | A formatted, sectioned passage/rules-set revealed in blocks | not stated (F12) | 📋 proposed, ADR-082 |
| — none — | Stored 'lemma' | Container row exists live but has no CA number — "not a displayed card" yet "always schedulable" | CT1 | live |
| ID | Name | Gloss | parent_card_id |
|---|---|---|---|
| CT1 | Lemma | Headword/container row — frequency, content-state, enrichment version | NULL |
| CT2 | Sense | One discrete meaning — the primary FSRS learning unit | → CT1 |
| CT3 | Form | Inflected/derived surface form under a sense | → CT2 |
The "parent" column is how a row points to the row above it in the tree: a spelling variant points at its meaning, a meaning points at its headword, the headword points at nothing. Numbering starts at 1 by your earlier ruling, and this axis deliberately uses no plant-metaphor names (per your CP-002/CP-009 answers).
Rows = what the card shows (CA). Columns = where it sits in the tree (CT). ✅ defined and working · ⚠️ allowed but fuzzy · ❌ impossible by definition · ∅ nobody has ever said. The gaps are the finding.
| CT1 Lemma | CT2 Sense | CT3 Form | |
|---|---|---|---|
| CA1 Sense | ❌ a lemma is not a meaning | ✅ the canonical pairing | ❌ |
| CA2 Family/form | ❌ | ❌ | ✅ the canonical pairing |
| CA3 Phrase | ⚠️ multi-word headword rows exist in the database, but nobody has defined what such a card would display | ✅ a multi-word meaning — works today | ∅ variants of a phrase (e.g. Indonesian doubled words) never addressed |
| CA4 Vocab | ∅ your "vocab needs the full tree" framing contradicts the glossary, which pins vocab cards to the meaning tier only | ⚠️ documented as a future direction; what data such a card needs is undecided | ∅ same gap |
| CA5 Character | ∅ our rules say every meaning-tier row needs a headword parent — do the 31 live alphabet-letter cards have one? The docs never say; needs a live database check | ✅ 31 letters live (Indonesian) | ❌ there's no such thing as a "spelling variant of a letter" |
| CA6 Passage (proposed) | ∅ | ⚠️ presumed meaning-tier, but the Passage-card write-up (ADR-082) never says which tier — and if meaning-tier, what "headword" would a set-of-vows card hang under? (F12; question M4 below) | ∅ scheduling each section of a passage separately was explicitly ruled out of scope |
| stored 'lemma' (no CA number) | ⚠️ these headword rows are live; one doc says a headword is "not a displayed card", yet your earlier CP-005 answers say it's "always schedulable" and even "the study unit" in flat custom decks — what a headword card would actually show a learner has never been defined (question M3 below) | ❌ | ❌ |
How to read this: 8 of the 21 cells are gaps or fuzz. The three solid pairings — meaning-card↔meaning-tier, spelling-variant-card↔variant-tier, headword↔headword-tier — are exactly your redundancy claim: for those, the two labels say the same thing twice. Every other card kind (phrase, alphabet letter, passage, future vocab) sits at the meaning tier, so today the "what it shows" label really works as "which flavor of meaning-tier card is this", plus two labels that just mirror the tier.
Every card is supposed to travel the same lifecycle: in the catalog → picked as a candidate → waiting its turn → introduced to the learner → actively studied → learned. Because the machinery is shared, the differences between card kinds come down to one thing: which of those stages each kind can actually reach in the running app.
| Card kind | How far it gets today | Worth knowing |
|---|---|---|
| Meaning + phrase cards | The whole journey — catalog to learned and beyond. Fully working. | A meaning that has spelling-variant children can't count as "learned" until all its variants are learned too — so it can look fully grown on screen while officially still mid-journey. |
| Alphabet-letter cards | The whole journey. Fully working (31 live). | Shown by the alphabet-assessment screen, not the regular card carousel; their empty translation fields are empty on purpose. |
| Spelling-variant cards | Stops at "candidate". The release mechanism that moves cards from the waiting room into study only picks meaning-tier rows, so variant cards are never released (verified against the live app, June 3). | What actually shipped is a display-only "related forms" panel on the parent card. The learning machinery could handle variant cards — only the entry doorway blocks them. |
| Passage cards (proposed) | On paper: the whole journey, identical to a meaning card — the design deliberately adds zero new scheduling behavior. | The tooling to author/generate passage content doesn't exist yet. |
| Headword rows | Contradiction. One doc says headwords travel the journey too; but the only wired release mechanism picks meaning-tier rows only, so a headword can never actually be released to a learner. | Your earlier "flat custom decks" answer requires headwords to be studiable — that's finding F5 and question M3. |
Grading a card ("I knew it / I didn't") and the manual levers (mark learned, pause, discard, star) all flow through one shared pipeline, whatever the card kind. The differences:
Meaning, phrase, and alphabet-letter cards: everything works — grading, graduating to "learned", demotion, all manual levers. Discarding a meaning also cascades to its spelling-variant children.
Spelling-variant cards: the grading behavior is designed and covered by automated tests, but no live screen ever calls it. In practice the only things that happen to a variant row today are being displayed on its parent, and being retired when its parent is discarded.
Passage cards: by design, identical to a meaning card — nothing new.
Headword rows: created directly when a learner's profile is set up, skipping the normal candidate pipeline — and no learner action anywhere is defined for them.
Found while cross-checking the matrix, reported as found — not pre-fixed. Why it matters: agents (and people) work from these documents; every conflict is a chance for future work to be built on a wrong claim. Question M6 below asks how to clean them up. The "where" column names the two documents in conflict — TERMINOLOGY is the project glossary, "flow doc" is the card-lifecycle reference, "state doc" is the card-progress reference.
| Flag | The conflict, in plain terms | Where |
|---|---|---|
| F1 | One named card-stage move ("T25") is defined two different ways: the glossary says it's "starring a waiting card to jump the queue"; the flow doc says it's "starring a card straight out of the catalog". Two docs, two different moves, same name. | TERMINOLOGY:420 vs flow doc § 4 |
| F2 | Another named move ("T72", un-pausing a card) has two different destinations in the two docs. The app follows the flow doc's version; the glossary's version is wrong. | TERMINOLOGY:428 vs flow doc § 4 |
| F3 | The two docs disagree on what happens when a card gets released from the waiting room — which stage it lands in. The boundary between "candidate", "waiting", and "introduced" is muddy on paper. | TERMINOLOGY:419 vs flow doc § 4 |
| F4 | The glossary describes a database marker ("is_candidate") that simply doesn't exist in the database. | TERMINOLOGY:393 vs state doc § 4 |
| F5 | One doc says headword rows are "always schedulable, never skipped" — but the app's only release mechanism never releases them. Both claims live in the SAME document. | flow doc § 3 vs § 5 |
| F6 | Spelling-variant cards are marked "shipped" in the glossary — but what actually shipped is only a read-only "related forms" panel; studiable variant cards were deferred. | TERMINOLOGY vs flow doc § 7 |
| F7 | The glossary says marking a card "learned" spaces its reviews 4× further apart. That behavior was removed from the code — it does nothing extra now. | TERMINOLOGY:468 vs state doc § 7 |
| F8 | The glossary still says there are four card kinds; there are six. | TERMINOLOGY:407 |
| F9 | The glossary still points at ADR-057 (a retired design doc) as the live contract for study sessions. Following it would regress current work. | TERMINOLOGY:190,214 |
| F10 | The master list of official documents (the registry) itself still lists that same retired ADR-057 as official — the exact staleness you worried about. The registry's own "last checked" date is 33+ days old, and the glossary has no named maintainer. | the registry § ADRs |
| F11 | One doc's rule of thumb for telling ordinary cards apart ("their extras field is empty") silently breaks the day Passage cards land, because passages store their content in exactly that field. A recent decision (ADR-081) already prevents real damage, but the stale rule of thumb should be rewritten. | TERMINOLOGY vs ADR-082 § 2 |
| F12 | The Passage-card proposal never says where in the card tree a passage lives, and every meaning-tier card is required to have a headword parent. What would a "Bodhisattva vows" card's headword be? Nobody has answered. (That's question M4.) | ADR-082 (an omission) |
Your exact remark last round: the headword and meaning display-labels are redundant — the tree position already says that — and a vocabulary deck would have headwords, meanings, and forms of its own.
For every ordinary language card, the what-it-shows label ("headword" / "meaning" / "spelling variant") can be worked out from the tree position alone. We're storing the same fact twice, in two columns.
And "vocab has lemma, sense and form" exposes the deeper flaw: "vocab" isn't the same kind of label as the others. A vocabulary deck would have its own headwords, meanings, and spelling variants — so a vocab spelling-variant card would need to be labeled "vocab" AND "spelling variant" at the same time. A single-value column can't say both. The same problem will eventually hit variants of phrases.
The what-it-shows label does carry information the tree position doesn't. An alphabet-letter card and a word-meaning card sit at the same tree position, yet must open completely different screens — something has to tell them apart.
They also have opposite rules about which data fields should be empty (a letter card has no translations, on purpose). Getting that wrong already caused a false "missing data!" alarm once (June 9). And only 3 weeks ago we decided — in ADR-081 — to store this label explicitly, because computing it kept breaking. Walking part of that back is defensible (a tree-position lookup is reliable in a way the old guesswork wasn't), but it must be done openly, in a new decision record, not as a quiet edit.
Both are coherent; neither is obviously wrong. Picking one (or neither) is item M1 below.
Stop storing the three labels that just mirror the tree position. Only store a label when a card is a special kind (alphabet letter, phrase, vocab, passage); an empty label means "the ordinary kind for its position".
Cheapest change. The catch: every piece of code that asks "what kind of card is this?" now has to read two columns and combine them — the exact two-signal juggling ADR-081 was adopted to end.
Split into two independent facts: tree position (headword / meaning / variant) and content world (ordinary language / alphabet / phrase / vocab / passage — final names to be locked in the glossary first).
Cleanest model — a vocabulary deck with its own word forms falls out naturally. The catch: the biggest rename ripple through code, database, and documents.
What has to be touched under either shape: the data-quality checker's rules for which fields each card kind needs; a handful of code constants and the places that stamp the label onto new cards; the screen-routing logic that picks which display a card opens; and every document sentence describing the old labels. What is guaranteed untouched: the scheduling engine, the learner-progress table, and the review endpoints — none of them ever read this label (verified in the Passage-card analysis and a code audit).
Sizes: XS/S = under an hour · M = a work session · 0 = provably untouched.
| What | The change | Size |
|---|---|---|
| The database | Relabel ~1,100 cards + 31 letters — minutes of SQL either way (Shape α = loosen one rule; Shape β = add one column and fill it) | S (α) / M (β) |
| Data-quality checker | Update its "which fields must each card kind have" rules, and the enrichment code that stamps labels onto new cards | S–M |
| Scheduling code | One naming constant — no scheduling logic reads the label | XS |
| Review/grading endpoint | Untouched — it never reads the label | 0 |
| Session card loader | Pass the new label(s) through to the screens | S |
| Screen routing | The logic that decides which display a card opens (regular card vs alphabet screen vs future passage view) switches on the new label(s) | S–M |
| Documents | Glossary sections, an honest "this partially supersedes ADR-081" decision record, an amendment to the Passage-card proposal, the project-overview block — the F1–F12 conflict cleanup should ride along | M |
| Guaranteed untouched | The scheduling engine, every learner's progress data, the lifecycle stages, the growth-stage ladder, the release mechanism, all game grading paths | — |
Bottom line: cheap now, pricier later. No learner data is touched, the card catalog can be regenerated, and pre-launch rules let us change the database freely. The two real costs are honesty (openly superseding a 3-week-old decision rather than quietly editing it) and a documentation sweep. Every new card type shipped on the tangled version — Passage cards, vocab decks — raises the price of untangling afterward.
The problem: we keep one master list saying "for each topic, THIS document is the official truth". Finding F10 proved the list has gone stale — it still names a retired document as official, and its own "last checked" date is over a month old. A stale master list quietly misleads every agent that consults it. Three ways to keep it alive:
W4-A — Self-updating list. Each official document declares itself official in its own header; a script rebuilds the master list automatically. About half a day of work. Risk: the staleness just moves down a layer — now the headers can rot instead.
W4-B — Weekly check (recommended). Extend the existing weekly audit to compare the list against reality and raise a flag on any mismatch — this would have caught the retired-document row. Small effort. Risk: it detects staleness after the fact rather than preventing it.
W4-C — Ask at write time. The document-writing tool asks "should this be on the official list?" whenever an official-looking document is created. Small effort. Risk: catches new additions only — not retirements, and a retirement is what actually bit us.
Each item says what it changes for the product first, then the options. Click an option; add a note if the options don't fit.
What this is: the Passage card is a proposed new card type — a formatted text (a set of vows, house rules, a checklist) that a learner reveals section by section instead of flipping one flashcard face. Its design write-up (ADR-082) is finished but can't be accepted until you rule on these two questions from last round. Full mockup: passage-card-ca6-checkpoint →
Two are about cmux — the terminal app that runs your fleet of Claude sessions. One is about Susi's cake site. Same one-click pattern as above.