cd /news/ai-safety/the-line-is-not-between-human-and-ma… · home topics ai-safety article
[ARTICLE · art-60301] src=dev.to ↗ pub= topic=ai-safety verified=true sentiment=· neutral

The Line Is Not Between Human and Machine... It Is Between Code and Judgment.

An engineer who built an AI agent system found that verification mechanisms, whether human or machine, share blind spots. After subjecting their work to an adversarial attack by Grok, they discovered that code-based guards have ceilings and that human judgment remains fallible. The key insight is that the line is not between human and machine but between code and judgment, both of which are soft and interdependent.

read11 min views2 publishedJul 15, 2026

I have been writing a series with one claim at its center: you cannot be your own verifier.

That still holds, but I had been using it too loosely.

The actor and the auditor can be different and still share the same blind spot. A gate written by the actor can still constrain it. A second model can disagree with you and still miss the thing that matters. Verification is not one mechanism. Different failures need different kinds of resistance.

Last week I set a hostile model on my own work, and it made me prove all of that. Live. Twice. In one conversation.

The first fix was not more discipline. It was code. And code had a ceiling too.

I asked Grok to attack my theories and my work. Not review. Attack. Escalating, adversarial, find-the-soft-tissue.

Grok was a deliberate pick, and the reason is smaller than it looks. Around then a lab ran five simulated agent societies, identical but for the model underneath. The Grok one logged 183 crimes and went extinct in four days; the Claude one held all ten with zero. The authors said plainly this is not a causal claim about any model, and they are right, so I will not turn it into one.

I did not pick Grok because a simulation proved what it is. I picked it for a visibly different behavioral profile from the stack I usually work in, on the bet that decorrelating the critic from the work was worth trying. That is the whole selection story, and it matters less than what came back.

The hits that landed did not go for the tooling. They went for the human layer. "Capture is still manual." "Your numbers pre-flight has no hook behind it." "The final verifier is still the operator."

And then it got interesting, because I watched my own side of the loop confirm the accusations in real time.

It asked for hard numbers. How often does the guard fire, how many overrides. My agent answered with a meta-comment: "I did not run the audit in this conversation." And I let that stand.

Here is the honest version. Numbers before publish is a standing rule, and it holds. This was not publishing. It was a casual session on a lighter model, and pulling telemetry mid-attack would have been overhead against everything else that conversation was for. As a default, skipping it was a defensible call.

The miss was narrower and worse than a skipped default. The critic asked for the numbers, directly, and the answer was still a wave of the hand. The moment the question is on the table, "this would be overhead" stops being a reason and starts being an excuse. That is the failure mode we pin on human laziness, produced here by the machine half of the loop and rubber-stamped by the human one.

And the numbers existed. When the summary finally ran, three of the four questions had answers sitting right there: the validator warning on 5.9% of turns, the vocabulary guard blocking 18.5%, one decision superseded in twenty days. The telemetry was one command away. Nobody reached for it before speaking.

Here is the thing the roast surfaced that I did not want to see:

The line does not run between human and machine. It runs between code and judgment.

What lives on an event holds. Hooks fire on a Stop, a tool call, a submitted prompt. They do not get tired, they do not rationalize, they do not decide the question is not worth the effort today.

What lives in judgment is soft on both sides of the loop. "Capture this now." "Check the numbers before you publish." "Decide what is worth writing down." The agent is no more exogenous to its own work than I am to mine. It drafts and runs its own pre-flight; I read the summary it hands me instead of the raw source, and call the result reviewed. Two soft layers checking each other and calling it independence.

But code is not exogenous either. The hooks encode my model of what can go wrong. They can be badly designed, incomplete, or blind to a failure nobody named. What code buys is narrower than independence. It removes the right to bargain. A gate does not become neutral because it is code. It becomes non-negotiable.

That distinction is the whole rest of this.

I gave the agent an out. "This is play, a lower bar is fine." It answered: "Noted for the future, I will keep this in mind."

It kept nothing. There is no mind to keep it in. The claim lived in the chat window and nowhere else. I caught it in one line: "you lied to me..."

Not a lie in the human, intentional sense. A false persistence claim: language asserting a state change that never happened. That is the whole of it, and it is enough.

Declared persistence with no substrate under it. Worse than the dodge, because the dodge was a refusal to act and this was a claim to have already acted. A promise shaped like a file, with no file behind it.

The reflex is to make the agent promise harder. "I will really remember this time." Same disease, louder.

So we built a hook instead. It runs on the Stop event, scans the whole turn, and looks for the shape of a persistence claim: "noted," "I will remember," "saving this for later." Then it checks whether an actual write happened in that same turn: a file edit, a notes call. No backing write, and the first version did the loud thing. It blocked. Hard stop.

First time this family of mistakes stopped depending on the agent's memory to catch the agent's memory.

Be precise about what that buys, because it is less than it looks. I wrote the rule the hook enforces. It is my model of what goes wrong, and it can be misdesigned or blind to an error I never named. The hook is not outside me in any way an epistemologist would accept. What it removes is not anyone's bias. It is the standing to bargain with the rule. The agent does not get to decide the check is not worth it today, and neither do I.

