Skip to content

fix(codex): reconcile prior cooldown after manual credit reset - #3995

Closed
luvs01 wants to merge 1 commit into
lidge-jun:devfrom
luvs01:agent/reset-credit-cooldown-recovery-20260908
Closed

fix(codex): reconcile prior cooldown after manual credit reset#3995
luvs01 wants to merge 1 commit into
lidge-jun:devfrom
luvs01:agent/reset-credit-cooldown-recovery-20260908

Conversation

@luvs01

@luvs01 luvs01 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #3973.

A confirmed manual reset can refresh the displayed usage while the same account remains blocked by its older local quota cooldown. Reconcile only the captured ordinary reset-derived cooldown after code: "reset" and a complete post-reset usage observation for the same credential identity.

Capture the cooldown object before consuming the credit, then settle it once without changing pins, pauses or account selection. Preserve explicit Retry-After, Spark/Reserve scopes, newer failures, replaced identities and deleted/recreated cooldown state. Drain pre-existing Pool quota requests before obtaining recovery evidence; the main path retains its native claim and identity-generation checks. already_redeemed and durable replay do not clear cooldowns.

Once the credit has been consumed, a failed or busy usage refresh retains the confirmed success code and the cooldown. It omits remaining when no fresh same-identity credit count is available, so a read failure does not invite spending another credit. The management API reference in English/Korean and the CLI reference describe this contract.

