Conversation
|
✅ Deterministic PR hygiene checks passed. |
✅ READY
Hygiene✅ Deterministic PR hygiene checks passed. |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Repository: luvs01/opencodex/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: 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. Comment |
Encrypted-task recovery rebound the conversation-only termination scope on the reparsed request after the early binding was removed. The kiro composite binding in transport overwrote it only by ordering, and a bind that produces no composite digest would leave the stale scope live for the adapter's delivered-answer suppression. Document the cross-request scope contract in structure/: the binding site, composite material, recording and consumption now live in providers/kiro.md, with the transport ownership row updated. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
|
Fixed in c680397 — removed |
|
Fixed in c680397 — documented the new scope contract in |
…kiro route The composite termination scope now binds only in transport for the kiro adapter, so the openai-chat spy could no longer observe a bound scope. Record the delivered answer through a real kiro turn and replay against the kiro route, preserving the reparse-rebind and follow-up assertions. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
Already addressed in c680397 — the recovery reparse no longer calls |
|
Already addressed in c680397 — the scope contract is documented in |
…d time A Kiro 429/401 can rotate the serving credential after the termination scope is bound, so an eagerly-hashed servingAccount pinned every record to the credential that failed -- and for key-authenticated routes it was always null, letting one key's delivered answer suppress a replay that belonged to a different key. Bind a resolver instead: conversation, admission, and route stay eager, while the serving credential resolves when the answer is checked or recorded, tracking route.provider through every failover site. Key routes now contribute their non-secret apiKeyAccountLogLabel so distinct keys never share a scope. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
…terminal Two follow-on Devin Review findings on the termination scope: - A request carrying only x-codex-parent-thread-id bound the shared parent lane as its scope, so every sibling under one parent collapsed into a single conversation and could suppress each other. The bind now takes the child-specific lane only (sessionSpecificLaneIdFromRequest) and falls back to the Cursor conversation id; a parent-only request binds no scope rather than treating a coalescing group as one child. - The lazy credential resolver made the check read whatever selection the request was bound with, which can go stale between prepare and dispatch. prepareAdapterExchange now runs the same selection-binding revalidation dispatch uses (selectionIsCurrent/refreshDispatchAdapter) before evaluating localTerminal, then rebinds the reasoning replay scope, so a record made by a replaced credential cannot suppress work the send path would have moved onto the live one. Regressions: an e2e asserting two requests sharing only a parent header both reach upstream, and unit coverage of the stale-binding refresh ordering at the local-terminal boundary. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
The serving-credential element hashed the configured env:/keychain: reference, so a rotation behind a stable expression kept the old identity's scope. credentialIdentity digests the resolved wire credential instead — the same primitive reasoning-metadata uses to bind learned refusals to what was actually sent. A failed dispatch refresh left the route stale but still evaluated localTerminal, letting a stale-credential record suppress a turn and return success where the credential error belonged. The terminal is now skipped after a failed refresh; the send path re-validates and surfaces the mapped error on its own terms. Adds an env-rotation e2e regression and a failed-refresh dispatch test, and keeps structure/providers/kiro.md in sync. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
|
End-to-end verification of Environment: Windows, real
Request log rows for suppressed turns: GUI golden path: Tested via Devin session: https://app.devin.ai/sessions/d60838d35393455abb53c5ab4a54ca18 |
|
Closing: current dev already isolates delivered final answers — src/responses/turn-termination.ts has �indTurnTerminationScope keyed by a WeakMap on the parsed request, bound from |
|
Devin is currently unreachable - the session may have died. |
Motivation
Description
sessionSpecificLaneIdFromRequest:thread ?? session, with the parent included only as a coalescing prefix — a parent-only lane binds no scope), the admission identity,route.providerName,route.modelId, and the resolved serving account, then normalize/hash the composite before using it as the cache key viabindTurnTerminationScope.credentialIdentity— the digest of the resolved wire credential rather than the configured$ENV/keychain:reference — so a rotation behind a stable reference terminates the old identity's scope; an OAuth snapshot account id wins when bound, and the Codex auth context is the last resort.selectionIsCurrent/refreshDispatchAdapter) before evaluatinglocalTerminal, so a record a since-replaced credential made cannot suppress work the send path would have moved onto the live one; a failed refresh skips the terminal entirely and the send path surfaces the credential error.bindTurnTerminationScopeusage so no insufficiently scoped record is retained before routing and auth are known.tests/server-kiro-completion-e2e.test.ts(sibling isolation, key-pool failover following the serving credential, env-backed key rotation, parent-only lane binds nothing) plus dispatch-level coverage intests/responses/adapter-dispatch-local-terminal.test.tsfor the pre-terminal staleness check and the failed-refresh path.Testing
bun test tests/server-kiro-completion-e2e.test.ts— 19/19 pass including the new regressions.bun test tests/responses/adapter-dispatch-local-terminal.test.ts— 4/4 pass.bun run typecheck,bun run privacy:scan,bun run structure:check— all pass.Codex Task
Link to Devin session: https://app.devin.ai/sessions/d60838d35393455abb53c5ab4a54ca18
Open in Devin Desktop: https://app.devin.ai/desktop/session/d60838d35393455abb53c5ab4a54ca18?variant=devin
Requested by: @luvs01