Skip to content

fix(planner): preserve local dates for schedule exceptions - #14

Merged
davidvornholt merged 3 commits into
mainfrom
fix/tuesday-exception-date
Sep 13, 2026
Merged

fix(planner): preserve local dates for schedule exceptions#14
davidvornholt merged 3 commits into
mainfrom
fix/tuesday-exception-date

Conversation

@davidvornholt

@davidvornholt davidvornholt commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Before. Adding an exception for Tuesday placed it under Monday in timezones ahead of UTC. Editing, removing, and generating the PDF also used UTC conversions, so the displayed and printed schedules could disagree.

Now. Exceptions keep their local calendar date throughout the planner. Changing or removing an exception clears an outdated PDF, and a generation request that finishes after a schedule change cannot restore it.

Screenshots

Same Tuesday museum-visit exception, Berlin timezone, 2026-W37, demo timetable, and 1280×800 viewport. Before renders main 757da41; after renders this change.

Before After
papersync-tuesday-exception-before papersync-tuesday-exception-after

Verification

Completed checks

  • bun run check:fix at final reviewed head 529f67c: all 25 tasks passed in 19.769 seconds. Astra high reviewed both initial lenses and verified the accessible-name repair.
  • Browser coverage exercises creation, editing, removal, and PDF request contents in Berlin and Los Angeles, including the ISO year boundary and a late PDF response.
  • Accessibility checks cover the exception dialog and restored schedule.

Check it yourself

Run gh pr checkout fix/tuesday-exception-date, start the app with bun run dev:web, and open Planner with a configured timetable. Add a Tuesday exception, reopen it, generate a PDF, and remove it. Only Tuesday changes, and changing the exception requires generating a fresh PDF.

@davidvornholt

Copy link
Copy Markdown
Owner Author

Review-fix scope: preserve exception calendar dates across creating, finding, editing, removing, and PDF generation; invalidate outdated PDF results after schedule changes. Threat model: ordinary authenticated browser use in positive and negative UTC offsets, including year boundaries and requests finishing after edits. No persisted exception migration is needed because these exceptions live in the planner screen state. Scanner changes and unrelated planner improvements are out of scope.

Astra high will run two separate read-only lenses: (1) behavior and invariants, covering date handling, asynchronous state, and regression coverage; (2) premise and integration, covering the reported workflow, accessibility, shared date contracts, and architectural boundaries, excluding the first lens’s date arithmetic and request-race analysis.

Baseline: bun run check:fix passed all 25 tasks at initial head 9e70706 in 23.384 seconds. Base is 757da41. This comment starts the bounded review-fix cycle. Merge and deployment are already authorized by the user if the results support them.

Comment thread apps/web/src/features/planner/screens/components/week-schedule-overview.tsx Outdated
@davidvornholt

Copy link
Copy Markdown
Owner Author
Phase Scope Model / lenses Findings Outcome Duration
Baseline gate 9e70706 deterministic 25 tasks passed 23.384 s
Review 757da419e70706 Astra high × 2 1 block, 0 ask, 0 defer accessibility repair required included below
Fix verification 9e70706529f67c Astra high × 1 0 remaining blockers clean included below
Repair verification no further repair skipped 0 s
Final gate 529f67c deterministic 25 tasks passed 19.769 s

Accessible-name finding: block, fixed. The visible “Edit” action was absent from its accessible name, breaking voice targeting by the displayed label. The integration lens reproduced it; the worker first reproduced the same Axe failure in desktop and mobile, then corrected the label without changing visible text. The existing post-save browser state now asserts the name and runs the explicit label-content-name-mismatch rule. A separate Astra high lens verified only that repair and found no remaining defect. Lens yield: 1 blocker from 2 initial lenses; 0 from targeted verification.

The behavior lens found no functional blocker and independently exercised create/find/update/apply/remove in Berlin and Los Angeles on September 8, 2026 and December 30, 2025. The planner browser matrix covers both viewports, both zones, the ISO year boundary, PDF request contents, late results after edits, regeneration, and removal. No new test fixture or dependency was introduced.

No database migration is required: exceptions are local screen state. No deferred work or unreviewed repair remains. The complete final gate passed; CI is running for the repair commit. Total review-cycle wall time: 417 seconds. Existing user authorization permits merge and trusted deployment after CI passes.

@davidvornholt
davidvornholt marked this pull request as ready for review September 13, 2026 12:01
@davidvornholt

Copy link
Copy Markdown
Owner Author

Main now includes the independently reviewed scan-week fix from #15. GitHub's required up-to-date policy merged it into this branch as f053ff061859992ed7624abd70a9f14bce7e2d38; no conflict resolution or new implementation was needed. bun run check passed all 25 tasks at that exact integration head in 19.547 seconds. The initial and repair review coverage remains applicable; this update only combines the two reviewed fixes. Waiting for the required exact-head CI check and container smoke before merge.

@davidvornholt
davidvornholt merged commit c276116 into main Sep 13, 2026
7 checks passed
@davidvornholt
davidvornholt deleted the fix/tuesday-exception-date branch September 13, 2026 12:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant