Repository source: docs/plans/calendar_today/calendar_today_one_shot.md
Calendar today — one-shot
Cycle: v3/calendar_today; Mode: one-shot; Record/index: this file, plans index
Debug mode: enabled (log; project .railspike_debug_on marker present)
Effort study: railspike-effort / v3/calendar_today, standing enrollment under protocol P2, reference R1 (ledger)
Extended estimates: enabled (new-cycle default; no real alternatives or work units, so no unit estimates)
Cycle estimate: 0.08
Status: technically complete on feat/calendar-today; pushed, not merged or deployed. Next action: maintainer review, merge and deployment.
Request and authorization
Feedback item: PF-20261108-F01, created for this cycle (no existing item matched).
Original request, 2026-11-08 (https://zenmemes.com/threads/thread-20261108034244-8b24dcc8, by ilyag): "I would like for the calendar to highlight the current date and also to have a button to go to the month with the current date if it's not already selected".
Authorization, 2026-11-08: the maintainer pasted the thread link into a session with no other words. Under thread to pull request the paste authorizes a one-shot cycle through an open PR and a reply in the thread. Exclusions: merge, deployment.
Outcome and work type
Application change (UI). On /calendar and /calendar/<tag>, today's square carries a ring and a bold day number, and its day link gets aria-current="date". When neither shown month contains today, a Today link appears between "← Earlier" and "Later →" and opens today's month.
Approach and reuse decisions
Whose today. The viewer's own clock and time zone, not UTC. The requester is in New York; at the time of the request it was already Nov 8 in UTC and still Nov 7 locally. Marking the UTC date would mark the wrong square for most evenings in the Americas.
Static markup. CONTRIBUTING requires server HTML identical for every viewer with viewer-specific UI decided before first paint in the client. The server renders the Today link
hiddenwith the calendar's base path; a small inline script at the end of the calendar template (the same pattern astemplates/partials/visitor_intro.php) runs during parsing, addscalendar-day--todayto the matchingdata-calendar-daycell, or fills the link's?month=and unhides it. No server work, cookie or new asset file.Reuse. Existing
.calendar-navlink row, existingdata-calendar-daycell attribute,--active-linetheme token (already used for confirmed days and hover). The ring is a 2px inset box-shadow, which keeps showing on hover (hover uses a 1px one).Considered and rejected: rendering the Today link server-side when the shown range excludes the UTC date (works without JavaScript, but disagrees with the viewer's date near midnight and puts date-dependent content in otherwise static markup).
No new dependency, route, table or copy beyond the one word "Today".
Concepts touched
None in the concept inventory.
Risks
Without JavaScript neither the mark nor the link appears; the calendar is otherwise unchanged. Accepted.
The default month (no
?month=) is still chosen by the server in UTC. Near a month boundary a viewer behind UTC may land on next month; the Today link then appears and fixes it in one click. Left as is.
Verification and recovery plan
CalendarPageTest::testTodayLinkAndMarkAreLeftToTheViewersClock: link present and hidden on all and tag calendars, no server-side today class, absent with events off; existing "same for every viewer" test still passes.Headless Chrome against
./v3 startwith events on: desktop and phone, New York and Tokyo time zones, current, January and October views, Today link click, six themes.Recovery: revert the commit.
Starting revision and branch: d6e068623eb87bbe2bd268c397daaf70a54ad7aa on main; branch feat/calendar-today.
Study history
Intake, 2026-11-08T03:44Z, 0.08. Single exposed rater: Claude (claude-opus-5-5). Pristine intake missing: the calendar controller, template, CSS and tests were read before rating. Scope v1 as above. Compared with R1's duplicate preview suppression (0.10).
Execution entry, 2026-11-08T03:45Z, 0.08 reaffirmed. No new evidence.
Closeout, 2026-11-08. Projection 0.08 reaffirmed; retrospective scope assessment 0.08, same single exposed rater. Corrections: none. Additions: none. Delivered scope v1 in full. Maintainer fit and acceptance pending. No active-work measurement collected.
Dated execution history
2026-11-08: record created; implemented template link and script, CSS, and test.
2026-11-08: verified in headless Chrome (see Verification).
Outcome
Delivered as bounded. Limitations: needs JavaScript; production changes only after deployment.
Verification
Passed:
./v3 test CalendarPageTest, 8 run, 8 passed../v3 test --smoke CalendarPageTest: all passed exceptBoardListTest::testPinnedThreadsComeFirstAndLatestThreadsArePaged, which fails identically onmainwith this change stashed (pre-existing, unrelated).Passed, headless Chrome (
./v3 startwithFORUM_EVENT_SUPPORT_ENABLED=1): New York zone marks 2026-11-07 witharia-current="date"and keeps Today hidden at desktop 1100px and phone 390px;?month=2026-01shows Today linking to?month=2026-11, and clicking it lands on November with the 7th marked;?month=2026-10(November as second month) marks the 7th with Today hidden; Tokyo zone marks 2026-11-08. Ring checked in the dark, Word97, Midnight, Console, Chicago and Gloss themes; visible in each, no layout shift.Not run: the full suite (maintainer runs it). Not checked: other themes beyond those six.
Commit, merge and publication status
Completion commit: pending (this record ships in it). Pushed to origin; not merged, not deployed.
— Claude · 2026-11-08 UTC · Model: claude-opus-5-5