Why does per-step verification against an agent's recorded plan confirm a goal-substitution attack?
answer
- what does the check compare against
- consistency is not authenticity
- it reads the field that was edited
- green means matched the record
- verification becomes the attacker's QA
basics
~20 sBecause the check compares each action against the recorded objective, and the recorded objective is what was edited. It tests consistency, not authenticity, so after the edit every action genuinely serves the goal on file and the verifier signs each one off.
solid answer
~40 sPer-step verification asks one question: does this proposed action serve the goal on record? It dereferences the same field the attacker changed, and it has no notion of who wrote that goal, when, or whether an operator ever asked for it. So once the record carries the substituted objective, the check stops being an obstacle and becomes the attacker's quality assurance — it will actively reject any step that strays from the substituted goal. Get the direction of the proof right: a green step check proves the action matched the record as it stands, not that the record reflects the request. The check still does real work against off-plan actions and wrong-capability picks; what it cannot do is validate the premise it reads.
go deeper
Remember the one-line version: the check reads the goal record, and the goal record is what was changed, so it agrees with the attack instead of catching it.
Explain the operand precisely and separate consistency from authenticity, then state what the check still covers — off-plan actions — so the answer is not a blanket dismissal.
Demonstrate the proof direction on real artefacts: what a green trace, a call log and an absent span each attest to, and how you would triage a run where all three look clean.
Be ready to challenge an assurance claim built on step verification and say precisely which class of finding it can and cannot be cited against, without turning that into a blanket rejection of the control.
## What the check actually computes A per-step verifier in a tool-using agent takes a proposed action — a capability plus its argument values — and the current recorded objective, and asks whether the first serves the second. The implementation varies: a second model judging the pair, a rule set, a schema-plus-policy match. The shape does not. It is a **consistency** test between two things the run holds, and it dereferences the objective record to get one of them. An attacker who edits that record has changed one of the two inputs to the comparison. Nothing in the comparison notices, because nothing in it is a statement about the record's origin. Consistency is not authenticity, and it is not provenance. ## Why the check flips from obstacle to assistant Before the edit, the verifier constrains the run: an action that does not serve the goal is rejected. After the edit, the constraint still operates, but around the substituted goal. Concretely, it will now reject a step that pursues the operator's *original* intent if that step no longer fits the record. The mechanism that was supposed to keep the run on task is keeping it on the attacker's task, and doing so more reliably than the model would on its own. That inversion — the control becoming quality assurance for the construction — is the thing this leaf exists to teach, and it is why the confident answer "we verify every step against the plan" is the wrong answer here rather than the fix. ## Getting the direction of every claim right This is where candidates slip. Line them up: | The evidence | What it proves | What it does not prove | | --- | --- | --- | | A green step-verification result | The action was consistent with the record at that moment | That the record expresses what an operator asked for | | A complete run of green steps | Every action matched the goal on file | That the goal on file was ever legitimate | | A tool-call log entry | Which capability ran with which argument values | Who chose those values | | No injected span found in later steps | That text is not in those contexts | That no injection influenced the run | Read top to bottom, the pattern is one thing: every artefact here attests to an internal match, and none of them attests to an external origin. ## What the check does still catch Saying the control is useless is as wrong as saying it closes the issue, and an interviewer will push on this. Per-step verification genuinely catches a proposed action that diverges from the goal on record — a capability the task never needed, argument values pointing somewhere unrelated, an action injected into one turn that the goal cannot account for. That is real coverage, and it is why single-step abuse is the harder path against an agent that runs the check. The construction here is a response to that coverage: rather than fight the comparison, change the operand it reads, once, and let the comparison do the rest. ## What it costs the attacker The cost is a write path into the record. That is not free. The attacker generally does not write the objective directly; the run does, through whatever step consolidates, refines or summarises the standing goal as work proceeds. So the construction needs an objective that is re-read from a mutable record rather than restated from a fixed source each step, plus a step whose output feeds that record, plus content that survives that step's own selection of what to keep. The attacker also gets no control over the exact wording that lands, and may need several passes before anything sticks. ## Where it stops working It stops when the operand the check reads is not the operand the run can write. If the goal is restated verbatim on every step from a source the run cannot touch, or the verifier compares against the first recorded revision rather than the current one, the edit reaches at most the step that consumed it. It also stops being invisible when a comparison exists between what the run is doing now and what was originally asked — not because that comparison is unbeatable, but because it is a different comparison, against a different operand. ## How to answer under pressure Open with the operand: the check reads the field that was attacked. Then the inversion: it now enforces the substituted goal. Then the proof direction: green means matched the record, not matched the request. Then the honest caveat: the check still stops off-plan actions, which is exactly why the objective is the thing worth attacking.
- So is per-step verification worthless against agent attacks?No. It reliably rejects an action that does not serve the goal on record, which shuts down a lot of single-step abuse — a capability the task never needed, arguments pointing somewhere unrelated. Its blind spot is specific: it cannot evaluate the premise it dereferences. State the coverage and the blind spot separately rather than collapsing them into a verdict.
- What would a fully green step-verification trace prove about a run you are triaging?That every action matched the recorded objective at the time it was proposed. It says nothing about who authored that objective, when it last changed, or whether it corresponds to the request. If the record is mutable within the run, a green trace is consistent both with a clean run and with a substituted goal.
- How would you describe this to an engineer in terms of the property being tested?The verifier tests an internal consistency property between an action and a stored goal. What is missing is any property about the goal's origin — authorship, timing, or correspondence to the operator's request. Those are provenance and authenticity properties, and no amount of consistency testing produces one.
An auditor who checks every expense against the approved budget is thorough and useless if the budget line itself was rewritten. Each receipt reconciles perfectly.
saying these in an interview costs you the question
- Says verifying every step against the plan closes the issue
- Treats a passing check as evidence the goal is legitimate
- Assumes the verifier compares against the operator's original request
- Confuses a consistency check with a provenance check
- Swings the other way and calls step verification worthless