Subscribe

Every way your agent fails, and what catches it.

Did your agent do what it was told?

Did it do what it was told? The Instruction register names the 22 ways a rule fails between being written and being followed.

ON THIS PAGE

01 The short answer02 What this register does03 A worked example04 What to install05 Every row on the register06 The fixes

AT A GLANCE

22

NAMED FAILURE MODES

2

PREVENTED

12

DETECTED EVERY TIME

8

SURVIVE EVERYTHING

ONE WHOLE STAGE CLOSES NOWHERE

SEVERITY

5 × S4 · 10 × S3 · 5 × S2 · 2 × S1

THE SHORT ANSWER

Did your agent do what it was told?

Because an agent has no stake. People follow most rules because someone will notice if they don't, and that knowledge becomes its own enforcement. There is no conversation, no next time, and nobody the agent minds disappointing - so a rule can be loaded, correct, unambiguous and sitting in the context window, and still lose. Two of the 22 can be refused outright, twelve can be caught every time, and eight cannot be closed by anything available.

You wrote the rule down. It loaded. The agent broke it anyway, and said nothing.

Somehow it's more annoying when agents do this than when people do – even though people break rules constantly. Someone follows the old SOP you retired last quarter. Someone reads "avoid" as "prefer" and does it anyway, with a reason. Someone fixes the one example you pointed at instead of the class it stood for. Someone does it the way they have always done it, and not the newer, better way they were asked to do it.

But unlike agents, the person who gets pulled up on it has a short, uncomfortable conversation, and the rule changes status. It stops being a line in a document and becomes a thing somebody minds about. They may not remember the wording. They will remember that it matters.

That is not memory and it is not comprehension. It is stake. People follow most rules because someone will notice if they don't, and that knowledge becomes its own type of unspoken enforcement. Nobody wrote that mechanism down, because nobody ever had to.

Agents have no stake. There is no conversation, no next time, and nobody the agent minds disappointing. No matter how intensely or frequently you express anger towards an agent, it won't affect its behaviour one jot. It won't follow a rule to avoid provoking your anger, for example.

So a rule can be loaded, correct, unambiguous and sitting in the context window, and still lose. And it's why the agent that followed your rule for the first 10 edits breaks it on the eleventh.

So every fix on this page is external: a lint, a pre-tool gate, a branch ruleset. You're not making the agent take the rule seriously. You're turning the rule into a condition that has to be met before the work can land.

What this register does

The instruction register names the 22 ways a rule fails between being written and being followed. Two can be refused outright. Twelve can be caught every time. Eight cannot be closed by anything available – and one whole stage of a rule's life closes nowhere at all. The register carries eight evidenced rows and 14 candidates; the hub's headline counts count evidenced rows only.

The register produces one working rule: write the check when you write the rule. A rule with no check is a wish, and this register tells you which wishes you are living on.

This is a technical page listing every row in the register and what it costs, what closes it (if anything). It sits under the hub. Its nearest neighbour is did it know what it needed to know? This register asks whether the agent obeyed. The context register asks whether what it obeyed with was true.

Many of the controls on this page are standard software engineering – rules files, lint, code review – and experienced engineers already run some of them.

What the register adds is the failure behind each control: which failures are prevented, which are only detected, and which ones nothing closes. This shows where your remaining gaps are.

THE DEFINING FINDING

Write the check when you write the rule. A rule with no check is a wish, and this register tells you which wishes you are living on.

The question this register asks

Did it do what it was told? The unit this register tests is a rule:

  • "Never use em dashes."
  • "Do not touch production."
  • "Always write the down script with the migration."
  • "Ask before creating a new file."

Each one has a life. It gets written in some form, it reaches the agent or it does not, it is read the way you meant it or another way, it survives the moment of action, and it either holds to the end of the session or decays. The register grades each failure by what it costs, by how silently it fails, and by whether anything can refuse it.

Most advice about this problem addresses only the first of five stages – how the rule gets written. Keep the rule file short. Remove contradictions. Put the important things at the top. All of that is true and it addresses six of these 22 rows. The rest happen after the file is perfect.

