Files
familysync/.planning/phases/17-ui-optimization-polish/17-REVIEW-FIX.md
T

3.4 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
17-ui-optimization-polish 2026-06-18T14:04:00Z .planning/phases/17-ui-optimization-polish/17-REVIEW.md 3 2 2 0 all_fixed

Phase 17: Code Review Fix Report (Iteration 3)

Fixed at: 2026-06-18T14:04:00Z Source review: .planning/phases/17-ui-optimization-polish/17-REVIEW.md Iteration: 3

Summary:

  • Findings in scope: 2 (fix_scope: all — includes Info)
  • Fixed: 2
  • Skipped: 0

Gate status after fixes (all pass):

  • pnpm --filter @familysync/pwa test → pass (22 files, 266 passed / 0 failed)
  • pnpm --filter @familysync/pwa typecheck → pass (tsc + e2e tsconfig)
  • pnpm --filter @familysync/pwa lint → pass (eslint --max-warnings 0)

Fixed Issues

CR-01: useFocusTrap visibility filter excluded all focusables under jsdom (CI gate failed)

Files modified: apps/pwa/src/hooks/useFocusTrap.ts Commit: 287ecae Applied fix: The prior iter-3 auto-fix (WR-01) rejected every focusable under jsdom because there getBoundingClientRect() returns all-zero geometry and offsetParent is null for every node, which short-circuited the trap (focusable.length === 0) and broke the two pre-existing WR-07 focus-trap regression tests — making pnpm test (a CI gate) fail at 2 failed / 264 passed.

Made the visibility heuristic tolerant of a non-layout environment: it now derives hasLayout = r.width > 0 || r.height > 0 || el.offsetParent !== null, and when there is no evidence of a layout engine (jsdom) it treats the node as visible instead of filtering it. Only when a real layout exists does it apply the offsetParent === null / zero-geometry exclusion, so genuinely hidden/collapsed nodes are still excluded in a real browser. The hidden-attribute exclusion is unambiguous regardless of layout, so it was hoisted out and kept unconditional. Result: all 266 PWA tests pass, including both WR-07 cases.

IN-01: Focus-trap containment guard was unreachable as wired (harmless dead branch)

Files modified: apps/pwa/src/hooks/useFocusTrap.ts Commit: 287ecae Applied fix: The handler is wired only to each dialog's own onKeyDown, so it can only run while focus is already inside the dialog subtree; the !dialogRef.current.contains(document.activeElement) containment branch could therefore never evaluate true and delivered no actual containment guarantee. Per the review's recommendation, removed the inert branch and replaced its misleading comment with an accurate note: this is a deliberate boundary-only trap (a document-level keydown/focusin listener would be required for true containment, and is unnecessary for the current always-focus-the-heading-on-open flows). No behavior change in any real scenario — it only removes a comment that implied a guarantee the wiring cannot provide.

Skipped Issues

None.

Prior Iterations

Iterations 1 and 2 fixed the earlier batches of findings (15 in iter-1, then the iter-3 review's WR-01/IN-02/IN-03 set). The IN-02 (favicon.ico coupling) and IN-03 (OidcRedirect visible status) fixes were confirmed clean by the final re-review. This iteration-3 report supersedes those and records the final state: the WR-01 regression (CR-01) and its inert containment guard (IN-01) are now resolved, with all CI gates green.


Fixed: 2026-06-18T14:04:00Z Fixer: Claude (gsd-code-fixer) Iteration: 3