S1: foundations + SSH plugin #9

Open
opened 2026-10-05 15:32:05 +00:00 by kayg · 1 comment
Owner

S1: the foundations and the SSH plugin. Decisions 7–29, 34, 36, 37, 39–41. The owner asked for the work to start on 2026-10-05. More grilling happens on the way (#5).

Approach: lean, with tracer bullets. First, one thin path from start to end: browser → server → embedded infraternal agent → local PTY. Then widen it. Each step is tested hands-on (by the owner or Claude) on the preview server.

Phase A (now), in parallel:

  • #10 contracts: wire framing, plugin and action definition, shim interface, bootstrap (Claude)
  • #11 Rust workspace, crates, static musl builds and scripts/verify for Rust
  • #12 spike: leg-A transport (WebTransport and WebSocket, Rust server, Safari) and wire format benchmark against protobuf
  • #13 spike: terminal renderer, ghostty-web against xterm.js, on a real iPhone

Phase B: tracer bullet (embedded agent, shim, PTY, browser terminal over the real protocol, no auth yet behind a dev flag)
Phase C: auth (passkeys, PRF, recovery), inventory (manual, ssh config, NetBird), remote agents (QUIC), bootstrap over SSH, the SSH plugin, mobile key bar, resume

S1: the foundations and the SSH plugin. Decisions 7–29, 34, 36, 37, 39–41. The owner asked for the work to start on 2026-10-05. More grilling happens on the way (#5). Approach: lean, with tracer bullets. First, one thin path from start to end: browser → server → embedded infraternal agent → local PTY. Then widen it. Each step is tested hands-on (by the owner or Claude) on the preview server. Phase A (now), in parallel: - [ ] #10 contracts: wire framing, plugin and action definition, shim interface, bootstrap (Claude) - [ ] #11 Rust workspace, crates, static musl builds and `scripts/verify` for Rust - [ ] #12 spike: leg-A transport (WebTransport and WebSocket, Rust server, Safari) and wire format benchmark against protobuf - [ ] #13 spike: terminal renderer, ghostty-web against xterm.js, on a real iPhone Phase B: tracer bullet (embedded agent, shim, PTY, browser terminal over the real protocol, no auth yet behind a dev flag) Phase C: auth (passkeys, PRF, recovery), inventory (manual, ssh config, NetBird), remote agents (QUIC), bootstrap over SSH, the SSH plugin, mobile key bar, resume
Author
Owner

What remains for S1 to be complete (status on 2026-10-06). The owner asked for this list. VNC/RDP comes next after S1 (DECISIONS 92).

Done (on dev)

  • Rust workspace, static musl builds, gates and CI (#11)
  • Contract drafts: wire, plugin/action, shim, bootstrap (#10). The owner still needs to read them.
  • Auth library: setup token, passkeys with PRF, recovery key, sessions, device keys (#17)
  • Session shim: PTY, VT snapshots, exactly-once resume (#16)
  • Wire codec in Rust and TS (#15): fix round in progress (split-header bug)

Backend still to build

  • Server core: HTTP + WebSocket endpoint, sessions per user, routing, event bus, SQLite, server install (self-installing systemd unit)
  • Action framework: plugin-api, generated HTTP, CLI and MCP adapters, audit, permissions (contracts/plugin.md)
  • Agent core: embedded agent (agent --fd 3), leg B (QUIC with TCP fallback, internal CA, mTLS), lockstep upgrade with A/B slots
  • Shim ↔ agent ↔ server ↔ browser end to end: resume, credit flow control, catch-up by snapshot
  • SSH plugin: agent-native PTY and agentless SSH (in a shim on the embedded agent), auth (passkey-sealed keys, NetBird or Tailscale identity, relayed login URLs), host key TOFU
  • Bootstrap: probe, propose, install, enroll, canary, rootful or rootless, promotion
  • Inventory: manual, ~/.ssh/config, NetBird and Tailscale/Headscale APIs, live sync, tags
  • Search: fan-out scrollback search, central command-history index, binary detection (#18, DECISIONS 89–91)
  • Shell integration (OSC 133): command blocks, notify when done, history

Web app (the real one, built from the mockup decisions)

  • SvelteKit shell: terminal-first, floating sidebar tree, search capsule and palette, tabs and splits
  • Terminal: ghostty-web, wire codec, resume, touch scrolling, mobile key bar (variant a), pinch for text size, fonts, themes, mesh backgrounds, iOS safe areas
  • Setup wizard (network → hosts → agents) and passkey and recovery screens
  • Command blocks, mission control, host glance, history search (V11, each with its own design and perf grill)
  • Notifications: web push for the PWA, ntfy and gotify
  • Restore tabs after a reboot; multi-device sessions (tmux-style size)
  • Predictive local echo (mosh-style)

Quality and ship

  • End-to-end performance gate measured from the UI: keystroke → paint < 5 ms of overhead p99, reconnect < 300 ms, first paint < 1 s, 60 fps under flood, agent idle RSS < 15 MB
  • Perf VM and runner (#4)
  • Deploy to infraternal.kayg.org on monitor01 (A record, Traefik route, NetBird ACL for 7443)
  • Security review across lanes, fuzzing kept green, docs

Open decisions

  • Images in the terminal (ghostty-web 0.4 has none; see the owner thread)
  • Visual grill pieces: wizard, command blocks, mission control, host glance
What remains for S1 to be complete (status on 2026-10-06). The owner asked for this list. VNC/RDP comes next after S1 (DECISIONS 92). **Done (on `dev`)** - [x] Rust workspace, static musl builds, gates and CI (#11) - [x] Contract drafts: wire, plugin/action, shim, bootstrap (#10). The owner still needs to read them. - [x] Auth library: setup token, passkeys with PRF, recovery key, sessions, device keys (#17) - [x] Session shim: PTY, VT snapshots, exactly-once resume (#16) - [ ] Wire codec in Rust and TS (#15): fix round in progress (split-header bug) **Backend still to build** - [ ] Server core: HTTP + WebSocket endpoint, sessions per user, routing, event bus, SQLite, `server install` (self-installing systemd unit) - [ ] Action framework: plugin-api, generated HTTP, CLI and MCP adapters, audit, permissions (contracts/plugin.md) - [ ] Agent core: embedded agent (`agent --fd 3`), leg B (QUIC with TCP fallback, internal CA, mTLS), lockstep upgrade with A/B slots - [ ] Shim ↔ agent ↔ server ↔ browser end to end: resume, credit flow control, catch-up by snapshot - [ ] SSH plugin: agent-native PTY and agentless SSH (in a shim on the embedded agent), auth (passkey-sealed keys, NetBird or Tailscale identity, relayed login URLs), host key TOFU - [ ] Bootstrap: probe, propose, install, enroll, canary, rootful or rootless, promotion - [ ] Inventory: manual, ~/.ssh/config, NetBird and Tailscale/Headscale APIs, live sync, tags - [ ] Search: fan-out scrollback search, central command-history index, binary detection (#18, DECISIONS 89–91) - [ ] Shell integration (OSC 133): command blocks, notify when done, history **Web app (the real one, built from the mockup decisions)** - [ ] SvelteKit shell: terminal-first, floating sidebar tree, search capsule and palette, tabs and splits - [ ] Terminal: ghostty-web, wire codec, resume, touch scrolling, mobile key bar (variant a), pinch for text size, fonts, themes, mesh backgrounds, iOS safe areas - [ ] Setup wizard (network → hosts → agents) and passkey and recovery screens - [ ] Command blocks, mission control, host glance, history search (V11, each with its own design and perf grill) - [ ] Notifications: web push for the PWA, ntfy and gotify - [ ] Restore tabs after a reboot; multi-device sessions (tmux-style size) - [ ] Predictive local echo (mosh-style) **Quality and ship** - [ ] End-to-end performance gate measured from the UI: keystroke → paint < 5 ms of overhead p99, reconnect < 300 ms, first paint < 1 s, 60 fps under flood, agent idle RSS < 15 MB - [ ] Perf VM and runner (#4) - [ ] Deploy to infraternal.kayg.org on monitor01 (A record, Traefik route, NetBird ACL for 7443) - [ ] Security review across lanes, fuzzing kept green, docs **Open decisions** - [ ] Images in the terminal (ghostty-web 0.4 has none; see the owner thread) - [ ] Visual grill pieces: wizard, command blocks, mission control, host glance
Sign in to join this conversation.
No labels
launch-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/infraternal#9
No description provided.