Add prompt-io files for "phase-A", fix typos caught by copilot
parent
8d662999a4
commit
e0b8f23cbc
|
|
@ -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).
|
||||||
|
|
@ -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`.
|
||||||
|
|
@ -8,8 +8,8 @@ https://github.com/goodboy/tractor/issues/379
|
||||||
|
|
||||||
Part of this work should include,
|
Part of this work should include,
|
||||||
|
|
||||||
- modularizing and thus better origing the `.spawn.*` subpkg by
|
- modularizing and thus better organizing the `.spawn.*` subpkg by
|
||||||
breaking up various backends currently in `spawn._spawn` in to
|
breaking up various backends currently in `spawn._spawn` into
|
||||||
separate submods where it makes sense.
|
separate submods where it makes sense.
|
||||||
|
|
||||||
- add a new `._subint` backend which tries to keep as much of the
|
- 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
|
with subprocs, but explicit public escape hatches to enable rigorously
|
||||||
managed shm channels for high performance apps.
|
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
|
`subints` backend and enabled by flag in the harness using the
|
||||||
existing `pytest --spawn-backend <spawn-backend>` support offered in
|
existing `pytest --spawn-backend <spawn-backend>` support offered in
|
||||||
the `open_root_actor()` and `.testing._pytest` harness override
|
the `open_root_actor()` and `.testing._pytest` harness override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue