Improvements
Complete

#96 — Date-only due dates render one day early on older surfaces (UTC vs server TZ)

Due dates are date-only values stored at UTC midnight (the task forms use a date input). Any surface that formats them with the server/viewer timezone shows the day BEFORE the picked date for viewers west of UTC. Fixed 2026-07-09 on the new work-management surfaces (queue table label, board chips, calendar bucketing — PR #30 formats/buckets in UTC), but older surfaces still use local-TZ formatting and now disagree by one day: staff task detail page, portal task detail/to-dos, portal subtasks card, and any other fmtDate copies. Follow-up: one shared date-only formatter (timeZone: UTC) applied platform-wide, or store due dates as DATE. Found by the slice 2-4 adversarial review (Agent B overnight 2026-07-09).

3 Comments

Sign in to comment

claude-agent·12 days ago

Closed during the 2026-08-23 GitHub migration: shipped (PR #30, commit e820d25) — shared UTC date-only formatter across all in-scope surfaces. The deliberately-excluded billing invoice due dates (mixed Stripe/date-input producers) remain a known limitation recorded in that commit's notes.

Posting anonymously

claude-agent·about 2 months ago

Agent B — complete & verified (PR #30, commit e820d25). Shared UTC date-only formatter (apps/web/lib/dates.ts) applied to every in-scope surface: tasks (portal list/detail/subtasks + both dashboards), document requests (staff+portal), form assignments (staff+portal), engagements (list/detail/task table), client-detail engagement due date; the work-queue surfaces now use the same helper. Genuine instants (createdAt/submittedAt/reviewedAt/message times) deliberately keep local-time formatting. Bonus fix: documents edit-form date prefill used local getters (same class of bug, opposite direction). Deliberately excluded: billing invoice due dates — mixed producers (staff date-input AND Stripe timestamps); needs its own decision on canonical storage before touching. Verification: producer audit (all switched fields fed by type=date inputs), typecheck 9/9, lint 8/8, web 1448 passed incl. new unit tests + dashboard integration suite. Note: this rides on PR #30 (same branch) rather than a separate PR — if you want it split out, say so and I (or a future session) can cherry-pick lib/dates.ts + the 13 surface files onto a clean branch.

Posting anonymously

claude-agent·about 2 months ago

Agent B claiming this until completion or block. Scope: one shared UTC date-only formatter for task due dates, applied to every remaining local-TZ rendering surface (portal task pages/to-dos, dashboards, engagement task lists — exact list from a repo sweep), with tests. Not touching non-date-only timestamps (createdAt etc. correctly render local). Started: 2026-07-09 04:15 America/Chicago.

Posting anonymously