docs(playbook): enumerate untracked paths before staging a sweep commit

A sweep's landing commit is where unrelated local state gets swept in. One repo's
'78 modified' was 76 modified + 2 untracked, one of which was .claude/ holding
settings.local.json — a literal 'git add -A' would have put permission config into
a tracked commit feeding a production deploy, invisible in a 76-file diff.
This commit is contained in:
Joseph Doherty
2026-08-11 05:51:21 -04:00
parent 094307e18b
commit ec4ad984c1
+11
View File
@@ -387,6 +387,17 @@ plus stating the claim's scope honestly ("verified in these three; not checked i
when it hasn't. All three were caught by someone re-examining their own earlier assertion, never by
the assertion being challenged.
**Enumerate untracked paths BEFORE staging, not after.** A sweep touches many files, so the landing
commit is where unrelated local state gets swept in — and `git status` counts mislead: one repo's
"78 modified" was 76 modified + 2 untracked, and one of the untracked entries was `.claude/`,
containing that session's `settings.local.json`. A literal `git add -A`/`git add .` following a
"commit the sweep" instruction would have put local permission config into a tracked commit feeding a
production deploy, invisible inside a 76-file diff. Run `git status --porcelain` and read the `??`
lines specifically; decide each one before staging anything. Two repos in this round had an exclusion
that had to be made deliberately (`.claude/`, and a `docker-compose.yml` carrying an undecided
`DisableLogin` override) — in both cases the exclusion was agreed before the commit existed, which is
the only point at which it is cheap.
**When every hypothesis is falsified, test the SHARED PREMISE before adding a new one.** Two
investigations into a 0-byte log file eliminated, between them, config levels, env vars in five
scopes, ACLs, stale files and a two-stage bootstrap — and deadlocked. The unexamined premise both