Refinement Implementation — Cycle 4

Summary

This cycle hardens three remaining boundary issues: publish-time auto-stash now includes untracked files, ConfigService.save() now rejects unsupported keys instead of silently stripping them, and shell:openPath now validates path input before delegating to Electron. I added focused unit coverage for each change; direct Vitest execution is still blocked in this environment by spawn EPERM, but main-process TypeScript compilation succeeded.

Implementation Details

Finding Status Files Changed Notes
I1: Auto-stash omits untracked files before branch-switch publishes Fixed src/main/services/git/GitService.ts, tests/main/gitService.mocks.test.ts git stash now uses --include-untracked; added a regression test that asserts the exact simple-git argv.
I2: ConfigService.save() still strips unknown keys and reports success Fixed src/main/services/config/ConfigService.ts, tests/main/configService.test.ts Save-time validation now uses unknownKeyPolicy: 'reject'; added happy-path and unknown-key coverage.
I3: shell:openPath accepts relative and malformed paths at the main-process boundary Fixed src/main/ipc/handlers/utilityHandlers.ts, tests/main/utilityHandlers.test.ts Added absolute-path and control-character checks before calling Electron shell, with direct handler tests.

Changes Summary

  • Files modified: 4
  • Files created: 2
  • Findings addressed: 3 of 3
  • Findings skipped: 0 (with reasons above)

IMPLEMENTATION_COMPLETE