October 5, 2026

Mid-Reply Messages Land on 1.4.0

Messages typed while Chalie is still working now join the reply, every model call writes its own row, a stop that worked stops reporting failure, and the whole interface moves to one flat look.

The biggest change to how a turn runs reached the 1.4.0 line today. Yesterday’s entry called it the next job. It is done.

Yesterday’s entry left nine commits on a feature branch. Today the same nine went onto rc-1.4.0 under new hashes. Chalie now reads a message typed mid-reply at the next call boundary, and each model call writes its own row. Only the row that ends the turn is marked settled, and it is written once and never changed.

The history bug from yesterday came along with them. Tool-only rows were pushing the user’s question out of the ten-row window the memory step reads, so the model got an answer with no question. Empty rows are now dropped once, where history is read. The fix is in the same commits as the feature, so the bug never reaches 1.4.0 on its own.

The turn engine needed more than the write. Settling, joining and cancelling each run in one transaction now, and their live updates go out only after it commits. A turn whose closing write fails now crashes. The alternative was committing an answer under a turn still marked working, which looks fine right up until someone reads the history.

Stop had two real bugs. A stop that actually worked was reported as failed. The server stops the turn and announces it before it answers, so the control was already gone. A “try again” banner showed with nothing to retry, and the message vanished from both the chat and the input box. Now a turn that is no longer running counts as stopped, and its message goes back to the box. A turn still running still shows the failure and keeps its stop control.

The second was an out-of-order read. A slow read of a turn that had already settled could repaint it as running, bring back “thinking…”, and block sends. Late reads are dropped now.

The rest of the day was the new look. The violet palette is gone. One shared stylesheet now defines a night theme, a light variant, pink as the only accent, flat controls, 1px lines, and no blur, shadow or rounded corners. It went through the chat, the dashboard, login and first-run screens, the rich-media cards, the loading screen, the desktop setup window, the terminal installer and the front page. The new mark is a clock arc, and its dot pulses while Chalie is working on a reply.

I deleted the tests that checked colours and the logo pulse. How the interface looks gets checked by eye in a manual pass. A test that fails because someone changed a hex value is noise, and the suite should only cover what can break unseen.

The release workflow changed too. A published release now builds the macOS desktop app on Apple Silicon and attaches it as Chalie.dmg. One fixed filename means one link always fetches the newest copy. A failed build fails the run and attaches nothing. The app is not signed with a Developer ID or notarized yet, and I am not going to pretend it is.

1.4.0 is still a release candidate branch, so none of this is out. Once it ships, a turn shows its steps as they happen rather than as one block at the end. That is the part I expect users to notice first.

  • Messages typed mid-reply join the running turn and are read at the next call boundary

  • Each model call writes its own row, and only the final row settles the turn

  • A stop that worked no longer reports failure, and its message returns to the input box

  • Every interface surface moves to the new flat look, with a clock-arc mark

  • Published releases attach the macOS desktop app as Chalie.dmg