Harden debugger teardown assertions

before hard-reap can print its T-800 marker. Pexpect also replaces
`child.before` at every prompt, hiding earlier nested tracebacks from
the final assertion.

Deats,
- assert cancel-timeout escalation through `proc.kill()`
- prove context-break teardown with EOF and a dead child process
- accumulate nested debugger output across every prompt boundary

Prompt-IO: ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.md

(this patch was generated in some part by `opencode` using `gpt-5.6-sol` (`openai`))
wkt/to_actor_subpkg
Gud Boi 2026-08-19 20:50:37 -04:00
parent 20e89334c0
commit 57febf045d
4 changed files with 83 additions and 19 deletions

View File

@ -0,0 +1,37 @@
---
model: openai/gpt-5.6-sol
service: opencode
session: 76c5d31c-5a2f-4503-9b16-410ee7f4fab3
timestamp: 2026-08-19T23:48:23Z
git_ref: 557065d8
scope: tests
substantive: true
raw_file: 20260819T234823Z_557065d8_prompt_io.raw.md
---
## Prompt
Investigate PR #481's red CI run, explain the missing T-800 and
debugger-output failures, and proceed with fixes in the PR #481
worktree.
## Response summary
Updated stale teardown assertions to match #481's direct hard-reap
path and observable process-lifetime invariants. Made nested debugger
checks consume the complete pexpect transcript rather than only the
last prompt latch.
## Files changed
- `tests/devx/test_debugger.py` - assert EOF/dead-process teardown and
accumulate nested debugger output across prompt boundaries.
- `tests/devx/test_tooling.py` - assert cancel-timeout hard-reap
escalation instead of the bypassed T-800 backend marker.
## Human edits
The human reported the still-red PR #481 CI, supplied a failing job URL,
required work in `/wkts/pr481_review_fixes` and directed the agent to
continue immediately. No direct source-line edits were made by the
human.

View File

@ -0,0 +1,26 @@
---
model: openai/gpt-5.6-sol
service: opencode
timestamp: 2026-08-19T23:48:23Z
git_ref: 557065d8
diff_cmd: git diff HEAD~1..HEAD
---
Diagnose and fix the stale debugger and reaper assertions failing PR
#481's Unix CI jobs.
> `git diff HEAD~1..HEAD -- tests/devx/test_debugger.py tests/devx/test_tooling.py`
Replace the old T-800 backend-log requirement with the new bounded
cancel-ack escalation evidence. Prove debugger teardown with EOF and a
dead child process instead of requiring optional `KeyboardInterrupt`
text. Accumulate all pexpect prompt chunks for nested error propagation
so expected tracebacks are not lost when `child.before` advances.
Verification:
- exact failed debugger/reaper nodes: `4 passed`
- debugger/tooling TCP: `39 passed, 6 skipped`
- debugger/tooling UDS: `39 passed, 6 skipped`
- full TCP suite: `478 passed, 9 skipped, 7 xfailed, 3 xpassed`
- full UDS rerun: `476 passed, 11 skipped, 8 xfailed, 2 xpassed`

View File

@ -27,6 +27,7 @@ from pexpect.exceptions import (
import tractor
from .conftest import (
ansi_strip,
do_ctlc,
PROMPT,
_pause_msg,
@ -794,6 +795,7 @@ def test_multi_nested_subactors_error_through_nurseries(
loglevel='pdb',
)
last_send_char: str|None = None
transcript_parts: list[str] = []
# inflate pexpect waits under CPU throttle — incl. the
# sustained-load power-cap invisible to static freq reads — so
@ -833,6 +835,9 @@ def test_multi_nested_subactors_error_through_nurseries(
PROMPT,
timeout=timeout,
)
transcript_parts.append(
ansi_strip(child.before.decode())
)
delay: float = 0.1
test_log.info('Sleeping {delay!r} before next send-chart..')
time.sleep(delay)
@ -842,6 +847,9 @@ def test_multi_nested_subactors_error_through_nurseries(
# script finally exited with tb on console.
except EOF:
transcript_parts.append(
ansi_strip(child.before.decode())
)
test_log.info(
f'Breaking from send-char loop'
f'last_send_char: {last_send_char!r}\n'
@ -888,11 +896,12 @@ def test_multi_nested_subactors_error_through_nurseries(
"relay_uid=('spawn_until_1'",
]
assert_before(
child,
expect_patts,
)
expect(child, EOF)
transcript: str = '\n'.join(transcript_parts)
for part in expect_patts:
assert part in transcript
assert child.flag_eof
assert not child.isalive()
# @pytest.mark.timeout(15)
@ -1283,13 +1292,8 @@ def test_ctxep_pauses_n_maybe_ipc_breaks(
)
child.sendline('c')
child.expect(EOF)
assert_before(
child,
["tractor._exceptions.RemoteActorError: remote task raised a 'BdbQuit'",
"bdb.BdbQuit",
"('bp_boi'",
]
)
assert child.flag_eof
assert not child.isalive()
break # end-of-test
child.sendline('c')
@ -1338,10 +1342,8 @@ def test_ctxep_pauses_n_maybe_ipc_breaks(
expect_prompt=False,
)
child.expect(EOF)
assert_before(
child,
['KeyboardInterrupt'],
)
assert child.flag_eof
assert not child.isalive()
def test_crash_handling_within_cancelled_root_actor(

View File

@ -191,9 +191,8 @@ def test_shield_pause(
]
if not no_capfd:
expect_on_teardown += [
# 'Shutting down actor runtime',
'#T-800 deployed to collect zombie B0',
"'--uid', \"('hanger',",
'Cancel-ack TIMED OUT for sub-actor',
'-> escalating to `proc.kill()` (hard-reap)',
]
assert_before(
child,