phux docs
decisions

Decision Records

Index of every decision that has closed off a design space in phux.

stable document
Full source summary

Index of every decision that has closed off a design space in phux. Format and Status: vocabulary defined in ../docs/CONVENTIONS.md. Read these when you need to know why something is the way it is — the architecture docs describe what the code is.

Project record

Read a decision when you need the reason a design space was closed. Use architecture for the current system shape.

We write down decisions so future contributors (including future-us) can understand why the system is the way it is. Format follows Michael Nygard’s template.

Index

#DecisionStatus
0001Use RustAccepted
0002Diff-based wire protocol, not VT byte replaySuperseded by 0013
0003Single server, many sessionsAccepted
0004libghostty-vt is the canonical gridAccepted
0005Relationship to zmx and zmoshAccepted
0006Input event types re-export libghostty-vt’s atomsAccepted (amended by 0024)
0007Mosh-class transport semantics and satellite forward-compatAccepted (forward-compat; superseded in part by 0098)
0008Use libghostty-vt’s types directly; stop reimplementing themAccepted (amended by 0024)
0009phux vs coder/mux: positioningAccepted
0010phux is TUI-first, non-TUI not precluded; tmux control mode reserved as compat optionAccepted (forward-compat; superseded in part by 0017)
0011phux-protocol and phux-core are independent; IdBridge is their only meeting pointAccepted
0012Window layout is a binary split tree, not n-aryAccepted (superseded in part by 0015)
0013Libghostty bytes on the wire; structured input remainsAccepted (supersedes 0002)
0014Server-side Terminal placement: per-pane PaneActor on a LocalSetAccepted
0015Protocol layering: L1 substrate, L2 collections, L3 metadataAccepted (superseded in part by 0030)
0016TerminalId as the wire primary; PaneId is a consumer-side aliasSuperseded by 0102
0017The reference TUI is not protocol-privilegedAccepted (supersedes in part 0010)
0018Lazy state synchronization is the wire’s long-arc shapeAccepted (builds on 0013)
0019Multi-pane TUI rendering: layout persistence, wire shape, and chromeAccepted
0020Layered render: ratatui chrome over libghostty pane interiorsAccepted
0021Control-plane commands and client-side selector resolutionAccepted (superseded in part by 0030)
0022phux as a tool for agentsAccepted
0023Config UX: pure-config, defaults as a live base layerAccepted (builds on 0017)
0024The wire protocol owns its input atomsAccepted (amends 0006, 0008)
0025Browser web client over a WebSocket transportAccepted (builds on 0017, 0024)
0026Overlays: one theme, a real stack, and a single dispatch pathAccepted (builds on 0020)
0027Terminals are referenced, not owned: views, links, and L3 tagsAccepted (builds on 0017, 0015)
0028Runtime log controlAccepted (forward-compat; builds on 0024)
0029One cursor authority and a repaint schedulerAccepted (builds on 0020)
0030Engine-delegated wire and projection consumersSuperseded by 0102
0031Remote-consumer authentication and encryption (no SSH tunnel)Proposed
0032Graceful server upgrade (sessions survive a binary update)Accepted
0033Input authority leases and process signals (“take the wheel + kill”)Accepted
0034Kitty graphics / image passthrough through the cell rendererProposed
0035Agent-asked event: a pending human-answerable question on the wireAccepted
0036Agent-asked detection sourcesAccepted
0037Overlay-network reachability for remote self-host consumersAccepted (forward-compat; builds on 0007, 0031)
0038Hub-to-satellite authenticationAccepted (builds on 0031)
0039Layered config: an ordered extends stack with explicit array appendAccepted
0040Agent identity and lifecycle are an L3 metadata recordAccepted
0041Managed plugin installs: snapshot fetches, system tools, one lockfileAccepted
0042Launch executor: a CLI verb that spawns an integration templateAccepted
0043State-diff output mode and loss-tolerant reference advanceAccepted
0044Dedicated input lane: route input off the single runtime threadAccepted
0045Client-side copy-mode over the consumer’s own engineAccepted (builds on 0030)
0046The server derives agent state; detection is level-triggeredAccepted (builds on 0040)
0047CI metrics recorded to an orphan ci-metrics branchSuperseded by 0082
0048Drag-to-resize panes and default outer-terminal mouse captureAccepted
0049Client-local focus and advisory agent attentionAccepted (builds on 0019)
0050Explicit spawn ownership, client-owned placementAccepted
0051Outbound dial-out (connector) transport modeAccepted (builds on 0037)
0052Connector route identity, registration, and config surfaceAccepted (builds on 0051)
0053Acknowledged idempotent input batchesAccepted (builds on 0021, 0024, and 0044)
0054Worktree-bound sessions by name conventionAccepted
0055Always-on server and ssh-bootstrapped enrollmentAccepted (superseded in part by 0080, 0096)
0056Cross-session Terminal moveAccepted (builds on 0050)
0057A minimal reference relay in-treeAccepted (builds on 0051, 0052)
0058Right-click context menus for panes, windows, and sessionsAccepted
0059Sandboxed chunked file uploadAccepted (builds on 0007, 0021, and 0031)
0060Self-contained session recordingAccepted (builds on 0013)
0061Capabilities add, versions breakAccepted (builds on 0060)
0062Headless resize and the window-size policyAccepted (builds on 0027)
0063Ephemeral server lifetimeAccepted (builds on 0003)
0064Playback as a paneAccepted (supersedes in part 0060)
0065One CLI grammarAccepted
0066One phux host namespace over the split machine registriesAccepted
0067Cache-preserving agent fleet contextAccepted (builds on 0040, 0046)
0068Native agent-session restoreAccepted (builds on 0040, 0042)
0069Generated reference docs from the compiled binaryAccepted
0070Native engine-state bootstrap and client-owned historyAccepted (builds on 0013)
0071What phux 1.0 commits toProposed (builds on 0061)
0072Prune the policy vocabulary, keep the authorization seamProposed (amends 0031)
0073Login-shell semantics for service-managed pane spawnsAccepted (builds on 0055)
0074The self-update trust boundaryAccepted (builds on 0071)
0075Agent names are addressable, and a withdrawn name is refusedProposed (builds on 0021, 0040)
0076Prompting an agent is acknowledged; waiting on one is event-drivenProposed (builds on 0053, 0046)
0077The agent read surface: sources, soft wrap, and truncationAccepted (builds on 0022)
0078Harvesting alternate-screen historyProposed (builds on 0077)
0079Fatal-signal terminal restoreAccepted
0080Socket lifecycle and instance isolationAccepted (amends 0055)
0081Overlay auto-listen and one-command pairingAccepted (builds on 0037, 0031)
0082Retire the CI metrics store; the run page is the dashboardAccepted (supersedes 0047)
0083In-place supervisor unit reconcileAccepted (builds on 0080)
0084Starting an agent in an existing shellAccepted (builds on 0042)
0085Hook-sourced agent state is detector evidenceAccepted (builds on 0040, 0046)
0086The pooled libghostty render trio lives in phux-protocolAccepted
0087Elastic status-bar space is row-wide slack, not slot layoutProposed (builds on 0071)
0088Adopting a live server into supervisionAccepted (builds on 0055, 0080)
0089The sidebar is a bounded attention inbox, not a structural listAccepted (amended by 0112)
0090Predictive echo returns to the alt screen via confirmation-gated displayAccepted
0091The certificate names the advertised address, once, at generationAccepted (builds on 0031)
0092The coordinator owns durable workProposed (amends 0009)
0093--remote user@host is a resolution ladder, not a new transportAccepted
0094Per-pane scrollback is bounded in bytes, by phux, explicitlyAccepted
0095Blackbird is a peer ledger, not a phux clientAccepted (builds on 0040)
0096Performance telemetry is always on, in-process, and one command awayAccepted
0097Durable coordinator is a separate bounded endpointAccepted (forward-compat; builds on 0092, still Proposed)
0098Workload proof and closed-scope authorityAccepted (forward-compat; amends 0031)
0099CI: one aggregate merge gate, immutable action pins, and shared lane setupAccepted
0100The TUI is its own crateAccepted (builds on 0020)
0101The settings page edits the fileAccepted (builds on 0023)
0102Resources: the server serves kinds; Terminal is the firstAccepted (supersedes 0016, 0030)
0103Agent session resource and producer-fed streamsAccepted (amends 0040)
0104Parent bindings are L1 lifecycleAccepted (builds on 0102)
0105Sessions can outlive their last windowAccepted (amends 0063)
0106Identity is the serving user; whoami reports itAccepted (builds on 0003)
0107Satellite sessions are listed, never adoptedAccepted (builds on 0066)
0108A hub relays host queries to satellites per requestAccepted (builds on 0107)
0109Late kills are conditional on instance and attachmentAccepted (builds on 0007)
0110A showing peer is re-shown at launch only in frontAccepted (amended by 0111)
0111How a front restore is judgedAccepted (amends 0110)
0112Sidebar navigation stays put while status changesAccepted (amends 0089)
0113Opt-in next channel from green mainAccepted (builds on 0074)
0114Cockpit closes terminals and detaches windowsAccepted (builds on 0105, 0107)

When to write an ADR

  • Picking between viable approaches with long-term consequences.
  • Closing off a design space (deciding against something).
  • Anything you’d want to explain to a new contributor on day one.

When NOT to write an ADR

  • Bug fixes.
  • Refactors that don’t change behavior.
  • Anything purely internal to a single function.

Format

The template, the Status: vocabulary, the 150-line cap, and the supersede-don’t-amend rule are defined once, in docs/CONVENTIONS.md under “ADR template”. Copy the template from there; this file carries only the index.

View exact source