Subscribe

Every way your agent fails, and what catches it.

Can you trust the record of what your agent did?

Is the record trustworthy? The Provenance register names the 22 ways the record of a piece of work turns out not to support the question you are asking of it.

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

3

PREVENTED

14

DETECTED EVERY TIME

5

SURVIVE EVERYTHING

ONLY TWO CAN BE CLOSED WHILE THE WORK IS HAPPENING

SEVERITY

8 × S4 · 8 × S3 · 5 × S2 · 1 × S1

THE SHORT ANSWER

Can you trust the record of what your agent did?

Because for agent work the record is the only remaining instance of the reasoning - there is no person to ask afterwards. Three of the 22 can be made impossible, fourteen can be caught every time, and five cannot be closed by anything available. Only two can be closed while the work is still happening; every other control reports on a record that is already wrong.

Six weeks from now somebody asks why the code does this. Can the record answer?

For human work it usually can, and not because the documentation was good. A person carries context between days and can reconstruct intent months later from a fragment – a half-remembered conversation or a name on a ticket. And you can walk over and ask them. The written record is a convenience.

An agent's memory of its own work ends when the session does. Whatever was not written down did not merely go unrecorded, it ceased to exist the moment the context closed. And you cannot ask, because asking produces a fluent, confident account with nothing behind it – the same sentence whether the work happened that way or not.

So the record is not documentation of the work. For agent work the record is the only remaining instance of the reasoning, and there is no testimony to fall back on when it turns out to be thin.

That changes when the record has to be made. You are not asking the agent for better notes at the end. You are making the record fall out of the work while it happens, because nothing reconstructs it afterwards and there is nobody left to ask.

What this register does

The provenance register names the 22 ways the record of a piece of work turns out not to support that question. Three can be made impossible. Fourteen can be caught every time. Five cannot be closed by anything available. The register carries 12 evidenced rows and 10 candidates; the hub's headline counts count evidenced rows only.

The best way to build controls is by deciding when each control acts: only two of the 22 can be closed while the work is still happening. Every other control tells you about a record that is already wrong.

The register produces one working rule: make the record a repo artefact, so it moves in the same commit as the change and can be read at the version the work was done.

This is a technical page listing every row in the register and what it costs, what closes it, and where. It sits under the hub. Its closest neighbour is can you believe your agent?, the truth register, and the two are not the same question. An agent can be perfectly honest and leave no usable trace.

Many of the controls on this page are standard software engineering – commit history, tickets, audit logs – 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

Only two of the 22 can be closed while the work is still happening. Every other control tells you about a record that is already wrong.

The question this register asks

Is the record of what was done trustworthy? The unit this register tests is a unit of work:

  • A ticket, and the commits that claim to belong to it.
  • A session record, and whether it survives the session.
  • A decision, and whether the reason for it was written down.
  • A board state, and whether it still describes the code.

Each one leaves a trail (or fails to). The register grades each failure by what it costs, by how quietly it fails, and by where the only available control sits – which turns out to matter more here than on any other register.

The consequence of that is where this register's controls have to sit. If the record is the only remaining instance of the reasoning, then a control that inspects the record after the fact is inspecting the only copy, with nothing to check it against.

What a broken record looks like

A WORKED EXAMPLE / PL-3A

Here is one from our own build.

Here is the row this page is built around, with two separate dated incidents behind it, from our own tooling.

The first: a canon checker ran on every register in the framework and passed all six. Three defects were standing at the time, and it had been passing for as long as they had. It validated no status field and no trigger cadence, so the things that were wrong were simply outside what it looked at. A clean run and a correct system produced the same output.

The second: a gate was written, validated and wired into the register that tracks gates. Both conditions the framework required were met – the file existed, the validation reference was recorded. Then somebody checked what actually called it. Nothing did. Not CI, not a git hook, not a package script. Its only references anywhere were inside documents describing that someone should run it. The framework's own canon checker had the identical defect at the same moment.

That is PL-3E, "the gate fails open and says nothing", and it is Class B – detected, and only from outside. Note where the control has to live: the harness gate cannot close this row, because the harness gate is the thing that failed. A dead sensor and a passing check are indistinguishable from inside. Only a control plane that asserts the gate ran can tell them apart.

TWO DECISIONS REACHED NO LOG / RECONSTRUCTED TWO DAYS LATER

Why the only control that acts in time cannot check itself

Two properties define this register.

The first is a distinction. Provenance is not the truth register. An agent can be scrupulously honest and leave no usable trace. It can also leave an immaculate, complete, well-structured trace of work it misreported. Those are different failures with different controls, and a page that treats them as one will prescribe the wrong fix for both. Truth asks whether the claim about the work was true. Provenance asks whether you can reconstruct what happened, whatever anybody claimed.

