Usage heatmap renders a day's activity one calendar day too early (off-by-one; empty day shown as full)
Preflight
Searched existing issues — this is related to but distinct from #76885, #67085, #75966, #71549. Those describe activity credited to the session-start date (multi-day sessions) or real days showing zero. This report is the inverse and is not explained by session-start-date attribution or timezone bucketing.
Summary
The home-screen usage heatmap renders a day's activity on the wrong cell — one calendar day too early. A day with literally zero activity is shown as a heavy day, and the real (same-day) work is shifted back one day.
Environment
- Claude Code 2.1.181, macOS 26.5.2 (build 25F84)
- System timezone America/Chicago (CDT, UTC−5);
TZunset
Observed
- Heatmap tooltip reads: "Jul 19 — 2,859"
- I did no work Sun Jul 19; my heavy day was Mon Jul 20.
Evidence (local ~/.claude/projects/**/*.jsonl)
Message-type ("type":"user"|"assistant") lines bucketed by local (America/Chicago) day:
| Local day | Messages |
|--------------|----------|
| Sat Jul 18 | 0 |
| Sun Jul 19 | 0 |
| Mon Jul 20 | 2,797 | ← real heavy day
| Tue Jul 21 | 263 |
| Wed Jul 22 | 392 |
- Zero events on Jul 18/19 in UTC and local time — no timestamp anywhere is Jul 19.
- Per-session start/end times: all ~10 Jul-20 sessions start on Jul 20 (earliest
2026-07-20T12:32Z= 07:32 CDT). The only multi-day session (184d111c…) starts Jul 7. No session starts Jul 19. - ⇒ Neither session-start-date attribution (#76885 / #67085) nor UTC-vs-local bucketing can place this data on Jul 19. Jul-20-noon-UTC data lands on Jul 20 in every timezone (max offset ±14h).
- Totals match the dashboard (my count 6,745 vs the widget's "Messages: 6,727"), so the underlying data is correct — only the per-day cell placement is off by one.
Expected
Mon Jul 20 activity appears on the Jul 20 cell.
Actual
Mon Jul 20 activity appears on the Jul 19 cell (shifted one calendar day earlier).