Checkpoint 2 · Card Taxonomy Matrix

How we label study cards — the untangling decision

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.

21 label combinations checked 8 turned out undefined or fuzzy 12 document conflicts found 2 ways to untangle cheap while we're pre-launch 12 questions for you
Checkpoints 1 Latest →
Start here

Why you're looking at this page

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.

The words this page uses

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.

1 · Inventory

What's on the board today

The two labels in full, then the shared machinery every card rides on. This is the vocabulary the rest of the page uses.

1a · Card Archetypes (CA) — what the card shows

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).

IDNamePlain-EnglishTierShipped?
CA1Sense cardOne discrete meaning of a word — the primary cardCT2
CA2Family (form) cardAn inflected/derived spelling, drilled as its own cardCT3🟡 label ships, studiable-forms deferred (F6)
CA3Phrase cardMulti-word sense / collocation, same rendererCT2
CA4Vocab cardL1=L2 vocab / domain jargon ("merge conflict")CT2 per docs — but your framing wants all 3 tiers📋 future
CA5Character cardA letter/cluster/script unit + pronunciation; alphabet renderer, not sense rendererCT2✅ (31 live, Indonesian)
CA6Passage card (proposed)A formatted, sectioned passage/rules-set revealed in blocksnot stated (F12)📋 proposed, ADR-082
— none —Stored 'lemma'Container row exists live but has no CA number — "not a displayed card" yet "always schedulable"CT1live

1b · Card Tiers (CT) — where the row sits in the word-family tree

IDNameGlossparent_card_id
CT1LemmaHeadword/container row — frequency, content-state, enrichment versionNULL
CT2SenseOne discrete meaning — the primary FSRS learning unit→ CT1
CT3FormInflected/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).

The shared machinery On top of the two labels, every studied card carries the same progress systems on one progress row: the scheduler's own internal bookkeeping (never shown to anyone), a lifecycle of stages the card moves through (in-catalog → candidate → waiting → introduced → actively studied → learned → paused/retired — written as CL10 through CL80 in the docs), a growth-stage emoji ladder shown to the learner (seedling → tree, plus a "wilting" warning flag), and the learner's five manual levers (star it, mark learned, pause, retire, reactivate). The key point: all of that machinery is identical for every card. The two labels don't change how learning works — only what gets displayed and which doorway a card uses to enter a learner's rotation.
2 · The full matrix

2a — Every combination of the two labels, checked

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 LemmaCT2 SenseCT3 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.

2b

Which cards can actually complete the journey today

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 kindHow far it gets todayWorth knowing
Meaning + phrase cardsThe 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 cardsThe 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 cardsStops 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 rowsContradiction. 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.
2c

What happens when a learner acts on each kind

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.

2d · Don't smooth these over

12 places our documents disagree — with each other, or with the app

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.

FlagThe conflict, in plain termsWhere
F1One 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
F2Another 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
F3The 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
F4The glossary describes a database marker ("is_candidate") that simply doesn't exist in the database.TERMINOLOGY:393 vs state doc § 4
F5One 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
F6Spelling-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
F7The 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
F8The glossary still says there are four card kinds; there are six.TERMINOLOGY:407
F9The 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
F10The 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
F11One 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
F12The 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)
3 · Your hunch, tested

"The two labels mostly repeat each other" — where that's right, where it isn't

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.

Where you're right

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.

Where the label still earns its keep

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.

The two ways to untangle it — not resolved, that's question M1

Both are coherent; neither is obviously wrong. Picking one (or neither) is item M1 below.

Shape α — store less, compute the rest

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.

Shape β — two clean columns

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).

4 · What it would cost

What actually moves if you pick a shape

Sizes: XS/S = under an hour · M = a work session · 0 = provably untouched.

WhatThe changeSize
The databaseRelabel ~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 checkerUpdate its "which fields must each card kind have" rules, and the enrichment code that stamps labels onto new cardsS–M
Scheduling codeOne naming constant — no scheduling logic reads the labelXS
Review/grading endpointUntouched — it never reads the label0
Session card loaderPass the new label(s) through to the screensS
Screen routingThe 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
DocumentsGlossary 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 alongM
Guaranteed untouchedThe 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.

5 · Keeping the master doc list honest (W4)

The list of official documents is itself out of date

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.

Recommendation W4-B now (one small audit step that catches the exact failure we just had), plus quietly adding W4-A's header flags over time so the self-updating option stays open. W4-C is nice-to-have but misses the case that actually happened.
Decisions

What's explicit vs. inferred going into this checkpoint

1
Whatever shape wins, the scheduling engine, learner progress data, and review endpoints stay untouched
Verified by code audit: nothing in the grading or learner-action code ever reads the what-it-shows label.
Decided by Frank
2
The matrix should surface contradictions rather than silently reconcile them
Your "don't smooth these over" framing on prior review rounds — F1–F12 are reported as found, not pre-resolved.
Inferred from what you said
3
This is a review artifact, not an implementation kickoff
You asked for "an extensive HTML" to read on your phone — nothing here has been implemented; M1–M7 are open questions waiting on your ruling.
Inferred from what you said
6 · Decision items

Your questions — answer any subset, one click each

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.

