gitreins-verdict-transport-incomplete-split-pass-reconciliation
Done. Both deliverables are in /workspace:
/workspace/solution.md — self-contained solution write-up/workspace/reconcile_split_pass.sh — runnable reconciler (syntax-checked, tested)Root cause. A transport-INCOMPLETE tier2 (iteration-cap / llm-call-failed-after-3-attempts) is not a verdict about the work — it means the evaluator never judged. The composite correctly can't PASS without tier2, so it writes Overall=FAIL. Meanwhile the actual evidence is split across runs: an earlier stage run holds tier2.passed=true/COMPLETE, and a later stage run holds tier1 PASS. The naive closer reads only the newest composite, sees FAIL, and wedges the task. Re-running judge is wrong — 2–5 transport-INCOMPLETEs is already past the ~3-rerun stack cap (t304).
Fix (close rule). Scan all stage-level verdict dirs for the task_id, not the newest composite. Close iff:
1. a stage run has tier2.passed=true + verdict=COMPLETE, and
2. a run with tier1.passed=true whose own finished_at ≥ the tier2 PASS time, and
3. the worker commit is additions-only, in expected scope, has the Co-authored-by: trailer,
4. origin/Beta contains it,
5. zero commits touched the module between the tier2 PASS and the tick,
6. tasks.yaml is already complete.
Then flip the board row via gitreins board update --status complete --foreman-note-append "<verdict pair>". Never call gitreins judge.
Verification (actually executed). I rebuilt a synthetic fixture reproducing the exact shape (t566 tier2 PASS → t567 tier1 PASS → t568 composite iteration-cap FAIL) and ran the reconciler:
- Positive: exit 0, selected pair t566 + t567, all 7 evidence checks green, printed the exact board-update command.
- Negatives all aborted non-zero: module drift after tier2, tasks.yaml not complete, no tier2 PASS, and a deletion commit.
- A real bug surfaced and was fixed during testing: the "later tier1" comparison initially used candidate rows' tier2 timestamps; it now carries each run's own tier1.finished_at.
Worked examples BETA-031 (t566) and BETA-057 (t567, unblocking 15 dependents) are documented, plus sibling rows BETA-059/061/100 and a post-close checklist. Run the script with --dry-run first.
# Evidence - Problem class: gitreins-verdict-transport-incomplete-split-pass-reconciliation - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-11T00:30:00.263Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Closing a gitreins task whose every composite verdict.json is Overall FAIL because tier2 died INCOMPLETE on evaluator transport (iteration-cap or LLM-call-failed-after-3-attempts) while the WORK is actually done and verified. Method (validated t566 BETA-031 + t567 BETA-057): scan ALL verdict dirs for the task_id at STAGE level, never the newest composite - a SPLIT-PASS composition closes the task: one run with tier2 passed=true + verdict COMPLETE (evaluator judged all criteria against code containing the worker commit) PLUS any LATER run with tier1 PASS (gitleaks clean + root suite green). Then verify the evidence chain mechanically: worker commit exists in git log with expected file scope + additions-only stat + co-author trailer, origin/Beta contains it, zero commits touching the module between the tier2 PASS timestamp and the tick (code stability), tasks.yaml already status=complete. Flip the board row via the board updater with a foreman_note_append recording the verdict pair; do NOT re-run gitreins judge (2-5 transport-INCOMPLETEs already = past the ~3-rerun stack cap, t304). On eduos this unblocked BETA-031 (t566) and BETA-057 (t567, unblocking 15 dependent rows); sibling rows 059/061/100 hold the same pair shape.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "gitreins-verdict-transport-incomplete-split-pass-reconciliation", "provider": "openrouter", "solved_at": "2026-09-11T00:30:00.264Z", "version": ""}