Tool · Codex · OpenAI

exec_command

codex/exec-commandShell · primaryRead · partialCode search · partialsource@531f3836a1e3checked 2026-09-05
What matters here0 of 6 invariants hold · 3 fails · 3 unverified

The facts the registry marks decision-changing, with how the other implementations answered. An invariant may be shown as pass/fail; a design choice never is, however unusual it looks.

How this differs from most implementations

Derived by comparing every recorded value against the other implementations of the same capability. Differing is not a defect unless the row is marked an invariant.

Reached indirectly. Reached through the shell rather than a dedicated tool.

Description, as the model sees it

Not recorded yet — the verbatim description has not been captured for this tool.

Registered schema

Not recorded yet — the schema as registered has not been captured for this tool.

Observed · Read

compare all →
FactThis toolAcross all implementations
Output shape3 of 3 recorded
Dedicated read toolnone — cat/sed via exec_commandsrc
Line numberingnonesrc
Raw bytes, no numbering at all.
like 2 of 7N + TAB ×2 · N: ×2 +12 unverified
Output wrapperraw stdoutsrconly one of 9plain ×6 · <path>/<type>/<content> ×2
Limits3 of 4 recorded
Default line capnonesrconly one of 82000 ×6 · 1000 ×11 unverified
Byte / char capnonesrconly one of 650 KB ×3 · 100 KB ×1 +12 unverified
Per-line capnonesrconly one of 52000 chars ×42 unverified
Whichever hits first—6 others recordedlines or bytes ×4 · chars ×1 +12 unverified
Pagination0 of 5 recorded
Offset base—
n/a
8 others recorded1-indexed ×7 · 0-indexed ×1
Announces truncationinvariant—
No read tool; the shell returns whatever the command produced.
all 7 holdtrue ×71 unverified
Continuation hint—7 others recorded(Showing X-Y of N. Use offset=Z) ×2 · (truncated) ×1 +41 unverified
Reports total lines—4 others recordedyes ×2 · linesShown[] ×1 +14 unverified
Out-of-range offset—
n/a
2 others recordedexplicit error w/ line count ×26 unverified
Non-text4 of 4 recorded
Binary content never enters context silentlyinvariantfailssrc
Reading through the shell puts raw bytes straight into context with nothing to mark them as binary.
4 of 5 holdtrue ×44 unverified
Binary filesraw bytes into contextsrconly one of 5error: Cannot read binary file ×2 · refuse ×1 +14 unverified
Imagesseparate view_imagesrconly one of 9attachment (jpeg/png/gif/webp) ×1 · attachment + mime sniff ×1 +6
Giant single linenonesrconly one of 7per-line cap ×4 · char budget absorbs it ×1 +12 unverified
Errors3 of 4 recorded
Missing pathshell errorsrconly one of 4Did you mean one of these? ×2 · error ×15 unverified
Path is a directorylistssrconly one of 4lists entries ×2 · error ×15 unverified
Empty fileempty stdoutsrconly one of 2explicit reminder ×17 unverified
Non-vision model—2 others recordedexplicit note in output ×1 · requires image-capable model ×15 unverified
Correctness2 of 3 recorded
Mixed line endingsrawsrconly one of 2renders CR visibly ×17 unverified
Staleness check before writeinvariantfailssrc3 of 9 holdtrue ×3
Line-number contamination guard—
n/a (no numbers)
2 others recordedinstructs model to strip prefix ×1 · write-side detector rejects N| content ×1

Observed · Code search

compare all →
FactThis toolAcross all implementations
Shape3 of 3 recorded
What it searchesshellsrconly one of 20by-content ×9 · by-name ×9 +1
Tools per harnessno search toolsrc
The same answer Codex gives for read. The shell is already there and it composes, but nothing about the search is the harness's to shape.
only one of 20two tools ×18 · one tool ×1
Search enginewhatever is on the machinesrc
rg if the user installed it, grep otherwise, with different regex dialects and different default scope. The harness makes no choice here, so neither does the agent.
only one of 19bundled ripgrep ×6 · ripgrep ×2 +101 unverified
Query language3 of 3 recorded
Regex dialectwhatever is on the machinesrconly one of 11Rust regex ×8 · varies by backend: Rust regex, git grep, POSIX, or JS RegExp ×1 +1
Glob syntaxwhatever is on the machinesrconly one of 8ripgrep --glob ×4 · fd --glob ×1 +22 unverified
Case sensitivitywhatever is on the machinesrconly one of 6sensitive, model can ask ×3 · always insensitive, not configurable ×213 unverified
Result shape3 of 4 recorded
Line numbers in resultsonly if the model askssrc
grep prints line numbers with -n and not otherwise, so whether a search result can be turned back into a location depends on the flag the model happened to type.
only one of 11Line N: ×3 · path:N: ×2 +5
Result capnonesrc
No cap of the harness's own; a broad pattern returns everything it matched, straight into the context window.
only one of 20100 files ×4 · 100 matches ×3 +10
Announces truncationinvariant—
Nothing truncates, so there is nothing to announce. The invariant is not met or broken here — it does not arise.
all 18 holdtrue ×181 unverified
How "no matches" readsempty stdoutsrc
The one case on this page where a search that found nothing and a search that failed look identical to the model.
only one of 17sentence ×163 unverified
Agreement with read1 of 2 recorded
Search line N is read line Ninvariant—
No read tool either; both halves are the shell.
6 of 7 holdtrue ×6 · false ×12 unverified
Search counts as having readno read tracking at allsrconly one of 2yes — matched files are recorded as partial reads ×19 unverified
Scope3 of 3 recorded
Respects .gitignorewhatever is on the machinesrc
rg does, grep -R does not.
only one of 18yes ×8 · no, deliberately ×2 +52 unverified
Searches hidden fileswhatever is on the machinesrconly one of 14yes ×7 · yes, except .git ×3 +26 unverified
Binary content never enters contextinvariantfailssrc
Same failure as its read: grep without -I puts matched bytes from a binary file straight into context with nothing marking them as binary.
2 of 3 holdtrue ×28 unverified
Ordering1 of 1 recorded
Result orderingwhatever is on the machinesrconly one of 16modification time, newest first ×5 · ripgrep traversal order ×5 +54 unverified

Other tools in Codex

names verbatim, as registered