Skip to content

Counting records answered a question the study no longer asks, so the census counts decisions - #826

Merged
MongLong0214 merged 2 commits into
mainfrom
cdeb-v4-census
Aug 21, 2026
Merged

Counting records answered a question the study no longer asks, so the census counts decisions#826
MongLong0214 merged 2 commits into
mainfrom
cdeb-v4-census

Conversation

@MongLong0214

@MongLong0214 MongLong0214 commented Aug 21, 2026

Copy link
Copy Markdown
Owner

Stacked on #825.

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.

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.

repository records with a reason decisions identified
gitseed 84 71 104 94
agent-operator-score 155 30 59 48
logic-pro-mcp 53 29 43 0
agent-control-plane 90 27 35 1

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 as ordinary-source and 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 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 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.

…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
@github-actions

Copy link
Copy Markdown

CommitLore — record lint

Trailers: clean — 1 commit in origin/cdeb-v4-decision-anchor..c3ada47ec4ec763269ada05478dfd6782261dd32
Active constraints: 1 limits · 3 ruled-out · 0 warnings — from 1 record over 6 changed paths

Limits (1)

  • r-v4census c3ada47 — 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

Ruled out (3)

  • r-v4census c3ada47 — 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
  • r-v4census c3ada47 — 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
  • r-v4census c3ada47 — 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

git log --follow accepts exactly one pathspec, so renames are not followed for 6 paths; query one path at a time to follow its rename chain

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

@MongLong0214
MongLong0214 changed the base branch from cdeb-v4-decision-anchor to main August 21, 2026 23:43
@MongLong0214
MongLong0214 merged commit 5af539b into main Aug 21, 2026
15 checks passed
@MongLong0214
MongLong0214 deleted the cdeb-v4-census branch August 29, 2026 02:00
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