diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee8d00aa..dba71bb2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,6 @@ jobs: architecture: name: Bumper Bowling - needs: format runs-on: xcode-27 env: BUMPER_CACHE_DIR: .build/bumper-cache @@ -75,7 +74,6 @@ jobs: test: name: Build & Test (iOS) - needs: format runs-on: xcode-27 # A cold/stalled CoreSimulator has held this job for 3.5–5 hours on the # xcode-27 image (a ~10 minute run), so cap it rather than letting a stuck @@ -126,7 +124,6 @@ jobs: snapshot_shards: name: Snapshot Tests (iOS, ${{ matrix.shard }}/2) - needs: format strategy: fail-fast: false matrix: @@ -195,7 +192,6 @@ jobs: test-macos: name: Build & Test (macOS) - needs: format # Same image as the other jobs so every target builds against one toolchain. runs-on: xcode-27 # The macOS-only Ledger scheme is self-contained and fast (no simulator, no diff --git a/TODOs.md b/TODOs.md index 47f6965d..0502c96a 100644 --- a/TODOs.md +++ b/TODOs.md @@ -98,6 +98,7 @@ inbox rather than here. - fix(Bumper) [quick-win]: `where.gregorian_calendar` matches only an explicit `Calendar` base, so it enforces nothing. It filters `MemberAccessExprSyntax` on `base?.trimmedDescription == "Calendar"` (`.bumper/Sources/WhereProjectRules.swift:122-124`, rule at `:116-135`, `severity: .error` at `:118`), which catches a spelled-out `Calendar.current` but not the implicit-member form (`calendar: Calendar = .current`, `startOfDay(in: .current)`) — and after the Gregorian call-site pass (`fe99dde`) the implicit form is the only one left in the tree: **12 sites today**, four of them shipped production paths and eight in DEBUG snapshot/preview fixtures (enumerated in the `CalendarDay.displayDate` P1 in [`Where/TODOs.md`](Where/TODOs.md)). CI hard-gates `bumper lint` (`.github/workflows/ci.yml:67-68`) and is green, which confirms the rule reports none of them. **Why it 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, and add an implicit-member case to the test first. Also match a no-base `MemberAccessExprSyntax` whose contextual type is `Calendar`, or add a lexical `.current` check scoped to calendar parameters and arguments. A rule that reads as enforced but enforces nothing is worse than a documented convention, because it stops anyone from looking. (audit 2026-07-26; re-verified 2026-08-09) ## P1s (Should do) +- docs [quick-win]: Delete the temporary `kve-stuff` CI benchmark organization after its paid plan ends — the [`Stuff-CI-Benchmark`](https://github.com/kve-stuff/Stuff-CI-Benchmark) repository exists only to retain the runner experiment, and GitHub Team is scheduled to downgrade to Free on September 9, 2026. After the downgrade, preserve [the final benchmark report](https://github.com/kve-stuff/Stuff-CI-Benchmark/pull/3) in this repo if it is still useful, verify that the organization has no billable usage or installed integrations, then delete the organization. (human 2026-08-09) - test(Bumper) [quick-win]: Two of the four architecture-graph assertions have no mutation test. `.bumper/Tests/` covers `component_boundary` (`WhereArchitectureTests.swift:28-46`) and `forbidden_import` (`:49-67`, `:70-91`), and each of the ten source-level `where.*` rules has one in `WhereProjectRulesTests.swift` — but nothing exercises `duplicate_ownership` or `declared_dependency_cycle`, so neither has been shown to fail on a tree that violates it. That is a gap against this repo's own discipline, which requires the rule, its catalog entry, and its mutation test to land together (root [`AGENTS.md`](AGENTS.md#architecture-lint)). Note `.bumper/RULES.md:40-41` is *not* wrong here — its "the mutation tests prove…" sentence is scoped to imports, which are genuinely covered — so this is missing coverage, not a false claim. Add a mutation per rule: assign one source path to two components, and declare a cycle between two Where layers. An untested assertion is indistinguishable from one that silently passes everything, which is exactly how `where.gregorian_calendar` came to enforce nothing. (audit 2026-08-09) - docs [quick-win]: Two feature-group folders are missing the doc pair the root [`AGENTS.md`](AGENTS.md#per-module-docs) requires of a module group spanning several targets. `Where/` has an `AGENTS.md` but **no `README.md`** — so the app with 11 modules and by far the most surface has no human-facing entry point at its root, while `Shared/Broadway/` and `Shared/Periscope/` both carry the pair. `Ledger/` has **neither**, though it groups the app target and `LedgerCore` (each of which has its own complete pair). Write the group-level `README.md` for `Where/` and both files for `Ledger/`, covering only what the group shares — the module graph and the invariants no single module owns — per the group rule, and without restating what the leaf docs already say. (audit 2026-08-09)