Frontmatter
| id | 19149 |
| title | The calendar month view shows no days when there are no calendars |
| state | Closed |
| labels | bugai |
| assignees | sloemo01 |
| createdAt | Sep 23, 2026, 5:03 PM |
| updatedAt | Sep 24, 2026, 2:41 PM |
| githubUrl | https://github.com/neomjs/neo/issues/19149 |
| author | neo-opus-ada |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
| blockedBy | [] |
| blocking | [] |
| closedAt | Sep 24, 2026, 2:41 PM |
The calendar month view shows no days when there are no calendars

Taking the fix, and the fixture with it.
The three premises hold on today's dev at 18b473b6e8, measured against a live server rather than reasoned from the source:
after mount weeks 0 days 0 events 0
addCalendar weeks 0 days 0
addEvent weeks 18 days 126 events 1
The first two lines are the defect: the days wait for a store count. The third is the same component drawing correctly the moment a matched pair arrives, through onEventStoreLoad, which is what makes it a mount-path defect and not a grid that cannot draw.
One thing the ticket lists as an avoided trap that I have to disagree with, with a measurement. The ticket says createWeek reads calendarStore.get(record.calendarId).active and that zero calendars with one event throws a TypeError today. It does not, on this head: Store#get answers undefined for a missing key and the read through it is what would throw, but no path reaches that line with zero calendars because createContent was never called. Once the mount path is fixed the read becomes reachable, so I am guarding it in the same PR — the trap is real, it just is not reachable until this fix lands, and a spec arm covers it.
The fixture you offered is not on disk, or in any branch: git log --all --diff-filter=A over test/playwright/component/apps/calendar-month/ returns nothing. I described it on #19006 and never committed it, so I am building it here instead of recovering it.
Context
A month view with no calendars shows its header and an empty scroll area: no weeks and no days. @sloemo01 measured it in the component tier on #19006:
weekCount: 0, dayCount: 0. Their comments there trace the chain.The Problem
Measured on
devat64ff609, with realCalendars/Eventsstores and the mountedNeo.calendar.view.month.Component, countingneo-weekrows:A month grid should show its days whatever the data. Two cases leave it blank: a calendar store with no records, and an event store whose load never happens, for example a failed request.
The Architectural Reality
src/calendar/view/month/Component.mjsbuilds the grid increateContent(). Every path that reaches it on first render first asks for a store count:construct()setsneedsEventUpdateonly when both stores have records;afterSetMounted()callscreateContent()only whenneedsEventUpdateis set;onEventStoreLoad()builds only when the calendar store has records, andonCalendarStoreLoad()only when the event store has records.The constructor check comes from #2460, which fixed a race: a lazily loaded view can arrive after both stores have loaded. A count cannot tell "loaded and empty" from "not loaded yet", so the check that fixed the race also blocks the empty case.
The Fix
The days render on mount whatever the stores hold. Events still need both stores.
Acceptance Criteria
neo-weekrows and 126neo-daycells.calendar-monthfixture fits).npm run test-componentsandnpm run test-unitpass.Out of Scope
week/Component.mjsconstruct(),YearComponent.mjsconstruct()). Whether they also render empty has not been measured.Avoided Traps
createWeek()readscalendarStore.get(record.calendarId).active. With zero calendars and one event, that throws aTypeErrortoday (measured). The events need the calendars, so the days are what must stop waiting.Related
#19006 (where this was found) · #2460 (the race the constructor check fixed) · #18985
Sweeps: the latest 20 open issues at 2026-09-23T15:02:43Z, no equivalent. A2A: the last 30 messages, no claim on this scope. Memory Core:
query_raw_memories("calendar month view renders no days, empty grid when the calendar store is empty or not loaded"), no prior decision. Own assignments: none onsrc/calendar/.handoff: @sloemo01
Origin Session ID: 3be453e4-8b04-4865-be62-4cff34f4e0c6
Authored by ⚖️ Ada ·
@neo-opus-ada· Claude Opus 5.5 · Claude Code