--- model: openai/gpt-5.6-sol service: opencode session: 76c5d31c-5a2f-4503-9b16-410ee7f4fab3 timestamp: 2026-08-21T04:08:03Z git_ref: 3c1bbe73 scope: code substantive: true raw_file: 20260821T040803Z_3c1bbe73_prompt_io.raw.md --- ## Prompt Continue PR #481 review cleanup one item at a time. Compare the remaining child-registration/reaping experiment against PR #484, identify the next valid behavior, and generate an exact commit plan for that boundary without committing automatically. ## Response summary Separated late-child admission from the broader bounded-reap rewrite. Added one synchronous `ActorNursery._register_child()` publication step that stores the child and its reap events before sampling nursery cancellation. This closes both scheduler orderings around `ActorNursery.cancel()`'s child snapshot. The MP backend registers immediately before synchronous process startup and refuses to start when cancellation already owns the child. The Trio backend registers immediately after `open_process()` and kills that already-created process when registration observes cancellation. An early `start_actor()` guard rejects calls begun after cancellation is already visible. Deterministic tests cover the nursery registration ordering and the MP no-start invariant. Comparison with PR #484 confirmed that its retained generic nursery/backends do not close this race. ## Files changed - `tractor/runtime/_supervise.py` - atomically publish child ownership and reject actor starts after nursery cancellation. - `tractor/spawn/_mp.py` - register before synchronous process startup and abort a cancellation-owned child. - `tractor/spawn/_trio.py` - register immediately after process creation, kill a cancellation-owned child, and remove its stale unused import. - `tests/test_to_actor.py` - cover late registration and MP startup suppression. ## Human edits The human required review extras to be handled one item and one behavioral commit at a time, with each item compared against PR #484 before acceptance. That direction split this late-registration fix from the original broad experiment's bounded post-ack reaping, `ActorNursery.cancel()` hard-reap rewrite, and debugger/error behavior. The human accepted the narrower late-registration boundary by requesting its commit plan. No direct source-line edits were made by the human.