tractor/ai/prompt-io/claude
Gud Boi f595acc76c Add `supervise_run_process` to `trionics._subproc`
A `trio.Nursery.start()`-style wrapper around
`trio.run_process()` that surfaces rc!=0 errors
deterministically, ALWAYS isolates the parent
controlling-tty, and optionally live-relays the child's
std-streams to `log.<level>` per-line. Suits both
short-lived test-runners + long-lived daemons.

`supervise_run_process()`,
- Deterministic rc!=0: pass `check=False` to `trio`
  and do our OWN post-drain rc-check from the
  supervisor coro body AFTER `own_tn.__aexit__` — NOT
  inside the internal nursery, since that would
  race-cancel the still-draining relay reader and lose
  stderr lines. (Re)build + raise a BARE
  `subprocess.CalledProcessError`: `.stderr=` for
  programmatic callers + an `add_note()`'d
  `|_.stderr:` block for human teardown logs. No
  nursery-eg-wrapped CPE to `collapse_eg` around.
- Parent controlling-tty isolation: `stdin=DEVNULL`
  always, `stdout=DEVNULL` unless relayed/overridden
  (via `stdout=` kwarg w/ `_UNSET` sentinel so explicit
  `None` = inherit still works). Prevents a spawned
  program from clobbering the launching tty's scrollback
  w/ control-seqs.
- Live per-line relay: `relay_stdout=True`/
  `relay_stderr=True` → relayed to `log.<relay_level>`
  (default `'io'`, our custom level 21). Picked to sort
  just above stdlib `INFO`=20 so it shows at usual
  `info`/`devx` levels yet stays separately filterable;
  `runtime`=15 was REJECTED as a default since it'd be
  silently filtered at usual verbosity — footgun for
  daemon supervisors whose whole point is visibility.
  STREAMED, not buffered-until-exit.
- Non-blocking `tn.start()` semantics: live
  `trio.Process` handed up via
  `task_status.started()` immediately (else
  `tn.start()` would block till child exit, losing
  the long-lived-daemon use case). Supervise/relay bg
  tasks run to completion in this coro.
- `**run_process_kwargs` forwarded verbatim (env, shell,
  cwd, start_new_session, executable, ...); MANAGED keys
  (`stdin`/`stdout`/`stderr`/`check`) win on conflict.
- Crash-handling layer intentionally NOT baked in —
  compose `maybe_open_crash_handler()` ON TOP at the
  call-site.

`_relay_stream_lines()` helper,
- Concurrent pipe-drain reader. MANDATORY whenever piping
  w/o `capture_*` since nothing else drains the OS pipe —
  child blocks on `write()` once kernel buf (~64KiB) fills
  → deadlock.
- Modes (combine freely): `emit`-only live relay,
  `accum`-only silent drain+capture (for the CPE note),
  or both. Per-line splitting handles cross-chunk
  residuals + flushes any trailing un-newline-term'd line
  at EOF.

`_add_stderr_note()` helper,
- Attaches an indented `|_.stderr:` note to a CPE via
  `add_note()` for legible rc!=0 reporting at teardown.

Tests (`tests/trionics/test_subproc.py`),
- Hermetic `trio`-only (no actor-runtime).
- `test_stdout_relayed_per_line`: per-line stdout relay.
- `test_parent_tty_isolated`: child fd1 is OUR pipe (no
  `/dev/pts/*`), fd0 pinned to `/dev/null`.
- `test_no_deadlock_on_big_unnewlined_output`: 200KiB
  no-newline output completes under `fail_after(2)` —
  exercises the concurrent drain (without it, the child
  blocks at ~64KiB).
- `test_stderr_relay_and_cpe_rebuild`: rc!=0 w/
  `relay_stderr=True` → bare `CalledProcessError` w/ the
  `.stderr` note + per-line live relay.
- `test_nonrelay_cpe_note`: rc!=0 w/o relay → same
  deterministic post-drain CPE w/ `.stderr` note (silent
  drain+capture path).

Re-export `supervise_run_process` from `tractor.trionics`.

Prompt-IO: ai/prompt-io/claude/20260601T231429Z_0e3e008b_prompt_io.md