The second is a contradiction. Three positions can hold a provenance control, and they trade off against each other in a way that has no clean answer.

The harness gate acts while the work is being done – hooks and blocking conditions inside the agent's own runtime. It is the only position that can refuse before the record is wrong. Everything after it is describing something that already happened. And it is the thing being checked: it cannot catch its own absence, and when it breaks it usually breaks silently open.

The repo artefact closes at the commit – tickets, session records and decision logs moving in the same commit as the change. Portable, diffable, readable at the version the work was done, and near-zero exit cost. Its weakness is that a file can be complete and say nothing; structure is not substance.

The control-plane check runs on the commit, external to both the agent and the tracker. It is the only position that can assert another position actually ran. It also runs late, telling you the record is missing after the work is finished.

So the position that can act in time cannot verify itself, and the position that can verify it cannot act in time. The practical consequence is that you need at least two of the three positions covered, not the best one.

Severity here is cost multiplied by how quietly it fails. Eight of the 22 rows are S4 and exactly one is S1 – a record that is invisible to anyone without a repository clone, which is at least loudly invisible.

How this register works

The provenance register lists 22 failures and grades them against a base install: an agent, a repository, a CI pipeline, and a tracker somewhere. It names the strongest control available against each and, unusually, which of three positions that control can occupy. 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 unit of work – how it is oriented, claimed, recorded, linked, landed and attributed – and asking at each point what would make the record unusable later. 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.

Nine of the 22 are recorded here with dates. Thirteen are not. The count is high for one reason: provenance failures happen to the people building the framework, in the framework's own tooling, and get caught by the framework's own checks. Two come from checkers that passed while defects stood. One comes from a push that a hook refused while the session reported the work as landed. One from a tool rebuilt from scratch because the existing one was never read. One from two branches appending to the same log and merging cleanly. Four are July 2026 incidents mapped retrospectively: a security pass that under-reported its own changes, a squash merge that broke an ancestry check, and a fan-out that stranded five agents' finished work.

The life of a record: six concerns

Rows are grouped by which part of the record is failing.

  1. Orientation and continuity. Whether the agent starts knowing what happened before, and whether constraints agreed early survive to the end. Two rows.
  2. Claiming the work. Whether the work is attached to a unit of work at all, and whether scope stays where it started. Three rows.
  3. The record itself. Whether anything is written, whether it says the parts that matter, and whether it can be edited afterwards. Five rows.
  4. Linking intent to code. Whether a commit can be traced to the decision it implements, and read as it stood at the time. Three rows.
  5. Landing. Whether "done" means it shipped, and whether the board still describes the code. Three rows.
  6. Many agents, and who did what. Whether you can tell which agent, which model, and which of two concurrent writers produced what. Six rows – the largest group, and the one with the most rows nothing closes.

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, and it is a separate axis from the three positions above.

  1. Prevented – the failure cannot occur (three rows). Require an active unit of work before the turn starts. Block the turn from ending with no record written. Inject the identifier on the commit so an unlinked commit cannot reach a protected branch. All three refuse rather than report.
  2. Detected – it occurs and something catches it every time (14 rows). The bulk of the register, and mostly ordinary: required headings on a session record, git history exposing an after-the-fact edit.
  3. Survives – nothing catches it every time, so it reaches you (five rows). A session digest an adversarial agent cannot ignore. A marker proving which unit of work a commit belongs to when two sessions share one. A fan-out with no gather stage, which is the defect itself rather than a missing control. An externally owned mutation boundary between concurrent writers. And a board projection someone outside the terminal can actually see.

So the score is three prevented, 14 detected, five surviving.

Now the cross-cut, which on this register is between class and position. Only two rows can be closed at the moment of work. Nine close at the commit. Six close only after the merge. Five close nowhere. Read left to right, that is a measure of how much has already happened by the time anything notices.

Two consequences follow, and they point in opposite directions from most advice.

The repo-artefact block is where the value is. Nine of 22 rows – the largest single block, the cheapest of the three positions to adopt, and it needs no new software at all. Tickets, session records and decision logs as files, moving in the same commit as the change.

And the group with the most rows nothing closes is the one about multiple agents. Three of the six rows on concurrency and attribution have no complete remedy. If your answer to throughput is more agents in parallel, this is the register that prices it.

Vocabulary: this register reads its three classes as prevented, detected and survives. Five of the six 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 one exception and the three things still unreconciled across the framework.

What to install

