Codex input_image base64 silently destroyed by JSONL redaction
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 5.1k
- Forks
- 475
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 178
Description
Summary
redact.shouldSkipJSONLObject only skipped types matching HasPrefix(t, "image") or t == "base64". Codex embeds images as "type":"input_image", so the entropy scanner rewrites the base64 to REDACTED with no warning.
Impact
- Any Codex transcript that still contains inline
input_imagepayloads at redaction time loses image bytes irreversibly. - Subagent path is especially exposed (no image externalization before redact). Main session is safe only when image externalization is enabled.
Repro
line := []byte(`{"type":"input_image","image_url":"data:image/png;base64,<high-entropy>"}`+"\n")
out, _ := redact.JSONLBytes(line)
// out contains REDACTED; Claude {"type":"image",...} is preserved
Expected
input_image / output_image objects are skipped like Claude type:image.
Related
- Subagent externalization gap (companion issue)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with redact.shouldSkipJSONLObject and the redact.JSONLBytes entry point described in the issue, then inspect the existing handling for Claude type:image objects. Verify that input_image and output_image JSONL objects preserve their base64 payloads instead of becoming REDACTED, while ordinary high-entropy content remains redacted.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 78/100