# Changelog

## Score

- CAI 57 → 58 (+1.3)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 87 → 88 (+0.5)
- Architecture 97 → 97 (-0.2)
- Maturity 63 → 63 (-0.1)
- Readiness 45 → 62 (+16.9)
- Security 58 → 50 (-7.9)
- Event-Driven 79 → 79 (+0.1)
- Performance 62 (new)

## Resolved (18)

- ClaudeLogUsageScanner.hasUnsupportedNullField (cognitive 23) (Sources/OpenUsage/Providers/Claude/ClaudeLogUsageScanner.swift)
- DefaultAccountObserver.observeCodex (cognitive 16) (Sources/OpenUsage/Providers/DefaultAccountObserver.swift)
- Documentation: no installation or build instructions (README.md)
- Duplicated block (7 lines × 4) (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- Duplicated block (8 lines × 3) (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- Hotspot: Sources/OpenUsage/Providers/Antigravity/AntigravityProtoDecoder.swift (Sources/OpenUsage/Providers/Antigravity/AntigravityProtoDecoder.swift)
- Hotspot: Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- Hotspot: Sources/OpenUsage/Providers/Cursor/CursorCSVParser.swift (Sources/OpenUsage/Providers/Cursor/CursorCSVParser.swift)
- Hotspot: Sources/OpenUsage/Providers/Grok/GrokCreditsConfigDecoder.swift (Sources/OpenUsage/Providers/Grok/GrokCreditsConfigDecoder.swift)
- Hotspot: Sources/OpenUsage/Providers/Ollama/OpenSSHEd25519Key.swift (Sources/OpenUsage/Providers/Ollama/OpenSSHEd25519Key.swift)
- Hotspot: Sources/OpenUsage/Support/OpenUsageISO8601.swift (Sources/OpenUsage/Support/OpenUsageISO8601.swift)
- Hotspot: Sources/OpenUsage/Support/PaceNotificationLogic.swift (Sources/OpenUsage/Support/PaceNotificationLogic.swift)
- Hotspot: Sources/OpenUsage/Support/PopoverDismissReader.swift (Sources/OpenUsage/Support/PopoverDismissReader.swift)
- Hotspot: Sources/OpenUsage/Support/ProviderIconShape.swift (Sources/OpenUsage/Support/ProviderIconShape.swift)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- MethodTooLong: AppContainer.init (Sources/OpenUsage/App/AppContainer.swift)
- Repeated repair: Sources/OpenUsage/App/SingleInstanceGuard.swift (Sources/OpenUsage/App/SingleInstanceGuard.swift)
- Repeated repair: Sources/OpenUsage/Providers/Codex/CodexLogUsageScanner.swift (Sources/OpenUsage/Providers/Codex/CodexLogUsageScanner.swift)

## New (54)

- ClassTooLong: ClaudeProvider (Sources/OpenUsage/Providers/Claude/ClaudeProvider.swift)
- ClaudeAuthStore.loadCredentialSet (cognitive 28) (Sources/OpenUsage/Providers/Claude/ClaudeAuthStore.swift)
- ClaudeAuthStore.loadCredentialSet (cyclomatic 20) (Sources/OpenUsage/Providers/Claude/ClaudeAuthStore.swift)
- ClaudeAuthStore.loadSwapVaultCredential (cognitive 16) (Sources/OpenUsage/Providers/Claude/ClaudeAuthStore.swift)
- ClaudeLogUsageScanner.parseEntries (cognitive 16) (Sources/OpenUsage/Providers/Claude/ClaudeLogUsageScanner.swift)
- ClaudeLogUsageScanner.parseEntries (cyclomatic 16) (Sources/OpenUsage/Providers/Claude/ClaudeLogUsageScanner.swift)
- ClaudeSwapAccount.discover (cognitive 18) (Sources/OpenUsage/Providers/Claude/ClaudeSwapAccount.swift)
- ClaudeSwapAccount.discover (cyclomatic 16) (Sources/OpenUsage/Providers/Claude/ClaudeSwapAccount.swift)
- CodexLogUsageScanner.aggregate (cyclomatic 16) (Sources/OpenUsage/Providers/Codex/CodexLogUsageScanner.swift)
- CodexProvider.refreshAccount (cognitive 37) (Sources/OpenUsage/Providers/Codex/CodexProvider.swift)
- CodexSwapAccount.discover (cognitive 18) (Sources/OpenUsage/Providers/Codex/CodexSwapAccount.swift)
- Coverage not measured — Swift suite
- DashboardView.body (cognitive 28) (Sources/OpenUsage/Views/DashboardView.swift)
- DashboardView.body (cyclomatic 26) (Sources/OpenUsage/Views/DashboardView.swift)
- Duplicated block (10 lines × 2) (Sources/OpenUsage/Providers/Grok/GrokUsageClient.swift)
- Duplicated block (12 lines × 2) (Sources/OpenUsage/Providers/OpenRouter/OpenRouterAuthStore.swift)
- Duplicated block (5 lines × 2) (Sources/OpenUsage/Providers/Claude/ClaudeProvider.swift)
- Duplicated block (5 lines × 2) (Sources/OpenUsage/Providers/Cursor/CursorProvider.swift)
- Duplicated block (6–8 lines × 2) (Sources/OpenUsage/Services/ProviderAccountAssembly.swift)
- Duplicated block (7 lines × 2) (Sources/OpenUsage/Providers/Antigravity/AntigravityDbUsageScanner.swift)
- …and 34 more

## Changes since last survey

- 39 commits — 20 feature/other, 19 fixes

## By area

- Sources/OpenUsage — 23 commits
- (root) — 10 commits
- Tests/OpenUsageTests — 4 commits
- .github/workflows — 2 commits

## Notable commits

- fix: Fix exhausted Devin weekly quota when percentage is omitted (#1251)
- fix: fix(claude): count terminal sessions when multiple accounts are known (#1299)
- fix: fix(claude): keep usage records whose nested iteration model is null (#1261)
- fix: fix(claude): keep verified launch-cached limits on the first 429 after relaunch (#1325)
- fix: fix(claude): preserve complete credential document during rotation (#1316)
- fix: fix(claude): read the plan badge from Anthropic's live profile (#1262)
- fix: fix(codex): attribute OpenCode 2 ChatGPT OAuth usage (#1284)
- fix: fix(codex): keep tier on tierless settings records and price Ultrafast -fast slugs at 6x (#1331)
- fix: fix(codex): scope Keychain reads and rotation writes to CLI account (#1317)
- fix: fix(cursor): bound usage CSV export to a 20s deadline (#1324)
- fix: fix(grok): keep local spend when team billing returns 412 (#1272)
- fix: fix(ollama): display monthly cloud usage limit (#1270)
- fix: fix(ollama): warn when the plan response can't be read (#1300)
- fix: fix(opencode): read OpenCode 2 usage and Go credentials (#1323)
- fix: fix(process): isolate each pipe drain from the shared utility pool (#1318)
- fix: fix(settings): rename update toggle to Check Automatically (#1330)
- fix: fix(settings): shorten the analytics toggle label and caption (#1328)
- fix: fix: discover Claude Swap accounts and isolate their usage (#1226)
- fix: fix: tolerate glued shell banners and recalculate pricing for every Codex card (#1320)
- change: Add Codex Swap account support (#1264)
- …and 19 more
