What changed, and why
The collection's closings had drifted. They lived in different places (sections/ vs components/), went by different names (Coda, Closing, Onward, Synthesis, Family), and a few were buried inline at the tail of a content chapter or missing a beat outright. A read-only audit — one agent per lesson — graded all 23 against a single coda contract: a distinct close that names the one idea and points where to go next, deduped, in the lesson's own voice.
Twelve already passed and are untouched. Eleven are corrected here, in three buckets: seven gained the missing where to go next beat; four had their one idea sharpened; two had competing closings deduped. Every fix reuses the lesson's existing, already-dual-mode classes — or, where a new class was unavoidable, ships it with both light and dark. The sections below read one representative change per bucket, plus the two structural ones and a real bug the isolation scan caught.
The common fix — add the where-next beat
Eight of the eleven simply lacked a forward pointer: a crisp one-idea, then the lesson stopped (or jumped straight to a bibliography). The fix is additive and themes for free, because it reuses the lesson's own eyebrow and prose classes. SWIM is representative — three real onward pointers (Lifeguard, Raft/Paxos above it, anti-entropy gossip) in its measured, intimate voice.
A where-next block built from existing swim-eyebrow / swim-prose classes.
src/lessons/swim/components/Closing.jsx · 119 lines
⋯ 43 lines hidden (lines 1–43)
⋯ 57 lines hidden (lines 63–119)
Sharpening the one idea
Four codas had a weaker problem: they ended on several takeaways instead of one. Concurrency-foundations is the clearest case — it closed on a three-card grid that read as three competing conclusions. That grid is replaced by a single one-idea box, with the three directions demoted to a proper where to go next list below.
One synthesis box (.cc-one-idea), then a where-next list reusing .closing-card.
src/lessons/concurrency-foundations/components/Coda.jsx · 106 lines
⋯ 64 lines hidden (lines 1–64)
⋯ 7 lines hidden (lines 100–106)
A new class, themed both ways
Where a one-idea box did not already exist, a new class was added — but never in one mode only. gRPC's .gx-kicker rides existing tokens (it mirrors .gx-eyebrow), and .gx-coda ships an explicit [data-theme='light'] complement alongside its dark base, exactly how the lesson themes its other panels.
Base rules near the top; the light complement lives with the lesson's other [data-theme] overrides.
src/lessons/grpc/grpc.css · 906 lines
⋯ 169 lines hidden (lines 1–169)
⋯ 697 lines hidden (lines 197–893)
⋯ 1 line hidden (lines 906–906)
Dedupe — acid-lab's two endings
Two lessons had competing closings. acid-lab carried a proper "Synthesis" section and, separately, a decorative footer in the composition root that read as a second, poetic close. The footer is removed (its couplet preserved as a colophon comment), and the Synthesis section becomes the sole ending by gaining the where-next beat it lacked — organized into two concept families rather than a bullet salad.
The new where-next, grouped by concept family, in the lesson's iso- classes.
src/lessons/acid-lab/sections/SynthesisSection.jsx · 427 lines
⋯ 161 lines hidden (lines 1–161)
⋯ 215 lines hidden (lines 213–427)
Dedupe — extracting bloom-filters' buried close
bloom-filters was the structural one. Its close was woven into the tail of chapter 10 ("When not to") plus a decorative footer — no distinct coda at all. The synthesis is lifted out into a real Coda section (a Chapter, num 11), the duplicate is removed from chapter 10, and the section is wired into the composition root and the table of contents.
The extracted close: the one idea, then four accurate onward pointers.
src/lessons/bloom-filters/sections/Coda.jsx · 63 lines
⋯ 31 lines hidden (lines 1–31)
⋯ 1 line hidden (lines 63–63)
Wired in order: Ch10 -> Coda -> Footer.
src/lessons/bloom-filters/BloomFiltersLesson.jsx · 90 lines
⋯ 82 lines hidden (lines 1–82)
A bug the isolation scan caught
One agent's new comment in b-trees.css listed palette tokens as --card/--card-2/--rule/--ink-*/--oak-2/--stamp. The */ inside --ink-*/ silently closed the CSS comment early — turning the rest of the comment into an invalid selector that swallowed the .bt-coda rule, so the coda card would have rendered unstyled. CSS error-recovery hides this: no build error, just a missing rule. The style-isolation scan flagged it as a stray global selector, and the comment was reworded.
The reworded comment (no */ in the token list) and the now-applied .bt-coda rule.