(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
2026-06-01 19:29:46 -04:00
..
20260406T172848Z_02b2ef1_prompt_io.md Add per-`ctx_key` isolation tests for `maybe_open_context()` 2026-04-06 14:37:47 -04:00
20260406T193125Z_85f9c5d_prompt_io.md Add xfail test for `_Cache.run_ctx` teardown race 2026-04-06 18:17:04 -04:00
20260406T222648Z_f086222_prompt_io.md Add prompt-io log for `run_ctx` teardown analysis 2026-04-09 14:42:42 -04:00
20260406T222648Z_f086222_prompt_io.raw.md Condense `.raw.md` prompt-IO logs, add `diff_cmd` refs 2026-04-16 17:44:14 -04:00
20260413T192116Z_f851f28_prompt_io.md Add `test_tpt_bind_addrs.py` + fix type-mixing bug 2026-04-14 19:54:14 -04:00
20260413T205048Z_269d939c_prompt_io.md Add `parse_endpoints()` to `_multiaddr` 2026-04-14 19:54:14 -04:00
20260413T205048Z_269d939c_prompt_io.raw.md Condense `.raw.md` prompt-IO logs, add `diff_cmd` refs 2026-04-16 17:44:14 -04:00
20260414T163300Z_befedc49_prompt_io.md Add `prefer_addr()` transport selection to `_api` 2026-04-14 19:54:14 -04:00
20260414T163300Z_befedc49_prompt_io.raw.md Condense `.raw.md` prompt-IO logs, add `diff_cmd` refs 2026-04-16 17:44:14 -04:00
20260417T034918Z_9703210_prompt_io.md Add prompt-IO log for subint spawner design kickoff 2026-04-17 16:48:22 -04:00
20260417T034918Z_9703210_prompt_io.raw.md Add prompt-IO log for subint spawner design kickoff 2026-04-17 16:48:22 -04:00
20260417T035800Z_61a73ba_prompt_io.md Add prompt-io files for "phase-A", fix typos caught by copilot 2026-04-17 18:26:41 -04:00
20260417T035800Z_61a73ba_prompt_io.raw.md Add prompt-io files for "phase-A", fix typos caught by copilot 2026-04-17 18:26:41 -04:00
20260417T124437Z_5cd6df5_prompt_io.md Impl min-viable `subint` spawn backend (B.2) 2026-04-23 18:47:49 -04:00
20260417T124437Z_5cd6df5_prompt_io.raw.md Impl min-viable `subint` spawn backend (B.2) 2026-04-23 18:47:49 -04:00
20260418T042526Z_26fb820_prompt_io.md Add prompt-IO log for subint destroy-race fix 2026-04-23 18:47:49 -04:00
20260418T042526Z_26fb820_prompt_io.raw.md Add prompt-IO log for subint destroy-race fix 2026-04-23 18:47:49 -04:00
20260420T192739Z_5e8cd8b2_prompt_io.md Add prompt-io log for `subint` hang-class docs 2026-04-23 18:47:49 -04:00
20260420T192739Z_5e8cd8b2_prompt_io.raw.md Add prompt-io log for `subint` hang-class docs 2026-04-23 18:47:49 -04:00
20260422T200723Z_797f57c_prompt_io.md Add CPython-level `subint_fork` workaround smoketest 2026-04-23 18:48:34 -04:00
20260422T200723Z_797f57c_prompt_io.raw.md Add CPython-level `subint_fork` workaround smoketest 2026-04-23 18:48:34 -04:00
20260601T231429Z_0e3e008b_prompt_io.md Add `supervise_run_process` to `trionics._subproc` 2026-06-01 19:29:46 -04:00
20260601T231429Z_0e3e008b_prompt_io.raw.md Add `supervise_run_process` to `trionics._subproc` 2026-06-01 19:29:46 -04:00
README.md Add per-`ctx_key` isolation tests for `maybe_open_context()` 2026-04-06 14:37:47 -04:00

README.md

AI Prompt I/O Log — claude

This directory tracks prompt inputs and model outputs for AI-assisted development using claude (Claude Code).

Policy

Prompt logging follows the NLNet generative AI policy. All substantive AI contributions are logged with: - Model name and version - Timestamps - The prompts that produced the output - Unedited model output (.raw.md files)

Usage

Entries are created by the /prompt-io skill or automatically via /commit-msg integration.

Human contributors remain accountable for all code decisions. AI-generated content is never presented as human-authored work.