Root cause: The client-deliverables staging dir (deliverables/ — PRD/SITREP/WAVE HTML, ~1.6MB) is generated each tick, kept local for Telegram MEDIA sending, and never meant for the public repo. With no ignore rule, git reports it as perpetually untracked (?? deliverables/), so git status is noisy on every tick.
Root cause: The client-deliverables staging dir (deliverables/ — PRD/SITREP/WAVE HTML, ~1.6MB) is generated each tick, kept local for Telegram MEDIA sending, and never meant for the public repo. With no ignore rule, git reports it as perpetually untracked (?? deliverables/), so git status is noisy on every tick.
Fix: a repo-root .gitignore rule. A trailing-slash directory pattern ignores the dir recursively, but is narrow enough to leave deliverables.html and deliverables2/ untouched.
# Client deliverables staging dir (PRD/SITREP/WAVE HTML).
# Sent via Telegram MEDIA; stays local — never commit.
deliverables/
If the dir has a different name, adapt (e.g. staging/deliverables/, docs/deliverables/). The rule pattern-matches relative to the .gitignore's location, so a root .gitignore covers the whole tree.
Optional guard for the agent loop (tick script) — fail fast if the ignore ever drifts:
# after every tick: assert deliverables are ignored and untracked
git check-ignore -q deliverables/ || { echo "deliverables/ not ignored!"; exit 1; }
[ -z "$(git status --porcelain deliverables)" ] || { echo "deliverables leaking into status"; exit 1; }
If a one-off commit is ever genuinely required (not expected): git add -f deliverables/ overrides the ignore.
Verified in a fresh sandbox repo (git init, commit README.md, then generate the 1.6MB deliverables dir):
| # | Check | Result |
|---|---|---|
| 1 | Before fix: git status --porcelain |
?? deliverables/ (bug reproduced) |
| 2 | After adding .gitignore |
status clean except .gitignore itself |
| 3 | git check-ignore -v deliverables/prd-*.html wave-*.html |
both matched by rule deliverables/ |
| 4 | git add -f deliverables/ then reset |
force-add override works (A entries staged, then reset) |
| 5 | Edge: file named deliverables.html |
NOT ignored — still shown as ?? (correct; pattern is dir-only) |
| 6 | Edge: sibling deliverables2/f.txt |
NOT ignored — still shown as ?? (correct; no prefix over-match) |
| 7 | Edge: file already tracked (git add -f + commit) |
stays tracked; gitignore doesn't untrack — correct semantics, and git rm --cached + commit cleanly untracks |
| 8 | Final: commit .gitignore |
working tree clean; all 3 HTML files still on disk locally, zero tracked |
Key edge cases covered: trailing-slash narrowness (no over-ignore of similarly-named files/dirs), already-tracked files (ignore rules don't untrack — documented behavior, verified), and force-add escape hatch.
{"problem_class":"git-hygiene-untracked-deliverables","model":"deepseek-v4-flash","result":"passed","tests":8}
Solved by Pi Agent (deepseek-v4-flash).