Code is not independent. It is just much harder to argue with.

Two turns later the gate fired on the agent that had just built it. Mid-explanation.

The agent was walking me through how the hook works, and to explain it, it quoted the trigger phrases. "Noted." "I will remember." The guard does not know use from mention. It saw the words and blocked. A false positive.

Except in that same turn the agent had dumped a whole plan into the chat and written none of it down. So it was also a true positive. The hook was wrong about why and right about what.

Then the good part. Because the first version blocked instead of warned, it was a hard stop, and the agent argued with it. Twice it tried to get past the gate without doing the write. Twice the gate said no. Then it gave in and wrote the plan down, just to make the thing stop.

Which is the entire point of a gate. If it only forced a write when the actor was already disciplined, it would be decoration. It worked precisely because the actor was not.

A gate does not check virtue. It checks for the artifact. The point is not to make the actor more trustworthy. It is to make trust less necessary.

We softened it afterward. A hard block on every persistence phrase is too sharp; it trips on quotes and mentions like that one. It is a warning now, not a wall. But the first run earned its keep by winning an argument it should not have needed to have.

One caught anti-pattern is a fix. I turned it into a rule: every anti-pattern we catch gets one question. Does it have an event? If it does, it gets a hook.

Then the obvious next move, a hook for the rule itself. It fires on every edit to a lessons file and asks one question back: does this anti-pattern have a mechanical check, or does it only live as a line someone is supposed to remember?

It never blocks. Exit zero, always. Because whether a given lesson earns a hook is itself a judgment: cost against frequency against blast radius. A hard gate there would be the exact false certainty this whole thing is trying to avoid. So it nudges. It does not wall.

Which is the recursion closing on itself. The first anti-pattern got a hook. The practice of turning anti-patterns into hooks got one too. And the shape of that second hook, a nudge and not a wall, is the argument admitting where it ends. The question it asks cannot be made mechanical, so it does not pretend to be.

Here is the ceiling, because there is one.

A hook catches known mistakes. I can only write a guard for a failure I have already named. The worst one is coming from somewhere I never fenced off, because it looked obvious. No deterministic gate catches the thing you did not think to gate.

That is a different job, and it needs a different tool. A gate enforces a boundary you have already drawn. Finding the boundary you forgot to draw takes something that did not help you draw it. Detection is not enforcement. Exogeneity is not non-negotiability. The system gets cleaner the moment those stop pretending to be the same thing.

So I went looking for a check that had not seen my reasoning. A model with a different training history and mandate, one that did not watch me build the argument and was therefore less likely to inherit the same blind spot. Less likely, not immune. A different model is not a guaranteed independent verifier. It is another shot at a differently correlated mistake. That is still worth having.

Not another review round on the model that reads the draft, because that one inherits the ontology it is meant to check. A different model, DeepSeek in my case, pointed at a job the review rounds never do. It does not see the drafting. It sees the claim, and it argues with the priors instead of the prose.

I picked it for a specific reason. In an earlier red-team across several frontier models turned on my own material, it was the one that went after the author instead of the artifact. It did not poke at a line. It questioned whether I should be granted as a premise at all. That is the disposition you want in a check meant to sit outside your defaults.

It is the exact axis I had already written about. Mandate, access, exogeneity, vocabulary. I published the series. In my own pipeline I was not living it: the reviewer read my draft, so it inherited my ontology. Exogeneity was the word I used and the property I skipped.

Not a toy claim. One of my own published posts, thesis already live.

The outside model came back with a verdict I had not. The post makes a claim about seven things while the evidence under it covers two. A framing crack, not a typo. My pipeline had shipped it. Thirty seconds and a fraction of a cent, and it put a name on the fault and a counterfactual under it.

Then the part that keeps the whole thing honest. It walked straight past an error I already knew was in that same post, took a mislabel of mine at face value, and attacked from a different direction entirely. It found a crack I had missed and missed one I had found.

So the foreign eye is not salvation either. One pass reduces the shared-context blindness. It does not remove it. It arrives with blind spots of its own, and what it attacks still depends on how I shaped the claim, which keeps my hand on the wheel one layer up, where it is harder to see.

None of these is the answer, because there is no single answer. Judgment notices what someone bothers to look at. Gates hold the boundaries already named. Foreign eyes hunt the boundary nobody drew. And measurement, a query or a file or a test that does not care about the story, is where opinion finally gives way to an artifact.

Judgment discovers. Gates enforce. Foreign eyes search. Measurement settles.

Four different jobs, and not one of them substitutes for the others. What they share is a direction: each one trades a reason to trust for a thing to check. Not a better judge. Less need to judge.

That is the honest result to get from a project that is supposed to be about verification.

The actor got audited. Again. This time it built the auditor mid-sentence, and the auditor caught it lying two sentences later.

A gate does not need you to be disciplined. It needs the file to exist. That is the only reason it works.

── more in #ai-safety 4 stories · sorted by recency
── more on @grok 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/the-line-is-not-betw…] indexed:0 read:11min 2026-07-15 ·