From e0b8f23cbc0dcff5963a1743708577da91a917a1 Mon Sep 17 00:00:00 2001 From: goodboy Date: Fri, 17 Apr 2026 18:26:41 -0400 Subject: [PATCH] Add prompt-io files for "phase-A", fix typos caught by copilot --- .../20260417T035800Z_61a73ba_prompt_io.md | 86 +++++++++++ .../20260417T035800Z_61a73ba_prompt_io.raw.md | 138 ++++++++++++++++++ ai/prompt-io/prompts/subints_spawner.md | 6 +- 3 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.md create mode 100644 ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.raw.md diff --git a/ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.md b/ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.md new file mode 100644 index 00000000..8534727d --- /dev/null +++ b/ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.md @@ -0,0 +1,86 @@ +--- +model: claude-opus-4-7[1m] +service: claude +session: subints-spawner-phase-a-impl +timestamp: 2026-04-17T03:58:05Z +git_ref: 61a73ba +scope: code +substantive: true +raw_file: 20260417T035800Z_61a73ba_prompt_io.raw.md +--- + +## Prompt + +Follow-up from the design session logged in +`20260417T034918Z_9703210_prompt_io.md`: the user +greenlit Phase A after `/prompt-io` tracking, so +execute the Phase A "modularize `spawn._spawn`" plan +end-to-end in a new worktree — four logical steps +(pytest harness prep, `trio_proc` extraction, +`mp_proc` extraction, docstring refresh), each green +via `/run-tests`. + +User directives during execution: +- **Option 3** for the test cadence ("continue A.2–A.4 + first, then run the full suite once at the end of + Phase A"). +- **One commit** for the whole phase ("can't we just + commit the whole patch in one commit?") instead of + the 3/4-commit split I initially proposed. +- **Don't pre-draft** commit messages — wait for the + user to invoke `/commit-msg` (captured as feedback + memory `feedback_no_auto_draft_commit_msgs.md`). + +## Response summary + +Produced the cohesive Phase A modularization patch, +landed as commit `61a73bae` (subject: `Mv +trio_proc`/`mp_proc` to per-backend submods`). Five +files changed, +565 / -418 lines. + +Key pieces of the patch (generated by claude, +reviewed by the human before commit): +- `tractor/spawn/_trio.py` — **new**; receives + `trio_proc()` verbatim from `_spawn.py`; imports + cross-backend helpers back from `._spawn`. +- `tractor/spawn/_mp.py` — **new**; receives + `mp_proc()` verbatim; uses `from . import _spawn` + for late-binding access to the mutable `_ctx` / + `_spawn_method` globals (design decision made + during impl, not the original plan). +- `tractor/spawn/_spawn.py` — shrunk 847 → 448 LOC; + import pruning; bottom-of-module late imports for + `trio_proc` / `mp_proc` with a one-line comment + explaining the circular-dep reason. +- `tractor/spawn/__init__.py` — docstring refresh + describing the new layout. +- `tractor/_testing/pytest.py` — the valid-backend + set now comes from `typing.get_args(SpawnMethodKey)` + so future additions (`'subint'`) don't need harness + edits. + +## Files changed + +See `git diff 61a73ba~1..61a73ba --stat`: + +``` + tractor/_testing/pytest.py | 12 +- + tractor/spawn/__init__.py | 31 +++- + tractor/spawn/_mp.py | 235 ++++++++++++++++++++++++ + tractor/spawn/_spawn.py | 413 +------------------------------- + tractor/spawn/_trio.py | 292 ++++++++++++++++++++++++++++ + 5 files changed, 565 insertions(+), 418 deletions(-) +``` + +Validation: +- import probe + `_methods` wiring check — OK +- spawn-relevant test subset — 37 passed, 1 skipped +- full suite — 350 passed, 14 skipped, 7 xfailed, 1 + xpassed + +## Human edits + +None — committed as generated by claude (no diff +between `.claude/git_commit_msg_LATEST.md` and the +committed body, as far as the assistant could +observe). diff --git a/ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.raw.md b/ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.raw.md new file mode 100644 index 00000000..982f10b7 --- /dev/null +++ b/ai/prompt-io/claude/20260417T035800Z_61a73ba_prompt_io.raw.md @@ -0,0 +1,138 @@ +--- +model: claude-opus-4-7[1m] +service: claude +timestamp: 2026-04-17T03:58:05Z +git_ref: 61a73ba +diff_cmd: git diff 61a73ba~1..61a73ba +--- + +Code generated in this turn was committed verbatim as +`61a73bae` ("Mv `trio_proc`/`mp_proc` to per-backend +submods"). Per diff-ref mode, per-file code is captured +via the pointers below, each followed by a prose +summary of what the AI generated. Non-code output +(sanity-check results, design rationale) is included +verbatim. + +## Per-file generated content + +### `tractor/spawn/_trio.py` (new, 292 lines) + +> `git diff 61a73ba~1..61a73ba -- tractor/spawn/_trio.py` + +Pure lift-and-shift of `trio_proc()` out of +`tractor/spawn/_spawn.py` (previously lines 448–670). +Added AGPL header + module docstring describing the +backend; imports include local `from ._spawn import +cancel_on_completion, hard_kill, soft_kill` which +creates the bottom-of-module late-import pattern in +the core file to avoid a cycle. All call sites, +log-format strings, and body logic are byte-identical +to the originals — no semantic change. + +### `tractor/spawn/_mp.py` (new, 235 lines) + +> `git diff 61a73ba~1..61a73ba -- tractor/spawn/_mp.py` + +Pure lift-and-shift of `mp_proc()` out of +`tractor/spawn/_spawn.py` (previously lines 672–842). +Same AGPL header convention. Key difference from +`_trio.py`: uses `from . import _spawn` (module +import, not from-import) for `_ctx` and +`_spawn_method` references — these are mutated at +runtime by `try_set_start_method()`, so late binding +via `_spawn._ctx` / `_spawn._spawn_method` is required +for correctness. Also imports `cancel_on_completion`, +`soft_kill`, `proc_waiter` from `._spawn`. + +### `tractor/spawn/_spawn.py` (modified, 847 → 448 LOC) + +> `git diff 61a73ba~1..61a73ba -- tractor/spawn/_spawn.py` + +- removed `trio_proc()` body (moved to `_trio.py`) +- removed `mp_proc()` body (moved to `_mp.py`) +- pruned imports now unused in core: `sys`, + `is_root_process`, `current_actor`, + `is_main_process`, `_mp_main`, `ActorFailure`, + `pretty_struct`, `_pformat` +- added bottom-of-file late imports + `from ._trio import trio_proc` and + `from ._mp import mp_proc` with a one-line + comment explaining why (circular dep) +- `_methods` dict unchanged structurally; still binds + `'trio' → trio_proc`, `'mp_spawn' → mp_proc`, + `'mp_forkserver' → mp_proc` + +### `tractor/spawn/__init__.py` (modified) + +> `git diff 61a73ba~1..61a73ba -- tractor/spawn/__init__.py` + +Docstring rewrite only — no code. New text describes +the per-backend `Layout` with `- ._spawn` (core), +`- ._trio` (default), `- ._mp` (two mp variants), and +reiterates the "no eager import" NOTE. + +### `tractor/_testing/pytest.py` (modified) + +> `git diff 61a73ba~1..61a73ba -- tractor/_testing/pytest.py` + +Two-line logical change (plus a comment): +- `from typing import` grows `get_args` +- `pytest_generate_tests()` replaces the hardcoded + `('mp_spawn','mp_forkserver','trio')` tuple with + `get_args(SpawnMethodKey)` via lazy import + `from tractor.spawn._spawn import SpawnMethodKey` + inside the function body (matching the project's + existing lazy-import convention for the spawn + module) + +## Non-code output (verbatim) + +### Design rationale for the file split + +From my Phase A plan turn (already captured in +`20260417T034918Z_9703210_prompt_io.md`): +- `_spawn.py` stays as the "core" rather than renamed + to `_core.py` so external imports + (`_testing/pytest.py:228` imports + `try_set_start_method` from `tractor.spawn._spawn`) + keep working without churn. +- Per-backend extraction chosen over alternatives + (e.g. splitting generic helpers further) because + the immediate motivation is hosting a 3rd + `_subint.py` sibling cleanly in Phase B. + +### Sanity-check output (verbatim terminal excerpts) + +Post-extraction import probe: +``` +extraction OK +_methods: {'trio': 'tractor.spawn._trio.trio_proc', + 'mp_spawn': 'tractor.spawn._mp.mp_proc', + 'mp_forkserver': 'tractor.spawn._mp.mp_proc'} +``` + +Spawn-relevant test subset (`tests/test_local.py +test_rpc.py test_spawning.py test_multi_program.py +test_discovery.py`): +``` +37 passed, 1 skipped, 14 warnings in 55.37s +``` + +Full suite: +``` +350 passed, 14 skipped, 7 xfailed, 1 xpassed, +151 warnings in 437.73s (0:07:17) +``` + +No regressions vs. `main`. One transient `-x` +early-stop `ERROR` on +`test_close_channel_explicit_remote_registrar[trio-True]` +was flaky (passed solo, passed without `-x`), not +caused by this refactor. + +### Commit message + +Also AI-drafted (via `/commit-msg`) — the 40-line +message on commit `61a73bae` itself. Not reproduced +here; see `git log -1 61a73bae`. diff --git a/ai/prompt-io/prompts/subints_spawner.md b/ai/prompt-io/prompts/subints_spawner.md index 0673fc81..4911a930 100644 --- a/ai/prompt-io/prompts/subints_spawner.md +++ b/ai/prompt-io/prompts/subints_spawner.md @@ -8,8 +8,8 @@ https://github.com/goodboy/tractor/issues/379 Part of this work should include, -- modularizing and thus better origing the `.spawn.*` subpkg by - breaking up various backends currently in `spawn._spawn` in to +- modularizing and thus better organizing the `.spawn.*` subpkg by + breaking up various backends currently in `spawn._spawn` into separate submods where it makes sense. - add a new `._subint` backend which tries to keep as much of the @@ -27,7 +27,7 @@ Part of this work should include, with subprocs, but explicit public escape hatches to enable rigorously managed shm channels for high performance apps. -- all tests should be (able to be) paramatrized to use the new +- all tests should be (able to be) parameterized to use the new `subints` backend and enabled by flag in the harness using the existing `pytest --spawn-backend ` support offered in the `open_root_actor()` and `.testing._pytest` harness override