Scope is six files. Strict-quota waiting (#3738) and background recovery scheduling are separate. Canonical reset-operation alias settlement (#3965) is already present in this PR's base branch.

Verification

Head e172453052bf7bbc4a0ae5aa24592982c0c64b15, based on dev 402be7c1f88283eb8465c3aec8437ccecd2542ec.

  • Final authentication API plus reset-operation ledger suites: 318 passed, 1,281 assertions across two files with the project-pinned Bun 1.4.0 on Windows. Mock coverage includes main/Pool recovery, joined old observations across credential generations, replay, identity replacement, newer cooldowns, independent scopes, and refresh failure.
  • Independent review found an initial-main-identity regression: a first reset or already_redeemed response could lose its fresh remaining count. Both new cases failed before the correction. Reconcile main identity under the existing native claim before capturing the baseline; the corrected authentication API suite passed 271 tests / 1,060 assertions before the final combined run. Read-only re-review confirmed the fix and found no further blocker.
  • After completing the sparse checkout's validation inputs, the affected source-oracle/integration checks passed: 285 tests / 1,287 assertions across four files, plus 3 source-oracle checks / 17 assertions across two files.
  • The previously failing Desktop lifecycle deadline cases passed in focused revalidation: ten in one run and the remaining disconnect-after-clear case separately (1 passed / 5 assertions, 12.66 seconds within its unchanged 15-second internal deadline, on the pre-review-correction head 5ee4d5910). A prior single-case control using the parent runtime source also passed at 14.52 seconds. This is evidence of timing sensitivity, not proof that all larger-suite failures were environmental.
  • bun run typecheck, bun run privacy:scan, and git diff --check: passed. Documentation build: 425 pages, with the changed generated text checked without opening a preview.
  • Rebase onto the merged reset-operation alias fix preserves its canonical settlement and both API-reference paragraphs. The current API and ledger were validated together after that rebase; the topic code is unchanged apart from the reviewed initial-main correction.
  • Fixtures and mock responses only; no live reset credit was consumed and no production settings were changed.

The larger import-connected local test run was incomplete and is not reported as green. The full contributor CI is now successful: 26/26 jobs on this exact head, attempt 2. The first attempt had 24 successful jobs and one config-lock fixture failure (plus the aggregate): cleanup expected child exit 0 but received 143. The unchanged failing case passed locally with its original deadline; one retry of the failed Windows job and aggregate then passed. This preserves the first failure as timing/lifecycle evidence rather than treating it as an initial clean run.

The existing reset-credit handler was also invoked with mocked responses on this head for reset/already_redeemed, with/without remaining, and load(true) returning false: all four cases returned success and closed the modal contract after exactly one consume and one refresh call. The controller converts read failures to false; the component closes the reset/confirmation state from close: true. No automatic credit re-consumption occurs in that path. This is bounded handler/source evidence, not an interactive UI test or a claim that a later manual action reuses the same operation ID.

CodeRabbit's exact-head review found no functional blocker. Maintainer sponsorship for the protected authentication/routing surface and explicit security review remain pending; agent review does not satisfy that requirement. The earlier attribution notice referred to #3965 in the base branch; the clarified description and commit text contain no declared attribution references in the repository checker.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

Review readiness checklist

  • All CI tests are green on my local testing.
  • I pushed my PR to the latest dev commit.
  • I resolved all correct Codex and CodeRabbit findings.
  • My PR is ready for review.

Summary by CodeRabbit

  • New Features

    • Manual Codex credit resets now clear a previous reset-related cooldown only after a fresh, complete usage check confirms recovery for the same account.
    • Successful resets remain valid even when usage reconciliation is unavailable or busy; remaining credits may be omitted until usage is refreshed.
    • New usage refresh attempts avoid consuming another credit.
  • Documentation

    • Updated management API and CLI documentation to explain reset recovery, preserved limits, and retry behavior.

@github-actions github-actions Bot added the intake: hygiene-blocked Deterministic PR hygiene checks failed label Sep 8, 2026
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: c47fcdb7-64b6-4255-9d8f-caf31cecb904

📥 Commits

Reviewing files that changed from the base of the PR and between 402be7c and e172453.

📒 Files selected for processing (6)
  • docs-site/src/content/docs/ko/reference/management-api.md
  • docs-site/src/content/docs/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/reference/management-api.md
  • src/codex/auth-api.ts
  • src/codex/routing.ts
  • tests/codex-integration/codex-auth-api.test.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

Manual reset-credit consumption now clears a matching reset-derived quota cooldown only after a fresh, complete usage read confirms the same account identity. Identity changes, newer failures, incomplete reads, busy reconciliation, and replayed operations preserve cooldown state. Tests and documentation cover these cases.

Changes

Reset-credit recovery

Layer / File(s) Summary
Cooldown capture and guarded settlement
src/codex/routing.ts
Adds a one-shot cooldown capture function. It clears only unchanged reset-derived cooldown entries after confirmed recovery and protects newer failures and delete/recreate cases.
Reset consumption and quota reconciliation
src/codex/auth-api.ts
Tracks account identity and pool credentials during reset consumption. Pool refreshes drain existing flights before a fresh read. Remaining credits and cooldown settlement require matching identity and credential continuity.
Recovery validation and contract documentation
tests/codex-integration/codex-auth-api.test.ts, docs-site/src/content/docs/reference/management-api.md, docs-site/src/content/docs/reference/cli/providers-accounts.md, docs-site/src/content/docs/ko/reference/management-api.md
Tests cover busy, incomplete, stale, replacement, replay, and first-use paths. Documentation describes fresh usage confirmation, preserved limits, and omitted remaining values.

Priority: ➖ Normal — Impact reflects medium issue severity.

Estimated code review effort: 4 (Complex) | ~45 minutes

Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to e1724

Reset-credit recovery now clears only matching ordinary cooldowns after fresh same-account usage confirmation, while preserving newer failures and unrelated limits. No actionable merge-blocking risk is identified.

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant ResetCreditsAPI
  participant QuotaRefresh
  participant CooldownState
  Operator->>ResetCreditsAPI: consume reset credit
  ResetCreditsAPI->>CooldownState: capture existing cooldown
  ResetCreditsAPI->>QuotaRefresh: drain flights and request fresh usage
  QuotaRefresh-->>ResetCreditsAPI: return usage and account identity
  ResetCreditsAPI->>CooldownState: clear matching reset-derived cooldown
  ResetCreditsAPI-->>Operator: return success and fresh remaining credits when available
Loading

Suggested reviewers: lidge-j

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 3 files. (3 skipped: 3… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The implementation addresses issue [#3973]. It captures the prior cooldown in src/codex/auth-api.ts, settles it through identity- and generation-aware logic in src/codex/routing.ts, preserves newer fa…
Out of Scope Changes check ✅ Passed The changes remain within the linked issue scope. The modified authentication and routing code implements cooldown reconciliation, the tests validate the required reset and identity behavior, and the …
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: reconciling an account's prior cooldown after a manual Codex credit reset. It matches the implementation and documentation changes.
Full details: Docstring Coverage

Explanation

Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 3 files. (3 skipped: 3 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

⚠️ Deterministic hygiene checks failed.

  • unsponsored_surface — This changes an authentication, workflow, release-automation, or dependency surface. MAINTAINERS.md requires security review for these; ask a maintainer to apply maintainer-sponsored once they have reviewed it. Paths: src/codex/auth-api.ts.
  • missing_coauthor_credit — This pull request says it reimplements, supersedes, carries, or rebases another author's pull request, but no Co-authored-by trailer names that author. Prose in a commit body is not read by anything; the trailer is what GitHub counts. Add it to the description or a commit, or obtain attribution-approved. Paths: #3965.

@github-actions github-actions Bot added the bug Something isn't working label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • hygiene: unsponsored_surface.

What to do

  • Fix unsponsored_surface — This changes an authentication, workflow, release-automation, or dependency surface. MAINTAINERS.md requires security review for these; ask a maintainer to apply maintainer-sponsored once they have reviewed it. Paths: src/codex/auth-api.ts.
  • Tick all four boxes in the PR description once you're done (currently 3/4).

Review readiness checklist

  • ✅ All CI tests are green on my local testing.
  • ✅ I pushed my PR to the latest dev commit.
  • ✅ I resolved all correct Codex and CodeRabbit findings.
  • ⬜ My PR is ready for review.

3/4 boxes ticked.

This pull request was already a draft. Its draft status will be preserved after every issue above is resolved.
@luvs01 Tick the boxes once your local CI is green, your branch is on the latest dev commit, and every correct Codex and CodeRabbit finding is resolved.

Hygiene

⚠️ Deterministic hygiene checks failed.

  • unsponsored_surface — This changes an authentication, workflow, release-automation, or dependency surface. MAINTAINERS.md requires security review for these; ask a maintainer to apply maintainer-sponsored once they have reviewed it. Paths: src/codex/auth-api.ts.

@luvs01

luvs01 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

Please review head e172453052bf7bbc4a0ae5aa24592982c0c64b15, including cooldown object identity, fresh main/Pool quota evidence, replay, and the initial-main generation regression. The final API/ledger suites passed 318 tests; full contributor CI is running. Maintainer sponsorship and explicit security review for src/codex/auth-api.ts are requested before review-ready status.

@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== PR metadata and checks ==='
gh pr view 3995 --repo lidge-jun/opencodex \
  --json number,title,headRefOid,baseRefOid,files,reviewDecision,statusCheckRollup \
  --jq '{number,title,headRefOid,baseRefOid,files: [.files[].path], checks: [.statusCheckRollup[] | {name,status,conclusion,detailsUrl}]}'

echo '=== Changed file summary ==='
git diff --stat HEAD^ HEAD
git diff --name-status HEAD^ HEAD

echo '=== Full PR diff ==='
git diff --find-renames --find-copies --unified=80 HEAD^ HEAD

echo '=== Relevant source outlines ==='
fd -a '^(auth-api|.*ledger.*|.*auth.*)\.(ts|tsx)$' . -E node_modules -E dist | while IFS= read -r file; do
  echo "--- $file"
  ast-grep outline "$file" --items all --type function,class,interface,type --view compact || true
done

echo '=== Focused identifiers with context ==='
rg -n -i -C 8 \
  'reset-derived|already_redeemed|retry-after|cooldown|redeem|identityGeneration|identity.*generation|quota' \
  --glob '*.{ts,tsx,md}' \
  -g '!node_modules/**' -g '!dist/**' .

echo '=== Test names and relevant assertions ==='
fd -a -E node_modules -E dist | rg '(^|/)(test|tests|__tests__)/|(\.|-)(test|spec)\.(ts|tsx)$' | while IFS= read -r file; do
  if rg -q -i 'reset-derived|already_redeemed|cooldown|redeem|quota' "$file"; then
    echo "--- $file"
    rg -n -i -C 6 'reset-derived|already_redeemed|cooldown|redeem|quota' "$file"
  fi
done

Length of output: 201943


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base="$(git merge-base HEAD origin/dev 2>/dev/null || git merge-base HEAD HEAD^)"
echo "=== merge base: $base ==="
echo '=== PR files ==='
git diff --name-status "$base" HEAD
echo '=== PR patch ==='
git diff --find-renames --unified=35 "$base" HEAD

echo '=== CI state ==='
gh pr view 3995 --repo lidge-jun/opencodex --json headRefOid,statusCheckRollup \
  --jq '{headRefOid,checks:[.statusCheckRollup[] | {name,status,conclusion,detailsUrl}]}'

echo '=== Definitions and usages of reconciliation APIs ==='
rg -n -C 12 \
  'function (capture|settle|reconcile).*Cooldown|const (capture|settle|reconcile).*Cooldown|capture.*cooldown|settle.*cooldown|reconcile.*cooldown|cooldownSource|identityGeneration|generation.*identity' \
  src/codex tests \
  -g '*.{ts,tsx}'

echo '=== Changed-test names ==='
git diff --unified=3 "$base" HEAD -- tests | rg -n -C 4 '^[+-].*(test|describe)\(' || true

echo '=== Changed documentation sections ==='
git diff --unified=20 "$base" HEAD -- '*.md'

Length of output: 209692


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Reset endpoint admission and native-main claim ==='
sed -n '2280,2495p' src/codex/auth-api.ts

echo '=== Main usage read and freshness result construction ==='
sed -n '760,1020p' src/codex/auth-api.ts

echo '=== Pool usage result types, commit path, and flight handling ==='
sed -n '1180,1455p' src/codex/auth-api.ts

echo '=== Cooldown stores and lifecycle clearing paths ==='
sed -n '1,120p' src/codex/routing.ts
sed -n '620,710p' src/codex/routing.ts
sed -n '2380,2490p' src/codex/routing.ts
rg -n -C 8 'clearCodexUpstreamHealth|deleteScopedHealth|setScopedHealth|clear.*Health' src/codex/routing.ts src/codex/account-lifecycle.ts

echo '=== Failed check annotations and logs ==='
for run in 34184176148 34184176157; do
  echo "--- workflow $run"
  gh run view "$run" --repo lidge-jun/opencodex --json status,conclusion,event,headSha,workflowName,jobs \
    --jq '{status,conclusion,event,headSha,workflowName,jobs:[.jobs[]|{name,conclusion,startedAt,completedAt,databaseId,url}]}'
done
echo '--- hygiene log'
gh run view 34184176148 --repo lidge-jun/opencodex --job 101929084539 --log-failed || true
echo '--- enforce-target log'
gh run view 34184176157 --repo lidge-jun/opencodex --job 101929124312 --log-failed || true

echo '=== PR base and reviewer state ==='
gh pr view 3995 --repo lidge-jun/opencodex --json baseRefName,headRefName,reviewRequests,reviews \
  --jq '{baseRefName,headRefName,reviewRequests,reviews:[.reviews[]|{author:.author.login,state,body}]}'

Length of output: 212627


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Reset authentication wrapper ==='
rg -n -C 20 'async function withResetCreditAuth|function withResetCreditAuth|withResetCreditAuth\(' src/codex/auth-api.ts

echo '=== Main claim fields in the reset authentication result ==='
rg -n -C 14 'nativeMainLease|nativeMainSharedClaimHeld|isMain:' src/codex/auth-api.ts

echo '=== Auth-surface ownership requirements ==='
if [ -f MAINTAINERS.md ]; then
  sed -n '1,240p' MAINTAINERS.md
fi

echo '=== PR labels and gate comment ==='
gh pr view 3995 --repo lidge-jun/opencodex --json labels,comments \
  --jq '{labels:[.labels[].name],gateComments:[.comments[]|select(.author.login=="github-actions[bot]")|.body]}'

Length of output: 44143


@luvs01 Full review completed for e172453052bf7bbc4a0ae5aa24592982c0c64b15.

I found no functional blocker in the cooldown reconciliation implementation.

Reviewed behavior

  • src/codex/auth-api.ts, Lines 2380-2480 captures the cooldown before the reset consume request. It settles the capture only for code: "reset".
  • src/codex/routing.ts, Lines 861-885 uses object identity for both the shared scoped entry and the account-wide entry. A newer cooldown write, a replacement object, or delete-and-recreate state cannot be cleared by the older captured closure.
  • src/codex/auth-api.ts, Lines 2446-2457 keeps main-account reconciliation inside the existing native-main shared claim. It requires the captured main identity generation, the completed read generation, and the current ChatGPT account ID to match.
  • src/codex/auth-api.ts, Lines 2458-2472 drains pre-reset Pool quota flights before it obtains recovery evidence. It then requires a fresh, live credential generation and the original replacedAt lineage.
  • src/codex/routing.ts, Lines 870-883 clears only ordinary shared and account-wide reset-derived cooldowns. It does not clear Spark or Reserve scope entries. It also preserves explicit Retry-After and other cooldown sources.
  • src/codex/auth-api.ts, Lines 2362-2369 returns durable replay before cooldown capture. Therefore, replay cannot clear a cooldown.
  • tests/codex-integration/codex-auth-api.test.ts, Lines 2733-3060 adds focused coverage for main and Pool recovery, identity replacement, new failures, recreation, credential replacement, Retry-After, in-flight Pool observations, multi-generation flights, and durable replay.
  • tests/codex-integration/codex-auth-api.test.ts, Lines 3361-3400 covers the initial main-account identity case. The explicit reconcileMainCodexAccountRuntimeState() before generation capture addresses the reported missing remaining regression.

Required follow-up before review-ready

The current PR checks are not green.

  • hygiene fails with unsponsored_surface and missing_coauthor_credit.
  • enforce-target fails for the same two policy requirements.
  • The PR has the intake: hygiene-blocked label.
  • MAINTAINERS.md requires explicit security review for this authentication and credential-handling change.

Add the required maintainer sponsorship and attribution credit. Then obtain the requested explicit security review. These requirements remain separate from this code review.

✅ Action performed

Full review finished.

@lidge-jun

Copy link
Copy Markdown
Owner

리뷰 · 우선순위 71 / 80

이 PR은 이슈 #3973을 고칩니다. 수동 reset-credit이 code: "reset"으로 성공해도, 같은 계정에 남아 있던 예전 local reset-derived 쿨다운이 그대로면 UI usage는 새로워 보이는데 요청은 계속 막힙니다. 지금 dev tip(402be7c1f)에는 #3965로 reset 연산 별칭 정본화와 #3970 저널 직렬화가 이미 들어가 있지만, “성공 직후 같은 identity의 완전한 usage 관찰이 있을 때만 ordinary reset-derived 쿨다운을 지운다”는 복구 계약은 아직 없습니다.

하는 일은 두 축입니다. src/codex/routing.tscaptureCodexResetCreditCooldown를 추가해, consume 전에 shared/account 쿨다운 객체 참조를 캡처하고, 복구가 증명되면 object-identity fence로 그 객체만 지웁니다(새 실패·delete/recreate ABA·Retry-After·Spark/Reserve는 남김). src/codex/auth-api.ts는 main/Pool 모두 reset 성공 후 fresh usage를 읽고, identity/generation이 같을 때만 recoverCooldown(true)를 호출합니다. Pool은 리셋 전 in-flight quota flight를 먼저 drain하고(joinExisting=false), 조회 실패·busy면 code: "reset"은 유지하되 cooldown은 남기고 remaining을 생략합니다. already_redeemed/replay는 쿨다운을 지우지 않습니다. en/ko management API·CLI 문서와 큰 테스트 매트릭스(main/pool, identity 교체, incomplete, retry-after 등)가 같이 옵니다.

현재 dev의 reset-credit 열차(#3965/#3970)와 맞물리는 자연스러운 다음 칸입니다. types/config 대분할과 무관합니다. 다만 draft이고 hygiene unsponsored_surfaceauth-api.ts/routing.ts가 막혀 있으며 enforce-target도 실패입니다. busy quota 테스트 의미가 503 server_busy에서 “확인된 reset 유지 + cooldown 보존”으로 바뀌었는데, 계약 변경이 의도라면 문서·클라이언트 재시도 가이드와 일치하는지 메인테이너가 한 번 더 보면 좋습니다.

라인 src/codex/routing.ts captureCodexResetCreditCooldown - object identity로 이전 reset-derived만 지운다. Spark/Reserve·새 실패·ABA에 강하다
라인 src/codex/auth-api.ts reset consume 경로 - main은 native claim 아래 identity generation, Pool은 credential generation/replacedAt으로 same-identity를 가드한다
라인 fetchPoolAccountQuota joinExisting=false - 리셋 전 flight를 복구 증거로 쓰지 않게 drain한다. 맞는 방향이다
경로 tests/.../codex-auth-api.test.ts - busy 케이스가 503 → 200+cooldown 유지로 바뀌었다. API 계약 변경이다
경로 docs management-api / CLI providers-accounts - “조회 실패 시 remaining 생략, 크레딧 재소비 금지”를 분명히 적었다
경로 intake: hygiene-blocked - unsponsored_surface. 스폰서 또는 maintainer carry 필요

메인테이너의 판단이 필요한 지점

  • busy/실패 시 예전처럼 503을 줄지, 확인된 reset 200 + cooldown 유지를 새 계약으로 확정할지
  • auth-api.ts/routing.ts 스폰서십을 이 PR에 줄지 carry로 가져갈지
  • #3973을 이 PR과 함께 닫을지

너의 추천
계약(200 유지 + remaining 생략 + 재소비 금지)을 받아들이면 스폰서십 후 머지하세요. #3965와 겹치지 않고 #3997과도 파일이 거의 안 겹칩니다. draft 해제 전 hygiene/enforce-target 녹색과, busy 계약 변경을 클라이언트가 오해하지 않는지(특히 GUI reset 버튼)만 확인하면 됩니다. close-don't-rebase 대상 아닙니다.

이 댓글은 grok-bot이 작성했습니다

lidge-jun pushed a commit that referenced this pull request Sep 8, 2026
Adapt cold-main, saturation and converged-flight coverage plus Korean API and CLI guidance from #3995 at e172453. Retain scoped recovery ownership and publication/refresh provenance.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
@luvs01

luvs01 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up to the client-contract check in #3995 (comment), on unchanged head e172453052bf7bbc4a0ae5aa24592982c0c64b15:

  • Invoked the existing reset handler with mocked reset / already_redeemed responses, each with and without remaining, while load(true) returned false. All four cases returned ok: true, close: true, and a success toast after exactly one consume request and one refresh call.
  • The read controller turns refresh failures into false. The handler preserves the confirmed reset; the component closes the reset and confirmation state. This path does not automatically consume another credit.
  • This is mocked handler execution plus source readback, not interactive UI testing. A later explicit manual redemption is a new action; the current handler does not promise reuse of an operation ID. The general success wording could also distinguish reset confirmation from immediate routing availability more clearly; that follow-up is separate from the observed no-auto-reconsume behavior.

Contributor CI now passes all 26 jobs on this head after one retry of the failed Windows job and aggregate. The description records both the initial failure and the successful retry. The PR remains Draft pending maintainer sponsorship and explicit security review.

@lidge-jun lidge-jun closed this Sep 8, 2026
@lidge-jun

Copy link
Copy Markdown
Owner

Landed via #4002 at 9ad218a

@lidge-jun lidge-jun added the landed-via-maintainer Original PR closed after landing via a maintainer merge train label Sep 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working intake: hygiene-blocked Deterministic PR hygiene checks failed landed-via-maintainer Original PR closed after landing via a maintainer merge train

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants