# Changelog

## Score

- CAI 25 → 26 (+0.2)
- Rubric changed (rubric-2026.09.12 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 9 → 9 (+0.0)
- Architecture 75 → 74 (-1.6)
- Maturity 57 → 57 (+0.1)
- Readiness 33 → 31 (-1.9)
- Security 47 → 52 (+4.9)
- Accessibility 36 → 36 (+0.0)
- Performance 60 (new)

## Resolved (12)

- Documentation: written for insiders (README.md)
- Hotspot: src/models/redis.js (src/models/redis.js)
- Hotspot: src/routes/admin/grokAccounts.js (src/routes/admin/grokAccounts.js)
- Hotspot: src/routes/admin/usageStats.js (src/routes/admin/usageStats.js)
- Hotspot: src/services/account/grokAccountService.js (src/services/account/grokAccountService.js)
- Hotspot: src/utils/grokQuota.js (src/utils/grokQuota.js)
- Hotspot: web/admin-spa/src/components/common/AccountSelector.vue (web/admin-spa/src/components/common/AccountSelector.vue)
- Hotspot: web/admin-spa/src/views/AccountsView.vue (web/admin-spa/src/views/AccountsView.vue)
- Off-boarding risk: anonymized user #1
- batchGetApiKeyStats (cognitive 20) (src/models/redis.js)
- batchGetApiKeyStats (cyclomatic 20) (src/models/redis.js)
- migrateGlobalStats (cyclomatic 21) (src/models/redis.js)

## New (206)

- Documentation: no licence statement (README.md)
- FunctionTooLong: api.router.post("/v1/messages/count_tokens") (src/routes/api.js)
- FunctionTooLong: apiKeys.router.get("/api-keys") (src/routes/admin/apiKeys.js)
- FunctionTooLong: apiKeys.router.post("/api-keys") (src/routes/admin/apiKeys.js)
- FunctionTooLong: apiKeys.router.post("/api-keys/batch") (src/routes/admin/apiKeys.js)
- FunctionTooLong: apiKeys.router.put("/api-keys/:keyId") (src/routes/admin/apiKeys.js)
- FunctionTooLong: apiKeys.router.put("/api-keys/batch") (src/routes/admin/apiKeys.js)
- FunctionTooLong: apiStats.router.post("/api/batch-stats") (src/routes/apiStats.js)
- FunctionTooLong: apiStats.router.post("/api/user-model-stats") (src/routes/apiStats.js)
- FunctionTooLong: apiStats.router.post("/api/user-stats") (src/routes/apiStats.js)
- FunctionTooLong: claudeRelayConfig.router.put("/claude-relay-config") (src/routes/admin/claudeRelayConfig.js)
- FunctionTooLong: dashboard.router.get("/model-stats") (src/routes/admin/dashboard.js)
- FunctionTooLong: droidAccounts.router.get("/droid-accounts") (src/routes/admin/droidAccounts.js)
- FunctionTooLong: openaiAccounts.router.put("/:id") (src/routes/admin/openaiAccounts.js)
- FunctionTooLong: openaiGeminiRoutes.router.post("/v1/chat/completions") (src/routes/openaiGeminiRoutes.js)
- FunctionTooLong: sync.router.get("/sync/export-accounts") (src/routes/admin/sync.js)
- FunctionTooLong: system.router.get("/check-updates") (src/routes/admin/system.js)
- FunctionTooLong: usageStats.router.get("/account-usage-trend") (src/routes/admin/usageStats.js)
- FunctionTooLong: usageStats.router.get("/accounts/:accountId/usage-history") (src/routes/admin/usageStats.js)
- FunctionTooLong: usageStats.router.get("/accounts/:accountId/usage-records") (src/routes/admin/usageStats.js)
- …and 186 more
