6ed9d98e35
* fix(claude): keep at-limit claude-swap cards complete Co-authored-by: Cursor <cursoragent@cursor.com> * docs: cite at-limit claude-swap card PR Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): keep non-limit claude-swap sentinels metrics-less Project usage only for ok and unavailable slots, and retain a previous snapshot only when the email still matches and a 100% window has not reset. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): drop expired windows from retained at-limit snapshots Keeping the whole previous snapshot after any sibling reset still showed "Resets now" on lanes that had already recovered. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): retain at-limit swap windows in CLI and dashboard One-shot cards and dashboard now reuse the last slot windows so an unavailable cswap row with null usage keeps the exhausted bars. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): bind retained at-limit windows to the slot account A SHA-256 fingerprint in the retained-usage cache rejects leftover 100% bars after the same slot is reused by a different account. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): prune expired windows on attached unavailable snapshots Direct cswap unavailable payloads with mixed reset times now drop already-reset lanes the same way retained snapshots do. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): keep retained at-limit bars on dashboard and app restart Seed the app projection from the retained-usage cache after a relaunch, and render dashboard windows alongside the deferred/limit note instead of returning after the error. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): require an email before retaining at-limit windows Slot-only fingerprints reused bars after an email-less account was replaced. Decline persistence and reuse unless the row has an email, and move the changelog note to 0.54.1 Unreleased. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): save retained usage only for current refreshes Stale claude-swap refreshes were writing the on-disk cache before the generation guard, and 100% windows without a future reset were kept forever. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ci): flatten fingerprint matching and expect localized API key details SwiftFormat rejected the nested guard wrap, and OpenRouter detail titles now follow the #3084 localization pass. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(claude): drop retained windows without a future reset A non-exhausted session lane with no resetsAt was kept beside a weekly at-limit bar and re-saved until that weekly reset, so a five-hour value could linger for days. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Peter Steinberger <steipete@gmail.com>