Development record
2026-07-30 — itd-74 (round 6), SECOND fix pass after two fresh adversarial reviews returned BLOCK on the first fix pass's OWN code. Detector-first throughout, each fix reverted in place and watched to fail before it passed. The guard's staged-content read was the cluster: it now reads each staged blob stage-explicitly (`git show ":0:$path"`, closing the `0:README.md` rev-magic bypass), derives staged modes from `git diff --cached --raw -z` so a gitlink (mode 160000, no blob here) is SKIPPED rather than fail-closing every commit forever, scans the staged PATH strings alongside content so a banned name in a filename is refused by key, refuses any staged path under the local tier (the private store must never be committed, and the guard cannot catch its own source), and announces the format and entry count it actually read before the scan so a stripped `# abcd-banlist: keyed` line cannot silently downgrade every keyed entry to a non-matching whole-line pattern. The verbs: `add` now proves the composed `KEY<space>PATTERN` line round-trips (a whitespace-only pattern wedged the store as `key `; leading/trailing whitespace was silently trimmed so the enforced pattern differed from the validated one) and rejects a NUL the two readers disagree on; the stdin path reads all of stdin and refuses trailing data rather than storing the first of a multi-line pattern silently; the verb resolves the git working-tree toplevel — the exact root the guard enforces at — so a repo nested under a parent holding a .abcd/ no longer writes its store into the parent where the guard never reads it; no cobra path echoes an unknown token (a would-be private value); the inert verdict is driven by the grep probe, not a static screen that falsely called `\b`/`\w`/`\s` "matches nothing" (GNU grep implements them); `remove --private` deletes ALL lines for a key (a duplicate no longer survives under a key the report calls gone) and `remove --public` no longer lets a bare hand-curated key shadow the managed `names/<key>` target it owns; the read path reports a store git does not ignore; and a mutation's entry count excludes unparseable lines so it agrees with `list`. Records corrected: the brief and this ledger had the RE2-vs-ERE divergence backwards — Go ACCEPTS `[a-z-.]` while grep -E refuses it (exit 2), the opposite of the earlier wording; engine.go was already right. Residual, recorded not fixed: the fsutil lock files are 0644 and never unlinked (a shared primitive; the banlist lock lives in the 0700 gitignored tier and the file is empty), a public-only add still creates the gitignored local-ephemeral tier to place its lock (nothing leaks; relocating hits the atomic-rename-inode problem), the `.abcd`-symlink asymmetry and a hand-written store's 0644 mode; and the out-of-repo `sync-banlist` trust and the empty-`$toplevel` branch carry over from the first pass. `RemovePrivate` surfaces the not-ignored condition only via the shared read path (list/bare), since `PrivateResult` carries no health field.
2026-07-30 — itd-74 (round 6), SECOND fix pass after two fresh adversarial reviews returned BLOCK on the first fix pass's OWN code. Detector-first throughout, each fix reverted in place and watched to fail before it passed. The guard's staged-content read was the cluster: it now reads each staged blob stage-explicitly (git show ":0:$path", closing the 0:README.md rev-magic bypass), derives staged modes from git diff --cached --raw -z so a gitlink (mode 160000, no blob here) is SKIPPED rather than fail-closing every commit forever, scans the staged PATH strings alongside content so a banned name in a filename is refused by key, refuses any staged path under the local tier (the private store must never be committed, and the guard cannot catch its own source), and announces the format and entry count it actually read before the scan so a stripped # abcd-banlist: keyed line cannot silently downgrade every keyed entry to a non-matching whole-line pattern. The verbs: add now proves the composed KEY<space>PATTERN line round-trips (a whitespace-only pattern wedged the store as key ; leading/trailing whitespace was silently trimmed so the enforced pattern differed from the validated one) and rejects a NUL the two readers disagree on; the stdin path reads all of stdin and refuses trailing data rather than storing the first of a multi-line pattern silently; the verb resolves the git working-tree toplevel — the exact root the guard enforces at — so a repo nested under a parent holding a .abcd/ no longer writes its store into the parent where the guard never reads it; no cobra path echoes an unknown token (a would-be private value); the inert verdict is driven by the grep probe, not a static screen that falsely called \b/\w/\s "matches nothing" (GNU grep implements them); remove --private deletes ALL lines for a key (a duplicate no longer survives under a key the report calls gone) and remove --public no longer lets a bare hand-curated key shadow the managed names/<key> target it owns; the read path reports a store git does not ignore; and a mutation's entry count excludes unparseable lines so it agrees with list. Records corrected: the brief and this ledger had the RE2-vs-ERE divergence backwards — Go ACCEPTS [a-z-.] while grep -E refuses it (exit 2), the opposite of the earlier wording; engine.go was already right. Residual, recorded not fixed: the fsutil lock files are 0644 and never unlinked (a shared primitive; the banlist lock lives in the 0700 gitignored tier and the file is empty), a public-only add still creates the gitignored local-ephemeral tier to place its lock (nothing leaks; relocating hits the atomic-rename-inode problem), the .abcd-symlink asymmetry and a hand-written store's 0644 mode; and the out-of-repo sync-banlist trust and the empty-$toplevel branch carry over from the first pass. RemovePrivate surfaces the not-ignored condition only via the shared read path (list/bare), since PrivateResult carries no health field.
Frontmatter
| id | dcn-2607300000000005 |
|---|---|
| type | decision |
| date | 2026-07-30 |
.abcd/work/decisions/dcn-2607300000000005-itd-74-round-6-second-fix-pass-after-two.md
open on GitHub ↗ · commit history ↗
mentions1
- itd-74abcd Keeps the Names You Ban Out of Everything You Publish