Refresh the Your Year timeline - #200
Conversation
f33327e to
a3fd66c
Compare
There was a problem hiding this comment.
Emojis look broken at larger a11y sizes. Let's fix them to a single given point size, given their containing circles do not grow.
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
There's a LOT of properties in here now. Per agents.md rule, let's go ahead and group similar properties into sub-structs.
There was a problem hiding this comment.
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.
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.
… 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`.
## 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
Summary
Testing