Propose unattended capture, and what stops it minting instructions - #427
Merged
Conversation
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
CommitLore — record lintTrailers: clean — 1 commit in Active constraints for the paths this PR touchesLimits (2)
Ruled out (3)
Warnings (1)
Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR. |
This was referenced Aug 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 initthat 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 adevbuild.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,injectdefaults it to[], andgradeRecordis 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
Provenance: draftedmarks a record staged without a person reading it, and grading caps it atclaim— the treatmentreconstructedalready gets. Additive: a reader that does not know the value falls tounknown, which also gradesclaim, so an old implementation is safe rather than wrong.Supersedes:the old, because a commit message is immutable. Never an edit.claimrecords — which is what every installed CommitLore serves today.Two alternatives that looked right and are not
An
approvedphase (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
draftedrecord under the sameRecord-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
cacheKeyand breaks the byte-identitytest/inject.test.tspins, and M5 is mid-flight against a pinned harness.test/dogfood.test.ts9 passed ·spec/verify.sh26 fixtures OK.