Start from a base install and add in this sequence. Conventions first, then CI, then the things nothing closes.

  • Move the record into the repository. Tickets, session records and decision logs as files, committed with the change they describe. This is the single highest-value item on the register: 9 of 22 rows close here, it costs no software, and the record becomes readable at the version the work was done.
  • Require an active unit of work before the turn starts. One of only three things here that prevents rather than detects. Work with nothing attached to it cannot be explained later, and the cheapest moment to attach it is before it exists.
  • Block the turn from ending with no record. The second prevention. A stop condition inside the harness, so the reasoning cannot leave with the context.
  • Inject the identifier on the commit, and reject unlinked commits at the branch. The third prevention, and note it needs both halves: the harness injects, the control plane refuses. Either alone is bypassable.
  • Require headings on the record, and reject on missing sections. A record that reads fine and answers nothing is the most common shape of this failure. Structure is not substance, but the absence of structure is reliably the absence of substance.
  • Recompute the result rather than trusting the report of it. The doer writing its own success report inherits its own blind spot. This is where provenance and truth touch.
  • Assert in CI that the gate ran. Not that it exists – that it ran. This is the only control that catches a dead sensor.
  • Check the artefact on the target branch. "Done" recorded on a branch that never landed is an S4 row and a clean CI run.
  • Carry a provenance trailer and the model seat. Which agent, which model. A model-specific defect that cannot be traced back to its model recurs.
  • Then the five that close nowhere. A digest an adversarial agent cannot ignore. A per-session marker that survives two sessions sharing one. A gather stage after every fan-out. A mutation boundary owned outside both writers. A board someone outside the terminal can see. Four of the five are orchestration problems; the fifth is a publishing one.

Run the free trust-check tool to find out which of these you already have. Or start without it: move your session records and decision log into the repository this week, and commit them with the change. It is the cheapest item here and it closes the largest block.

REFERENCE

Every row on the provenance 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 git repository, plain-text notes carrying a frontmatter schema, and a CI pipeline. The reference implementation is a markdown second-brain vault, which is where these 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 record that cannot support what actually happened is the same failure anywhere – but the mechanism is not. A tenant audit log stands in for the session record, document version history for the commit trail, a work-item link for the three-way match. A few rows are native to a repository and have no clean equivalent: the record moving in the same commit as the change, and the byte-diff of a stated board state against the code, are 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. This register adds the position.

  • Concern – which part of the record is failing.
  • What breaks – the failure, and what it costs you later.
  • Severity – cost multiplied by how quietly 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: cannot occur. Detected: occurs and is caught every time. Survives: nothing available closes it.
  • Position – where the closing control can sit. Harness gate at the moment of work · repo artefact committed with the code · control-plane check on the commit · nothing.
  • The fix – the mechanism, and which position it occupies.

Nine rows on this register carry a dated first-party incident, told in full above and in the row list below. The other 13 do not, or not that we know of – the highest first-party count of any register except Truth, for the reason given under "How this register works".

Nothing on this page says whether a control is switched on in your setup. A position that can close a row is not a control that is running.

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.

1

Orientation and continuity

None prevented, one detected, one survives

PL-1AS3SURVIVESNOTHING CLOSES IT

“Agent starts blind to prior work.”

It redoes finished work, or reverses last session's decision. It appears at the start of any session that follows another.

PL-1CS4DETECTEDREPO ARTEFACT

“Compaction drops a decision held only in context.”

It silently reverts to a default you had ruled out – or a constraint agreed in turn 3 is gone by turn 30. It appears whenever a long session is compacted and the only copy of a decision was in the part that went.

2

Claiming the work

PL-2AS2PREVENTEDHARNESS GATE

“Work done with no unit of work attached.”

Nobody can say later what it was for. It appears in quick fixes, which are the changes most likely to be questioned later.

PL-2BS4DETECTEDCONTROL-PLANE CHECK

“The gate only fires once a ticket is claimed.”

Never engaging reads as a clean pass. It appears wherever the provenance gate is conditional on the thing it is meant to enforce.

PL-2CS2DETECTEDREPO ARTEFACT

“Scope quietly expands mid-task.”

Files changed that nobody asked about. It appears in any session that finds something worth tidying.

3

The record itself

PL-3AS3PREVENTEDHARNESS GATE

“No record written at all.”

The reasoning is gone the moment the turn ends. The failure is evident at the end of any session for which nobody told the agent to write anything.

PL-3BS3DETECTEDREPO ARTEFACT

“Record omits the parts that matter.”

It reads fine and answers nothing you will actually ask later. It appears whenever a record is written to a length rather than to a question.

PL-3CS4DETECTEDCONTROL-PLANE CHECK

“The doer writes its own success report.”

