By acuteness of mind shall we find victory.
— Fabricator-General Explicatus, Warhammer 40,000: Mechanicus
Recently I’ve been noticing something with my coding agents. Read a file? Python. Check a SQLite database? Python. Make an HTTP request? Again, Python.
I’ve been using Astra and Sol in Codex, and Fable and Opus in Claude. Different models, same habit in my sessions.
I went back through the tool-call logs. Here are three actual snippets. The Python bodies are unchanged; I’ve left out the shell launchers. The JavaScript line is an excerpt from a larger tool-call batch.
Changing one Markdown heading:
from pathlib import Path
path = Path('/home/hp/.codex/skills/tw/SKILL.md')
text = path.read_text()
text = text.replace('## Flow A: Main Repository (not in worktree)', '## Flow A: Non-Task Checkout (not in task worktree)')
path.write_text(text)Updating a source path in a document:
from pathlib import Path
path = Path('docs/vox-flow.html')
text = path.read_text()
text = text.replace('crates/vox-seeder/src/validate.rs', 'crates/vox-seeder-core/src/validate.rs')
path.write_text(text)Both are small text edits that fit a direct patch. Seeing pathlib imported for each one is what made me notice the pattern.
Checking the working directory — while preparing this very blog:
text(await tools.exec_command({cmd:"pwd","max_output_tokens":1000}));That one is the tool interface wrapping a shell command in JavaScript: code mode in action.
Whether that command needs approval is a separate decision. My setup for that is here.

Python. Python everywhere.
My first theory was that they all have some version of a recursive language model running underneath. So I asked my agent to research it.
The RLM authors’ approach does use a Python REPL: the model inspects input outside its context and makes further model calls over selected parts. But a script reading a file doesn’t establish that recursive model calls are happening. These logs show scripting.
A public Codex configuration for Sol selects code_mode_only. That means JavaScript coordinates tool calls. The command it sends to the shell can still be cat or rg.
And the same Sol prompt tells it to avoid Python when a simple shell command will do. The preference for simpler tools is already in the instructions.
Anthropic’s programmatic tool calling explanation gives us a reason for using code: Python can call several tools, process their results, and send only the useful output back to the model. Less intermediate data in the conversation. Fewer trips back to the model.
They also say it helps less with simple calls and quick lookups. That’s exactly where I want agents to use the simpler tool.
I like having code execution available. For these small edits, though, the extra script adds work without adding much value.
The scratch files needed attention too. I gave Codex a dedicated folder and cleanup policy, documented here. That handles the housekeeping.
For messy data or a hundred files, scripting earns its place. For reading one file, I prefer the simpler tool. cat is right there, watching Python get another promotion.
For correspondence on DSPy and RLMs, or FDE opportunities at DinoDial: [email protected].