{ "title": "Fix repeated runner cleanup after a submitted parent is reaped", "reason": "Submit-transition descendant regression fails: repeated stop_process_tree after parent reap raises EPERM at os.killpg; launch OSError handling then attempts invalid escalation from review state.", "reproduction": "python3 -m unittest discover -s tests/tooling -p test_automation.py -v; test_submit_transition_stops_source_writing_descendant errors. In-memory trace: first cleanup returns parent -15; repeated cleanup raises PermissionError at runner.py:340. Evidence: state/evidence/S00-012-auto-ci-cd-28868645424b.md", "role": "ci-cd", "reviewer_role": "qa", "scope": [ "scripts/runner.py", "tests/tooling/test_automation.py" ], "outcome": "Reliable repeated lifecycle cleanup after submit with a reaped parent and SIGTERM-ignoring descendant, preserving actual process-tree termination and valid workflow state.", "steps": [ "Read S00-012 evidence and preserved descendant regressions.", "Reproduce repeated cleanup EPERM in the supplied execution harness without launching a model.", "Correct only the repeated-cleanup lifecycle failure; retain fail-closed handling for inaccessible live descendants and terminal/deadline monitoring.", "Run descendant, delayed stdin and existing lifecycle checks plus make check; record evidence and submit." ], "acceptance": [ "Submit-transition descendant regression completes without invalid escalation or delayed source writes.", "Timeout and terminal-transition paths terminate descendants, including SIGTERM-ignoring children.", "Repeated cleanup does not hide a failure to terminate a live process; stdin delivery and prompt budgets remain intact." ], "checks": [ "Both preserved descendant regressions.", "Delayed-reader UTF-8/EOF, timeout, transition, scope and fresh-session runner checks.", "make check" ], "depends_on": [], "requires_user_input": false }