Changes: Accept the bounded S00-014 cleanup correction and record independent QA evidence and handoff; no reviewer source changes. Validation: Four focused signal/descendant tests and make check passed (72 tests); prior function independently fails the injected repeated-signal regression in memory. Inspected executor patch/message and scope; git diff --check passed. Natural EPERM, Windows and parent-task acceptance are not claimed. Task: S00-014 Agent: auto-qa-0c2d58e2382e Role: qa Action: review Status: done Task title: Fix repeated runner cleanup after a submitted parent is reaped
4.3 KiB
S00-014 independent QA review
Reviewer: auto-qa-0c2d58e2382e (qa). Executor: auto-ci-cd-14343249da62 (ci-cd). Date: 2026-10-15. Decision: approve the bounded repeated-cleanup correction.
Input: assigned card/context, master/startup/workflow instructions, exact NFR-007, executor evidence/handoff/message, S00-012 preserved evidence/handoff, blocker reports, accepted ADR 0000 and direct dependency evidence/reviews/handoffs. Output: independent acceptance report. No reviewer source changes.
Findings against acceptance
- The preserved real submit regression passes: a descendant first installs SIGTERM ignore and records readiness; the harness submits and sleeps. Runner stops the process group, retains review state, records no scope violation, and the descendant cannot write its delayed source file. No invalid escalation occurs.
- The equivalent real timeout regression passes, prevents the delayed write and produces the expected blocked/remediation state. Initial cleanup retains SIGTERM followed by SIGKILL even when the parent has already exited. Both preserved subprocess tests were independently rerun.
- Successful cleanup is recorded on the same Popen instance only after all existing termination steps succeed. The subsequent finally cleanup returns without signaling the reaped group again. PermissionError remains unsuppressed; the deterministic final-SIGKILL failure test confirms a failed attempt does not mark completion and a retry signals again. Existing stdin, deadline/transition monitoring, prompt budgets and scope behavior remain intact; their full-suite checks pass.
Examined executor commit 7a737eeb49, both source patches, metadata diff, and commit message. Source changes are limited to scripts/runner.py and tests/tooling/test_automation.py; other changes are workflow/generated artifacts. The executor message matches the actual correction and tests and accurately distinguishes injected EPERM from a natural syscall reproduction. Initial working tree was clean. No acceptance defect or review blocker found.
Actual independent checks
python3 scripts/tasks.py resume --agent auto-qa-0c2d58e2382eandshow S00-014: exit 0 each; empty owned list expected for reviewer, task in review with a different executor; no claim.git log --all --oneline --grep='^S00-014:',git show 7a737eescoped source and metadata sections, and initialgit status --short: exit 0; patch/message reviewed and tree clean.PYTHONPATH=tests/tooling python3 -m unittest test_automation.RunnerTests.test_completed_cleanup_does_not_signal_reaped_group_again test_automation.RunnerTests.test_failed_descendant_kill_is_not_marked_complete test_automation.RunnerTests.test_submit_transition_stops_source_writing_descendant test_automation.RunnerTests.test_timeout_stops_source_writing_descendant -v: exit 0; four tests in 3.982s.- Read-only in-memory Python check: extracted stop_process_tree from
git show 7a737ee^:scripts/runner.pyusing AST, temporarily bound it in the test module, ran the deterministic completed-cleanup test and asserted its sole error wasPermissionError: Reaped process group inaccessible; exit 0. No source edits or real EPERM claim. This independently confirms the regression fails against the prior function. make check > /private/tmp/luma-S00-014-review-check.log 2>&1: exit 0; 72 tests in 17.514s, validation of 279 tasks, 22 stages, 221 requirements and 211 allocated Web requirements. Includes complete delayed UTF-8/EOF delivery, timeout/transition, fresh sessions, scope, current prompt budgets and immutable snapshots.git diff --checkand final pre-reportgit status --short: exit 0; no whitespace errors or source changes.- Runtime observations: Python 3.9.6; macOS 27.0.1, build 26A434. No browser/server required for this tooling task.
Limits and handoff
The original natural EPERM was not reproduced in this session; deterministic signal injection reproduces the repeated-signal failure. Windows cleanup and escaped process groups were not tested. Existing SIGKILL semantics are preserved; no permission bypass or process enumeration was added. No application, model, live provider, S00-012 or root S00-002 acceptance is claimed. Approval covers only S00-014. Coordinator must commit the review transition before launching a fresh process for the returned parent task; reviewer does not continue that work or mutate Git.