Skip to content

Roadmap counts the working week in hours, and names the weekday in every day head - #935

Merged
github-actions[bot] merged 6 commits into
mainfrom
claude/work-hours-nonwork-days-37cf9e
Oct 2, 2026
Merged

github-actions[bot] merged 6 commits into
mainfrom
claude/work-hours-nonwork-days-37cf9e

Conversation

@JSdotNet

@JSdotNet JSdotNet commented Oct 2, 2026

Copy link
Copy Markdown
Owner

Summary

Implements local ADR 0019 (proposed in #920): the roadmap counts the working week in hours. Effort windows now advance through working hours and skip days you don't work. The working week syncs to other devices inside the planning-pace document. Day and Week column heads show working hours, and days off are shaded.

At the owner's request, every Day column head also names its weekday, including narrow columns, which used to show only the date.

Changes

  • Working week (ADR 0019): WorkingHours in SharedKernel. EffortWindow / PlanningPace / ImportedPlanPlacement count working hours: 5 pts at 5/week is now 5 working days, not 7 calendar days. A start on a day off moves to the next worked day. The workingWeek key travels in the planning-pace document (same last-write-wins stamp) and keeps working-hours.json as each device's copy. The dashboard heatmap reads the same week.
  • One day-off shading: this is reconciled with Shade weekend day columns on the roadmap with a gradient #928, which shades Sat/Sun with a gradient. IsDayOff uses the working week when one is given and falls back to Sat/Sun otherwise. Both draw with Shade weekend day columns on the roadmap with a gradient #928's gradient classes; the hatch styling from the original implementation was removed.
  • Weekday in every day head:
    • Wide columns (≥ 3.25rem) are unchanged ("Wed 1").
    • Narrow columns show a two-letter, culture-aware weekday on the caption line ("Mo", or "ma" in nl-NL). When a culture's two-letter forms don't tell the days apart (vi-VN, he-IL, ar-SA), the full abbreviation is used.
    • The week's first day (WeekStart) shows "Mo W41" when it fits and "W41" otherwise.
    • The fit check estimates the real Inter widths per character, with full-width CJK characters counted at 1em.
  • Sync safety (from code review):
    • Resetting a week that is already the default is a no-op, so it no longer re-stamps the pace document.
    • A pulled workingWeek with no readable day ({} or a future shape) leaves the device's week alone instead of resetting it to the default.
  • The new registrations live in the shared desktop composition (DesktopCompositionRegistration), so the MAUI head and the harness get them in one place.

Testing

  • Backlog.WithoutAppHeads.slnf Release with -p:TreatWarningsAsErrors=true --no-incremental: 0 warnings, 0 errors. The Windows and Android heads also build clean.
  • Unit tests: 10,758 passed, 0 failed, 1 skipped before the review fixes. The skipped test is EndToEndTests, gated by BACKLOG_E2E=1 and not run in CI either. After the review fixes: FileSystem 549, UI.Components 2744, Roadmap 278 and Desktop.UI 3351, all 0 failed.
  • All 9 of ADR 0019's verification cases have tests (case 8 only partly: no test drives an actual push to a second device).
  • Playwright QA on the desktop harness, with a log monitor running alongside:
    • Default-week shading and a changed week (Fri off, Sat on): shading and per-day hours follow the configured week.
    • Effort bars re-project with the working week.
    • Day heads at 2, 2.76, 3.2 and 3.36rem with no clipping. QA's first round found "Mo W39" clipped by 1–2px at 2.76rem, fixed in 5fe7142.
    • No browser console errors. Aspire logs show no errors from this change.

Reviewer attention:

  • Known limitation, not fixed here: a device with no pace file that edits its week before its first pull loses that edit to the inbound document's week. ADR 0019 §3 explains why such a device sends nothing, but doesn't mention this lost update.
  • At ~2.75rem day columns, the week-start head shows "W41" without its weekday; "Mo W41" needs about 3.0rem.
  • The head class keeps Shade weekend day columns on the roadmap with a gradient #928's name, roadmap-timeline__quarter--weekend, even though it now marks any day off.
  • The first commit is the original session's work-in-progress. On its own it is an in-between state (its CSS still has the hatch); c624956 makes it consistent.

Related

Refs local ADR 0019 (.devbook/arc42/adr/0019-roadmap-counts-the-working-week.md), #920, #928. There is no issue.

Devbook follow-up (flow-spec):

  • ADR 0019 still says "Nothing is built yet" and calls days off "hatched" (they now use the gradient).
  • .devbook/domain/roadmap/features.md does not yet mention weekday names in narrow day heads.

Checklist

  • Scope is focused and excludes unrelated changes
  • Documentation or instruction files were updated when governance or behavior changed: code comments yes; the ADR 0019 and features.md wording is a follow-up (see Related)
  • Running Aspire instances for this checkout were stopped before PR creation
  • Follow-up work is captured when the implementation is intentionally partial
  • Issues this PR closes are linked with a closing keyword, or there are none

🤖 Generated with Claude Code

JSdotNet and others added 6 commits October 2, 2026 16:25
…archived session)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…adient)

Register the working week in the shared desktop composition: the options take
the WorkingHoursSettingsStore, the composition answers IWorkingHoursSettings
over it after resolving the pace store, and both heads build the pace store
over the registered week.

One day-off shading: the timeline shades the working week's days off when one
is given and Saturday and Sunday otherwise, with #928's top-down gradient and
head class. The WIP's separate hatch styling is dropped.

Tests follow main: FakeTimeProvider for the pace clock, plans filed under a
configured repository, and axis assertions that hold for however many weeks
are ruled in days.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A day column too narrow for "Wed 1" keeps its number on the head's first
line and names its weekday on the caption line, in two letters of the
culture's own abbreviation ("Mo", "ma"). The week's first day, wherever
WeekStart puts it, reads "Mo W41" there when both fit at the caption's
measured width, and "W41" alone when they do not. Wide day columns are
unchanged. The caption line never wraps, so the hours line and the day-off
shading keep their places.

ShortestDayNames is not used: under ICU it is one letter, and "T" and "S"
each name two days.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ResetToDefault on a week that already is the default now writes and
announces nothing, as SetDay and Replace already did. Announcing it made the
pace store re-stamp its document, so a stale device could win last-write-wins
over another device's newer pace.

FromJson reads an object with no legible day ({} or a shape a later build
writes) as no week rather than the default one, so a pulled document carrying
it leaves the device's own week alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Where two letters of the abbreviation do not tell the seven days apart
(Vietnamese "Th 2" to "Th 7", Hebrew, Arabic), a narrow day head uses the
culture's whole abbreviation, and a day with no room for it keeps just its
number. The caption estimate counts a full-width East Asian character at a
whole em, so "月 W39" is not claimed to fit where it would clip.

Corrects two comments that ADR 0019 made stale: the default pace is seven
points a working week, not one a calendar day, and a relengthened window's
start moves to the next worked day when the week no longer works it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions
github-actions Bot merged commit bfcf9b8 into main Oct 2, 2026
12 checks passed
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