The record inherits the same blind spot as the work. It appears at the end of every session by default.

PL-3DS4DETECTEDREPO ARTEFACT

“Record edited after the fact.”

You review a tidied version of events. It appears when a record is a mutable document rather than a commit.

PL-3ES4DETECTEDCONTROL-PLANE CHECK

“The gate fails open and says nothing.”

A dead sensor is indistinguishable from a pass. It appears the first time anybody asks what invokes a gate.

4

Linking intent to code

PL-4AS3PREVENTEDCONTROL-PLANE CHECK

“Unlinked commit lands on a protected branch.”

Six months on, nobody knows why it changed. It appears on every commit nobody attached an identifier to.

PL-4BS3SURVIVESNOTHING CLOSES IT

“Commit linked to the wrong unit of work.”

Two sessions, one shared marker. It appears whenever more than one session works under the same identifier.

PL-4CS2DETECTEDREPO ARTEFACT

“Decision made in chat, written nowhere.”

Re-litigated next month from scratch. It appears in every conversation that settles something without writing it down.

5

Landing

None prevented, three detected, none survive

PL-5AS4DETECTEDCONTROL-PLANE CHECK

“Done recorded on a branch that never landed.”

Shipped is asserted, never verified. It appears at the end of any session that reports work as complete without checking where it went.

PL-5BS3DETECTEDREPO ARTEFACT

“Board diverges from the code.”

The tracker quietly becomes fiction. It appears within about two weeks of anybody trusting the board.

PL-5CS4DETECTEDCONTROL-PLANE CHECK

“Squash-merge breaks the ancestry.”

The provenance check answers the wrong question. It appears the first time a check tests branch ancestry on a repository that squash-merges, because the merged commits are not ancestors of the base.

6

Many agents, and who did what

None prevented, three detected, three survive. The largest group, and the one where the least closes

PL-6AS3SURVIVESNOTHING CLOSES IT

“Parent returns before its children finish.”

Completed work is stranded, then paid for twice. It appears in every fan-out dispatched without a gather stage.

PL-6BS3DETECTEDREPO ARTEFACT

“Large artefact held in context, never written.”

Finished work dies with the context. It appears in long generative tasks and in subagent briefs.

PL-6CS4SURVIVESNOTHING CLOSES IT

“Two agents conflict; one overwrites the other.”

A correct change silently disappears. It appears in any repository worked by two agents at once.

PL-6DS2DETECTEDREPO ARTEFACT

“Cannot tell which code an agent wrote.”

Review effort spreads evenly over uneven risk. It appears once agents and people are committing to the same repository.

PL-6ES2DETECTEDREPO ARTEFACT

“Cannot tell which model produced it.”

A model-specific defect cannot be traced back. It appears the first time one model's characteristic failure needs finding across a history.

PL-6FS1SURVIVESNOTHING CLOSES IT

“Record invisible without a repository clone.”

Nobody outside the terminal can see the state. It appears the moment somebody who does not use git asks what is happening.

The fixes: dedupe view

The record as repo artefact

Tickets, session records, decision logs and constraints as files, moving in the same commit as the change. No software required.

Repo artefact

Active unit of work required before the turn

Refuses a turn with nothing to attach the work to.

Harness gate

Blocking stop condition on the record

Refuses to end a turn with no record written.

Harness gate

Identifier injected on commit, unlinked commits rejected

Attaches intent at the commit and refuses it at the branch. Needs both halves.

Harness gate + control plane

Required headings, rejected on missing sections

Fails a record that reads fine and answers nothing.

Repo artefact

Recompute rather than accept the report

Verifies the result externally instead of trusting the doer's account of it.

Control-plane check

Assert in CI that the gate ran

Distinguishes a dead sensor from a pass. The only control that catches a gate nothing invokes.

Control-plane check

Artefact check on the target branch

Verifies that "done" reached the destination. Tests file existence, not ancestry, so squash-merge cannot fool it.

Control-plane check

Board derived from the repository

Generates the tracker from the code rather than maintaining it beside it.

Repo artefact

Provenance trailer and model seat

Records which agent and which model produced a change.

Repo artefact

Things nothing closes

A digest an adversarial agent cannot ignore · a marker proving which session a commit belongs to · a gather stage after every fan-out · a mutation boundary owned outside both writers · a board visible without a clone.

Nothing

GROUNDING

Grounding, per the project's claim discipline: these counts, classes and positions come from one coding-agent harness and one production codebase, assessed row by row. The five dated instances come from this project's own corrections register, and four of the five are failures in the framework's own record-keeping. It is not a universal benchmark.

› Next register: Did your agent do what it was told?