Repository navigation
Conversation
Desktop 26.1007 folds the Account rate-limit selector and the reserve active flag into one boolean selector. The gate probe classified it as 'mixed' and rejected the whole owner, so external-Harness Composers kept the native usage restriction (send disabled while Codex quota is exhausted). Accept the merged selector as a new 'combined' gate kind, but only when every field it reads belongs to the known usage-domain whitelist; any unknown field still fails identification and keeps native restrictions. The separate account and combined forms must never appear together.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📜 Recent review details
📝 Summary
Merge Risk: ⚪ Minimal · up to
|
Summary
Desktop 26.1007 folds the Account rate-limit selector and the reserve
activeflag into one boolean selector. The Codex usage gate probe classified that merged selector asmixedand rejected the whole Composer owner, so external-Harness Composers fell back tounsupportedand kept the native usage restriction: the send button stayed disabled whenever the Codex subscription quota was exhausted, even with an external Harness selected and its adapter ready.This adds a
combinedgate kind:combinedwhen it readsauth.authMethod+limit.allowed+reserve.active(the two verified gates' fields), reads noreserve.hardBlocked, and every field it reads belongs to the usage-domain whitelist. It is then projected tofalseexactly like the account and reserve gates.hardBlockedmixed in, still classifies asmixed→ invalid →unsupported: unverifiable contracts keep native restrictions (fail-safe unchanged).accountselector (≤26.928) andcombined(26.1007+) are two generations of the same gate; if both are ever seen together the owner is rejected.combinedGateCount(renderer + desktop-control validator + tests).Root cause evidence (live Desktop 26.1007, quota exhausted)
reservegate (reserve.hardBlocked, snapshot match OK) plus one selector readingauth.accountId, auth.accountLoading, auth.accountStructure, auth.authLoading, auth.authMethod, auth.authenticatedAccountId, auth.plan, auth.userId, limit.allowed, limit.primary_window, limit.secondary_window, reserve.active→ classifiedmixed→invalid→ owner rejected →unsupported.disabled=truewith hermes selected and adapter ready, quota banner visible.disabled=falsewhile the quota banner (“Codex 和工作使用额度已用完”) is still displayed. Native Codex Composers keep the restriction.Test plan
npx vitest run --config tests/vitest.config.js packages/renderer-extension/test/renderer-codex-usage-gate.test.ts packages/desktop-control/test/contract-audit.test.ts— 20 passed. New cases: 26.1007 combined selector lifted for the external Composer only (shared store untouched, second Composer stays native,update(false)restores); combined selector reading a whitelist-external field staysunsupported; account + combined together rejected; audit counts.npx vitest run --config tests/vitest.config.js --exclude tests/release/release-version.test.mjson this branch vsorigin/mainbaseline: failed-file lists identical (49 pre-existing environment failures, e.g. optional SDK packages) — zero regressions from this change.npm run typecheck— only the 2 pre-existinghost-runtimeerrors present on main (verified via checkout baseline).npx eslinton all touched files — clean.npx prettier --check .— clean.Verified on commit 5a178f2.