commit as part of the loop, and announce it when unasked

The loop gains a seventh step. Work was being committed all session on a
verbal instruction, which means it was a property of one conversation
rather than of the harness: a fresh session would have left everything in
the working tree and reported success.

Why automatic: a commit is one `git revert` from undone, and work that
only ever existed in the working tree is not recoverable — this session
already lost uncommitted work to a `git checkout` while signing was
broken. Why announced: the safety argument covers the loss, not the
surprise, so a session that did not ask for this gets one prominent line
before the first commit and the off switch, once.

Ownership split so nothing is stated twice: conventions.md "Git" owns
what one commit contains — now one *revertible* unit rather than one
feature, which is the human's correction to the "never bundle two passes"
reading — and CLAUDE.md §4 owns when a commit happens. ADR-0052 records
both, including that no gate can check this: no script can see whether a
sentence was said.

Docs 6 files, +72/-6 lines. No code, no counters moved.
This commit is contained in:
Claude Opus 5
2026-08-01 01:41:11 +06:00
committed by bdeshi
parent de1ce73430
commit 8256c72180
6 changed files with 92 additions and 9 deletions
+11 -3
View File
@@ -12,7 +12,7 @@ engine — anything in it may be pulled into context on demand. `ideas/` and `re
## How you use it
You ask for a feature. The skill fires by itself and runs
`Clarify → Plan → Implement → Verify → Document → Report`.
`Clarify → Plan → Implement → Verify → Document → Commit → Report`.
This runs for casual requests too — the skill fires on "the default-language files do not need the
`.en` part" exactly as it does on "add tag pages", with a one-line plan instead of a full one. A short
@@ -26,7 +26,7 @@ need to run there rather than pretending to have done it.
3. **Agent:** a short plan — goal, primitive, success criteria, files, ±LOC, deps, earn-it check,
and what it is deliberately *not* doing.
4. **You:** "go", or edit the plan. "Just do it" skips the gate on small changes.
5. **Agent:** implements, runs `./scripts/verify.sh`, shows real output, updates docs, reports.
5. **Agent:** implements, runs `./scripts/verify.sh`, shows real output, updates docs, commits, reports.
Occasional maintenance, by you:
@@ -70,6 +70,14 @@ change detection. Treat a *second* raise as evidence that something belongs in `
two ceilings exist so that "core stops growing, ext rises" is observable, and that stops being true the moment
leaves are allowed into core.
**The agent commits by itself, and tells you the first time.** Work is committed as part of the loop
rather than on request (ADR-0052) — one commit per revertible unit, never a `push`. In a session where
you have not asked for that, the first commit is preceded by a line saying so and naming the off
switch ("stop committing"), because a commit appearing in your repository unannounced is a surprise
even when it is harmless. The asymmetry is the argument: a commit you did not want is one `git revert`
away, and work that existed only in the working tree when something went wrong is gone. If you want
the tree left dirty, say so and the loop stops at Document.
**What is staged has to build, not just the working tree.** Every other gate looks at your files; this one
looks at the commit you are about to make, by building a throwaway checkout of the index. It exists because
staging a subset — a changed signature without its caller — produced a commit that did not compile while
@@ -90,7 +98,7 @@ In order, cheapest first:
`docs/state.md` has fallen behind the code.
2. `docs/state.md` — what exists, the earn-it counters, the latent list, the commit it was last verified
against. This is the only doc that describes the present.
3. `git log --oneline` — one feature per commit, each body saying *why* (`conventions.md`). This is the
3. `git log --oneline` — one revertible unit per commit, each body saying *why* (`conventions.md`). This is the
real map of how the code got here.
4. `/refresh-docs` — reconciles every doc against the actual code and reports drift, which is exactly the
question you have after a year.