codex-security vs numbat
Both are catalogued under Guardrails & Security. The figures come from the GitHub API; the assessments are ours.
At a glance
| At a glance | codex-security | numbat |
|---|---|---|
| License | Apache-2.0 | Apache-2.0 |
| Languages | TypeScript, Python | Go |
| Deployment | Runs locally / Self-hosted | Runs locally / Self-hosted |
| Maturity | Growing | Experimental |
| Stars | 9.9k | 924 |
| Star growth over the last 7 days | — | — |
| Forks | 689 | 97 |
| Open issues | 129 | 6 |
| Last commit | 16 Aug 2026 | 14 Aug 2026 |
| Activity | Active | Active |
What each one does
codex-security
`npx @openai/codex-security scan .` walks a checkout and leaves JSON results on stdout, while `--mode deep` spreads discovery across workers and subagents until it stops turning up anything new. Across runs, `scans compare BEFORE_SCAN_ID AFTER_SCAN_ID` matches findings by root cause and labels them new, persisting, reopened, resolved or unknown, so a second scan reports movement instead of restating the whole report. It is a poor fit as a pre-commit gate: deep discovery runs until `--max-time-hours`, which defaults to 96. Access is also gated — the CLI needs access to Codex Security, and some cybersecurity requests and protected findings require Trusted Access for Cyber approval, so cloning the repo on its own scans nothing.
Full entry →numbat
numbat is a single binary that watches supported desktop, CLI, IDE and gateway agents through hooks, plugins and OTLP/HTTP log exporters, normalizes their activity into one event model, and evaluates it with a local CEL rule engine that writes versioned NDJSON events, findings and enforcement decisions. It also reconstructs past sessions from on-disk artifacts via `numbat scan`, so you can investigate an agent that was never instrumented. Blocking is deliberately conservative: enforce mode is off by default and every shipped rule is monitor-only, so denying an action means copying the rule YAML into your own `--rules-dir`, keeping its id, adding `enforce: true` and bumping the version. It is a poor fit if you expect coverage of arbitrary agents or a definitive account of what ran — the coverage matrix decides what is observable per host and surface, at-rest reconstruction cannot recover activity an agent never persisted, and findings are rule matches rather than proof that an action completed.
Full entry →What you can do
codex-security
- One command, or one SDK call —
npx @openai/codex-security scan .is the whole entry point;--modeland--effort hightune the run. The TypeScript equivalent isnew CodexSecurity()plusawait security.run("."), which returnsresult.reportPath. - Deep scans with an explicit stop condition —
--mode deeptakes--workersand--subagentsfor parallelism and--stop-after-no-new 3,--max-discovery-runs 10and--max-time-hours 1.5as budgets. Discovery otherwise halts at 96 hours, and findings completed before the limit are still returned. - Findings tracked across scans —
scans compare BEFORE_SCAN_ID AFTER_SCAN_IDreuses saved matches and matches the rest by root cause; findings stayunknownwhere coverage was incomplete or the original location was never reviewed.findings list [repository]surfaces open findings not confirmed by the latest scan. - Swap in another inference provider —
--provider openrouter,--provider fireworksand--provider amazon-bedrockpair with a matching--modelsuch asanthropic/claude-sonnet-4.5. Bedrock acceptsAWS_BEARER_TOKEN_BEDROCKas well as standard access keys, profiles, web identity and the default AWS credential chain. - Containerized bulk scanning — The official image and its Docker Compose config run noninteractive, resumable scans of repositories pinned to immutable Git revisions.
--knowledge-base PATHshares security documents with every repository,--scan-prompt-file PATHcarries the scan instructions common to all of them, and apromptCSV column holds the instructions for one repository.
numbat
- Survey an endpoint before instrumenting it —
numbat agentslists discovered agents andnumbat scan --agent codexparses their on-disk session artifacts; both are read-only and install no hooks or agent config changes. - Stream live activity to a local record file —
numbat hook install --agent codex --emit allappends events, findings, indicators and applicable enforcement decisions to~/.numbat/records.ndjson, whilenumbat hook statusverifies configuration only — not execution or delivery. - Write detections in CEL and test them first — Custom YAML rules run through
numbat rules check --rules-dir ./numbat-policyandnumbat rules test; a rules directory replaces an embedded rule when it reuses the same id, and--no-builtin-rulesgives an operator-only catalog. - Promote a monitor rule into a deny — Copy the shipped YAML from
rules/, keep the id, addenforce: true, bump the version, thennumbat hook install --agent codex --rules-dir ./numbat-policy --enforce; blocking applies only to agents with a supported synchronous pre-action hook. - Hand an investigation to someone else —
numbat timelinebuilds a per-session view andnumbat case build/numbat case verifyproduce and check bundles with SHA-256 manifests — which establish internal consistency, not source authenticity; complete raw transcripts stay out of normal records unless you opt into adding evidence files.