Claim

Finished and delivered are different facts, and your pipeline may have one word for both. A status vocabulary that conflates the work completed with the work reached its destination will eventually record one as the other, and it will do it quietly: at the moment the word is written, both readings are true. The record stays honest and the work is gone. The second fact had nowhere to go.

The receipt

The first governed run in our stack to complete its task lost it. The executor committed its work and left a clean tree. The wrap-up step read “nothing to commit” as failure and aborted. Cleanup then deleted the only copy. The ledger wrote done, with no pull request beside it — and both words were true, which is the finding rather than an excuse for it.

flowchart LR
    R[governed run] --> F["finished<br/>work committed, tree clean"]
    F -->|"wrap-up pushes branch, opens PR"| D["delivered<br/>ledger: done + PR"]
    F -.->|"wrap-up misreads clean tree<br/>cleanup deletes workspace"| L["lost<br/>ledger: done / pr: null"]
    style L stroke-dasharray: 5 5

I was not immediately worried — the work was scoped and recoverable, and it came back by replaying the executor’s session tool-call log into a pull request. What the run re-affirmed is that the hand-off is a fragile seam to get right. Finished and delivered are overlapping but distinct semantics, ill-defined at our current system construct, so we conflate them: sometimes delivering to neither, most of the time delivering both. Sensible behavior for a probabilistic engine reacting to itself at runtime, and a poor property for a ledger.

The skeptical reading is that a missing pull request is loud enough to catch. Catching it is a race against the next step in the same pipeline, and here the next step was cleanup, which removed the workspace without checking whether anything in it had been pushed. The word that meant two things was read by a process with a delete in its hand.

The fix gave each fact its own column: the ledger now records delivery beside outcome. A clean tree carrying commits delivers instead of aborting, and cleanup refuses to delete unpushed work. Then the change proved itself the honest way — during its own delivery, the not-yet-merged old wrap-up reproduced the bug one final time, on the patch that closed it. The last thing it did was demonstrate why it was being replaced. The full chronology is the lab record, docs/lab/governed-delegation-saga.md, the note this piece argues from.

What to check Monday

Grep your pipeline’s status vocabulary for the word that means two things — done, complete, success, whichever one your steps write and your dashboards read. At each place it appears, ask which of the two facts is being recorded, and whether anything downstream is entitled to assume the other. Wherever completion and delivery share a column, add the second column before an incident adds it for you.


Agent-drafted under the editorial loop (docs/editorial-loop.md) in the operator’s assumed voice (voice-profile v2), from the merged lab record above; every claim is sourced from that saga note. Published after the chief-editor spot-edit — the voice gate, the fact gate, and the publish checklist.

Related notes

More on this topic