codeburn/app/renderer/sections
iamtoruk 8d1a10369f fix(app): quota connects via macOS keychain + Connect affordance
Root causes (verified live): the Claude keychain branch was never
enabled (allowClaudeKeychain never passed), security -w returns
hex-encoded JSON the parser rejected, and Codex had no keychain
discovery at all.

- shared readKeychainPassword: Apple-signed /usr/bin/security, 90s
  window so the user can answer the macOS dialog, hex decode,
  notFound vs accessDenied classification; secrets never logged
- Claude: keychain fallback active (gated to explicit Refresh so
  launch never ambushes with a dialog); connection retained across
  keychain-less background polls
- Codex sources in order: the menubar's own cached OAuth (read-only,
  401 = one re-read, never rotate), legacy ~/.codex/auth.json
  (writable), com.openai.codex plaintext if usable; Safe Storage
  never decrypted
- new accessDenied state (amber, 'locked') + ConnectAffordance on
  Plans cards and Settings rows: login command, keychain-Allow note,
  force Refresh

Live verification: Claude connected with its real tier and windows;
Codex correctly accessDenied until the keychain dialog is allowed.

273/273 (26 files), typecheck + build green.
2026-07-16 06:20:44 -07:00
..
Compare.test.tsx fix(app): accuracy batch A — provider scoping, honest chart axes, range threading, stale-error banner 2026-07-16 01:14:41 -07:00
Compare.tsx polish(app): skeleton loaders for Compare and the Audit lens 2026-07-16 05:04:50 -07:00
Models.test.tsx feat(app): Audit lens on Models + Pricing pane in Settings 2026-07-16 03:45:36 -07:00
Models.tsx polish(app): skeleton loaders for Compare and the Audit lens 2026-07-16 05:04:50 -07:00
Optimize.test.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
Optimize.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Overview.test.tsx feat(app): coaching signals card (menubar rule parity) 2026-07-16 03:30:51 -07:00
Overview.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Plans.test.tsx fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
Plans.tsx fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
Sessions.test.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Sessions.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Settings.test.tsx fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
Settings.tsx fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
Spend.test.tsx feat(app): Sessions provider quick-filter + Spend project inline expand 2026-07-16 02:49:17 -07:00
Spend.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00