Skip to content

Unattended auto reports enabled but ordinary commits never initiate capture #527

Description

@MongLong0214

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:

  1. 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.
  2. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions