v0.60.0

feder-cr/invisible_dotsv0.60.0Sep 14, 2026by github-actions[bot]

Upgrading?

AI Summary

Fixes a critical bug where queued messages were lost during server restarts due to incorrect interpretation of the `fresh` flag. It also cleans up orphaned queued messages from local storage when a conversation is deleted and adds version detection for pages open across an upgrade.

Key Highlights

  • Fixed queued message loss during server restarts caused by `fresh` flag logic
  • Orphaned queued messages are now cleaned up from local storage
  • Pages open across an upgrade now detect version changes
  • Backward compatible with older pages

New Features

  • Version detection across upgrades
  • Cleanup of orphaned conversation data
  • Fixed `fresh` flag logic

Full Release Notes

ONE WORD MEANT TWO THINGS. `fresh` is what the server sends when somebody
presses Clear, and it is also what it sends to a page that reconnects holding a
position from another transcript - which is what a restarted process looks like
from the outside. The page answered both by wiping, and wiping dropped the
queued message. So a follow-up typed while the agent was working disappeared on
the next restart, with nothing said: the one thing this interface argues
everywhere it must not do, on the feature built precisely because a reload ate
it. Found by reading the two senders after the stored `fresh` of 0.57.0, which
was the same defect one step earlier.

The reason travels in the TEXT rather than in a new kind, the way `busy`
already carries "1" and "0". That is not a shortcut: the page's dispatcher is
deliberately total, so a kind it has never heard of is drawn into the
transcript as a sentence - and every page still open from the previous version
would have grown one. An older page seeing `fresh` keeps doing exactly what it
did before.

A QUEUED MESSAGE DIES WITH THE CONVERSATION IT BELONGS TO. Deleting one erased
its transcript on the server and closed its browsers, and left the sentence
somebody had typed into it sitting in this browser's storage: one key per
conversation that ever had one, kept for as long as the browser is, holding
text for something nobody can reach again.

AND A PAGE OPEN ACROSS AN UPGRADE NOW KNOWS. It was noticed only by a 404,
which means only when a route it asks for had gone away entirely - and most
versions do not remove a route, so a tab left open went on running the script
it was served against a server that had moved, in silence. The build rides on
the fleet poll every page already makes, as a FIELD for the same
backward-compatibility reason as above: a reader that does not know a field
ignores it. The page keeps the first build it is told and says one sentence,
naming both versions, the moment that changes - through the same latch as the
route that vanished, because a page is old once however it found out.

Suite 610 green. Eight known-bad inputs, eight killed.

And one of them SURVIVED first, which was the gate's fault and not the
mutation's: the test stubbed `wipe` and the known-bad changed `wipe`, so it
never ran the line it altered. The real function is sliced into the harness
now. A double standing in for the thing under test is a gate that cannot see
its own subject.

Related Repositories