Part of #345. Blocks every language shipping.
What
Roasty's spoken lines are reader-facing prose that no language folder can reach.
lib/features/companion/data/companion_lines_repository.dart reads
assets/content/companion_lines.json straight off rootBundle, bypassing the
bank loader and the language overlay every other content file goes through.
The file is shaped differently from a bank: a map of occasion → list of lines
(lessonComplete, moduleComplete, courseComplete, keepSharpComplete,
challengeComplete, streakMilestone) — 18 lines, no ids, no envelope. That
shape is why it was left out, not an oversight: an id-keyed overlay has nothing
to key on.
Why it blocks: ADR-0026
makes complete the bar for offering a language, and complete means every piece
of reader-facing prose. While these lines sit outside the mechanism, no language
can honestly be marked complete — Roasty would keep speaking English in a Polish
app.
Notes
Giving each line a stable id is the whole job; once the file is a bank it loads
through loadBank like everything else and needs no new mechanism.
Settled while building: a language ships the same number of quips as
English (ADR-0029). One record per line keeps the per-line review marks
ADR-0026 exists for; a per-occasion list would have bought length freedom and
lost them.
Acceptance criteria
Built in #617 — green on every gate, plus the smoke suite run by hand
(it gates main, not PRs).
Part of #345. Blocks every language shipping.
What
Roasty's spoken lines are reader-facing prose that no language folder can reach.
lib/features/companion/data/companion_lines_repository.dartreadsassets/content/companion_lines.jsonstraight offrootBundle, bypassing thebank loader and the language overlay every other content file goes through.
The file is shaped differently from a bank: a map of occasion → list of lines
(
lessonComplete,moduleComplete,courseComplete,keepSharpComplete,challengeComplete,streakMilestone) — 18 lines, no ids, no envelope. Thatshape is why it was left out, not an oversight: an id-keyed overlay has nothing
to key on.
Why it blocks: ADR-0026
makes complete the bar for offering a language, and complete means every piece
of reader-facing prose. While these lines sit outside the mechanism, no language
can honestly be marked complete — Roasty would keep speaking English in a Polish
app.
Notes
Giving each line a stable id is the whole job; once the file is a bank it loads
through
loadBanklike everything else and needs no new mechanism.Settled while building: a language ships the same number of quips as
English (ADR-0029). One record per line keeps the per-line review marks
ADR-0026 exists for; a per-occasion list would have bought length freedom and
lost them.
Acceptance criteria
loadBank, and a staged language folder changeswhat Roasty says. —
companion_lines_bank_test.dartstages a Polishfolder and asserts Roasty's line changes, and that an omitted line stays
English.
names, not positions (
rl-nice-brew), so reordering or rewriting a lineleaves the translation attached; the same test asserts all 18 are unique.
Built in #617 — green on every gate, plus the smoke suite run by hand
(it gates main, not PRs).