git add .coding-hermes/board/{tasks,events,board}.jsonl .gitreins/history//{e200b167,666383ca}
I diagnosed the bug from the real gitreins source (totalwindupflightsystems/gitreins v0.12.1), reproduced it, patched it, and verified the fix. Full write-up is in /workspace/solution.md.
gitreins produces two different 8-hex values and prints the wrong one:
engine/persist.py): short_hash = sha256(f"{task_id}:{evaluated_at}")[:8], written to .gitreins/history/<date>/<short_hash>/.gitreins/cli.py): persist() returns the git commit oid from _git_commit() (auto-commit on the gitreins orphan branch), and _persist_result() prints it as 📋 Verdict saved: {commit_hash}.Because history.storage defaults to git (which is what boardctl uses), the printed id is a commit oid that resolves to no path. I confirmed the on-disk ids are exactly the content hashes:
sha256("BT-019:2026-09-12T07:24:45.798347")[:8] = e200b167 ✓
sha256("BT-019:2026-09-12T07:26:34.221086")[:8] = 666383ca ✓
Pre-fix reproduction: printed 4f779f5b, on-disk befe4458 → mismatch.
persist() now records the canonical on-disk id (self.last_entry_id) alongside the commit oid, and the CLI prints that resolvable id. Full unified diff is in the doc. After the patch:
CLI output: 📋 Verdict saved: 0363c7a2 (git commit 2afb0f2b)
printed id == on-disk dir id == 0363c7a2 → path resolves
77 passed (tests/test_persist.py + tests/test_v07_features.py)
The doc includes a verdict_dir() resolver that finds the newest verdict for a task by evaluated_at (verified: BT-019 → .gitreins/history/2026-09-12/666383ca, passed: true), plus the full tick sequence:
timeout 300 gitreins guard
timeout 540 gitreins task complete BT-019
V=$(verdict_dir BT-019); jq -r '.passed' "$V/verdict.json"
# remediation + re-judge at HEAD -> second verdict dir
git add .coding-hermes/board/{tasks,events,board}.jsonl .gitreins/history/*/{e200b167,666383ca}
boardctl -C . validate && boardctl -C . doctor # 0 warnings
boardctl -C . header --set-ticks-total N
Key invariant now documented: the verdict id is the directory basename; the git commit oid is never a path.
# Evidence - Problem class: go-cli-gitreins-judge-verdict-location - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-12T07:41:53.190Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "boardctl BT-019 tick: gitreins CLI prints \"Verdict saved: <8hex>\" but the on-disk evidence dir under .gitreins/history/<date>/<8hex>/ uses a DIFFERENT hash (printed 1d00161b/8dae28de vs on-disk e200b167/666383ca); the printed id resolves to no path, so verify by listing the date dir and reading verdict.json passed. Working approach for the tick: (1) file a spec task, dispatch a worker with a pre-grepped VERIFIED FACTS block; (2) after the worker commit run timeout 300 gitreins guard then timeout 540 gitreins task complete <id>; (3) if the Tier-2 judge returns INCOMPLETE on an ENUMERATED criterion (each X names Y), remediate the deliverable with an explicit table mapping (view -> user question -> source -> UI layer), commit, re-run gitreins judge <id> which re-evaluates at HEAD and writes a second verdict dir; (4) stage the board JSONL trio plus BOTH verdict dirs; boardctl validate + doctor must report 0 warnings; header --set-ticks-total N.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "go-cli-gitreins-judge-verdict-location", "provider": "openrouter", "solved_at": "2026-09-12T07:41:53.191Z", "version": ""}