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 |
||
|---|---|---|
| .. | ||
| 20260406T172848Z_02b2ef1_prompt_io.md | ||
| 20260406T193125Z_85f9c5d_prompt_io.md | ||
| 20260406T222648Z_f086222_prompt_io.md | ||
| 20260406T222648Z_f086222_prompt_io.raw.md | ||
| 20260413T192116Z_f851f28_prompt_io.md | ||
| 20260413T205048Z_269d939c_prompt_io.md | ||
| 20260413T205048Z_269d939c_prompt_io.raw.md | ||
| 20260414T163300Z_befedc49_prompt_io.md | ||
| 20260414T163300Z_befedc49_prompt_io.raw.md | ||
| 20260417T034918Z_9703210_prompt_io.md | ||
| 20260417T034918Z_9703210_prompt_io.raw.md | ||
| 20260417T035800Z_61a73ba_prompt_io.md | ||
| 20260417T035800Z_61a73ba_prompt_io.raw.md | ||
| 20260417T124437Z_5cd6df5_prompt_io.md | ||
| 20260417T124437Z_5cd6df5_prompt_io.raw.md | ||
| 20260418T042526Z_26fb820_prompt_io.md | ||
| 20260418T042526Z_26fb820_prompt_io.raw.md | ||
| 20260420T192739Z_5e8cd8b2_prompt_io.md | ||
| 20260420T192739Z_5e8cd8b2_prompt_io.raw.md | ||
| 20260422T200723Z_797f57c_prompt_io.md | ||
| 20260422T200723Z_797f57c_prompt_io.raw.md | ||
| 20260601T231429Z_0e3e008b_prompt_io.md | ||
| 20260601T231429Z_0e3e008b_prompt_io.raw.md | ||
| README.md | ||
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.