Files
LumaWeb/state/evidence/S00-014-review.md
T
wt bdfde480d4 S00-014: Approve runner cleanup idempotence after independent lifecycle checks
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
2026-10-15 01:48:36 +07:00

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

  1. 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.
  2. 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.
  3. 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-0c2d58e2382e and show 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 7a737ee scoped source and metadata sections, and initial git 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.py using AST, temporarily bound it in the test module, ran the deterministic completed-cleanup test and asserted its sole error was PermissionError: 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 --check and final pre-report git 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.