I diagnosed the issue and verified the fix end-to-end in throwaway repos. Solution written to ~/solution.md.
Root cause: .gitreins/ mixes a tracked contract with local runtime state. .gitreins/config.yaml is meant to be tracked, but history/, verdicts/, tasks.yaml, tasks.yaml.lock, logs/, and usage.jsonl are regenerated every guard tick. The repo added the config without the matching .gitignore rules, so git reports them as untracked forever and git add -A can commit them.
Fix: add explicit ignore lines (not a blanket .gitreins/) and commit them in the same commit as the guard config:
# .gitreins local runtime state (the guard contract stays tracked)
.gitreins/history/
.gitreins/verdicts/
.gitreins/tasks.yaml
.gitreins/tasks.yaml.lock
.gitreins/logs/
.gitreins/usage.jsonl
Verified in a fresh repo:
- git ls-files .gitreins → only .gitreins/config.yaml
- git status --short → empty
- git add -A then git status --short → still empty
- git check-ignore -v confirms each runtime path is matched by the new rules
The doc also covers the already-committed case (git rm -r --cached ..., keeping working copies on disk and leaving config.yaml tracked), which I verified leaves a clean status.
# Evidence - Problem class: gitreins-runtime-state-not-gitignored - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-23T21:46:12.357Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "A repo adopts .gitreins/config.yaml but not the ignore rules for the guard's local runtime state, so git status --short shows tasks.yaml, tasks.yaml.lock, usage.jsonl and history/ as untracked on every tick and a later `git add -A` commits them. Fleet convention (verified on three siblings): .gitreins/config.yaml IS tracked (it is the guard contract); .gitreins/{history,verdicts,tasks.yaml,tasks.yaml.lock,logs,usage.jsonl} are local and must be gitignored. Fix by adding those lines to .gitignore and confirming git status --short is empty. Check this in the same commit that adds the guard config.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "gitreins-runtime-state-not-gitignored", "provider": "openrouter", "solved_at": "2026-09-23T21:46:12.357Z", "version": ""}I diagnosed the issue and verified the fix end-to-end in throwaway repos. Solution written to ~/solution.md.
Root cause: .gitreins/ mixes a tracked contract with local runtime state. .gitreins/config.yaml is meant to be tracked, but history/, verdicts/, tasks.yaml, tasks.yaml.lock, logs/, and usage.jsonl are regenerated every guard tick. The repo added the config without the matching .gitignore rules, so git reports them as untracked forever and git add -A can commit them.
Fix: add explicit ignore lines (not a blanket .gitreins/) and commit them in the same commit as the guard config:
# .gitreins local runtime state (the guard contract stays tracked)
.gitreins/history/
.gitreins/verdicts/
.gitreins/tasks.yaml
.gitreins/tasks.yaml.lock
.gitreins/logs/
.gitreins/usage.jsonl
Verified in a fresh repo:
- git ls-files .gitreins → only .gitreins/config.yaml
- git status --short → empty
- git add -A then git status --short → still empty
- git check-ignore -v confirms each runtime path is matched by the new rules
The doc also covers the already-committed case (git rm -r --cached ..., keeping working copies on disk and leaving config.yaml tracked), which I verified leaves a clean status.
# Evidence - Problem class: gitreins-runtime-state-not-gitignored - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-23T21:46:12.357Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "A repo adopts .gitreins/config.yaml but not the ignore rules for the guard's local runtime state, so git status --short shows tasks.yaml, tasks.yaml.lock, usage.jsonl and history/ as untracked on every tick and a later `git add -A` commits them. Fleet convention (verified on three siblings): .gitreins/config.yaml IS tracked (it is the guard contract); .gitreins/{history,verdicts,tasks.yaml,tasks.yaml.lock,logs,usage.jsonl} are local and must be gitignored. Fix by adding those lines to .gitignore and confirming git status --short is empty. Check this in the same commit that adds the guard config.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "gitreins-runtime-state-not-gitignored", "provider": "openrouter", "solved_at": "2026-09-23T21:46:12.357Z", "version": ""}