This is the build session that turned Frank's card-archetype-design board rulings (CD1/CD2/CD3/CD5, answered 2026-07-06) into shipped code — same day, 2026-07-07.
Formal, standard, gaul (street/casual), or regional — Frank's four words exactly, locked into the glossary. The enrichment AI can no longer skip this label.
Before: every example sentence in the database quietly had a fake "neutral" tag — nobody ever actually decided what register it was, the field just defaulted to a placeholder. The AI was told to keep everything sanitized and formal-ish, and slang was banned outright.
Now: the schema forces the AI to pick one of the four real labels for every example it writes. The policy: most examples stay standard (the teaching baseline), but for any word taught at A2 level or above, at least one example must be formal and at least one must be real, authentic gaul — actual street Indonesian, not a sanitized version. A1 (the easiest level) stays gaul-free for now. A regional label only gets used when a dictionary source actually proves a word is regional — never invented.
Every example looked the same register-wise — administrator Indonesian, no way to tell formal from casual, and no way for the app to ever teach the difference.
The gaul example: "Aku udah janji, tapi kayaknya nggak bisa datang" — real street Indonesian, correctly labeled, not scrubbed clean.
How it looks on the card: each labeled example gets a small icon+text tag next to it — a bank icon for formal, a chat bubble for standard, a chat-bubbles icon for gaul, a map pin for regional. Icon plus text, never color-only, so it reads clearly at a glance. Old, never-labeled examples show no tag at all — that's deliberate honesty, not a bug; we're not pretending old content is labeled when it isn't.
What stayed untouched (CD1's bound): no restyle of the card, no change to the arrow-key rating controls, no change to layout — the ONLY visible difference is the small tag next to each example.
A reality check surfaced first: this was assumed already shipped and just needing extension. It wasn't.
Built once, as a shared block that any card can opt into: a group name, "N of M" position count, and a fill bar showing progress through the group. It now leads the reveal (the answer-side of the card) on:
When a card has no group, the bar is hidden entirely — no empty "0 of 0" clutter.
An audit found the Intro badge was already consistent everywhere — the real gap was the Learn sheet.
The problem: the Learn sheet's mini-games were designed for vocabulary words — things like a letter-scramble game. On a grammar-rule card, that game would scramble the letters of the RULE'S TITLE, which makes no sense. On top of that, the empty-state copy always said "more learning aids as this word gets enriched" — a promise that's simply false for a rule, vow, or passage card; those will never get vocabulary-style memory aids.
The fix: non-vocabulary cards (rule, concept, passage) now only get sheet chips that actually make sense for them — right now that's the progress widget — plus copy that honestly points at that card's own lesson content instead of a vocabulary promise it can't keep. Vocabulary cards are completely unchanged, byte-for-byte.