10 KiB
Implementation Plans
Generated by the improve skill (deep audit) on 2026-07-08, against commit
73daf22b2. A deep 8-category read-only audit produced 53 raw findings; after
adversarial verification and manual vetting, the user selected the items below
to turn into executor plans.
Each executor: read your plan fully before starting, honor its STOP conditions, and update your row when done. Plans are self-contained — you do not need the audit or this repo's history to execute one.
Execution order & status
| Plan | Title | Priority | Effort | Risk | Depends on | Status |
|---|---|---|---|---|---|---|
| 001 | Characterization tests for the resume service | P1 | M | LOW | — | DONE (branch advisor/resume-service-improvements) |
| 002 | CSP + framing headers on web pages; gate uploads CORS | P1 | S | LOW | — | DONE (branch advisor/security-and-docs) |
| 003 | Fix silent-success mutations; bound bulk-op inputs | P1 | S | LOW | 001 (soft) | DONE (branch advisor/resume-service-improvements) |
| 004 | Correct README "Custom CSS" claim | P3 | S | LOW | — | DONE (branch advisor/security-and-docs) |
| 005 | Deduplicate public-resume view-count writes | P2 | M | MED | 001 (soft) | DONE (branch advisor/resume-service-improvements) |
| 006 | Font-picker options once; defer font payload | P2 | S | LOW | — | DONE (branch advisor/font-payload; Step-1 hoist only — build measurement confirmed the payload already loads only with the PDF chunk, so lazy-loading was correctly skipped) |
| 007 | Extract shared template page-shell — spike + pilot | P2 | L | HIGH | 001 (discipline) | REVERTED from integration (user decision) — spike executed & proved the recipe, but full rollout judged not worth it; Pikachu reverted for template uniformity. Work preserved on branch advisor/template-shell-spike. |
Status values: TODO | IN PROGRESS | DONE | BLOCKED (one-line reason) | REJECTED (one-line rationale)
Recommended order
Independent quick wins first (002, 004), then the tests-first foundation (001) before the behavior change that depends on it (003) and the caller change with a safety net (005). 006 is independent and low-leverage — do it anytime. 007 (template refactor) is last and is a spike + one-template pilot that stops for review, not a full rollout.
Fastest safe sequence: 002 → 004 → 001 → 003 → 005 → 006 → 007.
Execution results (2026-07-08)
All 7 plans were executed by isolated-worktree executor subagents and reviewed
by the advisor (re-ran every done-criterion, scope-checked, read diffs, audited
tests). All APPROVED. Four branches, all based on 73daf22b2:
| Branch | Plans | Package(s) | Verify (re-run by reviewer) |
|---|---|---|---|
advisor/security-and-docs |
002, 004 | apps/server, README | typecheck 0; server static tests 36/36 |
advisor/font-payload |
006 | apps/web | typecheck 0; web suite 457/457; build 0 |
advisor/resume-service-improvements |
001, 003, 005 | packages/api | typecheck 0; api suite 178/178; boundaries clean |
advisor/template-shell-spike |
007 | packages/pdf | typecheck 0; pdf suite 264/264; boundaries clean; parity snapshot byte-identical pre/post refactor |
Post-execution decision (user, 2026-07-08): Local integration branch
improve-integration created off main with plans 001–006 merged. Plan
007 was reverted from it (the spike concluded a full 14-template rollout
isn't worth it — the shell only centralizes layout orchestration, not the
per-template style hooks where most recurring edits land; 6 templates are
single-column and don't fit; consistency argues against a partial rollout). The
advisor/template-shell-spike branch is kept if 007 is ever revisited.
Known unrelated red: packages/api/.../storage/service.test.ts fails on the
pinned vitest 4.1.9 (.rejects.toThrow matcher TypeError, fixed in 4.1.10)
— present on base main too, in a file no plan touches; the vitest suite isn't
in CI, so it's latent. Bumping vitest to 4.1.10 clears it (a separate base-repo
concern, left untouched).
Integration notes for the user (merging is your call — the advisor never merges):
- The four branches touch disjoint packages, so they can be merged in any
order with no cross-branch source conflicts. The only shared file is
pnpm-lock.yaml, touched only byadvisor/template-shell-spike— no lockfile conflict between branches. - All commits are unsigned (
--no-gpg-sign): the executors ran headless and the repo's 1Password SSH signer needs interactive auth. Re-sign on merge if branch protection requires signed commits. - 007 adds test-only devDeps (
react-dom,@types/react-dom) topackages/pdf+ avitest.config.tstransform tweak — both were required to build the render-parity snapshot the spike depends on (react-test-renderer, which the plan suggested, is React-19-incompatible). Accept these consciously. - 007 is a pilot: only Pikachu is migrated. The executor's recommended
rollout batches for the other 14 templates (each snapshotted first):
- sidebar-% family (bronzor, ditto, glalie, leafish; likely kakuna, lapras,
meowth, rhyhorn, scizor — verify two-column shape) — trivial, pass
sidebarColumnStyle={{ width }}. - flexBasis family (azurill, chikorita) — pass
sidebarColumnStyle={{ flexBasis }}; the existing seam already covers it. - featured-summary family (ditgar, gengar) — needs a new section-rendering seam; do NOT force into the current shell.
- single-column/header-on-top (onyx) — needs a separate shell/layout variant; the current shell hardcodes the two-column scaffold.
- sidebar-% family (bronzor, ditto, glalie, leafish; likely kakuna, lapras,
meowth, rhyhorn, scizor — verify two-column shape) — trivial, pass
Dependency notes
- 003 depends softly on 001: 003 flips the three
setLocked/setPassword/removePasswordmethods from silent-return to throwingNOT_FOUND. If 001 is DONE, its Step 3 assertions must be updated in 003's PR (that test diff is the intended proof of the behavior change). If 001 is not done, 003 adds a minimal test itself. - 005 depends softly on 001: 001's Step 5 characterizes
statistics.increment; 005 changes the caller (dedup), not the write body, so that test should keep passing — a useful regression signal. - 007 is not technically blocked by 001 (the PDF layer needs its own render- parity net, which 007 builds in Step 1), but 001 should be done first as the characterization-testing exemplar. 007 explicitly does NOT roll out to all 15 templates; rollout is deferred to reviewed follow-up plans.
Findings considered and rejected
Recorded so they aren't re-audited next run. (Refuted by adversarial verification or downgraded during manual vetting against the code.)
- "Production secrets committed to repository" — FALSE.
.env.production/.env.localexist in the working tree but are gitignored (.env*with an.env.exampleexception); 0 commits touch them; not in history. - "Vulnerable @better-auth/oauth-provider (unbound resource indicators)" —
the claimed advisory (GHSA-p2fr-6hmx-4528) could not be verified as real, and
the code already configures
validAudiences. Treat any@better-auth/*bump as routine, not a security fix. - Unauthenticated OAuth2 dynamic client registration bypass — refuted; three validation layers exist (registration-time, server preflight, authorization endpoint).
- bulkUpdate tag-addition race — refuted; Postgres row-locking serializes
the
UPDATE ... SET tags = <subquery>correctly. - agent
getThreadmissing ownership check — refuted; theWHEREclause filtersuserIdand throwsNOT_FOUNDotherwise. - Snapshot throttle "bypassed" by AI patches — deliberate, documented design; pruning is atomic and bounded at 30 versions, not a reactive overflow. Not a bug.
- Missing index on
(user_id, isPublic)— no code path filters resumes by public status; speculative (YAGNI). - Stats daily-series "re-queries every 30 days after cache" — refuted; TanStack Query 60s staleTime already dedups.
- Large composite components / sections.tsx / rich-input / custom-styles
"need splitting" (ARCH-02/05/06/07) — refuted; each is a single-responsibility
internal-only component with no external reuse; a July-2026 audit already chose
not to split
sections.tsx. - Export paths duplicate filtering (ARCH-03) — refuted; PDF/DOCX/Markdown have genuinely different filtering needs, not a shared abstraction being reinvented.
node-html-parsermajor-version lag — refuted; only stable DOM APIs used, no breaking-change exposure.- PORT not validated in server.ts (DX-03) — refuted; the server does read
process.env.PORTin production (apps/server/src/index.ts:13).
Downgraded to notes (real but low-leverage; not planned unless revisited):
- Rich-text HTML not sanitized before react-pdf-html (SEC-07) — PDF-only
surface (browser path uses
stripHtml; PDFs don't execute scripts), on the user's own content. Defense-in-depth only. - MCP tools don't validate API-key scopes (SEC-05) — latent; scoped keys can't be created yet. Revisit if/when scoped API keys ship.
- Applications attachment cleanup: concurrent-write orphans + swallowed
Promise.allSettledfailures (CORRECT-02/03) — real but low severity for single-user; storage hygiene + observability. Candidate for a future plan. - Agent service is 1397 LOC mixing concerns (ARCH-04) — real tech debt; large L-effort refactor, deferred.
- Core deps pinned to prerelease/snapshot (drizzle-orm/kit rc, drizzle-zod snapshot hash, TS native-preview dev build) — watch item; de-risk when stable releases land. Not urgent (not on the CI/production critical path).
- Vite
chunkSizeWarningLimit: 10MBmasks bundle bloat — trivial DX nit. - Dev-setup docs vs AGENTS.md
dotenvxdrift (DX-02) — minor docs friction. - Applications bulk O(n) in-memory scan — the input-cap in Plan 003 bounds abuse; the scan rewrite is deferred.
Not audited
Honest coverage gaps from this run:
- E2E/Playwright test behavior and flakiness (relied on CI).
- PDF/DOCX template rendering correctness beyond structure (no visual- regression harness exists).
- Email/notification delivery reliability.
- S3 backup/restore and multi-instance storage behavior.
- The AI provider integration layer's retry/streaming internals.
- Lingui extraction/locale-catalog completeness (separate track).
- Deep dependency transitive-tree audit (worked from manifests + lockfile;
pnpm audit/pnpm outdatednetwork access was not assumed available).