openai / openai/codex-security
Codex Security 0.1.22: finalization resurrects resolved checkpoint deferrals and produces inconsistent durable coverage
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 10.8k
- Forks
- 801
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 257
Description
Summary
Codex Security 0.1.22 reproducibly retains an interim deferred checkpoint in terminal durable coverage after that checkpoint has been explicitly resolved before completion.
This was reproduced with a minimal synthetic target consisting of one 214-byte file. It does not depend on the original application repository.
No durable artifacts were manually edited.
Environment
- Codex Security plugin: 0.1.22
- Platform: macOS
- Fresh workbench state: yes
- Fresh scan state: yes
Minimal reproduction
Synthetic target:
- Files: 1
- Bytes: 214
- SHA-256:
3d06033bffeb0b451f0d1360430b46e281e4ef78bcdeb8487fca9a8ed44e4838
Scan ID:
71fee081-86ab-4d7a-9125-aa28f01b3321
Checkpoint ID:
synthetic-fixture-full-read
Lifecycle
- Start a fresh scan/workbench.
- Create an interim checkpoint with:
complete=falsecompleteness=partialdeferred=[synthetic-fixture-full-read]
- Complete the required review work.
- Submit the final semantic draft with:
complete=truecompleteness=completedeferred=[]openQuestions=[]- checkpoint state
RESOLVED_COVERED
- Finalize normally using the standard completion flow.
- Read back the durable artifacts.
Expected result
The resolved checkpoint should remain preserved in historical checkpoint evidence, but it should no longer count as a terminal deferral.
Expected terminal state:
- coverage:
complete - unresolved terminal deferrals:
0 synthetic-fixture-full-read:RESOLVED_COVERED- no open follow-up for that checkpoint
report.md, coverage.json, and scan-manifest.json should agree.
Actual result
After normal finalization:
coverage.jsonreportspartialsynthetic-fixture-full-readis reintroduced as a terminal deferred item- the same surface is also represented as
RESOLVED_COVERED report.mdrenders both the resolved state and an open follow-up
The final semantic draft immediately before completion was explicitly:
complete=truecompleteness=completedeferred=[]openQuestions=[]
So the resolved deferred ID is reintroduced during terminal finalization/projection.
Observed invariant violation
An interim checkpoint may remain in historical evidence, but once its terminal state is RESOLVED_COVERED, it should not remain in the final:
- deferred list
- open questions
- unresolved follow-ups
- unresolved terminal-deferral count
A genuinely unresolved terminal item should still remain deferred; the expected behavior is terminal-state reconciliation, not unconditional deletion of deferrals.
Additional notes
- Reproduced using fresh scan/workbench state.
- No application/private repository source is required to reproduce the issue.
- No credentials, production data, secrets, or customer data are involved.
- No product binaries or plugin internals were modified or reverse-engineered.
- No manual post-finalization editing of durable artifacts was performed.
I have a sanitized minimal reproduction package and final report available if useful.
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 at the standard completion flow that projects the final semantic draft into report.md, coverage.json, and scan-manifest.json. Trace how deferred and openQuestions entries are reconciled with terminal checkpoint states, then reproduce scan 71fee081-86ab-4d7a-9125-aa28f01b3321; done means resolved checkpoints remain historical evidence without unresolved deferrals, and all three artifacts agree on complete coverage.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- nodejs, typescript
- Domain
- cli, security
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100