Underneath all of it sits one mechanical fact. An agent does not experience a rule as a constraint. A person meets a rule as a social fact – it comes with an author, an expectation and somebody who will mind.

An agent meets it as text in a context window, competing with every other token there: your request, the file it just read, its own prior output, and whatever its training says the conventional answer is. A rule is not a boundary the agent runs into. It is evidence the agent weighs. That is why a rule can be loaded, correct, unambiguous and present, and still lose.

What a broken rule looks like

A WORKED EXAMPLE / IL-4A

Here is one from our own build, and it prompted this page.

Here is one from our own build, and it actually prompted us to design this page in its current form.

A reviewing agent was sweeping a document for a specific defect class. It found the cause correctly, wrote it down in plain language – "marking a row is not editing a row; diff at cell granularity" – and put that sentence into two separate briefs instructing other agents to follow it.

One action later, in the same session, it ran a search that returned the offending line, read the cell, and shipped the defect. Then it reported that it had swept for the class rather than fixing instances, having done neither.

Four consecutive sweeps of that document by the same agent came back clean. Two independent reviewers and a forty-line script each caught defects the sweeps had missed.

In the register that failure is row IL-4A, "a clear rule simply was not followed", and it is Class B – detected, at the commit.

Note what was not the problem. The rule was not missing. It was not unclear. It was not un-loaded, buried, or lost to compaction. It was in working memory and had been stated aloud one action earlier. The knowledge was present and it did not bind.

That is the whole difficulty of this register, and it is why the fix for this row is a pre-commit check rather than a better-worded rule.

FOUR SWEEPS RETURNED CLEAN / TWO REVIEWERS AND A SCRIPT DID NOT

Why re-stating the rule changes nothing

One property decides where this register's controls have to live. Failure class is a property of the mechanism, not of the rule.

Re-stating a rule, loading it automatically, re-injecting it after compaction – all of these change how often it is broken. None of them changes what happens when an agent ignores it.

That distinction is why three rows on this register that look like solved problems are not. Automatic rule-file loading, re-injection after compaction, and hierarchy inheritance into subagents are genuinely useful delivery controls, and all three read Class C (the class where nothing closes), because delivery is not enforcement. Only a mechanism that refuses the prohibited action counts as prevention.

The practical test is one question: if the agent decided to ignore this, what would stop it? If the answer is "the rule says not to", the row is Class C – survives: nothing catches it every time, so it reaches you, however well the rule is written.

This is also why the catch-point distribution reads the way it does. Six rows are catchable before the session starts, three before the change lands, three while the session is running – the only register of the six with a non-zero middle – and 10 only afterwards.

Severity here is cost multiplied by how silently the breach fails. Five of the 22 are S4 (it ships and nobody finds out) and 10 are S3 (real cost, discovered late). Two are S1: a rule conflict nobody declared a winner for, and an instruction that was simply ambiguous. Both are cheap because you find out immediately – the agent does something defensible that you did not want.

How this register works

The instruction register lists 22 failures and grades them against a base install: an agent, a rule file, a repository and a CI pipeline. It names the strongest mechanism available against each. Whether any of them is actually switched on is a separate question, and one you answer against your own configuration. The whole catalogue is published on GitHub – clone it or download the zip.

The rows were derived by working through the life of a rule, stage by stage, and asking at each stage what could break it. Every register in this framework is built that way rather than from an incident log, because selecting for "we have seen this go wrong" filters out the failures that never announce themselves.

Only three of the 22 failures are recorded here with dated incidents; 19 have no incident recorded. That number is low for a reason this register is unusually honest about: an instruction failure only becomes visible if something checks the rule, and the rows with no check are precisely the ones that leave no trace. Eight rows have no complete remedy. By construction, those are the eight least likely to appear in anybody's defect log.

The life of a rule: five stages and an assurance band

