← DOS · all incidents

Rendered from docs/incidents/my-agent-said-it-committed-but-theres-no-commit.md — the Markdown in the repo is the source of truth; this page is generated by scripts/build_incident_pages.py, never hand-edited.

"My agent said it committed, but there's no commit"

The one-command answer: dos verify — a verdict read from your git history, never from the agent's transcript. pip install dos-kernel, then ask.

What happened

You gave an agent a task. The transcript ends with something like "Done — I've implemented the endpoint, added tests, and committed the changes." Later — at the demo, at the deploy, or just when you ran git log — there is no commit. Sometimes there are no file changes at all.

This is the most common first burn with autonomous agents, and it is not a freak event. An agent's "I committed it" is a claim, written by the same process that wants credit for the work. Nothing in the loop checks the claim against the repository, so a confident narration and an empty git log can coexist for hours. The fix is not a better prompt; it is refusing to let the transcript be the evidence.

The command

dos verify answers "did this actually ship?" from git history alone — no plan files, no registry, no API key. It works on any plain git repo. Name the work the way your commits do (out of the box: a phase id at the front of a commit subject, like AUTH1: ship the login endpoint — see the five-minute quickstart for the convention):

pip install dos-kernel        # the PyPI name is dos-kernel, never bare `dos`
dos verify --workspace . AUTH AUTH2

When the agent claimed AUTH2 but nothing landed, the verdict is:

NOT_SHIPPED AUTH AUTH2 (via none)

with exit code 1. via none means DOS looked everywhere it trusts — the registry, then git history — and found nothing. The contrast, for work that really landed:

SHIPPED AUTH AUTH1 f762c2a (via grep-subject)

Exit code 0, and the verdict names its witness: a commit in your history, not anyone's say-so. Both outputs above are real, reproduced exactly as shown.

To stop the next one before you feel it, wire the verdict into your agent runtime's stop hook — then a "done" claim with no shipped commit behind it is refused, and the loop keeps working:

dos init --hooks auto .       # Claude Code, Cursor, Codex, Gemini CLI, …

What the verdict does — and does not — certify

SHIPPED certifies presence, not correctness: a commit stamping that phase exists in your repo's visible history. It does not review the code, run the tests, or grade whether the change is any good. A commit whose subject claims work its diff doesn't contain is a different incident — that one is caught by dos commit-audit.

Where to go next