Severity: medium | Category: data-integrity | Phase: P1.15
Problem
_execute_task_subprocess returns the active run's status even when the child crashed/was SIGTERMed before updating the row (still RUNNING), so the batch records results[task_id]="RUNNING" as terminal. resume_batch only re-runs FAILED/BLOCKED/missing, so the task is permanently skipped, and the stale RUNNING run makes the next start_task_run raise "already has an active run".
Evidence
codeframe/core/conductor.py:2156
Acceptance criteria
- On nonzero exit with the run still RUNNING, the run is reconciled to FAILED before returning.
- "RUNNING" is retryable on resume.
Dependencies
None
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).
Severity: medium | Category: data-integrity | Phase: P1.15
Problem
_execute_task_subprocessreturns the active run's status even when the child crashed/was SIGTERMed before updating the row (still RUNNING), so the batch recordsresults[task_id]="RUNNING"as terminal.resume_batchonly re-runs FAILED/BLOCKED/missing, so the task is permanently skipped, and the stale RUNNING run makes the nextstart_task_runraise "already has an active run".Evidence
codeframe/core/conductor.py:2156Acceptance criteria
Dependencies
None
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).