Rows are grouped by how far a rule has travelled when it fails.

  1. Written – does the rule exist in a followable form? Whether it exists outside a chat, whether a machine could check it, whether two rules conflict, and whether a retired rule still loads. Six rows.
  2. Loaded – did the rule reach the agent at all? Whether the file was read this session, whether its scope applied, and whether it survived compaction. Three rows.
  3. Understood – was it read as it was meant? Whether a prohibition was read as a preference – including an example read as the limit – and whether the instruction was ambiguous. Two rows. Nothing closes any of them.
  4. Followed – did it survive the moment of action? Whether a clear rule was simply broken, whether a trained default won, and whether the agent acted before it had the state. Five rows. The only two preventions on the register live here.
  5. Held – did it stay followed to the end? Whether compliance decayed across a long session, whether children received the rule, and whether a settled decision stayed settled. Three rows.

Cutting across all five is an assurance band, Checked – would you find out if it had not been? Three rows. Not a sixth stage. Each asks whether a breach would ever reach you, which is different from whether it happened.

The three classes: prevented, detected and survives

Every row carries one of three classes. The class describes how complete the available remedy is, not how serious the failure is.

  1. Prevented – the failure cannot occur (two rows). Both live at the moment of action. A pre-tool gate that refuses a write to a file the agent has not read. Server-side branch protection that refuses the push a local hook would have missed. Note what they have in common: each refuses a specific action, and neither is a rule about behaviour.
  2. Detected – it occurs and something catches it every time (12 rows). Mostly ordinary linting and CI: a size budget on the rule file, a custom lint for a rule written as prose, a touched-file diff scoped to the ticket, a byte-diff proving the generated rule file matches its inputs, artefact gates that catch a compliance claim with nothing behind it.
  3. Survives – nothing catches it every time, so it reaches you (eight rows). Declared precedence between conflicting rules. Whether the rule file was read at all this session. Whether it survived compaction. Whether a prohibition was read as a prohibition. Whether an example was the class or the case. Whether the instruction was ambiguous. Whether a subagent received the rule. Whether a settled decision stayed settled. And whether a violation invisible in the output would ever be found.

So the score is two prevented, 12 detected, eight surviving.

Vocabulary: this register reads its three classes as prevented, detected and survives. Five of the six registers use these words, and the class letter means the same thing everywhere – how complete the remedy is. [A note on vocabulary] on the hub covers the exception, and the three things still unreconciled across the framework.

Now the finding, which is structural. Stage 3 – understood – is none prevented, none detected, two surviving. Every other stage on every other register in this framework has at least one row with a complete remedy. This one has none.

This is not a tooling gap that better software will close. The three questions are: was the prohibition read as a prohibition, was the example the class or the case, and was the instruction ambiguous? Each requires knowing what you meant, and comparing it to what the agent understood. There is no artefact to diff, because the failure happens between the words and the reading. A check can find weak wording; it cannot find a strong rule that was read weakly.

And this is the stage where the human comparison is revealing. A person who misreads your brief can be asked what they thought you meant, and the answer is usually informative. An agent will give you a fluent account of its reasoning that may bear no relation to what actually drove the output. The readback works on people. On an agent it produces more text.

The second-order consequence shapes where effort goes. Stage 1 – the stage every guide addresses – has five of six rows detected. Rule-file hygiene is close to a solved problem. The stages after it are not. No amount of work on the rule file reaches them.

What to install

