Skip to content

Refresh the Your Year timeline - #200

Merged
kyleve merged 6 commits into
mainfrom
codex/refresh-your-year-timeline
Aug 8, 2026
Merged

Refresh the Your Year timeline#200
kyleve merged 6 commits into
mainfrom
codex/refresh-your-year-timeline

Conversation

@kyleve

@kyleve kyleve commented Aug 8, 2026

Copy link
Copy Markdown
Owner

Posted by an AI agent on kve’s behalf.

Summary

  • redesign the Your Year timeline as a connected, region-tinted journey
  • add a day-accurate annual ribbon that preserves gaps and multi-region days
  • size stint cards by their share of the year, with connectors ending at the emoji marker edges
  • retain stable stint identities as reports refresh
  • adapt the count layout for accessibility Dynamic Type and split the ribbon into labeled region bands when Differentiate Without Color is enabled
  • refresh the full iPhone/iPad snapshot matrix, including light and dark non-color variants

Testing

  • ./swiftformat --lint
  • ./test --no-generate --no-build WhereUITests — 360 tests passed
  • ./test --no-generate --no-build --only WhereUISnapshotTests/PresenceTimelineListSnapshotTests — 12 snapshot configurations passed

@kyleve
kyleve force-pushed the codex/refresh-your-year-timeline branch from f33327e to a3fd66c Compare August 8, 2026 18:22

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Emojis look broken at larger a11y sizes. Let's fix them to a single given point size, given their containing circles do not grow.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on kve’s behalf.

Fixed in 2636ef9. The rail emoji now uses a fixed 20-point stylesheet font inside the fixed 42-point node, and I refreshed the two AX5 references. The full WhereUI test bundle and focused timeline snapshot matrix pass.