M1
The big one: how should we store "what kind of card is this"?
What it changes: nothing a learner sees — this decides the foundation every future card type (vocab decks, passage cards) is built on, and how much untangling debt we carry into launch.
(a) Change nothing — keep today's single label column, just add "passage" when it ships. Lives with the redundancy.
(b) Shape α — stop storing the labels that just mirror the tree position; only special kinds get a stored label. Least work, but code must read two columns to know what a card is.
(c) Shape β — two clean columns: tree position + content world. Most work, cleanest end state; vocab decks with their own word forms come for free.
The analysis leans (c) if vocabulary decks with forms are a real goal, (b) if you want minimal.
Superseded — decided as Shape γ, see ADR-083
M2
How should a future vocabulary deck be structured?
What it changes: what an "English for developers"-style deck looks like under the hood — whether vocab items get the full word-family treatment (a headword like "merge conflict", its meanings, its variants) or stay simple.
(a) Full tree — headwords, meanings, and forms, like ordinary language. Matches your "vocab has lemma, sense, and form" framing.
(b) Flat deck — every item is one standalone card, no tree (the pattern your earlier custom-decks answer sketched).
(c) Keep as documented today — vocab items are meaning-tier cards only.
Superseded — decided as Shape γ, see ADR-083
M3
Can a dictionary headword itself be a study card?
What it changes: whether a learner can ever be shown "run" as a card of its own, or only its individual meanings. Today the docs say yes ("always schedulable" — your earlier answer) but the app has no way to deliver one, and nobody has defined what such a card would display.
(a) Keep your earlier answer — define what a headword card shows, and build its delivery path.
(b) Walk the earlier answer back — headwords are containers only, except in flat custom decks.
(c) Decide later.
Superseded — decided as Shape γ, see ADR-083
M4
Where does a Passage card hang in the card tree?
What it changes: whether the proposed Passage card (a formatted text — vows, rules, a checklist — revealed section by section) can move forward at all. Its proposal never says where it lives, and our rules say every meaning-tier card must hang under a headword — but a passage has no headword. This blocks the Passage-card decision either way.
(a) Treat it as a meaning-tier card and invent a container parent for it to hang under.
(b) Treat the passage itself as a top-tier card in a flat deck — the passage IS the study unit.
(c) Write a new rule exempting passages from needing a parent.
Superseded — resolved (single-tier, no parent) by ADR-083
M5
How do we keep the master list of official documents honest?
What it changes: whether agents keep getting silently misled by a stale "this document is the official truth" list (it already happened — finding F10). The three mechanisms are explained in section 5: W4-A self-updating list, W4-B weekly automated check (recommended), W4-C ask-at-write-time, or B and A combined.
Superseded — see ADR-083
M6
How do we fix the 12 document conflicts?
What it changes: how soon our documents stop contradicting each other (section 2d) — every day they stand, they can steer work wrong.
(a) One dedicated cleanup pass, now (matches our "docs must describe reality" house rule).
(b) Fold the fixes into the label-untangling work, whichever shape wins M1.
(c) Fix only the four most dangerous now — the ones that mis-describe how cards move between stages (F1–F4) — and leave the rest.
Superseded — see ADR-083
M7
Was this page the right format for this analysis?
What it changes: how future analyses like this get delivered to you. This very page is option (a).
(a) A review page like this one — clickable link, works on your phone, answers go straight back to Claude.
(b) A plain HTML page in the project's mockup scratch folder.
(c) Skip the page — the raw text write-up alone is enough.
Superseded — see ADR-083
7 · Re-asked from last round

A4 — the Passage card's two remaining rulings

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 →

A4a
What should this card type be called?
What it changes: only the name — it'll appear in docs, code, and eventually the app. "Passage Card" is the working name; nothing else in the project uses a similar term, so keeping it or renaming it are both safe. If you'd rather call it something else, pick "rename" and type the name in a note.
Re-scoped — tracked on ADR-082 (amended by ADR-083); a fresh checkpoint comes when ready, not this board
A4b
How should the passage text be stored and displayed?
What it changes: mostly safety and flexibility. Free-form formatted text, if handled carelessly, is a classic way for malicious code to sneak into a web page — so the storage format decides how much protective machinery we need.
(A) Structured blocks (recommended) — the passage is stored as typed pieces (heading, paragraph, list item…), not as free-form markup. Nothing can smuggle code in, no scrubbing layer needed, and it's the easiest format for AI generation to fill reliably.
(B) Sanitized markdown — free-form text plus a mandatory scrubbing step. Only worth it if authors need formatting the blocks can't express; the scrubber must never be skipped.
(C) A heavier text-processing stack, already rejected in the write-up — listed only for completeness.
Re-scoped — tracked on ADR-082 (amended by ADR-083); a fresh checkpoint comes when ready, not this board
8 · New this round

Three housekeeping items — not about WordSense cards

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.

U1
Upgrade cmux (the fleet terminal) to the newer version?
What it changes: the newer version (0.64.17) permanently fixes the bug where messages sometimes land in the wrong session's window. The cost: upgrading means quitting cmux, so every running session restarts. A step-by-step restart plan is written and ready, and the fleet has already been brought to a safe stopping point.
U2
Report the second cmux bug to its developers?
What it changes: nothing here — this is about being a good citizen. We found a separate cmux bug: when a second listener tunes into its event feed, that listener silently dies. Nobody has reported it to the cmux project yet, and we have a clean, repeatable demonstration of it. Reporting it may get it fixed for everyone.
Closed — cmux 0.64.17 fixed the events-stream bug, retested 2026-07-04
W2R
Add the 2 recipe illustrations to Susi's /cakes/ voice page?
What it changes: which pictures appear in the "tell me about this cake" voice prompts on Susi's cake page. Two of the site's pictures are decorative engraving-style illustrations from recipes — not photos of real cakes — so the agent left them out on purpose. It could add them back with an honest label ("the recipe cake"). Recommended: leave excluded.
💬
Anything else before I write up today's session log and close out the remaining board? — free note, not tied to a specific item above.