Repository navigation
Conversation
The blocklist sanitizer only touched instruction surfaces (tool descriptions, the #2 system prompt); data fields stayed byte-exact, so one quoted trigger phrase anywhere in a long thread history made every later request fail with upstream permission_denied. New OPENCODEX_DEVIN_SANITIZE_DATA_SURFACES=1 opt-in extends the same rewrites to message text (#3), tool-call arguments (#6.3), image captions (#10.3) and replayed thinking (#11). Identifiers (tool name, tool_call_id) and opaque signature blobs stay byte-exact. Off by default: rewriting literal history changes what the model sees, so refusing stays the default failure. The permission_denied hint now names the opt-in. Tests pin both modes: data literal by default, rewritten when enabled.
Two more live-isolated triggers in the Codex CLI developer boilerplate: the identity sentence "Codex refers to the open-source agentic coding interface" and the "Don not output ANSI escape codes directly — the CLI renderer applies them" bullet. Both are rewritten meaning-preservingly like the existing entries. Also adds the dump/bisect probe scripts used to isolate the triggers.
Keep reasoning signatures only when the serialized thinking is unchanged. Preserve signature-only replay and default-off sanitization, and add wire, authentication and continuity regressions with matching adapter docs.
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
|
✅ Deterministic PR hygiene checks passed. |
Summary
Codex CLI boilerplate can cause Cognition to refuse otherwise valid Devin requests with
permission_denied. Add two narrowly matched instruction rewrites and an off-by-defaultOPENCODEX_DEVIN_SANITIZE_DATA_SURFACES=1option for histories that quote known trigger phrases.The option rewrites joined message text, tool-call arguments, image captions and replayed thinking in the outgoing payload. Tool names and call IDs remain unchanged. Rewritten thinking is sent without its stale signature/type; unchanged and signature-only replay retain their original fields. Stored history is unchanged. Exact quoted text may change when opted in, and unsigned replay does not guarantee upstream acceptance.
Local credential-reading diagnostic scripts are excluded from the final diff. Prepared and reviewed first in luvs01#817.
Verification
Current head:
33884d887cc1ebecb3049e8ec87330149df045bb, integrated with upstream devaa30ea9d5e.bun test tests/providers/devin-adapter.test.ts tests/providers/devin-chat-wire-fixes.test.ts tests/providers/devin-reasoning-continuation.test.ts tests/providers/devin-anthropic-signature-fallback.test.ts tests/providers/devin-hardening.test.ts tests/providers/devin-image-passthrough.test.ts: 218 pass, 0 fail, 1,647 assertions.bun check --no-script --noEmit: passed, 2,433 files.bun run structure:check,bun run privacy:scanandgit diff --check: passed.codex-account-pool-target-switch.test.tsx:262, 3 reads expected, 2 observed); that failure is recorded separately and has not been dismissed or rerun.b534b8849b: the formerly denied Devin chat completed with HTTP 200 and an OK response. This predates the signature-consistency follow-up and is not evidence for live acceptance of rewritten signed thinking.test:changedselection was blocked by automatic approval review for unrelated external Google egress; it was not retried through another route. Focused transport tests use mocked network responses. Broader coverage is left to hosted CI.Checklist
Summary by CodeRabbit
"1".