Files
GearBox/.planning/phases/35-bug-fixes/35-REVIEW-FIX.md

3.0 KiB

phase, fixed_at, review_path, iteration, findings_in_scope, fixed, skipped, status
phase fixed_at review_path iteration findings_in_scope fixed skipped status
35-bug-fixes 2026-04-19T00:00:00Z .planning/phases/35-bug-fixes/35-REVIEW.md 1 4 3 1 partial

Phase 35: Code Review Fix Report

Fixed at: 2026-04-19T00:00:00Z Source review: .planning/phases/35-bug-fixes/35-REVIEW.md Iteration: 1

Summary:

  • Findings in scope: 4
  • Fixed: 3
  • Skipped: 1

Fixed Issues

WR-02: FAB "Start new thread" menu item does not close the menu before navigation

Files modified: src/client/components/FabMenu.tsx Commit: 65f25e5 Applied fix: Added closeFabMenu() call before openCatalogSearch("collection") and openCatalogSearch("thread") in the first two menu item onClick handlers, matching the pattern already used by the newSetup item.


WR-03: No onError handler on lazy images — skeleton shimmer persists on broken images

Files modified: src/client/components/GearImage.tsx, src/client/components/CandidateCard.tsx, src/client/components/ItemCard.tsx, src/client/components/GlobalItemCard.tsx Commit: 93c273d Applied fix: Added onError?: () => void prop to GearImageProps interface and threaded it through to all three <img> elements (cover, hasCrop, and default branches) in GearImage. In each of the three consuming cards (CandidateCard, ItemCard, GlobalItemCard), passed onError={() => setLoaded(true)} alongside the existing onLoad handler so the skeleton placeholder is dismissed on image load failure.


WR-04: Brand-stripping in ItemCard can silently truncate name when brand appears mid-string

Files modified: src/client/components/ItemCard.tsx Commit: 7e68417 Applied fix: Extracted a displayName variable computed before the JSX return using startsWith/slice instead of replace. The guard name.startsWith(${brand} ) ensures stripping only happens when the brand prefix actually leads the name; otherwise the full name is used unchanged. The inline {brand ? name.replace(...) : name} expression in the <h3> was replaced with {displayName}.


Skipped Issues

WR-01: Redirect loop in login route

File: src/client/routes/login.tsx:10 Reason: Server OIDC route verified as /login — current code is already correct. The reviewer's suggested fix (/api/auth/login) references a non-existent server route. Investigation of src/server/index.ts (line 108) confirms app.get("/login", oidcAuthMiddleware(), ...) is the Hono OIDC handler, and vite.config.ts (line 22) confirms /login is proxied to the Hono server in development. The existing window.location.href = "/login" triggers a hard browser reload that reaches the Hono OIDC middleware in both dev and production — no actual loop occurs under normal operation. Applying the reviewer's suggestion would redirect to a 404 endpoint. No change required. Original issue: LoginPage sets window.location.href = "/login" which the reviewer identified as a potential redirect loop.


Fixed: 2026-04-19T00:00:00Z Fixer: Claude (gsd-code-fixer) Iteration: 1