History: docs/decisions.md
Ref:
| Hash | Message | Author | Date |
|---|---|---|---|
| c64627bc | docs: record the wall freeze and the single-target terminal client | a73x | 2026-09-05 |
| d2323cb8 | fix: a burst of dials past the observer table waits in the backlog | a73x | 2026-09-05 |
| 547a0911 | docs: record the socket-path watch, its log trail and the QUIC admin door | a73x | 2026-09-05 |
| 5570679e | fix: normalize retained control cells in snapshots and deltas | a73x | 2026-09-04 |
| f429a992 | fix: cell text carrying a control byte is refused at the decoder | a73x | 2026-09-04 |
| fbbe3293 | docs: the wasm figure is the final tree's, and the README quotes bytes per keystroke | a73x | 2026-09-04 |
| ca7fac28 | test: the bench bounds a keystroke's bytes, not a ratio the snapshot's size now dominates | a73x | 2026-09-04 |
| c2344ddb | docs: record cells on the wire, its measurements and the clean break | a73x | 2026-09-04 |
| a9b26feb | fix: an interior blank cell is a space on the wire, so a curses row stays one ascii run | a73x | 2026-09-04 |
| 519410b1 | fix: the run header is a delta against the previous run, as SGR is | a73x | 2026-09-04 |
| 632d1166 | feat: the daemon encodes a grid row as cells, and the size is measured | a73x | 2026-09-04 |
| 298bebbf | docs: the release is one tarball per OS | a73x | 2026-09-04 |
| 39bf2478 | docs: the macOS gates name their boxes, and the guest is provisioned | a73x | 2026-09-04 |
| 7e20404d | docs: the Darwin spellings and the claims that had drifted past them | a73x | 2026-09-04 |
| e542a342 | docs: the Darwin arm, its measurements and the Mac e2e verdict | a73x | 2026-09-04 |
| 64c0073b | feat: the daemon's Darwin arm | a73x | 2026-09-03 |
| 0c516740 | Merge branch macos-port-step2: the platform layer (macOS port, step 2) | a73x | 2026-09-03 |
| 36800478 | fix: the client's agent probe sends through client_os, and the review's comment repairs | a73x | 2026-09-03 |
| dd868aeb | docs: record the platform layer and the macOS measurements | a73x | 2026-09-03 |
| ee157a2c | feat: the daemon holds 32 clients, one per wall tile | a73x | 2026-09-03 |
| e6fff02f | fix: a tile's application reads mouse reports in its own coordinates | a73x | 2026-09-03 |
| 8184693b | fix: no layout save at the exit, so two terminals stop clobbering each other | a73x | 2026-09-03 |
| a641fbae | fix: the picker asks the daemon to end a session instead of grading its list | a73x | 2026-09-03 |
| 31a7bd88 | docs: correct the version caveat, the --via rule and the picker's close key | a73x | 2026-09-03 |
| 646ac14b | docs: the wall is the layout | a73x | 2026-09-03 |
| 29cbd304 | fix: a QUIC client sends CONNECTION_CLOSE on teardown, so a poll frees its slot at once | a73x | 2026-09-03 |
| 0aed35be | fix: a successor reaps the pid-named leftovers a dead daemon or wall stranded | a73x | 2026-09-02 |
| 2843ffde | docs: record the 2026-09-02 hygiene run | a73x | 2026-09-02 |
| 5c9897e0 | feat: mux d upgrade HOST pushes this image over ssh and upgrades there | a73x | 2026-09-01 |
| 82749e3c | docs: the gone-pane rule joins the wall invariant | a73x | 2026-09-01 |
| 56a7de8e | feat: the label bar follows the tty, not the tile count | a73x | 2026-09-01 |
| 86beb855 | Remove the layer and folder-edge enforcement; keep the source bans | a73x | 2026-08-31 |
| 8f9fef4e | Remove the prose ratchets from the comment gate | a73x | 2026-08-31 |
| 15754bfd | docs: the collapse traded a file's import ban for its module's grant | a73x | 2026-08-30 |
| 16ba9284 | docs: the test order's comment claims only what the array does | a73x | 2026-08-30 |
| 600666bc | docs: a module is an owned component, and the tables name one | a73x | 2026-08-30 |
| 9d410ec9 | docs: ssh's prompts get a mux-painted place | a73x | 2026-08-30 |
| 702b0416 | docs: ssh's stderr is mux's, and its last line is the reason | a73x | 2026-08-30 |
| 5e7caf2c | docs: the handoff's policy is a table, and a warm miss pays once | a73x | 2026-08-29 |
| 145bed7e | docs: the cold attach is one ssh run | a73x | 2026-08-29 |
| 354981fc | docs: the wall is your hosts file, in the browser too | a73x | 2026-08-29 |
| 26643ada | refactor: no bare `mux run` — the v15 probe refuses before that exec could happen | a73x | 2026-08-28 |
| 2843fee1 | docs: one binary, the exec that starts it, and the break it costs | a73x | 2026-08-28 |
| d22a2aa1 | build: folder rule 4 reads production lines, not test bodies | a73x | 2026-08-28 |
| 7acef27e | docs: mux hosts' sum-of-timeouts cost gets a decisions.md entry and a measured date | a73x | 2026-08-28 |
| 98a28017 | docs: a split arrow key closes the picker — the trade-off, and the fix if it's ever wrong | a73x | 2026-08-28 |
| 7ab01fe3 | docs: correct the claims this change made stale | a73x | 2026-08-28 |
| 2bf682e2 | docs: mux HOST starts the daemon it did not find; nothing else does | a73x | 2026-08-28 |
| 7d164858 | docs: the README says what the last tile's exit really does | a73x | 2026-08-28 |
| 6fe188fc | fix: review round 1 — an unborrowed birth's copies have one owner | a73x | 2026-08-28 |
| ce611141 | feat: a new tile takes the lowest free digit | a73x | 2026-08-28 |
| 908ba6a1 | fix: the picker's claim, its auto-close, and the help that still taught `:` | a73x | 2026-08-28 |
| a6ebfe9a | docs: hosts live in a picker now | a73x | 2026-08-28 |
| d825ab6a | docs: a daemon lives until muxd stop | a73x | 2026-08-28 |
| 77e31dd9 | docs: the listing cost is a sum, and the upgrade answer is not chosen yet | a73x | 2026-08-28 |
| 0a0fefea | docs: the wall lists daemons, and the tiles are their live sessions | a73x | 2026-08-28 |
| 3dcd8110 | docs: review follow-ups — close_range barrier, observer idle deadline | a73x | 2026-08-27 |
| ba2f646a | docs: decide one read per readiness, and the seal after the last rollback | a73x | 2026-08-27 |
| fc9c746e | docs: the e2e runner, its register, and what running a group alone found | a73x | 2026-08-26 |
| e032ef40 | docs: the split, the first full coverage map, and the race it found | a73x | 2026-08-26 |
| 1baf9412 | docs: why the upgrade is an exec and not a handover | a73x | 2026-08-26 |
| aab60216 | docs: what 32 sessions buys is names, not tiles on screen | a73x | 2026-08-26 |
| 4e7623ee | docs: verify.js is where a page rule gets pinned, not a browser | a73x | 2026-08-26 |
| 597d8a35 | fix: a shell you exited is not brought back by a zoomed tile | a73x | 2026-08-26 |
| b7d2b15a | docs: the restore rule reaches the browser wall | a73x | 2026-08-26 |
| 793707c9 | docs: the bar's digit is position, not the session name | a73x | 2026-08-25 |
| 7ec78a84 | docs: the local/remote split of a restored wall line | a73x | 2026-08-25 |
| 520a8baa | feat: the daemon holds thirty-two sessions, wall-sized again | a73x | 2026-08-25 |
| fad55914 | docs: the whole tree stops telling stories | a73x | 2026-08-23 |
| 888e14a7 | docs: the two worst narrators stop telling the story | a73x | 2026-08-23 |
| 76c34f89 | feat: the doc gate holds every file to a byte budget | a73x | 2026-08-23 |
| 7e8bc30a | docs: mode 2048 — why the daemon speaks the size report | a73x | 2026-08-22 |
| 23776a3b | docs: the answer clock, its two rejected anchors, and the hub-owned frames | a73x | 2026-08-22 |
| 43b9ed13 | review: pin what the blind path moved, and stop assuming leg 3's premise | a73x | 2026-08-21 |
| 38deccfb | fix: the -A preflight asks the agent, it does not just dial it | a73x | 2026-08-21 |
| d62bdb97 | build: make release, tarred, so the exec bit survives | a73x | 2026-08-21 |
| 949cd17b | docs: agent forwarding — opt-in, daemon-blind, latest wins | a73x | 2026-08-21 |
| 94f783e5 | refactor: the whole-terminal path goes — every session is a tile | a73x | 2026-08-20 |
| ae70f4ec | check: comment claims are verified, not trusted | a73x | 2026-08-20 |
| cb1e4946 | test: the mutation notes name what the mutants actually did | a73x | 2026-08-20 |
| 28cd9a55 | docs: the model ships — mux is the wall | a73x | 2026-08-20 |
| 9c9ccd0f | refactor: one session's interaction is one interact.Core | a73x | 2026-08-20 |
| 411b6c25 | docs: the wall file is attach history now | a73x | 2026-08-20 |
| 535ccca0 | docs: the zoom is a lens — supersede the real-attach decision, retable the keys | a73x | 2026-08-19 |
| c1798e71 | docs: the wheel in the key table, and why the app owns the mouse | a73x | 2026-08-19 |
| 14b06705 | docs: the wall's keys in the README, and why zooming is a real attach | a73x | 2026-08-19 |
| b44db225 | docs: MUX_SOCK/MUX_SESSION in the README, and why the loop is refused not escaped | a73x | 2026-08-19 |
| c76c27a2 | docs: Ctrl-\ w in the key table, and why the wall is a child process | a73x | 2026-08-19 |
| 020d91c1 | docs: n and p in the key table, and why a lone session refuses to step | a73x | 2026-08-19 |
| 8d698839 | docs: Ctrl-\ c in the key table, and why a switch is an attach | a73x | 2026-08-19 |
| f1441c35 | docs: Ctrl-\ is documented as a prefix, and the old decision says so | a73x | 2026-08-19 |
| 7c4367e8 | test: e2e — dynamic wall add/remove/reorder/restore; docs | a73x | 2026-08-18 |
| 14ffe9c4 | docs: record the selection lane's totality and history watermark | a73x | 2026-08-18 |
| 13ff6638 | docs: record web copy/paste acceptance | a73x | 2026-08-18 |
| d25d34dd | docs: qualify web selection acceptance | a73x | 2026-08-18 |
| ee627aff | docs: record muxweb mouse selection | a73x | 2026-08-18 |
| f09ed4f5 | docs: clarify web clipboard text constraint | a73x | 2026-08-18 |
| 43b4f724 | docs: record shared web clipboard semantics | a73x | 2026-08-18 |
| 80c68b96 | docs: side-channel passthrough, and what it measured | a73x | 2026-08-16 |
| 2dd9158f | docs: copy/paste discovery — measured, and it reorders the work | a73x | 2026-08-15 |
| 48349aee | feat(shellint): the OSC 133 injection is opt-in | a73x | 2026-08-15 |
| 971a17e9 | docs: M18 decisions, field verification, and what the version string cannot tell you | a73x | 2026-08-15 |
| 5d41e106 | docs: review-round records; four passages caught up with the code | a73x | 2026-08-14 |
| 86003eb5 | feat: valgrind 6c first run — clean bill; pin local stack to x86_64_v3 | a73x | 2026-08-14 |
| ddefd581 | docs: three cross-reference fixes in the hygiene doctrine | a73x | 2026-08-14 |
| a61e6262 | docs: soak numbers stated with their measured window | a73x | 2026-08-14 |
| 43fb76c4 | docs: hygiene-kit doctrine — the table is the law, verdicts print, scopes stated | a73x | 2026-08-14 |
| 638786cd | docs: two precision fixes in the zlint verdict wording | a73x | 2026-08-14 |
| d529c286 | tools: valgrind recipe for the QUIC/C stack + first-run record | a73x | 2026-08-14 |
| ff178c4f | docs: zlint trial verdict recorded | a73x | 2026-08-14 |
| 4e6962dd | Merge branch 'feat/agent-surface' | a73x | 2026-08-14 |
| af32c00c | docs+build: record the diff-since deferral; the agent e2e becomes a gate | a73x | 2026-08-13 |
| 11423676 | docs: agent surface shipped — decisions recorded, deferrals named | a73x | 2026-08-13 |
| dc0a1f75 | docs: simplify-round record; tools/collect.sh — the bundle in one go | a73x | 2026-08-13 |
| 431ce862 | docs: M17 field verdict — kill criterion PASSED, two field findings | a73x | 2026-08-13 |
| 7c2b4725 | docs: M17 close-out record; a recovered tile clears its stuck badge | a73x | 2026-08-13 |
| 5cc8660f | docs: M16-a record — both deletions, and the readoption design lands where the commit body pointed | a73x | 2026-08-13 |
| c37bc263 | docs: M15 closed — 12 tasks, 37 commits, suite unchanged at 20/33, soak 10/10, regrade 3/3 at the unit layer, refused dial 15001ms→1ms | a73x | 2026-08-12 |
| ca46fe0e | fix: Task 4 follow-through — the third re-timed site, the inverted mechanism comment, narrowed error set | a73x | 2026-08-12 |
| 7bf74d2b | fix: refused QUIC dial fails in ~1 RTT; quic:// attach budget is deadline_ms, not idle_ms | a73x | 2026-08-12 |
| aa247b30 | docs: M14 closed — ssh→QUIC handoff | a73x | 2026-08-12 |
| 82232063 | docs: M13 closed — auto-start, muxd stop, error audit; regrade 3/3 caught | a73x | 2026-08-10 |
| 90487096 | docs: M12 complete — the tty gate is open and graded | a73x | 2026-08-10 |
| e09da54f | fix: review conditions — soak refuses a dirty baseline; the scroll bug's true severity | a73x | 2026-08-09 |
| ef95d950 | docs: M11 close — convergence harness held 10/10, campaign table recorded | a73x | 2026-08-09 |
| fa0eb22a | docs: M10 record and roadmap close — cleared on the real box | a73x | 2026-08-09 |
| 7299fe80 | docs: name which run each reproduction rate came from | a73x | 2026-08-08 |
| b817dc93 | docs: the transient had two causes, and neither story alone ever fit | a73x | 2026-08-08 |
| 9a3c7535 | fix(wan): the authoritative clock was timing the wrong thing | a73x | 2026-08-08 |
| ba62a7b2 | test: pin the three QUIC fixes a mutation could still walk through | a73x | 2026-08-08 |
| b8b8af9c | docs: M9 prediction — the record | a73x | 2026-08-08 |
| 8a005f3a | feat(m8): QUIC held on a real path — three legs of four; the record | a73x | 2026-08-08 |
| 5cb25cf4 | spike: QUIC stack chosen — ngtcp2 + wolfSSL builds static-musl under the pinned toolchain | a73x | 2026-08-08 |
| 531494b3 | feat(m7): reconnect held over the WAN — 10 tears, 10 delta resumes; the record | a73x | 2026-08-08 |
| f6a54d28 | feat: transport death is a non-event — reconnect with have_seq, resume by delta | a73x | 2026-08-08 |
| b296da2b | fix: muxd run refuses a live socket instead of stealing it | a73x | 2026-08-08 |
| 49996784 | feat: latest-wins follows input activity, matching the cited tmux semantics | a73x | 2026-08-08 |
| 024048ae | docs: M6 transport verdict — the swap held, measured; milestone complete | a73x | 2026-08-08 |
| 65f76187 | feat: session epoch fences have_seq across daemon restarts | a73x | 2026-08-08 |
| 909a0377 | feat: two-client e2e and demo; docs: resize decision recorded — M5 complete | a73x | 2026-08-08 |
| d890ac97 | feat: bytes-on-wire bench gates the M4 kill criterion; docs | a73x | 2026-08-08 |
| 9ea510f6 | test: kill-reattach e2e; docs: M3 decisions and usage | a73x | 2026-08-08 |
| 57da0875 | fix: clean daemon shutdown on SIGINT/SIGTERM; attach takeover; audible client exits | a73x | 2026-08-08 |
| 16c40066 | feat: systemd user units; docs: M2 decisions and usage | a73x | 2026-08-08 |
| 076d28eb | feat: muxd run/dump wired through poll loop; e2e passes | a73x | 2026-08-08 |