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
+15 -2
View File
@@ -79,8 +79,8 @@ the test: `docs/architecture.md`.
## 4. The loop (every request, no exceptions)
`Clarify → Plan → Implement → Verify → Document → Report`.
Procedure: `.claude/skills/khosra-feature-loop/SKILL.md`. The two gates people skip:
`Clarify → Plan → Implement → Verify → Document → Commit → Report`.
Procedure: `.claude/skills/khosra-feature-loop/SKILL.md`. The three gates people skip:
**Clarify.** Only questions whose answer changes the code or the bytes on disk. Max three,
batched, up front, each with a **bold** default so silence answers. Never about naming, formatting,
@@ -90,6 +90,18 @@ or anything `docs/conventions.md` decides. None to ask? State assumptions in one
ran (golden file, `curl`, test name, benchmark). Never report success from reading your own diff.
"Should work" is not a result.
**Commit.** Work lands in git without being asked, every time, before you report. What one commit
contains is `docs/conventions.md` "Git": the changes that would be reverted together, bundled
together. Never `git push`, and never `--no-verify` without saying why in the body. Asymmetry is the
whole reason — a commit is one `git revert` away from undone, while work that only ever existed in
the working tree is not recoverable at all.
**Announce it once per session, prominently, when it was not asked for.** If the human has not
already asked for automatic commits in *this* session, the first commit is preceded by a visible
line of its own — not a clause inside the report — saying that this change is being committed, that
later changes will be too, and that saying so turns it off. Silence is consent only after the notice
exists; before it, an unannounced commit is a surprise in someone else's repository.
## 5. Definition of done
- [ ] Plan's success criteria demonstrated with real output.
@@ -97,6 +109,7 @@ ran (golden file, `curl`, test name, benchmark). Never report success from readi
- [ ] Diff contains nothing outside the planned files.
- [ ] `docs/state.md` updated (inventory, counters, latent items, verified-at line).
- [ ] ADR in `docs/decisions.md` if a load-bearing choice was made.
- [ ] Committed — one revertible unit per commit, announced if this session did not ask for it.
- [ ] Report states LOC delta, what is now earned, what you deliberately did not do.
## 6. Stop conditions — halt and ask