Mark
6a1fc32826
docs(04-02): complete harden-clean-up-optional plan 04-02 — build hygiene
Plan 04-02 closes three independent build-hygiene fixes consolidated into
one plan because they share the build-gate-grep test-scaffold pattern:
1. **setimmediate polyfill replacement** — layered 4-mechanism CSP-hardening
eliminates the `new Function` literal from the SW chunk (grep -c flips
1→0 across all three SW chunks). Runtime guard + nodePolyfills exclude
+ resolve.alias + Rollup post-transform plugin. Option α (force JSZip
unbundled lib/index.js) attempted + reverted because it broke
readable-stream-browser propagation causing UAT A30+ regressions;
Option β (post-transform plugin) preserves JSZip's pre-bundled
distribution verbatim while excising the offending literal.
2. **ROADMAP SC #3** (generate-icons ESM/CJS) — `git mv generate-icons.js
generate-icons.cjs` resolves the `require('fs')` under
`package.json type: module` via Node's `.cjs`-as-CJS rule.
3. **ROADMAP SC #4** (dead-code grep) — `tests/build/dead-code-grep.test.ts`
regression-pins `permissions.request` absence in `src/`.
Plus closure of Plan 01-12 Wave 7's setimmediate deferred-items entry.
Task commits:
- 630d40c test(04-02): Wave 0 RED — no-new-function + dead-code-grep
- f251297 feat(04-02): Wave 1 GREEN — setimmediate replacement + CJS rename + closure
Verification:
- vitest 180/180 → 183/183 GREEN on clean run (+3 net new tests)
- UAT harness 33/33 GREEN preserved (REVISION iter-2 WARNING 1 empirical pin)
- Pre-checkpoint bundle gates 5/5 PASS; SW CSP-safety polarity flipped 1→0
- tsc-clean preserved; npm run build exit 0; node generate-icons.cjs exit 0
STATE.md: Plan 3/7 (Plan 04-02 complete); 25/30 total plans; 83% progress.
ROADMAP.md: Phase 4 progress 2/7 plans complete (04-01 + 04-02).
deferred-items.md: Plan 01-12 Wave 7 setimmediate entry CLOSED end-to-end.
SUMMARY at `.planning/phases/04-harden-clean-up-optional/04-02-SUMMARY.md`.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 15:41:54 +02:00
..
2026-05-21 10:25:29 +02:00
2026-05-20 22:42:13 +02:00
2026-05-21 09:30:49 +02:00
2026-05-21 14:34:03 +02:00
2026-05-21 10:00:07 +02:00
2026-05-21 15:41:54 +02:00
2026-05-21 09:30:49 +02:00
2026-05-21 10:00:07 +02:00
2026-05-21 09:30:49 +02:00
2026-05-21 10:00:07 +02:00
2026-05-21 10:00:07 +02:00
2026-05-20 22:16:57 +02:00
2026-05-20 22:16:57 +02:00
2026-05-21 10:21:03 +02:00
2026-05-21 10:21:03 +02:00
2026-05-21 07:46:34 +02:00
2026-05-21 10:21:03 +02:00