be status ignores only the sub's own .gitignore — needs hierarchical (cwd→$HOME) compounding
be status:<sub>/ floods with unk for paths the repo-root .gitignore should exclude (build-*/, *.o, CMakeFiles/, …): the relayed sub-scan IGNOLoads only the SUBMODULE's own .gitignore, which abc lacks, so the parent's patterns never reach the sub's paths. Bare be collapses a sub to one summary row (no flood) — that's the "intermittent". Fix: hierarchical .gitignore resolution — load every .gitignore from the classified path's directory UP to $HOME (or / if outside $HOME) and COMPOUND them, crossing submodule boundaries, the way nested git ignores stack. NO hardcoded directory names. See Sniff.
be and a fresh build — NOT skew): build
the abc sub (makes abc/build-debug/{CMakeCache.txt,*.o,…}), then be status:abc/ → ~15 unk abc/build-debug/... rows.
be status:<sub>/ relays into the sub's worktree; its SNIFFOpen/IGNOLoad
reads only the SUB's own .gitignore (absent for abc), so the repo-root .gitignore never governs the sub's paths.
be collapses the sub to one summary row → no flood (the "intermittent").8c7f5f3a) REFUTED: sniff/SNIFF.c/CLASS.c/dog/git/IGNO.c/
ULOG.c are byte-identical to parent d8fec51a; the bug is pre-existing / structural (since submodule projector recursion), not a regression.
.gitignore already lists every flooded pattern — it justisn't consulted from inside the sub.
.gitignore: classifying a path loads every .gitignore from
its directory up to $HOME (or / if not under $HOME) and COMPOUNDS them (git precedence: nearer/deeper rules add or override; ! negation honored).
.gitignore
governs nested sub paths — this is what fixes the abc/build-debug flood.
build/Corpus/etc. are excluded ONLY because the
real .gitignores in the chain list them.
build*//Corpus/ ignore in
IGNOMatch): Corpus is not special — restore pattern-only matching.
/, ! negation,precedence) across the compounded chain.
$HOME (or /); cache the chain per directory so the
status walk doesn't reload .gitignores for every leaf.
igno_is_build/Corpus special-case in IGNOMatch — a hardcoded dir blacklist, not ignore resolution.
.gitignore STACK loaded leaf-dir → $HOME//; IGNOMatch
consults it nearest-first with git precedence; built once per directory (cached), not per leaf. Localize in dog/git/IGNO + the sniff/SNIFF open/scan that drives it (incl. the be status:<sub>/ relay).
igno_is_build*/Corpus anywhere in
dog/git/IGNO.c or dog/test/IGNO.c (audit-verified); IGNOMatch pattern-only.
IGNOLoad walks the anchor dir up to $HOME//
(IGNO.c:239-276), stacks every .gitignore, git precedence incl. ! (nearest-first consult, IGNO.c:332+), built once per load — dog 623b5a9e.
sniff/SNIFF.c:303 IGNOLoad(&s->ignores, wt_for_ig)— the upward chain crosses sub boundaries, so a sub scan inherits parent rules.
dog/test/IGNO.c STATUS-002 chain property cases
(igno_chain_case: parent-only pattern + ! negation/precedence). ctest green.
/ at 100% disk (built via atmpfs symlink). Watch disk on the rerun.
623b5a9e / beagle pin 7d60c8ae "STATUS-002 hierarchical
.gitignore across submodules": the chosen .gitignore STACK (leaf dir → $HOME//, git precedence, ! negation) in dog/git/IGNO.c, consumed via sniff/SNIFF.c IGNOLoad; the build/Corpus stop-gap is gone (rolled back).
dog/test/IGNO.c chaincases); no hardcoded dir names remain. CLOSED.