Skip to content

docs: weekly backlog re-verification and MODULE_AUDIT refresh (August 9, 2026) - #217

Merged
kyleve merged 8 commits into
mainfrom
cursor/todo-triage-weekly-pass-d294
Aug 9, 2026
Merged

docs: weekly backlog re-verification and MODULE_AUDIT refresh (August 9, 2026)#217
kyleve merged 8 commits into
mainfrom
cursor/todo-triage-weekly-pass-d294

Conversation

@cursor

@cursor cursor Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

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 Add matrixed image snapshot testing for WhereUI #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 Refresh the Your Year timeline #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 Use intrinsic height for scroll snapshots #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.
Open in Web View Automation 

Note

Low Risk
Documentation and backlog only; no runtime, build, or persistence changes.

Overview
August 9 weekly todo-triage: no Swift or scripts changed — only backlogs, MODULE_AUDIT.md, and agent-facing docs. Work re-derived from source because last week’s audit PR (#171) never merged, so this is effectively a two-week refresh.

Backlogs: Every open item across 13 TODOs.md files was re-checked against HEAD with updated file:line citations. Six items closed (mostly WhereUI broken-snapshots, including one judged obsolete after PR #200 removed StintRow). Three items carry dated corrections where the original premise was wrong (e.g. Periscope span fields are downcasts, not stored on every LogRecord). ~10 new findings filed; new area files Ledger/TODOs.md (first Ledger audit) and Shared/Flyover/TODOs.md.

MODULE_AUDIT.md: Rewritten for 623 / 337 / 40 source-test-image counts, new modules (Ledger, Flyover, LifecycleKitUI, Inspector rename), and cross-cutting themes (Gregorian lint blind spot + self-passing mutation test, snapshot re-records pinning defects, reconciliation fan-out holes). Severity/category count tables were removed rather than re-estimated; limitations now note no Swift on Linux (no bumper / ./xcstrings here).

Doc fixes: Root AGENTS.md lists tla-check, scopes ./test to iOS bundles with an explicit Ledger-macOS-Tests / tuist carve-out, and documents Linux limits for Swift tooling. LedgerCore/AGENTS.md points macOS tests at the scheme. Root TODOs.md documents convention and localization as allowed item types. RegionKit/README.md and RegionViewer/README.md no longer claim GeoJSON decoding or runtime us-states.geojson behavior that the code doesn’t match.

Still-open snapshot warnings: Three broken-snapshot items note PR #196 may have re-recorded the same layout bugs — re-check images before fixing.

Reviewed by Cursor Bugbot for commit d2ed67e. Bugbot is set up for automated code reviews on this repo. Configure here.

…ENTS.md

The dev-script list omitted ./tla-check, and the Linux limitations named only
Tuist/simulator/Xcode — but this VM ships no Swift toolchain at all, so
./xcstrings (a #!/usr/bin/swift script, and a CI gate) and swift run bumper
also cannot run here. Verified: which swift/swiftc both empty; ./xcstrings
--lint fails with "couldn't exec process".

Validation: mise exec -- ./swiftformat --lint (0/1007 files require
formatting) and ./attribution --check (up to date) both pass. No Swift
sources touched.
Every WhereCore-scoped open item checked against HEAD; citations had drifted
badly (the module went 87 -> 118 sources since the July 26 audit).

Corrected: the daily-summary fan-out gap (DayJournal.swift:70-74, plus the
live-GPS path at WhereServices.swift:197-209), setPrimaryRegions (:382-386),
the region hard-delete (SwiftDataStore.swift:1773/1854), the retry-queue
eviction (LocationIngestor.swift:497-502), the outbox fallback (:118-125),
ReportReader/WidgetDataReader, and the stale doc-claim line numbers.

Partially closed, so narrowed rather than dropped: the unreadable-backup-asset
half now throws and moved to Completed; two of the four Core parameter defaults
are gone; WherePreferences gained its namesake test.

Re-derived a stale number: the namesake-test debt is 59 of 118 files, not 28,
and WhereCoreTests.swift is an omnibus of five suites rather than one. Recorded
the count as a proxy with its derivation date so it can be re-checked.

Filed one new finding: WidgetSnapshotStore.read() collapses 'never published'
and a genuine read failure into the same silent nil, while its own doc comment
claims the two are told apart in the log.

Rejected one candidate finding: DeviceRecordingController.resumeAfterImport's
catch is not a swallowed error -- it logs a typed event with the error
attached, revokes authorization, publishes .unavailable, and sets
needsReconciliation, which is the sanctioned 'log + honest state' path.

Validation: docs only, no Swift touched. swiftformat --lint and
attribution --check both pass.
All 19 open Periscope items and both JournalKit items checked against HEAD.
None have shipped: the three durability gaps (survivesRelaunch resume, the
pre-store-attach window, multi-process journal coordination) remain the oldest
open work in the repo, now with current citations.

Corrected a wrong premise in the span-record-modeling P0. It claimed spanID and
spanExit are 'bolted onto every LogRecord'; they are computed downcasts on the
record's event (LogSpan.swift:210, :216, :224), and LogRecord stores exactly one
span-related field, bypassesFloors. The denormalized columns live on the store
and journal shapes deliberately, so the orphan sweep reads an indexed value
instead of decoding payloads. Left as a dated correction inside the item,
because it changes what the item is asking for.

Re-counted the hosting-smoke-test debt: 20 assertions across 10 files, not the
18 across 9 filed -- PR #152 added LogEventDetailViewHostingTests, so the
conversion surface grew. PeriscopeTools/SnapshotTests still holds only
PeriscopeViewerSnapshotTests, so none of the conversion has happened.

Refreshed drifted citations throughout (PeriscopeStore.make :84 -> :118,
add(sink:) :192 -> :223, the relaunch warn :577 -> :600, the four density
sites, both rebuild-per-ping models, the inspector's uncursored requery).

Confirmed clean, so not filed: Broadway does not leak below PeriscopeTools
(no imports in Core/UI; Package.swift:94-99 lists it only on Tools).

Validation: docs only. swiftformat --lint and attribution --check pass.
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.
All 24 open items across the root, Broadway, CreditKit, LifecycleKit,
SnapshotKit, SnapshotKitTesting, and StuffCore backlogs are STILL OPEN. Nothing
in this cluster shipped in two weeks, so the work here is citation accuracy plus
two claims that had gone stale or wrong.

Explained why the Bumper gregorian P0 has survived three audits: the rule's own
mutation test only ever feeds it a spelled-out Calendar.current
(.bumper/Tests/WhereProjectRulesTests.swift:164-171), so the test passes for the
same reason the rule fails. Fix both together, test first. Also pinned the real
scope: 12 implicit .current sites, 4 shipped and 8 in DEBUG fixtures.

Found a doc that actively misleads, which is worse than the silence the item
was filed for: SnapshotCase.swift:47-48 says 'Each access creates an
independent view value for its configuration', true of the accessor and false
of how the runner uses it (AssertSnapshots.swift:44-45 reads it once per case,
then re-hosts for every configuration). A test author reading the type is told
the isolation exists.

Flagged the settle-floor perf item's measurements as stale rather than letting
them read as current: they were taken over 260 references and the suite holds
361 today (+39%), with a Flyover .settledAtLeast case the split omits.

Partially closed one nested test gap: the fullContent 10-iteration cap now has
coverage via rejectsNonConvergingBoundedScrollMeasurement; the multi-iteration
lazy convergence path is still uncovered, so the item is narrowed, not closed.

Re-counted: 13 dev scripts, not ten. affected_bundles is test:196-359 (~164
lines) in an 869-line script.

Confirmed clean, so not filed: attribution --check passes and correctly credits
the TLA+ tooling and all four external skills while excluding repo-owned ones;
every AGENTS.md has its generated CLAUDE.md; all 25 test bundles appear in a CI
scheme; and no target double-links a product WhereUI already carries except the
documented WhereUITests carve-out.

Validation: docs only. swiftformat --lint and attribution --check pass.
Opens two new area backlogs, per the root placement rule that an area gets its
own file the first time it has an item.

Ledger/TODOs.md -- its first audit. The module is in good shape: 16 sources /
13 test files, Swift Testing throughout, a single LoadState enum rather than
parallel loading/error/value fields, typed DashboardError -> LoadError mapping
that never swallows a failure, a failed refresh that keeps prior data and
surfaces staleness, no secrets in its JSON (pasted token in the Keychain, auto
token read-only from Cursor's own store), no token values in log strings, and
its docs correctly credit PeriscopeCore rather than the deleted LogKit. Filed
three P2s: a Calendar.current default that also violates the no-Core-parameter-
defaults rule, three 1:1 test gaps, and the deliberate absence of an app-shell
test bundle. Recorded that Bumper Bowling does not cover Ledger -- verified
against BumperBowling.swift, whose Included list is Where-only.

Shared/Flyover/TODOs.md -- one P2. Its engine is well covered; the interactive
surfaces are not, and the fix shape is more image cases, not hosting smoke
tests.

Filed at root: ./test cannot run the macOS Ledger bundle at all -- no reference
to Ledger or a macOS destination in 869 lines -- while root AGENTS.md states it
is the only way to run tests. The skill and LedgerCore/AGENTS.md both document
the tuist carve-out, so the always-applied root rule contradicted both.

Sharpened two host items rather than restating them: the WhereIntents perform()
gap is half closed (AGENTS.md now explains the framework trap; the README still
implies full coverage), and PR #210 shipped RegionSpotlightIndexer with no test
of its own -- RegionEntityTests covers its input, which is easy to mistake for
coverage of the indexer.

Corrected a doc claim precisely: RegionViewer/README.md describes Source mode as
decoding a monolithic us-states.geojson, but buildSourceOutlines walks the 54
bundled per-region files. The monolith does still exist -- as a build-time input
under RegionKit/Tools/source -- so the README describes the pipeline's input as
if it were the app's data.

Rejected a candidate high-severity finding: StaggeredReveal.swift:85 sets
\.isCapturingSnapshot to true, which would make real users get capture
stand-ins, but it is inside #if DEBUG in a #Preview and never ships.

Validation: docs only. swiftformat --lint and attribution --check pass.
Root AGENTS.md said './test' is the only way to run tests; it cannot run the
native-macOS Ledger-macOS-Tests scheme at all. Named the exception and pointed
at the running-tests skill, which already carried the invocation.

LedgerCore/AGENTS.md told agents to run 'tuist test LedgerCoreTests'. The scheme
is Ledger-macOS-Tests, and the skill adds --no-selective-testing. Corrected, and
marked it as the repo's one sanctioned tuist test so it doesn't read as a
violation of the root rule.

RegionKit/README.md claimed GeoJSON decoding is covered. It isn't -- there is no
GeoJSONTests.swift -- and an AGENTS/README overclaiming coverage is worse than
silence, because it tells the next agent not to add the tests. Replaced with an
explicit statement of the gap, pointing at the filed item.

RegionViewer/README.md described its Source mode as decoding a monolithic
us-states.geojson. buildSourceOutlines walks the 54 bundled per-region files;
the monolith is a build-time input under Tools/source that is never bundled.

SnapshotKitTesting/AGENTS.md quoted two measurements over '260 references' as
present tense. There are 361 now, and this Linux pass cannot re-measure, so both
are dated with a tripwire and the durable conclusion is separated from the
seconds.

Root TODOs.md format: documented 'convention' and 'localization' as allowed
types. Both were already load-bearing in four filed items, so the list was
wrong rather than the items.

Filed two findings from the rules audit: duplicate_ownership and
declared_dependency_cycle have no mutation test, against the discipline root
AGENTS.md states; and Where/ is missing its group README.md while Ledger/ is
missing both group docs.

Rejected two reported violations after checking the contract: 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', not Open.

Validation: swiftformat --lint (0/1007) and attribution --check pass;
./sync-agents regenerated the CLAUDE.md mirrors. ./xcstrings --lint cannot run
here (no Swift toolchain on Linux).
…026)

The report was six weeks stale in every measured claim: 14 SPM targets (now
20), ~359/198 files (now 623/337), a SwiftDataInspector module that has been
called Inspector since #158, 'eight TODOs.md' (now 13), and seven modules it
never mentioned at all -- Inspector, Flyover, LifecycleKitUI, CreditKit,
SnapshotKit, SnapshotKitTesting, and both Ledger targets.

Rewritten from what the TODOs.md files now say, after this pass re-verified
them. Header records that this is a two-week diff, because the August 2 pass
was closed unmerged and nothing it found reached main.

Removed two stale high findings the source contradicts: the tracking-toggle
race (closed 2026-08-03, serialized behind a monotonic intent sequence) and the
LifecycleKit terminal-phase race (gone with the typed-engine rewrite).

Dropped the severity and category count tables rather than re-estimating them.
They could not be reconciled against the backlog, and the Limitations section
now says so instead of implying a census.

Rewrote the themes so none of them prescribes a fix -- the previous version
embedded 'widen the rule', 'add it to the fan-out', 'extract a ReportLoadGate'
inline, which contradicts the file's own no-actionable-items contract. The
themes now carry only synthesis no single item shows, including two findings
that only appear across items: a lint rule and its mutation test can fail
together, and re-recording a reference does not fix what it pins.

Added a Verified OK section per module, including first-audit entries for Ledger
and Flyover -- negative space has no home in a backlog, and it is the part of
this report a TODOs.md cannot carry.

Limitations now state that this VM has no Swift toolchain at all, so bumper lint
and xcstrings --lint are as unavailable as tuist, and that where the pass judged
a reference re-recorded it read the LFS pointer size rather than any pixel.

Validation: docs only. swiftformat --lint (0/1007) and attribution --check pass.
Verified root AGENTS.md's description of this file is still accurate after the
rewrite.
@kyleve
kyleve marked this pull request as ready for review August 9, 2026 20:13
@kyleve
kyleve merged commit 41bdb0e into main Aug 9, 2026
6 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.

2 participants