Background
Finding from the PR #2550 review round. #2486 fixed the permissions feature's swallow-and-continue (warn + continue → error + rethrow) so a malformed shared config fails the run like the MCP feature. generateIgnoreCore is now the only remaining feature loop with the old pattern (src/lib/generate.ts ~791-796, pinned by the unit test "should handle errors gracefully and continue" at src/lib/generate.test.ts ~388).
Details
A throw from IgnoreProcessor (e.g. a malformed ignore source) still exits 0 with "All files are up to date", including in --check mode. Since ignore files are what keep secrets out of AI tools' reach, a silently-skipped ignore generation is the same class of fail-open bug — arguably worse.
Solution / Next Steps
Align ignore with the other eight feature cores: log at error level and rethrow (mirror the #2550 change), flip the pinning unit test, and add an e2e regression case — or document explicitly why ignore is intentionally lenient if there is a reason.
Background
Finding from the PR #2550 review round. #2486 fixed the permissions feature's swallow-and-continue (warn +
continue→ error + rethrow) so a malformed shared config fails the run like the MCP feature.generateIgnoreCoreis now the only remaining feature loop with the old pattern (src/lib/generate.ts ~791-796, pinned by the unit test "should handle errors gracefully and continue" at src/lib/generate.test.ts ~388).Details
A throw from IgnoreProcessor (e.g. a malformed ignore source) still exits 0 with "All files are up to date", including in --check mode. Since ignore files are what keep secrets out of AI tools' reach, a silently-skipped ignore generation is the same class of fail-open bug — arguably worse.
Solution / Next Steps
Align ignore with the other eight feature cores: log at error level and rethrow (mirror the #2550 change), flip the pinning unit test, and add an e2e regression case — or document explicitly why ignore is intentionally lenient if there is a reason.