M5.6Jun 30, 2026

A character who genuinely doesn't know how it ends

by Aliyah Daleen

This milestone was two branches landing on top of each other — cloud book backup (M5.5) and the Green Room itself (M5.6) — both grown from the same ancestor commit, merged as a real merge rather than a fast-forward so neither history gets flattened. Most of what collided was the boring, expected kind of conflict: two branches each adding an item to the same list. The milestone-verification scripts sitting next to each other. Two different feature branches each adding a book-deletion path to the same cleanup routine. Those all resolve as unions — nobody's work supersedes anybody else's, they just both need to exist.

One conflict wasn't boring. An earlier reader-chrome redesign had collected the bottom of the screen into a single reader dock, specifically so that summoning the app's UI chrome could never again hide the audio player sitting there. The Green Room branch, built before that redesign landed, wired its own "open the Green Room" button into the old, flatter chrome layout. Taking either branch whole would have been wrong: keep the old layout and you lose the redesign's whole point; take the Green Room branch's version of the chrome file and you silently undo it. The fix was to keep the dock and graft the new button onto the component living inside it — the kind of merge conflict that's actually a design decision wearing a diff's clothing.

Alice answers a reader in a saved Green Room conversation
The current conversation design brings the speaker, scene, and reading boundary together. Sample conversation, shown as a later design reference for the June milestone. Select an image to view it full size.

The more interesting bug wasn't in the merge at all — it was a test that had been passing for the wrong reason. The Green Room feature keeps a roster of characters current with where you actually are in the book, which means it needs to know when your reading position changes. Its test suite mocked the reading pane as an inert div, the way every other reader test in the codebase gets away with. But this suite's pane really does relocate the reader as part of what it's testing, so it reached into a player hook expecting a position-changed callback that the mock had quietly overwritten with nothing. It crashed — correctly, because the mock was wrong, not the code path.

The honest numbers on the merged tree: 1,241 tests passed, 0 failed, 35 skipped, the mobile bundle still builds, and the new AWS S3 client came in clean on licensing (Apache-2.0). Two milestone-verification scripts still list pending items — a storage cap that needs real numbers, a safe-harbour legal package, and the live spoiler-leak suite, which is expensive enough to run against a real model that it hasn't been run yet. All three were already called out in the pull requests before merge. We'd rather ship a milestone with its gaps named than round up to "done."

← All devlog posts

The cast has been waiting for you.

Join the waitlist — beta invites go out in order, and the devlog keeps you honest company until then.