Skip to content

fix(account-pool): recover from temporary OAuth refresh outages - #3115

Closed
smsunarto wants to merge 4 commits into
get-bb:mainfrom
smsunarto:scott/pool-refresh-recovery
Closed

fix(account-pool): recover from temporary OAuth refresh outages#3115
smsunarto wants to merge 4 commits into
get-bb:mainfrom
smsunarto:scott/pool-refresh-recovery

Conversation

@smsunarto

@smsunarto smsunarto commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Human comments

What was wrong

A brief OAuth refresh outage could leave an account permanently unusable. Sessions then received quota errors even when the account still had a valid access token, requiring manual recovery.

What changed

Keep sessions running on valid tokens during temporary refresh outages and retry automatically with backoff. If every usable token has expired, return a temporary error instead of permanently disabling the accounts.

How you verified

Six regressions failed before and pass after. All 86 plugin tests, typecheck, lint, and formatting passed.

Fork branches are stacked; upstream PR diffs are cumulative.

AGENT GENERATED


This is part 2 of 4 in a stack made with GitButler:

@smsunarto
smsunarto force-pushed the scott/pool-refresh-recovery branch from 1c85def to e1ee522 Compare September 5, 2026 07:04
SawyerHood pushed a commit that referenced this pull request Sep 5, 2026
## Human comments

## What was wrong

Conversations could switch accounts under load even while their current
account was healthy. Losing a warm prompt cache can increase uncached
input and latency. Child sessions also missed their parent’s account
affinity, and Codex session headers were dropped.

## What changed

Keep conversations on eligible accounts and let children inherit an
eligible parent’s account. A child can fail over independently. Preserve
native session headers, cache keys, and encrypted payloads so routing
does not unnecessarily disrupt cache reuse.

## How you verified

Quota tests cover failover, staying on the replacement account, and
recovery after all accounts exhaust. Both providers’ tests fail with
affinity disabled. All 229 plugin tests, typecheck, lint, and formatting
passed. Synthetic tests do not measure live cache improvement.

Fork branches are stacked; upstream PR diffs are cumulative.

<!-- GitButler Footer Boundary Top -->
---
This is **part 4 of 4 in a stack** made with GitButler:
- <kbd>&nbsp;4&nbsp;</kbd> #3117 👈 
- <kbd>&nbsp;3&nbsp;</kbd> #3116
- <kbd>&nbsp;2&nbsp;</kbd> #3115
- <kbd>&nbsp;1&nbsp;</kbd> #3112
<!-- GitButler Footer Boundary Bottom -->

> AGENT GENERATED
@SawyerHood

Copy link
Copy Markdown
Collaborator

Closing as already included in #3117, which was squash-merged into main as 4a5e755. Verified that this PR head is included in the top of the stack and that the merged tree matches that stack head. No additional merge is needed.

@SawyerHood SawyerHood closed this Sep 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants