Repository navigation
Codex Security 0.5.0
Highlights
Codex Security 0.5.0 adds investigation time budgets, host-provided finding reviews, and more inference provider options. It also improves saved finding evidence, usage reporting, and recovery after interrupted scans and publication. The minor version marks the retirement of advisory capability preflight; custom integrations should follow the migration guidance below.
- Investigation budgets. Set an investigation allowance with
codex-security scan . --max-time 15, SDKmaxTimeMinutes, or project settingscan.max_time_minutes. Values are positive minutes, including fractions. Standard and diff scans treat the allowance as advisory; Deep Scan enforces it for discovery, then combines completed findings. Reporting can continue beyond the deadline. See the time-budget guide. (#1674) - Host-provided finding reviews. Hosts can validate findings against source with
codex-security validate --recordsandvalidateRecords(), or classify canonical reports against a supplied severity rubric withcodex-security classify-severity --recordsandclassifySeverityRecords(). Both use host-provided model execution; classification requires no repository or saved scan. See the validation guide and classification guide for input contracts and host responsibilities. (#1682, #1662) - Inference providers. Scans support Cheaper Inference through
--provider cheaperinference, an explicit model, andCHEAPER_INFERENCE_API_KEY. The GitHub Action adds aproviderinput for Amazon Bedrock, OpenRouter, and Fireworks alongside the default OpenAI provider; non-OpenAI providers require an explicit model and the selected provider's credentials. See the CLI provider documentation and Action setup guide. (#1623, #1677) - Saved results and recovery. Patching and fix verification use complete sealed evidence, and bulk scans validate saved artifacts before reusing completed results. See the upgrade guidance below.
Upgrade notes
Custom capability-preflight integrations
The plugin's scripts/config_preflight.py helper and preflight/capability-profiles.toml registry are removed. Custom capability registries and helper-derived progress inputs and events are no longer supported.
Migration steps for custom integrations
- Remove helper invocations, custom-registry arguments, and gates that wait for a helper
readyresult. Replace references toconfig-preflight.mdanddesktop-config-preflight.mdwith the scan runtime guidance. Use available delegation tools and successful spawn results; continue in the parent when workers cannot start. Do not edit persistent configuration to enable optional workers or goal tools. - Remove
kind: "preflight"handling fromonWorkerStatusconsumers, including reads ofdelegationandconfiguredSlots, and stop waiting for the CLI'sworker.preflightdiagnostic.onWorkerStatusstill emitskind: "dispatch"withphase,planned, andstarted. These counts are best-effort model reports; a missing event does not prove no worker ran. - Stop sending
preflightCheckstoupdate_codex_security_scan_progressand remove the workbench arguments--preflight-issues-jsonand--preflight-issues-json-stdin. For host-backed Standard and diff scans, use the authoritative scan context and advance tothreat_modelbefore architecture mapping. Deep Scan's coordinator continues to own its setup and progress.
Saved preflight history remains readable, and the scan lifecycle still includes a preflight phase. Local SDK preflight() input checks, authentication, sandbox enforcement, and Deep worker configuration remain in effect. Normal CLI and SDK scans need no capability-preflight configuration migration. (#1609)
Investigation time settings
Prefer the new minute-based settings for Standard, diff, and Deep scans. For existing Deep Scan configurations, convert hours to minutes:
| Previous setting | Preferred setting |
|---|---|
--max-time-hours 2 |
--max-time 120 |
SDK maxTimeHours: 2 |
SDK maxTimeMinutes: 120 |
Project scan.deep.max_time_hours: 2 |
Project scan.max_time_minutes: 120 |
The hour-based settings, including legacy TOML deep_scan.max_time_hours, remain accepted as deprecated Deep-only aliases. Explicit settings override lower-priority configuration across units. At the winning configuration source, equivalent durations are accepted; conflicting minute/hour values are errors.
Standard scans still have no time allowance by default. An allowance is neither a hard timeout nor a minimum runtime. Deep Scan's default and maximum discovery duration remain 5760 minutes (96 hours). Resuming Deep Scan retains its original deadline; rerunning starts a new allowance. For batch and component scans, project time settings apply separately to each scan attempt, not the campaign as a whole. See the time-budget guide. (#1674)
Saved scan evidence and recovery
Keep the complete sealed artifacts with saved scans used for patching or fix verification. Missing or mismatched evidence now stops those tasks instead of passing a shortened preview to the model. Bulk-scan resume validates saved contracts and seals before reusing a completed result; invalid or unsuccessful results start a new attempt while preserving the old artifacts. (#1608, #1720)
GitHub Action release assets
If automation downloads the Action manifest or SBOM from an npm-vX.Y.Z release, switch those downloads to the matching action-vX.Y.Z release. The npm release remains the canonical changelog and Latest release; Action version tags and workflow usage syntax are unchanged. See the Action release documentation. (#1711)
Selected-profile approval policy
An explicitly selected Codex profile's approval_policy now takes precedence over the root policy. If you previously relied on a root never policy despite a selected profile specifying on-request, set the selected profile's policy to never to continue denying permission requests. An absent or null profile policy still inherits the root value; Deep Scan workers retain their explicit never policy. (#530)
More improvements
- Hosted scans pass
reasoningEffortstrings through to the executor, includingmaxand future values supported by the selected model or provider. The GitHub Action'seffortinput also accepts provider-supported strings and retains itsxhighdefault. Deep Scan forwards resolved native settings to fresh and resumed workers while retaining worker-specific permissions. (#1712, #1717) - Standard and diff scans use available workers and continue review in the parent when delegation is unavailable. Optional worker or goal-tool availability no longer depends on the removed capability registry. (#1609)
- Patching and fix verification use complete sealed findings from saved scans, preserving current triage and remediation state. Workbench excerpts stay tied to the source and scope of the saved scan, and publishing older findings preserves their historical root-cause details and code evidence. (#1608, #488, #1756)
- Usage reporting distinguishes recorded tokens from missing worker receipts or unfinished turns. Partial totals display as "at least X tokens; some usage unavailable." Saved scan history includes parent/worker totals and measurement times alongside cost estimates; historical account-limit readings are not a live allowance check. See progress and cost. (#1640)
- Bulk-scan recovery validates completed artifacts before reusing them and preserves interrupted receipt bytes. Parallel workers serialize receipt writes, and publication replaces its latest receipt atomically. Completed Linear publication results remain available after late cancellation during a failed final receipt write. (#1720, #1748, #1735, #1738, #1725)
- Matching GitHub Action distributions publish their manifest, SBOM, and full distribution commit SHA in a companion
action-vX.Y.Zrelease. Artifact upload failures propagate the original stream error and cancel active streams. (#1711, #1671) - Failed or canceled
dedupe --json --full-outputcommands no longer print a false success envelope. Diff scans handle root commits in SHA-256 repositories and read blobs with Git versions older than 2.38. (#1071, #1716, #1715) - DOCX knowledge-base extraction excludes deleted revisions and field instructions while preserving visible field results. (#1714)
All changes
What's Changed
Breaking changes
- refactor(plugin)!: retire advisory capability preflight by @mldangelo-oai in #1609
- fix(plugin): select compatible Node runtimes for helpers by @mldangelo-oai in #1431
Features
- feat(validation): support host-provided standalone reviews by @zcrab-oai in #1682
- feat(action): support scan CLI inference providers by @mldangelo-oai in #1677
- feat(hosted): remove reasoning effort allowlist by @mluck-openai in #1712
- feat: add Cheaper Inference inference provider by @aiapienthusiast in #1623
- feat(classification): support canonical records with host reviews by @kmbroai in #1662
- feat(scan): add unified max-time investigation budgets by @mldangelo-oai in #1674
- feat(action): support GitHub Enterprise Cloud on ghe.com by @mldangelo-oai in #1713
Fixes
- fix(dedupe): do not report a successful envelope for a failed dedupe by @pasmud in #1071
- fix(examples): update Bedrock workflow to CLI 0.3.0 by @mldangelo-oai in #1675
- fix(github): normalize hostnames before credential lookup and API routing by @dipeshbabu in #1069
- fix(config): honor selected profile approval policy by @sylvesterkaczmarek in #530
- fix(plugin): use the SHA-256 empty tree for root commit diffs by @WenJing95 in #1716
- fix(plugin): read diff blobs with Git before 2.38 by @WenJing95 in #1715
- fix(plugin): separate diff revisions from paths in scan inputs by @WenJing95 in #1694
- fix(release): preserve generated-note command failures by @mldangelo-oai in #1729
- fix(knowledge-base): drop deleted revisions and field codes from DOCX by @LittleYier in #1714
- fix(config): URL-encode generated schema references by @dipeshbabu in #981
- fix(cli): detect Windows Yarn global installs in update notices by @WenJing95 in #1692
- fix(action): describe positive numeric input bounds by @WenJing95 in #1605
- fix: normalize CWE identifiers without integer conversion by @mldangelo-oai in #1723
- fix(cli): delete whole characters when editing patch instructions by @LittleYier in #1549
- fix(artifacts): adopt the registered target kind when sealing a scan draft by @IvanCaceres in #828
- fix(contract): reject remote targets the SDK reader refuses to load by @Mihir-Rabari in #1569
- fix(coverage): validate deferred source paths by @peter-research in #1573
- fix: validate code evidence paths by @peter-research in #1567
- fix: label incomplete scan usage and show measurement times by @ianw-oai in #1640
- fix(cost): treat inherited model names as unpriced by @mldangelo-oai in #1727
- fix(publish): preserve completed publication after late cancellation by @mldangelo-oai in #1725
- fix: reject merge advice with critical regression likelihood by @mldangelo-oai in #1728
- fix(hosted): forward cancellation during repository preparation by @mldangelo-oai in #1737
- fix(previews): bound JSON prefix sizing by byte budget by @mldangelo-oai in #1722
- fix(runtime): clean unnamed output after permission setup fails by @mldangelo-oai in #1755
- fix(sdk): isolate schemas passed to host review callbacks by @mldangelo-oai in #1734
- fix: reuse captured source hashes in SARIF results by @mldangelo-oai in #1721
- fix(workbench): stop snapshot copies at directory links by @mldangelo-oai in #1751
- fix(artifacts): close directory handles after cleanup failures by @mldangelo-oai in #1697
- fix(artifacts): handle filesystem-root target containment by @mldangelo-oai in #1750
- fix(sdk): register operations before synchronous preparation by @mldangelo-oai in #1736
- fix(sdk): share close completion before abort callbacks by @mldangelo-oai in #1732
- fix(import): align required finding text across runtimes by @mldangelo-oai in #1706
- fix(snapshot): create new SQLite destinations with private permissions by @mldangelo-oai in #1747
- fix(publication): preserve record boundaries after append failures by @mldangelo-oai in #1753
- fix(publication): clean up incomplete handoffs by @mldangelo-oai in #1754
- fix(release): refresh the standalone workflow CLI pin by @mldangelo-oai in #1683
- fix(runtime): release inherited command pipes after cancellation by @mldangelo-oai in #1705
- fix(config): pass native settings through scan workers by @mldangelo-oai in #1717
- fix(runtime): find bundled tools through executable symlinks by @mldangelo-oai in #1707
- fix(multiscan): serialize durable receipt appends by @mldangelo-oai in #1735
- fix(bulk-scan): preserve interrupted receipt bytes by @mldangelo-oai in #1748
- fix(mcp): clean up only owned atomic staging files by @mldangelo-oai in #1749
- fix(mcp): stop coordinator admission after host shutdown by @mldangelo-oai in #1731
- fix(publish): atomically replace latest publication receipts by @mldangelo-oai in #1738
- fix(cli): preserve complete evidence for saved finding remediation by @mldangelo-oai in #1608
- fix(release): publish matching Action releases with metadata by @mldangelo-oai in #1711
- fix(deduplication): bind provenance to each retrieved finding by @mldangelo-oai in #1752
- fix(cli): preserve repository protections in artifact exports by @mldangelo-oai in #1668
- fix(bulk-scan): validate saved contracts before resuming completed scans by @mldangelo-oai in #1720
- fix(sdk): preserve historical publication content by @mldangelo-oai in #1756
- fix(action): propagate artifact stream failures and preserve diagnostics by @mldangelo-oai in #1671
- fix(workbench): read excerpts from the scanned source by @mldangelo-oai in #488
- fix(auth): diagnose unsupported Windows credential ancestry by @mldangelo-oai in #1745
- fix(sandbox): keep new Windows SDK scan output private through archival by @mldangelo-oai in #1739
Documentation
- docs: map source ownership and regression checks for contributors by @mldangelo-oai in #1699
- docs(cli): clarify scan scope and recovery guidance by @mldangelo-oai in #1660
- docs: make security workflows discoverable to agents by @mldangelo-oai in #1698
- docs: add an Invoice Desk scan and fix walkthrough by @mldangelo-oai in #1701
Other changes
- refactor(publication): separate Git transport from review providers by @mldangelo-oai in #1551
- perf(workbench): avoid copying unused dictionary items by @mldangelo-oai in #1661
- chore(plugin): clean up imports and expected test exceptions by @mldangelo-oai in #1665
- chore(deps): bump the third-party group across 3 directories with 3 updates by @dependabot[bot] in #1696
- chore(deps-dev): bump ruff from 0.16.10 to 0.17.0 in /plugins/codex-security by @dependabot[bot] in #1695
- refactor(sdk): import schema APIs directly from Zod by @mldangelo-oai in #1726
- chore(dev): remove the empty editable Python distribution by @mldangelo-oai in #1724
- ci: bump taiki-e/install-action from 2.87.27 to 2.87.28 by @dependabot[bot] in #1742
- chore(deps): update Zod, OpenCode SDK and Bun types by @dependabot[bot] in #1743
- ci: skip source checks for body-only pull request edits by @mldangelo-oai in #1708
- ci: bump actions/create-github-app-token from 3.2.0 to 3.3.0 by @dependabot[bot] in #1744
New Contributors
- @aiapienthusiast made their first contribution in #1623
- @IvanCaceres made their first contribution in #828
Full Changelog: npm-v0.4.0...npm-v0.5.0