Fix: progress renders assessed_at as UTC day, diverging from local last_reviewed
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 88/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- node.js, typescript
- Domain
- cli
Research direction
Read src/cli/progress.ts around lines 155–168 and check how it formats assessed_at and last_reviewed_at; compare the date helper in src/engine/sm2.ts and the existing invalid-string fallback test. Update the display to use the local calendar date, then confirm both values show the same day for timestamps near UTC midnight.
Written by the indexing model from the issue text.
Description
palee progress shows Last Assessed a day off from Last Reviewed
This is the kind of thing that makes you second-guess your own memory. Ran
palee review and palee assess on the same topic seconds apart, then
palee progress --topic <id>. The output showed:
Last Assessed: 2026-10-24
Last Reviewed: 2026-10-25
But I ran the review before the assess. The dates are on different clocks.
Reproduction
# On a machine in IST (UTC+5:30), at 23:43 local:
palee review T-somtopic 4
sleep 15
palee assess T-somtopic --conceptual 0.7
palee progress --topic T-somtopic
# Shows "Last Assessed: 2026-10-24" / "Last Reviewed: 2026-10-25"
Root cause
Two different write paths, two different timebases:
src/application/record-review.ts:108writeslast_reviewed_atas a
local date-only string viaformatLocalDateOnly(reviewedAt).src/application/record-assessment.ts:100writesassessed_atas a
full UTC ISO instant viaassessedAt.toISOString().
Then src/cli/progress.ts:155-168 renders both through the same expression:
new Date(value).toISOString().split('T')[0]
For the local date-only string, this round-trips fine. But for the UTC
ISO instant, .toISOString().split('T')[0] gives you the UTC calendar
day — which can be yesterday or tomorrow relative to the learner's local
calendar.
So if you're in IST and assess at 23:43 local, the UTC ISO is
2026-10-24T23:43:34Z → progress shows 2026-10-24. Meanwhile review wrote
2026-10-25 (local) → shows 2026-10-25. Hence the "review is a day after
the assess that happened first" illusion.
src/cli/review.ts:113 already renders its due date via formatLocalDateOnly
(local), so the two adjacent commands disagree on timebase.
ADR / convention
agent.md:41 (ADR-0005): dates use local calendar day.
record-review.ts:44-47 explicitly documents the hazard: "new Date('YYYY-MM-DD')
reads as UTC midnight and would make same-day local reviews look early west of
UTC."
Acceptance criteria
progress.tsroutes date-only display throughformatLocalDateOnly
(already imported by sibling commands, exported fromsrc/engine/sm2.ts:189-194).assessed_atandlast_reviewed_atrender the same calendar day as the
learner's local timezone.- No existing test breaks (current tests pin only the invalid-string fallback).
I did not use AI to generate this issue report.
- Dominant language
- TypeScript
- Stars
- 1
- Forks
- 0
- Avg merge
- 15h 54m
- Merged PRs (30d)
- 163
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Kuldeep2822k/cli
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Kuldeep2822k/cli#550 ·
Maintainers usually reply within 1 day
-
Fix: lapses string-concatenates on each review instead of throwingPossibly taken @Kuldeep2822k claimed this 3 days ago. Openbug core priority: medium
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Kuldeep2822k/cli#547 ·
Maintainers usually reply within 1 day
-
Fix: non-interactive session start prints success but creates no sessionPossibly taken @Kuldeep2822k claimed this 2 days ago. Openbug cli priority: medium
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Kuldeep2822k/cli#546 ·
Maintainers usually reply within 1 day
-
bug priority: medium storage
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
Kuldeep2822k/cli#542 ·
Maintainers usually reply within 1 day
-
bug priority: medium storage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Kuldeep2822k/cli#540 ·
Maintainers usually reply within 1 day
All issues in Kuldeep2822k/cli
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Graphify-Labs/graphify#4860 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
sveltejs/eslint-plugin-svelte#1615 ·
Maintainers usually reply within 7 days
-
Parallel reticle_verify opens per-flow leases without the source lease's ignoreHTTPSErrorsPossibly taken @as992949791 claimed this today. Opengood first issue help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
reticlehq/reticle#2033 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day