gitreins-foreground-task-complete-dies-at-terminal-cap
Done. I diagnosed the issue against the real gitreins 0.14.0 wheel, reproduced it, verified the recovery, and verified a code fix.
Root cause — cmd_task_complete (gitreins/cli.py:1329) is non-atomic:
- line 1376: tm.complete() persists status: complete + completed_at (engine/task_manager.py:227-229)
- line 1381: long Tier 2 judge runs
- line 1385: _persist_result() writes verdict.json only after the judge returns
A kill in Tier 2 leaves write #1 committed and write #2 never executed. The sync judge command (cli.py:2051) and async worker (cli.py:2186) do not flip task status, which is why judge --async is the safe recovery.
status: complete, 0 verdicts.gitreins judge --async DF-REPRO-1 → job-90eb…; --status → complete and .gitreins/history/2026-09-20/d1a5bd66/verdict.json written.verdict.json commit field matched git rev-parse HEAD.status: in_progress (safe), and a normal run still ends complete with a verdict.~/gitreins-foreground-task-complete-dies-at-terminal-cap.md (310 lines) containing:
- root-cause analysis with exact file/line references
- immediate recovery commands (do not re-run foreground)
- the exact source patch + a detached-wrapper option + operational notes
- a verification section with the actual observed outputs
- an inconsistency detector and a note on the separate async log-path/id mismatch bug in 0.14.0
# Evidence - Problem class: gitreins-foreground-task-complete-dies-at-terminal-cap - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-20T10:12:08.501Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "gitreins task complete <id> run in the FOREGROUND on a Go repo with a large suite is killed by the caller's terminal timeout part-way through Tier 2. The task status has already flipped to complete in .gitreins/tasks.yaml, but no verdict.json is written, so the task reads as judged when it never was. Observed twice in one tick (<project>, 2026-09-20): a 420s foreground cap killed the eval mid-run for DF-CRIER-12 and again for DF-CRIER-11.", "environment": "linux", "language": "go", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "gitreins-foreground-task-complete-dies-at-terminal-cap", "provider": "openrouter", "solved_at": "2026-09-20T10:12:08.501Z", "version": "1.26.6"}Done. I diagnosed the issue against the real gitreins 0.14.0 wheel, reproduced it, verified the recovery, and verified a code fix.
Root cause — cmd_task_complete (gitreins/cli.py:1329) is non-atomic:
- line 1376: tm.complete() persists status: complete + completed_at (engine/task_manager.py:227-229)
- line 1381: long Tier 2 judge runs
- line 1385: _persist_result() writes verdict.json only after the judge returns
A kill in Tier 2 leaves write #1 committed and write #2 never executed. The sync judge command (cli.py:2051) and async worker (cli.py:2186) do not flip task status, which is why judge --async is the safe recovery.
status: complete, 0 verdicts.gitreins judge --async DF-REPRO-1 → job-90eb…; --status → complete and .gitreins/history/2026-09-20/d1a5bd66/verdict.json written.verdict.json commit field matched git rev-parse HEAD.status: in_progress (safe), and a normal run still ends complete with a verdict.~/gitreins-foreground-task-complete-dies-at-terminal-cap.md (310 lines) containing:
- root-cause analysis with exact file/line references
- immediate recovery commands (do not re-run foreground)
- the exact source patch + a detached-wrapper option + operational notes
- a verification section with the actual observed outputs
- an inconsistency detector and a note on the separate async log-path/id mismatch bug in 0.14.0
# Evidence - Problem class: gitreins-foreground-task-complete-dies-at-terminal-cap - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-20T10:12:08.501Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "gitreins task complete <id> run in the FOREGROUND on a Go repo with a large suite is killed by the caller's terminal timeout part-way through Tier 2. The task status has already flipped to complete in .gitreins/tasks.yaml, but no verdict.json is written, so the task reads as judged when it never was. Observed twice in one tick (<project>, 2026-09-20): a 420s foreground cap killed the eval mid-run for DF-CRIER-12 and again for DF-CRIER-11.", "environment": "linux", "language": "go", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "gitreins-foreground-task-complete-dies-at-terminal-cap", "provider": "openrouter", "solved_at": "2026-09-20T10:12:08.501Z", "version": "1.26.6"}