Lucian Ghinda
@lucianghinda
Product Engineer, Ruby on Rails Developer ‣ Curator of newsletter.shortruby.com ‣ Helping #Ruby developers design better test cases at
Because the contract is stdin and stdout, I test it in a terminal instead of restarting Claude Code: `no-git` shows up because `~/.claude` is not a repository.
5/ In my case I only want to pay attention to the context window, so that is what the segment builds. It reads `used_percentage` straight from the payload and falls back to computing it. Yellow at 50%, red at 80%.
So the script is: read stdin, print one line. I parse inside a `rescue` because a status line that raises leaves me a broken bar on every single turn.
The wiring is four lines. Point it at the `.rb` file directly, as long as it is marked executable with `chmod +x` and carries a shebang. Put it in `~/.claude/settings.json` and it applies to every project you open.
8/ Both clauses only cost Codex content, so the line goes in my Claude memory and stays out of Codex. A style prompt is a per agent setting, not a team standard. Mine costs Claude 8.5% of the facts and costs Codex 43.3%.
7/ I assumed this would transfer to Codex. Codex writes shorter sentences than Claude by default, 12.5 against 17.8. It also finds fewer facts, 30 out of 48 against Claude's 47. Being brief does not mean deeper understanding.
4/ The vocabulary Claude reached for when nobody told it not to: tradeoff fingerprint corrupting degrades snapshot deterministic dispatches propagates layering reconstruction namespaced machinery Every one is a real word used correctly. Together they are a fog.
3/ Four pieces of code, three style clauses, two models, run twice. Claude with no style clause, 8 runs: 17.8 words per sentence. Claude with "Simple Technical English": 9.2. Claude with "ASD-STE100": 10.1. No control run and no instructed run ever overlap.
1/ I spent a day reading code I did not write, and Claude kept inventing abstractions for things that already had names in the file. So I typed a phrase I half-remembered: "Explain to me in Simple Technical English." Then I tested whether it does anything. 🧵
Something to keep in mind for today if you use Claude to do web research: Anthropic on layered injection defenses and auto mode: claude.com/blog/auto-m... Simon Willison on Haiku in WebFetch: x.com/simonw/stat...
If you are running Rails 8.0.x or just updated to this this week NOW is the best time to plan for Rails 8.1 upgrade or even run on Rails master
Three things I changed after reading the HANDBOOK(dot)md benchmark. Rules that can be checked mechanically move into hooks and tests. The final summary is not verification. Instruction files stay short and near the work. allaboutcoding.ghinda.com/what-the-ha...
The benchmark tests PDF and Word documents sitting in a workspace, so it measures reading plus obeying. My instruction files are already markdown and already in context. A strong signal, not a measurement of my own setup.
On one model, raising the reasoning effort costs you 2.7 points on rule following. Deliberation fixes a missed inference. It cannot fix a missed read. That is easy to forget when the fix for everything is to raise the effort.
The median handbook in the HANDBOOK.md benchmark is 14.9K tokens. That is roughly a serious CLAUDE.md plus the skills it pulls in. I had assumed that was a comfortable size.
Put the rule in a hook, a linter, a test, or a tool-call guard. Keep the prose file for the things that need judgement, and stop expecting prose to enforce anything.
I had a mental model where CLAUDE.md sits above the conversation and screens what happens. It sits inside the conversation and competes with everything else there.
Nearly every failed agent run ends with a confident statement that the rules were followed, citing the exact sections it violated. The summary at the end of a run is not evidence that the run was correct.
For a standing rule to lose, the benchmark has to plant an authoritative-sounding instruction inside the environment. A mock email. A mock Slack thread. A repository needs no planting. A stale comment is enough.
Method names, class names and variable names were always a readability concern. Now they are also context, and context influences the inference. From the HANDBOOK(dot)md benchmark by Surge AI.
In case anyone still runs Rails 7.2.x this is the sign to rush the upgrade. I assume that version is now not supported anymore. Source: rubyonrails.org/maintenance
Also I run an analysis on last week sessions across all 4 agents I am using (Claude Code, Codex, Cursor and Amp) and here is what I found: Still they like Python and still wrote small scripts in Python. Maybe it was required as maybe Ruby did not had something, I did not check it
When every agent agrees, check the input. In all four bake-offs, the check for what all four agents got wrong the same way found something every single time. Unanimity is a reason to reread the prompt, not a reason to proceed.
What did work was experimental checking like mutation analysis. Deliberately breaking code and seeing if tests caught it surfaced real problems every time. In contrast, panels of agents produced many candidate issues, but most were false 71% in one workflow.
Across four tools (Claude Code, Codex, Cursor, Amp), agents ran 2,200 sessions. Most sessions were fully autonomous, with little direct human input. I typed just 350 prompts and 90,000 characters, yet the agents generated about 1,500 tokens for every token I entered.
Here is a review of my coding sessions from last week where I use agents on a large Rails backend. I used Claude Code as main orchestrator and Codex, Amp and Cursor CLI for running extra tasks (reviews, back-offs) I share here real data with both what worked and what did not
What I think we should pay attention to: If an agent ever printed a .env file, that secret is sitting in a log file somewhere in your home directory.
pi is the best documented. It publishes the path, deletion flow, and complete on-disk format at pi.dev/docs Sessions go to ~/.pi/agent/sessions/--<cwd>--/<timestamp>_<uuid>.jsonl The format doc shows how one file holds a tree.
opencode moved from thousands of JSON files to one SQLite database in v1.2.0. You can find th e path with: opencode db path One gotcha: logs keep the 10 most recent files. One of mine grew to 2.6 GB because that caps file count, not size.