Pasting small JSON with nested escaped JSON freezes Codex composer / VS Code extension
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
- Paste the original JSON text into the Codex composer.
- The Codex UI freezes.
- 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.messagelogs[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.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