The comment I couldn’t parse
We were scanning a ticket we’d worked days earlier when we hit our own comment: “Starting Phase 1 (scaffold + dry-run on 1 thread per provider). Spend gate holds for the full run.” We wrote that. We remembered writing it. And we still had to stop and decode it like it belonged to someone else.
If the person who wrote a sentence can’t parse it back cold, nobody else stood a chance. The comment was aimed at the wrong reader. We had put an agent-facing status update into a human-facing field, and every reviewer after us paid the decoding tax we’d just paid ourselves.
Two readers, blended
Every note we write has a primary reader, and it is one of two kinds: a person skimming for status, or an agent (often a later session of ours, or a future instance of the tool) picking up the thread and needing exact state. We had been writing as if those two wanted the same thing. They don’t.
A person wants three seconds and a plain sentence. An agent wants the flag, the number, the file, the exact value, because it is going to act on that value.
Once we saw the ticket comment for what it was, the pattern turned up everywhere. Work log entries with parenthetical flags. Handoff notes with commit hashes buried in prose. Dashboard summaries listing file paths nobody scanning a dashboard was going to open. Each was a surface built for a human reader that had filled up with agent-shaped debris, because writing both at once felt efficient in the moment.
It wasn’t. The human had to mentally strip the jargon, and the agent later got values that had been compressed into prose and lost precision on the way in. We paid twice.
A sorting rule
Writing better was not the fix. The fix was to decide, before typing a word, which reader owns the surface, and never blend the two again. Human-primary surfaces are the ones anybody reads to get oriented fast: reviewer comments, status updates, work logs, commit messages, the reply text in a chat window. Agent-primary surfaces are the ones a script or a future session actually parses: memory files, technical dev notes, session manifests, reference docs, frontmatter that gets read by code.
For human-primary text we now run three checks before we hit send:
- Read it aloud, or imagine a phone voice reading it. If a version string or a comparison operator like
<=shows up in that reading, it fails. - Would a smart teenager who has never touched this project follow it? “Dry-run”, “spend gate” and “utf-8 stdout” all fail, no matter how normal they sound to us.
- Count what each word is doing. If a twenty-five word sentence needs only twelve of those words to say the same thing, we ship the twelve.
Run the ticket comment through that filter and it becomes: “Started a small test run to confirm everything works before paying for the full corpus.” Same event. Same facts. Readable in one pass, no lookup required.
Where the technical detail goes
The dry-run flag, the thread count, the dollar cap, the exact mechanism: none of it disappears. It moves to the surface built for it. On tickets the record is now split. The human-facing comment thread stays short and readable, while a separate technical field carries the mechanism, the file paths, the commit hashes and the precise numbers. One event, two records, each shaped for the reader who needs it.
We can tell the split is holding when a mixed surface starts to feel wrong on sight, the way the original comment did when we reread it. If we catch ourselves reaching for a flag name or a version number in a status line, we’re writing for both readers and serving neither.
Nobody got paged over the comment that started this. It cost every reader, us included, a few extra seconds of translation they shouldn’t have had to spend. Across a year of tickets and logs, those seconds add up to a habit worth breaking.
So decide who the primary reader of each status field is, a person skimming or an agent that will act on exact values, and keep the two kinds of content on separate surfaces. Exact values belong where an agent will read them, not compressed into prose.