/// leading region-tinted accent bar and the row's internal spacing.
/// Style for the presence timeline's calendar-proportional overview ribbon
/// and the connected journey rows below it.
struct TimelineStyle: Equatable {

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a LOT of properties in here now. Per agents.md rule, let's go ahead and group similar properties into sub-structs.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on kve’s behalf.

Fixed in 96ae415. TimelineStyle now groups its tokens into overview, ribbon, rail, and row sub-structures, with call sites and stylesheet coverage updated. All token values are unchanged; 361 WhereUI tests pass and the focused timeline snapshots match byte-for-byte.

@kyleve
kyleve enabled auto-merge (squash) August 8, 2026 18:54
@kyleve
kyleve merged commit 8f8a819 into main Aug 8, 2026
5 checks passed
cursor Bot pushed a commit that referenced this pull request Aug 9, 2026
All WhereUI/Where-scoped open items checked against HEAD. The module went
113 -> 224 sources since the July 26 audit, so most citations had moved.

Closed five, four of them from the broken-snapshots cluster:
- The blank VoiceOver calendar captures: re-recorded by PR #196, LFS size
  fields now 3.2 MB / 3.6 MB against the 66 KB / 171 KB that evidenced the
  solid-white blanks. A 3.2 MB PNG is not blank. Verified from LFS pointers
  only; noted that confirming pixels needs a macOS ./test --review.
- The timeline accent bar: no longer applicable, PR #200 deleted StintRow and
  both stylesheet tokens. Closed as obsolete, not fixed -- nobody scaled the
  capsule, the capsule is gone.
- The timeline ax5 squish: fixed the way the item asked, via
  timeline.row.stacksDayCount at accessibility sizes.
- The Resolve sheet ax5 cutoff: now .fullContentScreenDefaults.
- The CalendarYearGrid capture-time scroll skip: the last product-code read of
  isCapturingSnapshot that wasn't a stand-in is gone.

Recorded a trap on the three that stay open: PR #196 re-recorded their
references with the layout code unchanged, so those images now pin the same
defect at a new size. Re-check the image before fixing.

Sharpened rather than restated:
- The calendar item now names exactly four production sites, separates eight
  DEBUG preview/fixture sites, and explicitly excludes calendar.timeZone =
  .current, which is the correct pattern and has been miscounted before.
- The notification-prompt item now carries the full launch chain and the root
  cause: all three preferences default to true on a fresh install, so the fix
  has to reckon with the defaults, not just the call site.
- WhereSession is 636 lines, not the ~460 filed -- it grew, because PR #160
  landed multi-device recording on it.

Filed two new findings, and corrected one of them while verifying: three
screens lack image coverage, but only RemovedDeviceView is new -- Alerts and
VisibleYear have been uncovered since PR #111, so prior audits missed them.
Also nested the evidence feature-discovery VoiceOver gap under the existing
widget-gallery item rather than filing a second item for the same defect class.

Did not file the timeline's missing report.calendar separately; it is the same
defect as the calendar item and is now cited there.

Validation: docs only. swiftformat --lint and attribution --check pass.
kyleve pushed a commit that referenced this pull request Aug 9, 2026
… 9, 2026) (#217)

## Summary

- Re-verified **every open item in all 13 `TODOs.md` files** against
`HEAD`, refreshing citations module by module. The tree nearly doubled
since the last merged audit (359 → 623 sources), so most line numbers
had moved.
- **Closed 6 items**, five of them in WhereUI — four from the
broken-snapshots cluster that has been open since PR #101, plus the
capture-time scroll skip.
- **Corrected three items whose premise was wrong**, as dated
corrections inside each item rather than silent edits, because each
changes what the item is asking for.
- **Filed ~10 new findings** and opened two new area backlogs:
`Ledger/TODOs.md` (its first audit) and `Shared/Flyover/TODOs.md`.
- **Rewrote `MODULE_AUDIT.md`** from the refreshed backlog. It was six
weeks stale in every measured claim.
- **Fixed five docs the fortnight invalidated**, including two
`AGENTS.md` files making claims the code contradicts.

## Why

The weekly `todo-triage` pass. One thing worth flagging up front: **last
week's PR (#171) was closed unmerged**, so nothing it found reached
`main`. This is therefore a two-week diff against the July 26 audit, and
#171's work was re-derived from source rather than copied from its
branch.

The three findings I'd most want a second opinion on:

1. **The Bumper Gregorian rule and its own test fail together.** The
rule matches only an explicit `Calendar` base, so it reports none of the
12 implicit `.current` sites — and
`WhereProjectRulesTests.swift:164-171` only ever feeds it the explicit
form. The test passes for exactly the reason the rule fails, which is
why this has now survived three audits with CI green and the rule at
`severity: .error`. The item now says to fix the test first.
2. **`./test` cannot run the macOS Ledger bundle at all** — no reference
to Ledger or a macOS destination anywhere in its 869 lines — while the
always-applied root `AGENTS.md` said it was "the only way to run tests".
The `running-tests` skill and `LedgerCore/AGENTS.md` both documented the
`tuist` carve-out, so the one file guaranteed to be loaded contradicted
both. Root `AGENTS.md` now names the exception; whether `./test` should
absorb the tier is filed.
3. **`SnapshotCase`'s doc comment tells test authors something false.**
It says "Each access creates an independent view value for its
configuration" — true of the accessor, false of how the runner uses it,
since `AssertSnapshots.swift:44-45` reads it once per case and re-hosts
that value for every configuration. The item was originally filed
because the docs were *silent* on this; they're now actively misleading.

## Review focus

- **The five closures in `Where/TODOs.md`.** The
blank-VoiceOver-calendar one is judged from the Git LFS pointer size (66
KB → 3.2 MB; a solid-white PNG cannot be 3.2 MB), not from pixels — this
VM can't render. If you want that one held open pending a macOS `./test
--review`, say so and I'll reopen it. One of the four is closed as
**obsolete rather than fixed**: PR #200 deleted `StintRow` and both
stylesheet tokens, so nobody scaled the accent bar; the accent bar is
gone.
- **A trap I added to the three broken-snapshot items still open.** PR
#196 re-recorded their references while their layout code went
untouched, so those images now faithfully pin the same defects at a new
size. Re-check the image before fixing.
- **`MODULE_AUDIT.md`'s omissions.** I dropped the severity and category
count tables rather than re-estimating them (they never reconciled
against the backlog) and rewrote the themes so none of them prescribes a
fix — the previous version had "widen the rule" / "add it to the
fan-out" / "extract a `ReportLoadGate`" inline, contradicting the file's
own no-actionable-items contract.
- **Two reported violations I rejected**, in case you disagree: the
single-module backlogs (Inspector, CreditKit, JournalKit, LifecycleKit)
correctly omit the `(Scope)` tag, which the root format explicitly
permits, and LifecycleKit's resolved P0 is already under `# Completed
issues`.
- **`convention` and `localization` are now documented as allowed item
types** in the root format. Both were already load-bearing in four filed
items, so the list was wrong rather than the items — but this is a
change to the format contract, so it's your call.

## ⚠️ Breaking changes

None. Documentation and backlog only; no Swift source, manifest, or
script was modified.

## Compatibility

No effect on build, runtime, or persisted formats. Two new files
(`Ledger/TODOs.md`, `Shared/Flyover/TODOs.md`) and the regenerated
`CLAUDE.md` mirrors, which are gitignored.

## Testing

- `mise exec -- ./swiftformat --lint` — passes, 0/1007 files require
formatting.
- `mise exec -- ./attribution --check` — passes, `attribution.json` up
to date (8 credits).
- `mise exec -- ./sync-agents` — run after every `AGENTS.md` edit;
regenerated `CLAUDE.md` for root, `LedgerCore`, and
`SnapshotKitTesting`.
- **Not run, and why:** `./test`, `swift run bumper lint`, and
`./xcstrings --lint` are all unavailable here. This VM is Linux with
**no Swift toolchain at all**, which rules out the two Swift-script CI
gates as well as Tuist and the simulator — now recorded in the root
`AGENTS.md` Linux section, since it previously named only
Tuist/simulator/Xcode. CI on `main` was read via `gh` and is green at
`46a84015`, which is what lets the "the Gregorian rule finds nothing"
conclusion stand.
- Every claim published here was spot-checked against source rather than
taken from a subagent report; four candidate findings were investigated
and rejected, including one that looked like a shipped bug
(`\.isCapturingSnapshot` set to `true` in WhereUI) until it turned out
to be inside `#if DEBUG`.
kyleve added a commit that referenced this pull request Aug 10, 2026
## Summary

- **User-facing:** float the compact year overview above the scrolling
journey, with stays passing behind its rounded corners instead of behind
a full-width panel
- **User-facing:** open the timeline at its most recent stays on entry
and after changing years
- **User-facing:** keep the overview scrollable when Differentiate
Without Color or accessibility Dynamic Type needs more room
- **Internal:** resolve the adaptive header placement through the
WhereUI stylesheet and cover both full-content and initial viewport
rendering

## Why

The refreshed timeline from #200 opens at the beginning of the year and
scrolls its compact overview away with the journey. The latest stays are
the useful starting point, while the overview remains useful context
when it is compact enough to stay onscreen.

## Review focus

- The bottom anchor applies only to the initial offset, so same-year
data refreshes do not pull someone away from an older stint they are
reading.
- Only the rounded overview shape is opaque; the surrounding inset
remains transparent so the journey passes behind its corner cutouts
without introducing a rectangular shelf, blur, or shadow.
- Accessibility Dynamic Type and Differentiate Without Color move the
overview back into the scroll content.

## Testing

- `./swiftformat --lint`
- `./test WhereUITests` — 420 tests passed
- `./test --snapshots --only
'WhereUISnapshotTests/PresenceTimelineListSnapshotTests' --review` —
every capture matched its reference byte for byte
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