c64627bc
docs: record the wall freeze and the single-target terminal client
a73x 2026-09-05 19:42
Commit message
CLAUDE.md
| Old | New | ||
|---|---|---|---|
| @@ -5,6 +5,23 @@ carries its grid as cells and the client copies them into a grid of its own. | |||
| 5 | Attach = one snapshot, then row deltas. Zig; Linux and Apple-silicon macOS; | 5 | Attach = one snapshot, then row deltas. Zig; Linux and Apple-silicon macOS; |
| 6 | prototype. | 6 | prototype. |
| 7 | 7 | ||
| 8 | ## Sprint delivery | ||
| 9 | |||
| 10 | When the user requests sprint delivery, read and follow | ||
| 11 | [the shared skill](docs/skills/sprint-delivery/SKILL.md). Use this repository copy | ||
| 12 | for mux work; no personal skill installation is required. Ordinary isolated | ||
| 13 | edits do not require the sprint workflow. | ||
| 14 | |||
| 15 | ## The wall is frozen (2026-09-05) | ||
| 16 | |||
| 17 | The terminal wall — tiles, rails, chords, the layout tree and file, the | ||
| 18 | pane grade, the picker — retires once the native client covers it, and | ||
| 19 | `mux [TARGET]` becomes one session per invocation with no picker. Until | ||
| 20 | every gate in issue `94ed7dfd` lands (macOS `muxg` first), the wall takes | ||
| 21 | BUG FIXES ONLY: no new wall features, no new wall invariants. `mux web` | ||
| 22 | stays and will own the layout file. Rationale and the file list are in | ||
| 23 | `docs/decisions.md` under that date. | ||
| 24 | |||
| 8 | ## Toolchain (pinned — system zig will NOT build this) | 25 | ## Toolchain (pinned — system zig will NOT build this) |
| 9 | 26 | ||
| 10 | ```sh | 27 | ```sh |
| @@ -30,7 +47,7 @@ make mac xos # macOS journeys (test/mac.sh); the cross-OS gate | |||
| 30 | make provision-mac # clone, boot and key a macOS guest on a tart host and | 47 | make provision-mac # clone, boot and key a macOS guest on a tart host and |
| 31 | # print one line; `eval "$(test/provision-mac.sh)"` | 48 | # print one line; `eval "$(test/provision-mac.sh)"` |
| 32 | # is how MAC_BOX gets set. --down takes it away. | 49 | # is how MAC_BOX gets set. --down takes it away. |
| 33 | make install # the one user binary -> ~/.local/bin, ReleaseSafe | 50 | make install # mux + muxg -> ~/.local/bin, ReleaseSafe; needs native libraries |
| 34 | # MUX_TARGET follows the HOST: a Mac installs a Mac | 51 | # MUX_TARGET follows the HOST: a Mac installs a Mac |
| 35 | # binary, because that is the only one it can link | 52 | # binary, because that is the only one it can link |
| 36 | make release release-mac # one tarball per OS into dist/, cut on that OS; | 53 | make release release-mac # one tarball per OS into dist/, cut on that OS; |
| @@ -123,7 +140,7 @@ independent of terminal wall policy and persistence. Rule 9 confines SDL to `src | |||
| 123 | entry `src/cli/muxg.zig` may also use it. Everything else in the painter is | 140 | entry `src/cli/muxg.zig` may also use it. Everything else in the painter is |
| 124 | unit-tested without opening a window. | 141 | unit-tested without opening a window. |
| 125 | 142 | ||
| 126 | The default product and install remain ONE binary, `mux`, and the first word | 143 | The default development build produces `mux`, and the first word |
| 127 | picks a mode: `mux d` the daemon, | 144 | picks a mode: `mux d` the daemon, |
| 128 | `mux a` the agent surface (JSON verbs), `mux web` the browser hub, and no | 145 | `mux a` the agent surface (JSON verbs), `mux web` the browser hub, and no |
| 129 | letter at all the client. There is NO alias: a word that is not a mode is a | 146 | letter at all the client. There is NO alias: a word that is not a mode is a |
| @@ -134,9 +151,11 @@ daemon); `agent` stays a row of its own so muxa's suite can fail on its | |||
| 134 | own. Test fixtures in `test/`: | 151 | own. Test fixtures in `test/`: |
| 135 | `ptyclient` (real client on a real pty), `wsclient` (browser stand-in), | 152 | `ptyclient` (real client on a real pty), `wsclient` (browser stand-in), |
| 136 | `rawmode`, `delaypipe`, `render` — those stay separate binaries. | 153 | `rawmode`, `delaypipe`, `render` — those stay separate binaries. |
| 137 | The opt-in second product binary is `muxg`, a dynamically linked window on | 154 | The second product binary is `muxg`, a dynamically linked window on native |
| 138 | native session panes; it is built only by the native steps and is never installed by | 155 | session panes. `make install` and `make release` build both binaries in |
| 139 | `make install` or included in `ci`. | 156 | ReleaseSafe; `make native` builds the GUI for development. The GUI remains |
| 157 | outside `ci`. On Linux, `mux` stays static musl while `muxg` uses the host's | ||
| 158 | native target and system GUI libraries, which are not bundled in the release. | ||
| 140 | 159 | ||
| 141 | ## Invariants — do not break, they are load-bearing | 160 | ## Invariants — do not break, they are load-bearing |
| 142 | 161 | ||
docs/decisions.md
| Old | New | ||
|---|---|---|---|
| @@ -9340,3 +9340,46 @@ narrows the window. Pinned by the observer-burst test in | |||
| 9340 | `server_test_attach.zig`: eight connects with no frame behind them, exactly | 9340 | `server_test_attach.zig`: eight connects with no frame behind them, exactly |
| 9341 | four held after twenty pumps, and all eight seated and served once the | 9341 | four held after twenty pumps, and all eight seated and served once the |
| 9342 | frames arrive. | 9342 | frames arrive. |
| 9343 | |||
| 9344 | ## 2026-09-05 — the terminal wall retires; `mux` becomes one session per invocation | ||
| 9345 | |||
| 9346 | Decided with the native client (`muxg`) in hand, recorded as issue | ||
| 9347 | `94ed7dfd`. | ||
| 9348 | |||
| 9349 | **The TUI keeps one of its two jobs.** It is the only client that runs | ||
| 9350 | where there is no window — over ssh, inside mosh, on a headless box, as | ||
| 9351 | the piped `mux` a script reads an exit code from — and it is the pty the | ||
| 9352 | e2e harness grades the daemon through, so it stays a product. What it | ||
| 9353 | loses is the wall: tiles, rails, the split and resize chords, the layout | ||
| 9354 | tree and the layout file, the once-a-second pane grade, the two-level | ||
| 9355 | picker, focus, and relocating mouse reports into wall coordinates. The | ||
| 9356 | native tiling design (2026-09-05) chose its own workspace and persistence | ||
| 9357 | and refused to migrate the wall, so there were two walls and the browser | ||
| 9358 | hub's grade made a third copy; the 2026-09-04 layout loss and the top two | ||
| 9359 | backlog items were all wall-file problems. | ||
| 9360 | |||
| 9361 | **The shape after.** `mux [TARGET]` is strictly one session per | ||
| 9362 | invocation: no picker, no tiles. It keeps the pump and redial, prediction, | ||
| 9363 | the askpass popup, `-A`, mouse passthrough, drag select, scroll mode, the | ||
| 9364 | end two-step on its own connection, the ssh handoff to QUIC, and the exit | ||
| 9365 | code. `mux web` stays — it is the only phone and tablet surface — and | ||
| 9366 | inherits ownership of `client.layout`, the layout file and the host grade, | ||
| 9367 | since it is their only remaining consumer; `wall_host.planHostDiff` and | ||
| 9368 | `webhub.applyList` collapse to the hub's copy. Dying with the wall: | ||
| 9369 | `wallview.zig` (most), `wall_layout.zig`, `wall_picker.zig`, the wall parts | ||
| 9370 | of `interact.zig` and `wall_host.zig`, the six `wall_test_*.zig`, e2e groups | ||
| 9371 | 07_wallcli, 09_hosts, 12_panes, 13_birth and the tile legs of 06_web, and | ||
| 9372 | the wall invariants in CLAUDE.md. Backlog that closes with it: 32d168d1, | ||
| 9373 | the seed half of 55ca6e6d, 2fc534d6, 05fc3090, 7b04a2ac, 68d4700e, most of | ||
| 9374 | e3548ab1. | ||
| 9375 | |||
| 9376 | **Until then the wall is FROZEN: bug fixes only, no new wall features.** | ||
| 9377 | Nothing is deleted before the GUI covers what the wall covers today, each | ||
| 9378 | gap an issue: `d61fdc4c` muxg on macOS (a Mac has no client but the TUI — | ||
| 9379 | nothing builds or runs the GUI there, though the Mac release recipe names | ||
| 9380 | it), `8b16e26b` mouse selection and scroll wheel, `50ca9ba5` agent | ||
| 9381 | forwarding per pane, `f3cf5785` ssh prompts through an askpass popup, | ||
| 9382 | `fb4a0ee4` prediction overlay, `0b725c82` ending a session (the GUI can | ||
| 9383 | detach and sends no `end_req`), `08ff372f` release bundling (the tarball | ||
| 9384 | ships a dynamic `muxg` with none of its libraries and no message naming | ||
| 9385 | the missing one). | ||