Pasting small JSON with nested escaped JSON freezes Codex composer / VS Code extension

Resolved 💬 1 comment Opened Jun 2, 2026 by Ice-wilderness Closed Jun 2, 2026

Summary

Pasting a small JSON debug export into the Codex composer can freeze the UI. The same input also caused the VS Code Codex extension window to become unresponsive when opening a conversation that contained the pasted text.

This does not appear to be caused by text size. The original private file was only about 1.9 KB, 38 lines, with the longest line under 500 characters. Longer plain text inputs do not reproduce the freeze.

The likely trigger is a JSON object containing duplicated fields whose values are stringified JSON/XHR error objects, e.g. "{\"readyState\":4,...}" inside an outer JSON document.

Affected surfaces

  • Codex desktop app composer
  • VS Code Codex extension / Webview conversation view
  • Windows environment reported by the user

Observed behavior

  1. Paste the original JSON text into the Codex composer.
  2. The Codex UI freezes.
  3. In VS Code, opening the conversation containing the same pasted text causes the VS Code window to become unresponsive and show the native "The window is not responding" dialog.

Expected behavior

The composer should accept the text, or at least fail gracefully without freezing the UI/window.

Isolation notes

The original private JSON was inspected and did not contain obvious hidden-character hazards:

  • No control characters
  • No zero-width characters
  • No bidi control marks
  • Not large: approximately 1.9 KB / 38 lines
  • Longest line was approximately 468 characters
  • It contained 108 escaped quotes, all from nested stringified JSON values

The freeze stopped when the nested stringified error fields were removed/replaced. The two suspicious fields were:

  • reason.message
  • logs[0].entries[0].error

Both contained nearly the same stringified XHR/GM request error object.

Sanitized repro payload

The domains, site names, site keys, and paths below are redacted. The important preserved detail is the duplicated nested escaped JSON string.

{
  "tool": "RedactedDebugLogs",
  "exportedAt": "2026-06-02T13:14:18.378Z",
  "retentionDays": 3,
  "logs": [
    {
      "siteKey": "redacted-site-key",
      "siteName": "redacted-site-name",
      "mode": "direct-api",
      "pageUrl": "https://example.invalid/",
      "startedAt": "2026-06-02T13:13:22.000Z",
      "savedAt": "2026-06-02T13:13:23.000Z",
      "reason": {
        "outcome": "error",
        "status": "failed",
        "stage": "direct-api",
        "message": "{\"readyState\":4,\"responseHeaders\":\"\",\"finalUrl\":\"https://example.invalid/redacted_endpoint.php\",\"status\":0,\"statusText\":\"\",\"responseText\":\"\",\"DONE\":4,\"HEADERS_RECEIVED\":2,\"LOADING\":3,\"OPENED\":1,\"UNSENT\":0,\"RESPONSE_TYPE_TEXT\":\"text\",\"RESPONSE_TYPE_ARRAYBUFFER\":\"arraybuffer\",\"RESPONSE_TYPE_BLOB\":\"blob\",\"RESPONSE_TYPE_DOCUMENT\":\"document\",\"RESPONSE_TYPE_JSON\":\"json\"}"
      },
      "entries": [
        {
          "type": "gmRequest",
          "method": "GET",
          "url": "https://example.invalid/redacted_endpoint.php",
          "requestHeaders": {
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
          },
          "requestBody": "",
          "responseType": "arraybuffer",
          "status": "error",
          "pageUrl": "https://example.invalid/",
          "time": "2026-06-02T13:13:22.000Z",
          "error": "{\"readyState\":4,\"responseHeaders\":\"\",\"finalUrl\":\"https://example.invalid/redacted_endpoint.php\",\"status\":0,\"statusText\":\"\",\"responseText\":\"\",\"DONE\":4,\"HEADERS_RECEIVED\":2,\"LOADING\":3,\"OPENED\":1,\"UNSENT\":0,\"RESPONSE_TYPE_TEXT\":\"text\",\"RESPONSE_TYPE_ARRAYBUFFER\":\"arraybuffer\",\"RESPONSE_TYPE_BLOB\":\"blob\",\"RESPONSE_TYPE_DOCUMENT\":\"document\",\"RESPONSE_TYPE_JSON\":\"json\"}",
          "durationMs": 1306
        }
      ]
    }
  ]
}

Possible area to inspect

This looks like it may be in the paste/composer preprocessing path, preview rendering, Markdown/linkification, JSON detection/formatting, syntax highlighting, token estimation, or conversation Webview rendering path. The input is too small for the freeze to be explained by raw size alone.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