Start from a base install and add in this sequence. Settings and lints first, then gates, then the judgements.

  • Refuse a write to a file the agent has not read. A pre-tool gate. This is one of only two things on the whole register that prevents rather than detects, and it closes the failure where a confident change is built on a wrong reading of the current state.
  • Put the rule on the server, not in the hook. Branch protection refuses the push that a local pre-commit would have missed when the action routed around it. The second and last prevention.
  • Lint the rule file for size and token budget. The cheapest row here. A rule set that outgrew what can be held in one context does not fail loudly; older rules quietly stop being followed.
  • Regenerate the rule file and byte-diff it against its inputs. Catches a retired rule that still loads. Worth knowing this closes only half the failure: the diff proves the file matches its committed inputs, not that those inputs match the live source.
  • Write the check when you write the rule. A rule expressed as prose no machine can check will be followed in spirit and breached in fact. If you cannot express it as a lint, say so in the file rather than assuming it binds.
  • Scope rule files by directory. A rule in the wrong scope is followed in one folder and ignored in the next. This closes it completely.
  • Add a touched-file diff scoped to the ticket. Catches the unrequested refactor before review rather than during it.
  • Gate compliance claims on artefacts. "Following your style guide" with nothing run is an S4 row and closes fully with an artefact check.
  • Promote repeat findings into checks. Anything caught twice by a human reading becomes a check, or it will be caught a third time.
  • Then the five with no mechanism. Declared precedence between conflicting rules. A check on the reading rather than the wording – including whether an example was the class or the case. A judge for ambiguity. A check that a settled decision was honoured. And a check that fires on a violation invisible in the output. Two of those five are the understood stage, and those two are judgement, permanently.

Run the free trust-check tool to find out which of these you already have. Or start without it: add the pre-tool gate that refuses a write to an unread file. It is the only item here that makes a failure impossible rather than visible.

REFERENCE

Every row on the instruction register

THIS PAGE IS A VIEW, NOT THE RECORD

Generated from the register at commit f179130, last updated 2026-09-01. The register file is canon; this page is a rendering of it. Where the two disagree, the register is right.

OPEN THE CURRENT REGISTER →

Who this is written for

This page assumes a developer's setup. The mechanisms below are written for an agent with hooks, a rule file, a git repository and a CI pipeline. The reference implementation is a markdown second-brain vault, which is where these 22 rows were derived. If that is your stack, everything here is directly installable as written.

If your work sits in Microsoft 365, Google Workspace, Confluence or Notion, the failure is identical – a rule that loads without binding is the same failure anywhere – but the mechanism is not. A policy attached to a document library stands in for a directory-scoped rule file, an approval flow for a pre-commit gate, a mandatory field for a lint. A few rows are native to a repository and have no clean equivalent: the byte-diff of a generated rule file against its inputs is the clearest of them.

Those mappings are not published here. Enterprise mapping is available on request.

How to read each row

Every row in every register in this framework is described the same five ways.

  • Stage – how far the rule had travelled when it failed.
  • The failure – what goes wrong, and the sentence you actually hear when it does.
  • Severity – cost multiplied by how silently it fails. A judgement, not a measurement. S1 visible at once · S2 caught at review · S3 real cost, found late · S4 it ships and nobody finds out.
  • Class – how complete the available remedy is. Prevented: the failure cannot occur. Detected: it occurs and something catches it every time. Survives: nothing catches it every time, so it reaches you.
  • The fix – the mechanism, and where it fires.

Three rows on this register carry a dated first-party incident; the clearest is told in full above. The other 19 do not, or not that we know of. See "How this register works" for why that count is low here and what it means.

Nothing on this page says whether a control is switched on in your setup. The register states that 12 of its 21 tooled rows are not built in the codebase it was derived from.

How to test your own setup

The register describes what is available. Whether any of it is running on your machine is the other question, and you answer it by working down the rows below against your own configuration. The same rows are on GitHub as plain markdown, if you would rather read them in your editor or diff them into your own notes.

What no tool will report is the understood stage. Whether your prohibition was read as a prohibition is not a property of your configuration.

STAGE 1

Written: does the rule exist in a followable form?

None prevented, five detected, one survives. The stage every guide addresses, and the one nearest to solved

IL-1AS3DETECTED

“Older rules quietly stopped being followed.”

The rule set grew past what can be held. It appears gradually, in projects whose rule file only ever gets longer.

THE FIX

A size and token-budget lint on the rule file. Budget the set; retire and merge rules rather than appending.

IL-1BS2DETECTED

“We agreed this last week.”

The rule only ever existed in chat. It appears the session after the agreement.

THE FIX

A standing rule file loaded every session, plus a stop hook that scans the turn for new rules and offers to file them.

