Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ jobs:

architecture:
name: Bumper Bowling
needs: format
runs-on: xcode-27
env:
BUMPER_CACHE_DIR: .build/bumper-cache
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -126,7 +124,6 @@ jobs:

snapshot_shards:
name: Snapshot Tests (iOS, ${{ matrix.shard }}/2)
needs: format
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions TODOs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
Loading