Skip to content

Code review โ€” dashboard full build โ€‹

  • Branch: feature/dashboard-full-build โ†’ master
  • Date: 2026-06-23
  • Scope: 3 files (+249 / โˆ’5) โ€” dashboard-page.{ts,html,spec.ts}
  • Reviewer: code-reviewer agent over git diff origin/master...HEAD, synthesized.

Deterministic gate โ€‹

CheckResult
nx lint webโœ“ 0 errors
nx test webโœ“ 177 passed (+3)
coverage gateโœ“ stmts 77.8% ยท branches 67.7% ยท fns 69.0% ยท lines 82.8% (all โ‰ฅ threshold)
nx build webโœ“

What's in the build (design-system dashboard gaps) โ€‹

  • Mandate drill-down โ€” clicking a .dash-card opens a read-only breakdown: large completion ring (.dash-ring.lg), stacked status bar (.dash-bar + legend), full chronological activity list (.dash-act with assignee + .dash-act-gacx reward), and a "โ† Back to mandates" link. Driven by a selected signal + detail computed.
  • GACx on activity rows โ€” task.gacxReward shown in the people view too.
  • "Finished ยท last 30 days" โ€” dataLatest (max activity timestamp) anchors a 30-day window for the people view's finished list; no dates โ†’ includes all (safe fallback).

No CSS added โ€” all .dash-* breakdown classes already exist in dispatch-theme.css.

Findings โ€‹

๐Ÿ”ด Blocking โ€” none. โ€‹

๐ŸŸก Should-fix โ€” none. โ€‹

๐ŸŸข Nits (all acceptable, no change) โ€‹

  • Date.parse treats date-only ISO (2026-06-20) as UTC vs datetime as local โ€” harmless given all comparisons are relative over a 30-day window.
  • @if (task.gacxReward) hides a zero reward โ€” intentional, matches the existing @if (task.due) pattern.
  • denom = total || 1 guards division but is unreachable at 0 (zero-task mandate โ†’ all segments filtered out โ†’ bar block skipped). Correct.

Verified clean โ€‹

Signal reads are all calls; computeds chain correctly. selected stores only an id, so detail re-resolves each recompute and falls back to the grid if the mandate disappears (no stale object). selectMandate(undefined) no-ops; unknown id โ†’ detail null โ†’ grid stays. 30-day no-date fallback is intended. .slice() before .sort() avoids mutating source. .dash-card a11y complete (role/tabindex/aria-label/keydown.enter/keydown.space+preventDefault). [style.--pct] / [style.width.%] valid. Detail view replaces grid+stats via @else if (detail(); as det) โ€” stat-strip hidden in detail mode is intended. Models fidelity confirmed (gacxReward/scope/rate/duration all typed). The 3 new specs assert real behavior (drill-down DOM, back-to-grid, guards, assignee resolution, 30-day window via the "1 finished" toggle).

Verdict โ€‹

Ship it โ€” 0 blocking, 0 should-fix. Clean, correct, well-tested. Awaiting a visual pass + sign-off before push.