--- model: gpt-5.6-sol service: opencode session: trio-pre-handshake-child-death timestamp: 2026-08-28T04:51:19Z git_ref: fb6d81d3 scope: code substantive: true raw_file: 20260828T045119Z_fb6d81d3_prompt_io.raw.md --- ## Prompt The human approved the next WireGuard Layer C implementation step after committing child-side network namespace bootstrap. ## Response summary Restore and harden the boot-race design originally implemented by `3b0724eba85b4014170ed95773e1e41a60d5c513` before transferring namespace FDs. Race the initial peer handshake against child-process death so a pre-connection bootstrap failure surfaces instead of parking `ActorNursery.start_actor()` forever. ## Files changed - `tractor/spawn/_spawn.py` - provide the generic handshake/process death race. - `tractor/spawn/_trio.py` - use the race during Trio child startup. - `tests/test_spawning.py` - cover handshake-first and death-first schedules, simultaneous outcomes, waiter errors, and backend cleanup. ## Human edits The human approved continued Layer C implementation. The agent narrowed the next slice to failure detection after analysis showed FD transfer would otherwise introduce a parent hang. The human then identified the earlier `wait_for_peer_or_proc_death()` implementation and required explicit credit; the source docstring and commit message now cite its original commit rather than a later cherry-pick. The human directly reflowed `_trio.py` to the project line limit and normalized nearby quotes. The human also required naming the race helper in its lifecycle comment, explicit `trio.Cancelled` handling in waiter tests, expected cancellation diagnostics, and a `trio.Process`-constrained test double. After mainline portability verification, the human chose to commit the fix on the current WireGuard branch and require its cherry-pick onto `main` as a blocker in the eventual WireGuard pull request.