Skip to content

Propose unattended capture, and what stops it minting instructions - #427

Merged
MongLong0214 merged 1 commit into
devfrom
adr-unattended-capture
Aug 7, 2026
Merged

Propose unattended capture, and what stops it minting instructions#427
MongLong0214 merged 1 commit into
devfrom
adr-unattended-capture

Conversation

@MongLong0214

Copy link
Copy Markdown
Owner

Part of #426. Docs only — one ADR, no source change.

Status: Proposed, not Accepted

It changes SPEC §3 vocabulary, which binds every implementer of the protocol and not just this codebase. ADR-0028 says the thing it declines to build "needs its own ADR and its own approval." This is the first half.

Why now

The product goal is that one install is the last thing a user does. After commitlore init that is already true of injection, validation, trailer application, the notes write, the publish (#416), the collect, the index and its staleness recovery (#406), and concurrent hooks (#420) — verified end to end against a dev build.

One thing still asks: the skill shows verified records and stages only what the user keeps. ADR-0028 is explicit that the core does not require it.

The argument for building the guarantee before it is needed

The expected objection to unattended capture is that it mints instructions nobody read. It does not, today. No installed surface passes --trusted-author, inject defaults it to [], and gradeRecord is fail-closed on that. Measured on a repository whose record was authored by its own committer: 0 lines [directive], 6 lines [claim] (#415).

That safety is accidental — it holds because a feature is missing, and #415 exists to decide whether to add it. The moment trusted authors become configurable, unattended capture starts minting directives, and the guarantee would have to be retrofitted onto records already in history.

What is proposed

  1. Capture runs unattended; the skill's step 4 goes.
  2. Provenance: drafted marks a record staged without a person reading it, and grading caps it at claim — the treatment reconstructed already gets. Additive: a reader that does not know the value falls to unknown, which also grades claim, so an old implementation is safe rather than wrong.
  3. Promotion is a new record that Supersedes: the old, because a commit message is immutable. Never an edit.
  4. Promotion is optional and rare. A repository where nobody promotes serves only claim records — which is what every installed CommitLore serves today.
  5. An off switch, in the capture policy ADR-0021 §7 already hashes.

Two alternatives that looked right and are not

An approved phase (the shape ADR-0028 sketched): as a gate it stops the record being applied at all, which is the feature; as a flag it stays in .git/ and never reaches the trailers grading reads.

Endorsement through the notes mirror: attractive because a note attaches without rewriting history, and #409 made a notes record graded by its own author. But #409 also grades a multi-source record on every source and keeps the floor — so an endorsement note cannot lift a drafted record under the same Record-Id. The mechanism that closed the forgery closes this too.

The cost the design does not mitigate

With no person in the loop the pipeline decides what is worth recording, and the skill's own guidance is that most commits carry nothing. A record costs a future reader attention; unattended capture spends that budget without asking. Recorded as Unverified: on the commit, because nothing here measures it.

Not before

M5's verdict and the release that follows it. The ADR also defers the injection-legend question (#415) for the same reason: changing injected bytes changes cacheKey and breaks the byte-identity test/inject.test.ts pins, and M5 is mid-flight against a pinned harness.

test/dogfood.test.ts 9 passed · spec/verify.sh 26 fixtures OK.

One install should be the last thing a user does. Injection, validation, trailer
application, the notes write, the publish, the collect, the index and its
staleness recovery all run with no input already. One thing still asks: the
skill shows the verified records and stages only what the user keeps.

ADR-0028 says the core does not require that prompt -- `stage` has no way to ask
whether a human saw the record, and a host that stages without asking is within
contract. So the question was never permission. It is what should be true
instead.

The expected objection is that unattended capture mints instructions nobody
read. It does not, today: no installed surface passes `--trusted-author`,
`inject` defaults it to empty, and grading is fail-closed on that. Measured on a
repository whose record was authored by its own committer: zero directive lines,
six claim lines.

That safety is accidental. It holds because a feature is missing, and #415
exists to decide whether to add it. Building the guarantee while it costs
nothing is the argument for writing this now rather than after.

Four alternatives are recorded with why they fail, and two of them looked right
at first. An `approved` phase deletes the feature when used as a gate and never
reaches the commit -- where grading reads -- when used as a flag. Endorsement
through the notes mirror cannot lift a record, because #409 made a multi-source
record take the trust floor, so the mechanism that closed the forgery closes
this too.

Proposed rather than Accepted. It changes SPEC vocabulary, which binds every
implementer and not just this codebase, and ADR-0028 says the thing it declines
to build needs its own ADR and its own approval. This is the first half.

Limit: a commit message is immutable without rewriting history, so a record cannot be upgraded in place and promotion has to be a superseding record
Limit: `X-` extensions are defined as never interpreted by the core, so the unread signal cannot live in one
Ruled-out: an `approved` phase in the pending transaction | as a gate it stops the record being applied at all, which is the feature; as a flag it stays in `.git/` and never reaches the trailers grading actually reads
Ruled-out: endorsing a drafted record with a note written by a trusted human | #409 grades a multi-source record on every source and keeps the floor, so the endorsement cannot raise it under the same Record-Id
Ruled-out: removing the prompt and changing nothing else | correct today only because `--trusted-author` is unreachable, which makes the product's safety depend on the absence of a feature it intends to add
Warn: unattended capture spends a future reader's attention without asking; the skill's own rule is that most commits carry nothing and an empty answer is the common correct one
Blast: system
Undo: costly
Certainty: tentative
Verified: the zero-directive measurement is `buildInjection` run against a seeded repository, counting tagged record lines rather than reading the renderer
Unverified: whether unattended drafting over-records in practice -- nothing here measures the noise cost, and it is the one cost the design does not mitigate
Provenance: authored
Record-Id: r-adr30x
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown

CommitLore — record lint

Trailers: clean — 1 commit in origin/dev..25bf6327285835841d174064e3d3327a61b7d148
Active constraints: 2 limits · 3 ruled-out · 1 warnings — from 1 record over 1 changed path

Active constraints for the paths this PR touches

Limits (2)

  • r-adr30x 25bf632 — a commit message is immutable without rewriting history, so a record cannot be upgraded in place and promotion has to be a superseding record
  • r-adr30x 25bf632X- extensions are defined as never interpreted by the core, so the unread signal cannot live in one

Ruled out (3)

Warnings (1)

  • r-adr30x 25bf632 (claim) — unattended capture spends a future reader's attention without asking; the skill's own rule is that most commits carry nothing and an empty answer is the common correct one

Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR.

@MongLong0214
MongLong0214 merged commit 83ce7ad into dev Aug 7, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant