Safe workflow for changing account selection, fallback, retry, or failover behavior in the wrapper runtime, runtime rotation proxy, or optional plugin-host runtime. For the deeper safety path (quota inputs, explain/report surfaces), see RUNBOOK_CHANGE_ROUTING_POLICY_SAFELY.md.
Adjust routing policy without obscuring why requests changed behavior.
index.ts— plugin-host runtime orchestrationlib/runtime-rotation-proxy.ts— rotation request flowlib/runtime/rotation-account-selection.ts—chooseAccounttier orderlib/policy/runtime-policy.ts— policy composition (budgets/tags/profiles/boosts)lib/request/failure-policy.ts— pure retry/failover decision tablelib/request/rate-limit-backoff.ts— cooldown/backoff behaviorlib/request/stream-failover.ts— SSE failover (pre-first-byte only)lib/request/request-transformer.ts— request invariantslib/accounts.ts,lib/rotation.ts— selection inputs, health statetest/index.test.ts,test/index-retry.test.ts,test/runtime-rotation-proxy.test.ts,test/rotation-account-selection.test.ts,test/failure-policy.test.ts,test/request-transformer.test.ts,test/stream-failover.test.ts,test/rate-limit-backoff.test.ts
- Write down the policy change in one sentence before coding.
- Identify which decision point the change actually touches:
- account choice (selection tiers)
- policy gating (budgets, tags, model allow/deny, pause/drain)
- fallback model choice
- retry timing / cooldown timing
- stream failover behavior
- runtime rotation proxy behavior
- Add or update the narrowest tests first.
- Preserve request invariants unless the change explicitly targets them:
stream: truestore: false- include
reasoning.encrypted_content
- Keep the skip-reason precedence intact unless the release intentionally changes it:
disabled→workspace-disabled→token-invalid→rate-limited→cooling-down→circuit-open. - Prefer adjusting one policy decision point instead of rewriting multiple layers at once.
- If behavior becomes harder to explain, add diagnostics or comments before merging —
codex-multi-auth why-selected,report, androtation statusoutput are the operator-visible explanation surfaces.
npm run lint
npm run typecheck
npm test -- test/index.test.ts test/index-retry.test.ts test/runtime-rotation-proxy.test.ts test/rotation-account-selection.test.ts test/failure-policy.test.ts test/request-transformer.test.ts test/stream-failover.test.ts test/rate-limit-backoff.test.ts
npm run buildExercise one real routing path (codex-multi-auth-codex exec with rotation enabled, or codex-multi-auth rotation status after) to confirm the changed reasoning shows up correctly.
- policy delta is clearly stated
- request invariants remain covered
- runtime rotation stays default-on, loopback-only, and authenticated unless the release plan explicitly changes that policy
- retry or fallback changes have targeted regression tests
- reviewers can tell whether behavior changed intentionally or accidentally
- exhaustion/exit contracts (
codex_runtime_rotation_pool_exhausted,codex_pinned_account_unavailable) still carryreason,retry_after_ms, andaccount_skip_reasons - no storage or CLI refactor was mixed into the same change