Running log of bugs / dead code / improvement candidates spotted during the codebase
reorg (move-and-rename only). Logged here instead of fixed inline, per the reorg rules.
See docs/handoff/2026-07-01-reorg-phase0-safety-net/HANDOFF.md for full session detail.
src/components/VideoHero.tsx— zero references anywhere in the codebase.src/server/services/_lib/errors.ts(ServiceError,unauthorized(),notFound()) — defined, zero call sites.
src/components/admin/NewJobForm.tsx(544 ln) vssrc/app/(admin)/admin/jobs/[id]/edit/_components/EditJobForm.tsx(440 ln) — near-identicaluseForm/zodResolver/FormFieldshape (16 vs 17 matching call sites). Candidate for a shared-form extraction.
prisma/seed.ts— 681src/app/(admin)/admin/jobs/[id]/applicants/page.tsx— 602src/app/(admin)/admin/jobs/[id]/applicants/[applicantId]/page.tsx— 555src/components/admin/NewJobForm.tsx— 544src/app/(admin)/admin/templates/[id]/_components/TemplateEditor.tsx— 510src/components/public/CareersJobBoard.tsx— 477src/app/(admin)/admin/jobs/[id]/edit/_components/EditJobForm.tsx— 440- (300–350 range)
admin/settings/page.tsx,(public)/careers/[slug]/page.tsx,admin/applicants/page.tsx,StagesManager.tsx,ApplicationForm.tsx
None exceed the 800-line hard max from .claude/rules/common/coding-style.md.
- High —
src/lib/webhook/sign.ts:3— signing secret silently defaults to""ifINTEGRATION_KEY_SECRETis unset, instead of throwing. Risk: unsigned webhooks ship silently in prod. - High —
src/app/api/admin/jobs/[id]/integrations/route.ts:47— integration API keys stored plaintext in DB. Tracked as GitHub issue #103. - Med —
src/server/services/pipeline/update-impl.ts:24— unmapped pipeline stage name silently degrades to"REVIEWING", no log/error. Relates to GitHub issue #105. - Med —
src/lib/rate-limit.ts— in-memory rate limiter resets per cold start; unsafe for multi-instance Vercel prod (needs Upstash Redis / Vercel KV). - Med —
src/app/api/public/job-alerts/route.ts— no rate limiting. - Med —
src/lib/storage/upload-limits.ts— resume upload validation trusts declared MIME/extension only, no magic-byte check. - Med —
src/lib/resume/access.ts:25— resume access guard does exact string match on/api/resumes/URL; fragile if URL construction diverges elsewhere. - Med — inconsistent API error response shapes (
{error}vs{success,error}) across routes. - Low — transitive
uuid<11.1.1advisory via@google-cloud/storage/resend(GHSA-w5hq-g745-h8pq). - Low — no automated cross-organization isolation test (org-A/org-B 403/404 denial).
- Low — unused
SessionPrisma model (JWT session strategy, model never read/written at runtime) — already flagged inCLAUDE.md. - Low — pipeline stage→status mapping undertested (
pipeline/route.test.tsonly has the happy path).
- Status (2026-08-29): README's doc-index and test count fixed (see GAPS.md G22).
docs/API.mdmay still reference the deleteddocs/HANDOFF.md— not checked this pass;docs/*edits go through the dedicated docs worktree perdocs/CLAUDE.md, out of scope here. docs/API.md/ README doc-index still referencedocs/HANDOFF.md, which was deleted 2026-07-01 (superseded bydocs/handoff/tree).- Some doc references cite a stale test count ("54 tests / 10 files"); as of 2026-08-29 the true count is 271 tests / 49 files.
src/components/AnimatedBackground.tsxandsrc/components/VideoHero.tsxsit loose atsrc/components/root while every other component is grouped by feature folder (admin/ applicants/ dashboard/ pipeline/ public/ ui/). Proposed move: both →src/components/public/, update the 2 import sites (SignInForm.tsx,VideoHero.tsxitself).