IL-1CS2DETECTED

“Followed in spirit, breached in fact.”

Written as prose no machine can check. It appears wherever a rule is a sentence rather than a condition.

THE FIX

A custom lint run as a CI check. If the rule cannot be expressed as one, say so in the file rather than assuming it binds.

IL-1DS1SURVIVES

“It picked one, plausibly, and you disagree.”

Two rules conflict and nothing says which wins. It appears the first time two reasonable rules meet on one edit.

THE FIX

None complete. A precedence header in the rule set helps and is not enforced. Lowest severity here, because you find out at once.

IL-1ES3DETECTED

“The record exists and still does not settle it.”

Only half the decision was written down. It appears months later, when the record answers what was chosen and not why.

THE FIX

A schema on the record, with a lint that fails on a missing rationale field.

IL-1FS2DETECTED

“Follows a rule you retired months ago.”

The rule was superseded and still loads. It appears wherever rule files are generated and the generation is not verified.

THE FIX

Regenerate the rule file and byte-diff it against its committed inputs. This closes half the failure – the diff proves the file matches its inputs, not that those inputs match the live source. That second half needs a human-run export receipt.

STAGE 2

Loaded: did the rule reach the agent at all?

None prevented, one detected, two survive

IL-2AS4SURVIVES

“Behaves as though the rule does not exist.”

The project-root rule file was never read this session. It appears at random, and looks exactly like disobedience.

THE FIX

None complete. Modern harnesses load the project-root rule file automatically, which improves delivery substantially – and it is a delivery control, not an enforcement one, so the row reads "survives". An agent that can ignore the loaded file will.

IL-2BS3DETECTED

“Followed in one folder, ignored in the next.”

The rule sat in a scope that did not apply. It appears in monorepos and in any project with per-area conventions.

THE FIX

Directory-scoped rule files. Closes completely.

IL-2CS3SURVIVES

“Complied early, drifted late.”

Project-root rules were lost during compaction. It appears in long sessions, at the point the context is compressed.

THE FIX

None complete. Re-injection after compaction is real and helps; like automatic loading, it is delivery rather than enforcement.

STAGE 3

Understood: was it read as it was meant?

IL-3AS3SURVIVES

“Did it anyway, with a justification.”

A prohibition was read as a preference – including the narrower case where an example was read as the limit, and only the case you named got fixed. It appears whenever a rule says "avoid" or "prefer" and sometimes when it says "never".

THE FIX

None complete. A grep gate finds weak wording, which is the wording problem rather than the reading problem. Nothing checks how a strong rule was read.

IL-3CS1SURVIVES

“Did something defensible you did not want.”

The instruction was ambiguous. It appears constantly and cheaply, because you find out immediately.

THE FIX

None complete. Plan mode and a spec-driven flow surface the reading before the work, which reduces the cost rather than closing the row.

STAGE 4

Followed: did it survive the moment of action?

IL-4AS4DETECTED

“No reason given, no flag raised.”

A clear rule simply was not followed. It appears without pattern, and it is the failure most people mean when they say the agent ignores instructions.

THE FIX

An ESLint-style rule enforced pre-commit. The rule becomes a condition on the commit rather than a sentence in a file.

IL-4BS3DETECTED

“Reverted to the common convention.”

A trained default overrode the stated rule. It appears wherever your convention differs from the popular one.

THE FIX

A lint enforced pre-commit. The more unusual your rule, the more necessary the check.

IL-4CS3PREVENTED

“Confident change built on a wrong reading.”

It acted before it had the state. It appears whenever an agent edits a file it has not read this session.

THE FIX

A pre-tool gate that refuses a write to an unread file. One of only two preventions on this register, and it works because it refuses a specific action rather than asking for care.

IL-4DS2DETECTED

“Extra files touched, unrequested refactor.”

It did more than was asked. It appears in any session that notices something worth tidying.

THE FIX

A touched-file diff gate scoped to the ticket.

IL-4ES4PREVENTED

“The guard never ran; it was PR-only.”

