What's wrong
GitStatusBuilder (~L84-99), GitDiffBuilder (~L160) and GitPatchBuilder (~L167-188) never pin --ignore-submodules, so a host-level diff.ignoreSubmodules setting changes what they report. No --ignore-submodules appears anywhere under GitIntegration/.
Failure scenario (reproduced on git 2.43)
Submodule s has a local commit plus an untracked file:
- default
status --porcelain=v2 → 1 .M SC.U ... s
- with
-c diff.ignoreSubmodules=all → nothing, so IsClean == true
diff --name-status: M s → empty; diff --submodule=short patch → empty
- adding
--ignore-submodules=none restores the output in all three.
Why it matters
A caller asking "is this working copy safe to discard?" gets "clean" on a machine with that setting while unpushed submodule work exists. It is the same class of host-config hazard the repo already closed for status.showUntrackedFiles (CLAUDE.md design point 14, #112).
Suggested fix
Emit --ignore-submodules=none by default in Status, Diff and Patch (optionally with a builder option to choose another level).
Acceptance criteria
- Integration tests run Status/Diff/Patch with
diff.ignoreSubmodules=all set in the repo config and still see the dirty submodule.
Not #124 (closed, diff.submodule format) or #173 (dirty-submodule patch hunks).
What's wrong
GitStatusBuilder(~L84-99),GitDiffBuilder(~L160) andGitPatchBuilder(~L167-188) never pin--ignore-submodules, so a host-leveldiff.ignoreSubmodulessetting changes what they report. No--ignore-submodulesappears anywhere underGitIntegration/.Failure scenario (reproduced on git 2.43)
Submodule
shas a local commit plus an untracked file:status --porcelain=v2→1 .M SC.U ... s-c diff.ignoreSubmodules=all→ nothing, soIsClean == truediff --name-status:M s→ empty;diff --submodule=shortpatch → empty--ignore-submodules=nonerestores the output in all three.Why it matters
A caller asking "is this working copy safe to discard?" gets "clean" on a machine with that setting while unpushed submodule work exists. It is the same class of host-config hazard the repo already closed for
status.showUntrackedFiles(CLAUDE.md design point 14, #112).Suggested fix
Emit
--ignore-submodules=noneby default in Status, Diff and Patch (optionally with a builder option to choose another level).Acceptance criteria
diff.ignoreSubmodules=allset in the repo config and still see the dirty submodule.Not #124 (closed,
diff.submoduleformat) or #173 (dirty-submodule patch hunks).