mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 00:02:23 +00:00
Nine findings from a review pass over the branch. One commit because they cross the same files, and splitting them would leave an intermediate that does not build on Windows. - A dropped delta announced a LayoutResync and then delivered the backlog behind it. The queue is FIFO, so everything still in it is *older* than the gap: the peer re-pulled on the notice and was then walked back through history it had already left — TabRestructured restoring the shape a tab used to have, with window and mirror agreeing on the stale answer so nothing recovered a second time. The forwarder now drops the superseded queue and sends the resync in its place. - Pane facts persisted the whole document, with an fsync, from the PTY reader thread — once per OSC 7, so once per prompt per pane — while holding the lock that orders every other client's edits. A shell looping over directories was a write per iteration. Observations (pane facts, workspace_touch) now take Persist::Soon: the delta still goes out at once, the file catches up within FACT_FLUSH_INTERVAL, and the daemon flushes on the way out. The layout itself is never deferred. - An ordinary output chunk paid two AgentFacts clones and a clone-to-compare for facts it could not have changed. Gated on the signals that can move one, and the compare no longer clones. - machine.json was created 0644, naming every workspace's directories, the SSH user and host of every native-SSH pane, and each agent's session id. It is written owner-only from the first instant the final name exists, and a second corruption no longer overwrites the rescue copy of the first. - Windows had no control listener, so on the one platform where the tree is the only layout store, tabs did not come back at all. It now serves the dialect over the transport its pane socket already uses: a loopback listener whose port and 256-bit token live in a user-private control.port beside daemon.port — its own token, not the pane endpoint's — refusing to rebind over a live one, since binding is what writes the marker. run_daemon and the GUI's local link are one code path again. - Workspace names and paths came only from the machine's mirror, so a laptop shut since Friday listed every row as "Untitled" with a blank subtitle, in the picker whose whole job is offering workspaces on machines that are asleep. WindowView carries the label and subject the machine last gave, stamped on save and on detach; the tree still wins whenever it answers. - liveness_of read "the mirror has not been pulled yet" as Stopped, which tells the user their sessions are gone on the strength of our own ignorance. Unknown is what that state is for. - A WorkspaceRemove that never reached its machine was a debug line, though the client had already forgotten the workspace. It is now a warning that says what was left where. - MachineMirrors::install landed a pull without a repaint; the two tests the record store's retirement took with it (a closed connection stops being a subscriber, concurrent connections can all write) are back against the tree; and CHANGELOG records the migration's one-time layout loss and the Windows gap this closes. Suites green: tty7-core 675, tty7 819, tty7-server 9/5/3/3/51, fmt and clippy clean. The Windows listener is unverified by a compiler here — a C dependency in the tree blocks cross-checking from macOS — so CI's Windows job is its first build.