An unfinished scan answered with silence, which reads as "no records here" - #778
Merged
Conversation
…here" `buildInjection` returned an empty payload whenever a path had no active records -- including when the scan stopped at its budget before reaching the commits that hold them. The caveat existed, on stderr, which a model reading `additionalContext` never sees. So the two answers arrived identically: a repository with nothing recorded for this path a repository this tool had not finished reading That distinction is the one CommitLore keeps everywhere else. `coverage: partial`, `history: unavailable` and `notes: unfetched` are separate states precisely so absence is never read as evidence, and the surface a model actually consumes was collapsing them. Found in a freshly materialized worktree: 588 commits unread, zero bytes out, and a benchmark ON arm that recorded it as a hook which had never fired -- the arm looked configured and was untreated. Filed as #776. There were two early returns, not one. The first, on `active.length === 0`, is the path that actually fires in a fresh clone, and a fix at the second alone would have passed review and changed nothing. Both now go through one helper. Silence is kept where it is right: a complete scan with nothing to say still costs nothing, and this hook fires on every Read. Limit: this says the scan was cut short, not which records were missed -- the payload cannot name what it never read Blast: module Undo: easy Certainty: firm Record-Id: r-partialsilence Provenance: authored Verified: driven by scanBudgetMs so the partial state is constructed rather than raced for -- reproducing it by clone-and-hope is the non-determinism the defect is about; reverting either return fails the notice test and leaves the other two passing CommitLore-Version: 2.0.0
CommitLore — record lintTrailers: clean — 1 commit in 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 18, 2026
This was referenced Aug 18, 2026
Merged
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.
Closes the third recommendation on #776.
buildInjectionreturned an empty payload whenever a path had no active records — including when the scan stopped at its budget before reaching the commits that hold them. The caveat existed, on stderr, which a model readingadditionalContextnever sees.So two different answers arrived identically:
That distinction is the one CommitLore keeps everywhere else —
coverage: partial,history: unavailableandnotes: unfetchedare separate states precisely so absence is never read as evidence. The surface a model actually consumes was collapsing them.Where it bit
A freshly materialized worktree: 588 commits unread, zero bytes out, and a benchmark ON arm that recorded it as a hook which had never fired. The arm looked configured and was untreated, and nothing in the row said otherwise.
Two early returns, not one
A fix at the second alone passes review and changes nothing. Found by driving it rather than reading it: with
scanBudgetMs: 0the payload stayed at zero bytes after the first attempt.Both now go through one helper. Silence is kept where it is right — a complete scan with nothing to say still costs nothing, and this hook fires on every
Read.What the payload says now
Verified
Driven by
scanBudgetMsso the partial state is constructed rather than raced for — reproducing it by clone-and-hope is the very non-determinism the defect is about, and one attempt at that returned 3281 bytes because the budget happened to reach the right commits that time.98 tests pass across the three inject suites.
artifact:verifypasses against the regenerated manifest.Limit (on the commit): this says the scan was cut short, not which records were missed — the payload cannot name what it never read.