0.1.64-beta2 — the tick carries what moved, and the teardown is really bounded
Pre-releaseThe presence tick stops re-sending the whole graph, and the teardown that beta1 promised to bound actually is.
The tick carries what moved (#297)
Every 15 seconds the daemon sent the entire graph so that presence could change. It now sends DaemonEvent.nodesChanged — the loops that actually moved, revision-stamped — and the app folds that into the snapshot it already holds.
Making the wire narrower needs a way to know who can read it, and that is the rest of this change:
DaemonCommand.announceis the first frame on every app socket. A store sends deltas only to a connection that announced it understands them, and the full snapshot to everyone else.- An unreadable frame is skipped, not fatal.
OrchestratorClientused to treat a frame it could not decode as a dead socket. Without this, an older app on this daemon would tear its connection down and rejoin every 15 seconds, forever. It now skips the frame and says so once per connection.
Bounding a send that was never actually bounded (#301)
This is a follow-up to #291, not a retraction of it. Be clear on which half was wrong.
What beta1 fixed is real and holds up on the shipped build: a client that stops reading no longer stalls the daemon — measured at 0.003 s with a deaf client, against a 12 second timeout on 0.1.63.
What was not real was the teardown guarantee. The write loop relied on MSG_DONTWAIT to keep each send non-blocking, and on macOS that flag does nothing for send on a blocking AF_UNIX socket: 60 KB pushed into a 4 KB peer was still inside the syscall after 120 seconds, so the poll loop never got to run and closeAndWait was not bounded at all.
SO_SNDTIMEO is the half that works. It is set on the socket at init, so no single send can park indefinitely and the writer comes back each slice to notice a close. MSG_DONTWAIT is still passed, and the code now says plainly that it must not be relied on.
Verified on the merged tree: 1643 tests · 170 suites · 0 failures · swiftlint 0 errors · swift-format clean. PresenceDeltaTests and OutboundChannelTests each observed executing. Bundle identity verified dev.graphcode.app in both the Info.plist and the code signature.
Carried forward from 0.1.64-beta1: the rest of the #288 line, and its upgrade note — this remains a build where an old CLI meeting a new daemon is refused loudly rather than losing mail, with issue #298 still open.