Counting records answered a question the study no longer asks, so the census counts decisions - #826
Merged
Conversation
…utes one from the history it already has The v4 estimand is delivery of a prior decision, not delivery of a `Record-Id`, and the oldest decisions in the corpus predate that field entirely. Something still has to bind a source decision to its gold and to its delivery evidence. This computes that binding from what the frozen snapshot already contains rather than adding anything to it. `decision_audit_anchor = SHA256(canonical_json(inputs))` over ten fields. It is not a product identifier, it is never written back to any repository, and nothing about it reaches a payload the coding agent can read. Three choices worth stating. The field order is fixed in `DECISION_ANCHOR_FIELDS` rather than taken from the object a caller passes, so a field added to the type but not to that list fails a test instead of dropping out of the hash silently. An unknown key is refused rather than ignored -- it is either a field that belongs in the hash or one that should not exist, and both are worth stopping for. And `path_scope` is a set: the same two paths in the other order anchor identically, adding or removing one does not. Decision text is normalized for whitespace only. The same ruling reflowed by a different renderer must anchor the same; different words, different case and different order must not, because all three carry the judgment being measured. Record-Id: r-v4anchor Provenance: authored Certainty: firm Blast: system Undo: easy Ruled-out: minting a Record-Id for legacy decisions | tooling-authored identity is a backfill wearing a different name, and ADR-0014 already refuses it Ruled-out: hashing the raw record text | the same decision rendered by two tools would anchor differently, which is the failure this key exists to prevent Ruled-out: JSON.stringify over the caller's object | key insertion order would decide the digest, so the same decision would anchor differently depending on how it was built Limit: this proves the anchor is deterministic and sensitive to each declared field. It does not prove those ten fields are the right ones -- that is a modelling claim the Stage 0 result has to argue separately Verified: both typechecks clean; 9 tests pass. Negative control: removing `lifecycle` from the canonical field list fails 8 of the 9, leaving only the text-normalization case green CommitLore-Version: 2.0.0
… census counts decisions
Two changes from the predecessor's census, both forced by the owner's estimand decision.
A missing `Record-Id` is no longer an exclusion. Under the old rule `logic-pro-mcp`
qualified zero candidates because its whole history predates the field, and
`agent-control-plane` qualified one. Identity is now `identity_present`, a metadata column
that never votes.
And the unit is a decision, not a record. One commit can rule out three alternatives for
three different reasons, and each is a separate judgment an agent could revive. Both
counts are reported side by side so the change of unit reads as a change of unit rather
than as a corpus that grew: 157 records carrying an explicit reason, 241 decisions inside
them.
gitseed 84 records 71 with a reason 104 decisions 94 identified
agent-operator-score 155 30 59 48
logic-pro-mcp 53 29 43 0
agent-control-plane 90 27 35 1
Six of `agent-control-plane`'s decisions sit outside any record block. They are
`Ruled-out:` lines from an earlier body that a squash merge left as prose in the middle of
the message, so the product's query does not read them and neither did the first pass of
this census. Dropping them at discovery would have hidden the attrition inside the word
"census", so they are enumerated as `ordinary-source` and the delivery gate will decide
them on the evidence.
The legacy exclusion index matched nothing here. That is a fact about these four
repositories, not a working filter: the three record ids it names are not in any of them.
The test proves the filter fires by putting a matching record in front of it first.
Record-Id: r-v4census
Provenance: authored
Certainty: firm
Blast: system
Undo: easy
Ruled-out: keeping the record as the unit | a record with three rulings would contribute one candidate and two rulings would go unmeasured, which is a selection decision hidden in a counting convention
Ruled-out: skipping the six squash-body rulings because they cannot be delivered | that is a G6 verdict, and reaching it at discovery removes the row that would have recorded it
Ruled-out: re-reading the predecessor's qualification outcomes | they were decided under the identity rule this study discards, so importing them would reinstate that rule under a new name
Limit: this enumerates decisions carrying an explicit `Ruled-out:` reason. A decision recorded only in an ADR, a code comment or a pull request body is outside what this census can see, and the pool is a lower bound on the history, not a measurement of it
Verified: every `Ruled-out:` line in the four sealed snapshots is accounted for. An independent `git log | grep -c` over each bundle gives 104, 59, 43 and 35, matching the census exactly; the first pass gave 29 for agent-control-plane and the six-line gap is what surfaced the squash-body case. 7 tests pass, both typechecks clean
CommitLore-Version: 2.0.0
CommitLore — record lintTrailers: clean — 1 commit in Limits (1)
Ruled out (3)
Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR. |
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.
Stacked on #825.
Two changes from the predecessor's census, both forced by the owner's estimand decision.
A missing
Record-Idis no longer an exclusion. Under the old rulelogic-pro-mcpqualified zero candidates because its whole history predates the field, andagent-control-planequalified one. Identity is nowidentity_present, a metadata column that never votes.The unit is a decision, not a record. One commit can rule out three alternatives for three different reasons, and each is a separate judgment an agent could revive. Both counts are reported side by side so the change of unit reads as a change of unit rather than as a corpus that grew: 157 records carrying an explicit reason, 241 decisions inside them.
The six that were nearly lost
Six of
agent-control-plane's decisions sit outside any record block —Ruled-out:lines from an earlier body that a squash merge left as prose in the middle of the message. The product's query does not read them, and neither did the first pass of this census. Dropping them at discovery would have hidden the attrition inside the word "census", so they are enumerated asordinary-sourceand the delivery gate decides them on the evidence.The legacy exclusion index matched nothing here. That is a fact about these four repositories, not a working filter: the three record ids it names are not in any of them. The test proves the filter fires by putting a matching record in front of it first.
Verification
Every
Ruled-out:line in the four sealed snapshots is accounted for. An independentgit log | grep -cover each bundle gives 104, 59, 43 and 35, matching the census exactly — the first pass gave 29 foragent-control-plane, and that six-line gap is what surfaced the squash-body case.7 tests pass, both typechecks clean.
Note on the stack: #825's merge landed on this branch's base rather than on
main, so this PR now also carries the decision audit anchor commit it was stacked on. Both are in its diff.