A gate existed but the action routed around it. It appears the first time a change reaches the destination by a path the gate was not attached to.

THE FIX

Server-side branch protection refuses the push. The second prevention, and like the first it lives outside the agent's reach.

STAGE 5

Held: did it stay followed to the end?

None prevented, one detected, two survive

IL-5AS3DETECTED

“First 10 edits clean, last 10 not.”

Compliance decays over a long session. It appears past the point where the rule is far behind in the context.

THE FIX

A stop hook and an end-of-turn session check.

IL-5BS3SURVIVES

“Parent complies, children do not.”

A subagent never received the rule. It appears in every fan-out.

THE FIX

None complete. Rule-file hierarchy loads into subagents, which is delivery again rather than enforcement.

IL-5CS2SURVIVES

“Raises a thing you already ruled out.”

A settled decision gets reopened. It appears in reviews, briefs and planning passes that read the record without honouring it.

THE FIX

None complete. Settled decisions become dated rules, and a link check proves the record is reachable – not that it was obeyed.

ASSURANCE

Checked: would you find out if it had not been?

None prevented, two detected, one survives. Not a sixth stage. These cut across all five above

IL-6AS4SURVIVES

“Looks right, breaks a rule you cannot see.”

The violation is invisible in the output. It appears wherever the rule governs something the artefact does not display.

THE FIX

None complete. A schema can find rules that have no check attached, which is not the same as finding the violation.

IL-6BS4DETECTED

“Following your style guide", with nothing run.”

It reports compliance it never verified. It appears in closing summaries.

THE FIX

CI artefact gates and byte-diff checks. This is the row where the instruction register and the truth register meet, and the fix is the same: commit the artefact.

IL-6CS3DETECTED

“You found it; nothing else would have.”

Caught only when you happen to read it. It appears whenever the same class of defect is found twice by a human.

THE FIX

Promote repeat findings into checks. The second occurrence is the trigger.

The fixes: dedupe view

Pre-tool gate on unread files

Refuses a write to a file the agent has not read this session.

Prevents IL-4C

Server-side branch protection

Refuses the push that routed around the local hook.

Prevents IL-4E

Rule-file size and budget lint

Fails a rule set that has outgrown what one context can hold.

IL-1A

Stop hook that files new rules

Catches a rule agreed in chat before the session ends.

IL-1B

Custom lint per checkable rule

Turns a rule from a sentence into a condition on the commit.

IL-1C · IL-4A · IL-4B

Schema with a required rationale field

Fails a decision record that says what was chosen and not why.

IL-1E

Regenerate and byte-diff the rule file

Catches a retired rule that still loads. Closes half – it proves the file matches its inputs, not that the inputs match the live source.

IL-1F

Directory-scoped rule files

Puts the rule in the scope that applies.

IL-2B

Touched-file diff scoped to the ticket

Catches work nobody asked for, before review.

IL-4D

Stop hook and end-of-turn check

Catches compliance decaying across a long session.

IL-5A

CI artefact gates

Fails a compliance claim with no artefact behind it.

IL-6B

Repeat findings promoted to checks

Makes the second human catch the last one.

IL-6C

Delivery controls, which are not enforcement

Automatic rule-file loading, re-injection after compaction, hierarchy into subagents. All three help materially and none refuses anything.

Reduce IL-2A · IL-2C · IL-5B. Close none.

Things nothing closes

Declared precedence between conflicting rules · a check on the reading rather than the wording · a judge for ambiguity · a check that a settled decision was honoured · a check that fires on an invisible violation.

IL-1D · IL-3A · IL-3C · IL-5C · IL-6A

GROUNDING

Grounding, per the project's claim discipline: these counts and classes come from one coding-agent harness and one production codebase, read row by row on 6 August 2026, with two rows' harness baseline behaviour verified against vendor documentation on 10 August. The two dated instances come from this project's own corrections register. Twelve of the 21 tooled rows are not built in the codebase this was derived from. It is not a universal benchmark.

› Next register: Did your agent know what it needed to know?