diff --git a/ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.md b/ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.md new file mode 100644 index 00000000..4abb2244 --- /dev/null +++ b/ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.md @@ -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. diff --git a/ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.raw.md b/ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.raw.md new file mode 100644 index 00000000..4bbef8f8 --- /dev/null +++ b/ai/prompt-io/opencode/20260819T234823Z_557065d8_prompt_io.raw.md @@ -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` diff --git a/tests/devx/test_debugger.py b/tests/devx/test_debugger.py index 5830cf94..67e1ae39 100644 --- a/tests/devx/test_debugger.py +++ b/tests/devx/test_debugger.py @@ -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( diff --git a/tests/devx/test_tooling.py b/tests/devx/test_tooling.py index 4c64b988..f24e6e51 100644 --- a/tests/devx/test_tooling.py +++ b/tests/devx/test_tooling.py @@ -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,