SSOT execution contract
Outcome
On the certified Claude Code adapter, an eligible git commit attempt deterministically starts or finds a capture assessment without the user asking.
Scope
- host hook receives transcript/cwd/tool call
- robust commit-intent parsing
- one bounded Commit Gate retry
- existing pending transaction/hook pipeline reuse
Acceptance
- important change → record staged
- trivial change → verified-empty
- changed staged tree invalidates prior assessment
- direct human commit follows documented non-agent policy
- no infinite loop or model/network call in Git hook
Summary
commitlore init --unattended reports that unattended capture is enabled and describes it as preparing, verifying, and staging a record on every commit. A normal commit after successful initialization does not initiate capture: no pending transaction is created, no trailer is appended, and no note is written.
The installed hooks only validate/apply/finalize an already-staged pending record. They do not create the transcript/draft/pending transaction that commitlore capture requires.
Reproduction
Use current dev at 78f88be16413796845794d70465f60d7b919fe3f:
git init -b feature repro
cd repro
git config user.name 'E2E'
git config user.email 'e2e@invalid.local'
git commit --allow-empty -m 'chore: baseline'
commitlore init --unattended --verbose
Initialization succeeds and reports:
installed commit-msg hook
installed prepare-commit-msg hook
installed post-commit hook
installed pre-push hook
unattended capture enabled: wrote .commitlore-policy.json (mode "auto")
Commit the generated policy/config, then make and stage a non-trivial text change and run only the ordinary Git operation:
git add decision.txt
git commit -m 'docs: record the pinned runtime decision'
Observed readback:
shape ok · references ok
$ git show -s --format='%B' HEAD | git interpret-trailers --parse
# empty
$ commitlore pending ls --json
{"transactions":[],"unreadable":[]}
$ git notes --ref=commitlore list
# empty
The exact auto/init/prepare/post-commit focused suite passes, so this is not a hook installation failure.
Source boundary
auto.ts reads/writes consent (mode: "auto", unattended: true).
prepare-commit-msg applies only an existing staged pending record.
post-commit finalizes only an applied pending record.
capture.ts requires transcript and draft inputs to create and stage that pending record.
No installed Git hook initiates that first capture step.
Expected
The product needs one truthful contract:
- If unattended auto is intended to start capture for every normal commit, initialization must install and verify the component that initiates capture, and the E2E above must yield either a verified record or an explicit verified-empty decision.
- If an external host integration is required to invoke
capture, init/auto status must name that prerequisite and must not report the repository as fully enabled when the host trigger is absent.
Failing silently is the unsafe state: the repository says unattended capture is on while ordinary commits produce no capture attempt and no diagnostic.
SSOT execution contract
Outcome
On the certified Claude Code adapter, an eligible
git commitattempt deterministically starts or finds a capture assessment without the user asking.Scope
Acceptance
Summary
commitlore init --unattendedreports that unattended capture is enabled and describes it as preparing, verifying, and staging a record on every commit. A normal commit after successful initialization does not initiate capture: no pending transaction is created, no trailer is appended, and no note is written.The installed hooks only validate/apply/finalize an already-staged pending record. They do not create the transcript/draft/pending transaction that
commitlore capturerequires.Reproduction
Use current
devat78f88be16413796845794d70465f60d7b919fe3f:Initialization succeeds and reports:
Commit the generated policy/config, then make and stage a non-trivial text change and run only the ordinary Git operation:
git add decision.txt git commit -m 'docs: record the pinned runtime decision'Observed readback:
The exact auto/init/prepare/post-commit focused suite passes, so this is not a hook installation failure.
Source boundary
auto.tsreads/writes consent (mode: "auto",unattended: true).prepare-commit-msgapplies only an existing staged pending record.post-commitfinalizes only an applied pending record.capture.tsrequires transcript and draft inputs to create and stage that pending record.No installed Git hook initiates that first capture step.
Expected
The product needs one truthful contract:
capture,init/auto statusmust name that prerequisite and must not report the repository as fully enabled when the host trigger is absent.Failing silently is the unsafe state: the repository says unattended capture is on while ordinary commits produce no capture attempt and no diagnostic.