writeonce/docs/stories/runtime-v2/01-streaming-subprocess.md
shoney.arickathil ab8ef64cd9 docs(rt2): runtime-v2 track — the runtime beyond sockets
- five stories under docs/stories/runtime-v2/: 1 streaming subprocess
  (42's follow-up; five forks incl. the mailbox-cap collision), 2 PTY,
  3 signals-as-events (signalfd lean), 4 termios adoption, 5 SCM_RIGHTS
  fd passing; 00-story states the arc — the plane learned sockets in
  8/11/35, files in 6, this adds processes/terminals/signals
- build order 1 -> 2 -> 3; 4 and 5 startable alone; all readiness:
  refine, brainstormed on demand
- board: Five tracks; "▸ runtime-v2" pending section; wmux section now
  points at it; graph section 6 nodes carry runtime-v2 numbers + links
- wmux stories re-reference the track; prefix `rt2` claimed
- linkcheck: 0 broken

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit e0451cb4889bb3d03429c0276d03c090269a5ced)
2026-09-15 01:15:30 +02:00

3.4 KiB

track iteration status readiness
runtime-v2 1 pending refine

runtime-v2 1 — streaming subprocess: a long-lived child as a peer

Part of Story — runtime-v2: the runtime beyond sockets. Iteration 42's named follow-up, promoted to this track's opening slice. 42 built the machinery a streaming form reuses whole: the wo_child registry, the pidfd wait, the epoll bundle, the cap/refusal doctrine, the ownership sweeps (fib_reap/wo_vm_destroy/stop).

The problem. proc.run/proc.run_dl are one-shot: nothing can talk to a child while it runs, and a child that legitimately runs for hours (a shell under wmux, a browser under the CDP driver, a script under skillhost) has no shape at all. Output must reach the owning actor as it happens, stdin must reach the child, and exit must arrive as an event — all without violating a single 42 guarantee.

Info — the forks (open; why this is refine)

  1. Verb shape. A new proc.spawn(cmd, args, …) returning a child HANDLE, versus spawn-options on proc.run_dl. Sub-fork: the handle as an actor address (the child looks like an actor — send to feed stdin, monitor for exit, iteration 24 machinery free) versus an opaque scalar with its own verb family.
  2. Output transport. PUSH — stdout/stderr chunks delivered as Bytes messages into the owner's mailbox (the fd-event pattern) — versus PULL — a read-style verb the fiber parks on, the net.read_dl mould. Push composes with actors; pull composes with backpressure.
  3. The mailbox-cap collision — the fork that decides whether push is viable at all: a chatty child versus wo_mailbox_cap's fail-fast 1024. Drop chunks? Kill the child by name? Or stop reading the pipe and let the KERNEL buffer be the backpressure (the lean — the child blocks on a full pipe exactly as it would under a slow tmux).
  4. stdin and its mirror. Child not reading, pipe full: park the writing fiber with a deadline (the net.write_dl mould) versus refuse at a byte cap.
  5. Bounds semantics shift. Total-output cap and total deadline stop meaning anything for a shell that runs for days — per-chunk caps and an IDLE deadline replace them; exit notification as a monitor-style death notice carrying the code, versus a blocking wait verb.

Ownership does not fork: 42's rule stands — the owner unwinding kills the child; engine stop kills them all; a zombie or an orphan is a bug.

Acceptance sketch (firmed at brainstorm)

  • A child that emits a line a second: each line reaches the owning actor while the child lives — not after it exits.
  • stdin round trip: feed a cat-like child, read the echo back.
  • The chatty child against whatever fork 3 picked: the declared behavior happens, by name, and the shard never stalls.
  • Exit: the owner learns the code as an event; the registry slot is released; fd count flat (the 42 measurement legs, streaming edition).
  • Stop/unwind: identical guarantees to 42, proven with a LIVE stream.
  • Gate legs land in runtime/test/test_proc.c beside 42's.

Consumers

wmux 1 (the shell under every pane), skillhost 28 (stdin/stdout transport was half its named gap), the zen study's CDP driver (spawn the browser, then talk to it). The alacritty stage-A "headless PTY runner" is this plus runtime-v2 2.