docs: weekly backlog re-verification and MODULE_AUDIT refresh (August 9, 2026) - #217
Merged
Conversation
…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
marked this pull request as ready for review
August 9, 2026 20:13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
TODOs.mdfiles againstHEAD, refreshing citations module by module. The tree nearly doubled since the last merged audit (359 → 623 sources), so most line numbers had moved.Ledger/TODOs.md(its first audit) andShared/Flyover/TODOs.md.MODULE_AUDIT.mdfrom the refreshed backlog. It was six weeks stale in every measured claim.AGENTS.mdfiles making claims the code contradicts.Why
The weekly
todo-triagepass. One thing worth flagging up front: last week's PR (#171) was closed unmerged, so nothing it found reachedmain. 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:
Calendarbase, so it reports none of the 12 implicit.currentsites — andWhereProjectRulesTests.swift:164-171only 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 atseverity: .error. The item now says to fix the test first../testcannot run the macOS Ledger bundle at all — no reference to Ledger or a macOS destination anywhere in its 869 lines — while the always-applied rootAGENTS.mdsaid it was "the only way to run tests". Therunning-testsskill andLedgerCore/AGENTS.mdboth documented thetuistcarve-out, so the one file guaranteed to be loaded contradicted both. RootAGENTS.mdnow names the exception; whether./testshould absorb the tier is filed.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, sinceAssertSnapshots.swift:44-45reads 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
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 deletedStintRowand both stylesheet tokens, so nobody scaled the accent bar; the accent bar is gone.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 aReportLoadGate" inline, contradicting the file's own no-actionable-items contract.(Scope)tag, which the root format explicitly permits, and LifecycleKit's resolved P0 is already under# Completed issues.conventionandlocalizationare 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.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 regeneratedCLAUDE.mdmirrors, which are gitignored.Testing
mise exec -- ./swiftformat --lint— passes, 0/1007 files require formatting.mise exec -- ./attribution --check— passes,attribution.jsonup to date (8 credits).mise exec -- ./sync-agents— run after everyAGENTS.mdedit; regeneratedCLAUDE.mdfor root,LedgerCore, andSnapshotKitTesting../test,swift run bumper lint, and./xcstrings --lintare 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 rootAGENTS.mdLinux section, since it previously named only Tuist/simulator/Xcode. CI onmainwas read viaghand is green at46a84015, which is what lets the "the Gregorian rule finds nothing" conclusion stand.\.isCapturingSnapshotset totruein WhereUI) until it turned out to be inside#if DEBUG.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.mdfiles was re-checked againstHEADwith updatedfile:linecitations. Six items closed (mostly WhereUI broken-snapshots, including one judged obsolete after PR #200 removedStintRow). Three items carry dated corrections where the original premise was wrong (e.g. Periscope span fields are downcasts, not stored on everyLogRecord). ~10 new findings filed; new area filesLedger/TODOs.md(first Ledger audit) andShared/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 (nobumper/./xcstringshere).Doc fixes: Root
AGENTS.mdliststla-check, scopes./testto iOS bundles with an explicitLedger-macOS-Tests/tuistcarve-out, and documents Linux limits for Swift tooling.LedgerCore/AGENTS.mdpoints macOS tests at the scheme. RootTODOs.mddocumentsconventionandlocalizationas allowed item types.RegionKit/README.mdandRegionViewer/README.mdno longer claim GeoJSON decoding or runtimeus-states.geojsonbehavior 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.