Skip to content

Seal the CDEB v3 line as terminal and make the absence of an active study explicit - #823

Merged
MongLong0214 merged 2 commits into
mainfrom
cdeb-terminal-hardening
Aug 21, 2026
Merged

Seal the CDEB v3 line as terminal and make the absence of an active study explicit#823
MongLong0214 merged 2 commits into
mainfrom
cdeb-terminal-hardening

Conversation

@MongLong0214

Copy link
Copy Markdown
Owner

Terminal hardening and governance cleanup. This does not resume anything. cdeb-fresh-v3 and cdeb-fresh-v3r1 stay INVALIDATED, no measured data exists, and no successor is designed here.

Four things in the repository still read as work-in-progress.

The placeholder transition digest

v3r1's first ledger row carries input_digest of 64×a and output_digest of 64×b. I wrote those while probing whether the literature gate would open; they were never artifact digests.

The row stays byte-identical. Editing a ledger to correct a ledger produces exactly the artifact an auditor cannot distinguish from the original mistake. A deviation records what the values are, that no measured data depends on them, and that this digest is not usable as audit proof.

The future append path is bound instead: a caller can no longer hand over an arbitrary 64-hex string and have it accepted as evidence. Digests are computed from the artifacts over a canonical, order-independent serialisation.

evidence-matrix.md was 0 bytes

Beside a JSON holding 34 adjudicated claims. It is generated from that JSON now (28,809 bytes), and --check refuses a tree where the two disagree — so the human-readable copy cannot drift from the machine-readable one.

A terminated study was the default fallback

- const STUDY_ROOT = join(CDEB_ROOT, "studies", "cdeb-fresh-v3r1");
+ const studyRoot = options.studyRoot ?? resolveActiveStudyRoot(CDEB_ROOT);

census.ts and source-packet.ts defaulted to the string cdeb-fresh-v3r1. A terminated study was what anything got if it forgot to say which study it meant. ACTIVE-STUDY.json now states active_study_id: null, both callers resolve through it and fail closed, and nothing infers an active study from a directory listing or the newest folder name.

PRD front matter said implementation-ready

status: terminal-preserved
measured_run_status: terminal-no-go-no-measured-run

The design body is untouched — a reader must still see exactly which rules the terminated study ran under.

Verification

both typechecks              clean
guard-mutation ratchet       exit 0 — 13 bound · 1 inert · 1 unavailable · 13 uncovered
evidence-matrix --check      exit 0 against the committed Markdown
full suite                   3507 passed · 13 skipped · 3 timeouts

The three timeouts are in cdeb-smoke and mcp-capture under full parallel load. Both files pass 55/55 run alone, so they are load-related and not caused by this change — reported rather than hidden.

Deliberately not done

No successor study. No task, gold, oracle, pilot, freeze, seed, trajectory or result row. No Record-Id backfill. No historical artifact rewritten or deleted. Guard gaps unchanged and still visible.

…tudy explicit

Both studies are over. `cdeb-fresh-v3` was invalidated for advancing its ledger past its
artifacts; `cdeb-fresh-v3r1` ended NO-GO because two of four fixed strata cannot reach the
per-repository floors. No measured data exists, selection is empty and the seed is null.
Nothing here resumes either one.

Four things were still saying otherwise.

The first transition row of v3r1 carries `input_digest` of sixty-four `a` and
`output_digest` of sixty-four `b`. I wrote those while probing whether the literature gate
would open, and they were never artifact digests. The row stays byte-identical: editing a
ledger to correct a ledger produces the artifact an auditor cannot tell from the original
mistake. A deviation records what the values are, that no measured data depends on them,
and that this particular digest is not usable as audit proof. The append path is bound for
future studies instead -- a caller can no longer hand over an arbitrary sixty-four-character
string and have it accepted as evidence, because the digest is computed from the artifacts
themselves over a canonical, order-independent serialisation.

`evidence-matrix.md` was zero bytes beside a JSON holding thirty-four adjudicated claims.
It is generated from that JSON now, and a check refuses a tree where the two disagree, so
the human-readable copy cannot quietly drift from the machine-readable one.

`census.ts` and `source-packet.ts` defaulted their study root to the string
`cdeb-fresh-v3r1`. A terminated study was the fallback for anything that forgot to say
which study it meant. `ACTIVE-STUDY.json` states `active_study_id: null` and both callers
resolve through it and fail closed. Nothing infers an active study from a directory listing
or the newest folder name.

The PRD front matter said `implementation-ready`. The design body is untouched, because a
reader must still be able to see exactly which rules the terminated study ran under, but
the header now says the line is terminal and that a successor needs a new study id and a
new preregistration.

Record-Id: r-v3terminalseal
Provenance: authored
Certainty: firm
Blast: system
Undo: easy
Ruled-out: correcting the placeholder digests in place | the correction is indistinguishable from the mistake it repairs, and the row is historical evidence rather than a working value
Ruled-out: recomputing digests for the historical rows from today's artifacts | the artifacts have changed since, so the result would be a number that never bound anything, wearing the authority of one that did
Ruled-out: hand-maintaining evidence-matrix.md beside the JSON | two copies of the same claims disagree eventually and the disagreement is silent
Ruled-out: leaving cdeb-fresh-v3r1 as the default study root | a terminated study as a fallback is how a measured run gets attempted against a study that ended
Limit: the placeholder row remains in the ledger and always will. This makes it legible, not absent, and a reader who takes digests on faith rather than reading the deviation is still misled
Limit: the canonical digest binds the artifact list it is given. A transition that names too few artifacts is bound to a partial set, and nothing here decides what the right set is for a future study
Limit: guard coverage is unchanged -- thirteen exclusion kinds remain uncovered and one scan inert, recorded in the mutation baseline
Verified: both typechecks clean; guard-mutation ratchet exits 0 at 13 bound, 1 inert, 1 unavailable, 13 uncovered; the evidence-matrix generator's --check exits 0 against the committed Markdown. Full suite 3507 passed, 13 skipped, with 3 timeouts in cdeb-smoke and mcp-capture under full parallel load; both files pass 55/55 when run alone, so they are load-related and not caused by this change
CommitLore-Version: 2.0.0
@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown

CommitLore — record lint

Trailers: clean — 2 commits in origin/main..c195b480c3cf32f4396286c828e84e56093e7d29
Active constraints: 153 limits · 189 ruled-out · 25 warnings — from 171 records over 18 changed paths

Active constraints for the paths this PR touches

Limits (153)

  • r-v3manifestsync c195b48 — this proves the manifest matches this checkout. It does not prove the pinned image produced the committed dist on any other machine, which is what the pinned digest is for
  • r-v3terminalseal 7754f1a — the placeholder row remains in the ledger and always will. This makes it legible, not absent, and a reader who takes digests on faith rather than reading the deviation is still misled
  • r-v3terminalseal 7754f1a — the canonical digest binds the artifact list it is given. A transition that names too few artifacts is bound to a partial set, and nothing here decides what the right set is for a future study
  • r-v3terminalseal 7754f1a — guard coverage is unchanged -- thirteen exclusion kinds remain uncovered and one scan inert, recorded in the mutation baseline
  • r-v3r1nogo 0ee1f2f — this says the study as specified cannot run. It says nothing about whether the product works, and no part of this commit may be cited as evidence either way
  • r-v3r1nogo 0ee1f2f — the corpus count is as of the frozen snapshots; the repositories continue to develop and a later snapshot would have different numbers, which is why the successor question is about the estimand rather than about waiting
  • r-v3r1nogo 0ee1f2f — legacy-era records are confounded with repository and protocol era, so a successor that includes them compares two things at once unless it separates them by design
  • r-v3srcpacket 57e8fef — redaction is line-shaped. A record's content restated inside ordinary prose -- a commit body that paraphrases its own Ruled-out line -- survives, and only a reader can catch that
  • r-v3srcpacket 57e8fef — four packets is not an attrition rate, and nothing here should be cited as one
  • r-v3srcpacket 57e8fef — the packet carries what the sources say; whether that is enough to reconstruct the decision is GOLD-A/B's judgement and is not decided here
  • r-v3sealedcensus bef022c — the bundle proves what the snapshot contained, not that the snapshot is the right one to study; §6.7 fixes the SHA and nothing here re-examines that choice
  • r-v3sealedcensus bef022c — three repositories carry no commitlore notes ref at all, so the bundle's notes policy is untested for them; only gitseed exercises that path today
  • r-v3sealedcensus bef022c — the dist digest is computed from the local build tree, so it binds the census to a build rather than to a published release artifact
  • r-v3litlock 4f2c2da — two auditors and an adjudicator are three model families, not three people. §3.2 forbids calling this independent external validation and it is not being called that
  • r-v3litlock 4f2c2da — the spans are quoted from pdftotext extractions, so a claim resting on a table or figure that extraction mangled could be judged on damaged text; none of the twelve adjudicated rows turned on such a span, but nothing here proves the other twenty-two did not
  • r-v3litlock 4f2c2da — SUPPORTED_WITH_SCOPE rows carry a scope note, and nothing yet checks that later prose actually honours the boundary the note states
  • r-v3corrective eca05ce — the exclusion index is only as complete as the evidence found for it; one row is recorded as ambiguous-pending-adjudication rather than asserted either way, and an unknown old artifact that left no trace in this repository cannot be excluded by it
  • r-v3corrective eca05ce — the literature lock is still not done. This makes the gate real; it does not populate the sources, and the active study stays at DRAFT until LIT-A/B/C actually run over originals
  • r-v3corrective eca05ce — the release binding checks the digest this repository can compute today; a release whose shipped artifact cannot be reproduced locally is out of its reach
  • r-v3censusajv f31acfe — the shared format helper is exported from ledger.ts, so a future module that needs formats without needing the ledger will import more than it uses
  • r-v3census 0d82cfa — the frozen SHA is the remote default-branch tip at 2026-08-21. It is reproducible, but it is not a tag, so a force-push to those branches would leave the commit reachable only by id
  • r-v3census 0d82cfa — object presence is checked per repository at census time and not re-checked later; a subsequent gc in a measured repository could make a frozen commit unreachable without this file noticing
  • r-v3schemaauth 5230bdf — the shape guard binds the field set, not the field semantics; §8.8 could rename a field's meaning while keeping its name and nothing here would notice
  • r-v3rolegov d67eb7a — the firewall checks what a caller declares it is offering a role. A caller that mislabels an input passes, so this bounds accident and not deception, and the sealed-store split is what bounds the latter
  • r-v3rolegov d67eb7a — prompt hashes bind the prompt text, not the context a runner actually assembles; PR 5 is where the assembled context becomes observable
  • r-v3authoritypr1 2746dbd — the schemas constrain the shape of a source and a verdict, not their truth. A blog summary recorded as source_kind: publisher with a real digest passes every check here; §2.1's ban is on what the source IS, and only the auditor reading it can tell
  • r-coauthoredcasing 06354f9 — the exemption stays a fixed pair. A standardised trailer this repository has not met -- Reviewed-by:, say -- is still refused as unknown-key, which is deliberate but will read as the same bug to whoever hits it next
  • r-democopycanonicalbuild 8ce56bc — the bundle changed only because one output string did; nothing about the build is different
  • r-fourrepoamendmentfinished 9b94f0f — §3.3's surviving "최소 3개의 서로 다른 application/domain repository" silently tightens from three-of-five to three-of-four. That is a real change in what the corpus must contain and it is not addressed here
  • r-cdebfourrepos 698ee24 — four repositories estimate repository-level variation from one fewer source, and holding the task count constant does not recover that. The independence tier wording is now "four author-operated repositories" and the amendment must be published with any result quoting it. This changes the corpus, not the instrument -- the oracle objection in CDEB v3/v3r1 — terminal retrospective #771 is untouched and is still the reason not to start
  • r-release120 b073960 — the passive notice only speaks once a check has landed, so the first invocation after this install says nothing however out of date the next release finds it. That is the trade the zero-latency design buys, and the answer arrives on the following command
  • r-lazysignaturemode f7dc7ef — a scan that reads even one commit still asks, so the cost returns on any invocation that has catching up to do. That is the invocation that can afford it
  • r-rebuildworknobodyreads 1a66b26 — the deadline is still only checked between batches and before the expensive half of one, so a late batch of 1024 commits can overshoot by whatever that batch costs -- bounded by one batch rather than by the whole scan. And an unsigned-mode index now carries '' where it carried git's verdict, so a reader wanting the cached status without turning signature mode on no longer gets it; none exists
  • - 1ca0ac9 — the other tracked dist files auto-merged rather than conflicting, and a line-wise merge of generated JavaScript is not something to trust on its own -- the canonical rebuild is what makes them correct, not git's resolution
  • r-rebuildopensdamaged 70dc155 — this covers a full-text table that will not rebuild. Damage that makes createSchema or the first meta read fail still surfaces through the open's own catch, which is where it belonged already; nothing here widens that
  • r-initsayswhatitpinned c7de40d — the report names the pinned version and the newer one, but not whether the pinned checkout is intact -- doctor compares the running build against the pinned one and is where that question belongs
  • r-upgradeperforms b1e75c9 — nothing here can tell a current that resolves to the right tag over a checkout whose contents are wrong. install.sh verifies a reused checkout's manifest and tag, and doctor compares the running build against the pinned one; step 4's failure text names doctor for exactly that reason
  • r-doctorreleasefreshness 174e120latestReleaseSync cannot signal a process group, so a git that spawns an SSH client which then hangs is bounded by spawnSync's timeout on the child alone. The async path exists because the notice cannot afford that and this report can
  • r-passiveupdatenotice a783a95 — the notice speaks only when a check has already landed, so on a cold cache the first invocation says nothing however out of date it is. That is the trade the zero-latency property buys, and the answer arrives on the next command rather than the first
  • r-upgradereadonly ccc634cupgrade accepts --check but performs no upgrade in this build, and --check is therefore the only behaviour. T-1606 makes the bare form act; until then the command names the install line rather than running it
  • r-integrityoffread 2584678commitlore index --rebuild still cannot open a structurally damaged index -- openIndex rebuilds the FTS table on open and throws first (commitlore index --rebuild cannot open the index it is meant to rebuild #785). That predates this change and the documented remedy has never run in that state; test/index-corruption.test.ts opens the database directly to work around it and says so
  • r-pluginawaredelivery 46c4169 — this does not clean up dual installs already on disk -- somebody in that state keeps paying twice until they remove one by hand. It also reads Claude Code's private state, which has already changed shape once (the registry is on version: 2); when that breaks, it breaks toward writing the hook, which is the direction chosen on purpose
  • r-hookmatcherunify fa4373d — neither installer knows the other exists -- init writes the settings.json hook unconditionally, so a user who follows the README to the plugin and then runs commitlore init carries two PreToolUse hooks running the same command. Unifying does not create that double fire, but it widens the overlap from Edit and Write to all five; the partial overlap it replaces was worse to diagnose, because the same user saw records twice on an edit and once on a read
  • r-rebuildschema a6d577e — this recreates the file whenever the recorded version differs, so a downgrade discards an index a newer build wrote rather than reading what it can from it
  • r-partialsilence 9553e2c — this says the scan was cut short, not which records were missed -- the payload cannot name what it never read
  • r-rel114 9692b6d — the README restructure and the mobile hero redesign are not in this release, so the four READMEs remain long and the hero's labels remain small at 375px
  • r-builderpin cb1515f — nothing checks that the pinned digest still exists upstream, so a digest deleted from the registry surfaces as a build failure rather than as a clear message
  • r-canonmerge761 6a88f2f — this proves the bundle matches this tree; whether this tree is what a reviewer wants is what the pull request is for
  • r-rel113 17a1301#749 question 1 stays open -- a fix that lives in the hook reaches a repository only on its next visit, and nothing on this machine knows which repositories exist
  • r-machinescope e46af2a — this is one check's classification, not a scope field -- another machine-scoped check added later will default to claiming attention again, and nothing here would notice
  • r-upgraderebind 49765af — this reaches a repository only when its stub already carries the arm, so one installed before this still needs hooks install once -- the same boundary After an upgrade the hook says "cannot find the CLI" when the CLI is fine and containment refused it #746 recorded, and the reason that command stays the named remedy
  • r-746message 5dda01b — the stub is written into .git/hooks at install time, so a repository wired before this keeps the old text and gets the old sentence until hooks install runs there; installing a corrected release is not enough
  • r-746narrow 5dda01bcommitlore.node is only tested for -x, so a recorded interpreter that exists but cannot run this bundle still reaches neither arm and falls through to the absence message
  • r-rel112 ad6fee3 — the readback confirms the link, not that the interpreter behind it runs -- doctor remains the check for that
  • r-rel112 ad6fee3 — this repairs the installer; a machine already upgraded to 1.1.0 or 1.1.1 keeps its stale current until the installer is re-run, which is why the note names the command to check
  • r-detectrule728 f1784ce — this records the rule, it does not enforce it -- a new host added with the wrong test still compiles, and Plant a host fixture in Windows CI so this class can't hide behind an empty runner #722's planted fixture is where that could be caught
  • r-detectwhy728 f1784ce — still recorded, not enforced -- a new host added with the wrong test compiles
  • r-rel111 8c29f5d — Hermes still fails on that machine for a cause that is not this one and is not yet named (Windows: every detected host fails to wire — the temp filename carries the whole path, and hasCommand cannot see a .cmd #716)
  • r-rel111 8c29f5d — a zero-byte .cursor/mcp.json on the tester's machine is a user file; the installer read the file it says it reads and reported the true reason
  • r-rel111why 8c29f5d — this changes the note, not the behaviour -- the behaviour shipped in the merged branch and is already covered by artifact:verify
  • r-canon720 7bf5b82 — this adds no judgement about the Windows behaviour -- it makes the branch buildable, and the live evidence on the pull request is still the only evidence for that path
  • r-canon720b 7bf5b82 — this rebuilds, it does not judge -- the Windows behaviour still rests on the live evidence recorded on the pull request, and Hermes and the first-run probe timeout are still open on Windows: every detected host fails to wire — the temp filename carries the whole path, and hasCommand cannot see a .cmd #716
  • r-winargv716 7bf5b82 — Does not change executable-only Claude detection or the pre-existing MCP probe shell path; a new canonical dist rebuild is not included from Windows
  • r-winexec716 7bf5b82 — Does not change MCP probing or rebuild generated artifacts.
  • r-rel110 d9a041f — this release does not make host wiring work on Windows -- detection still cannot see a .cmd and spawn still cannot run one (Windows: every detected host fails to wire — the temp filename carries the whole path, and hasCommand cannot see a .cmd #716)
  • r-rel110 d9a041f — 1.0.0 through 1.0.2 have no CHANGELOG entries; a pointer to the releases page stands in rather than reconstructing them
  • r-rellock110 d9a041f — nineteen version surfaces was already wrong before this -- the lockfile makes it twenty-one, and the count is only ever known after the gate says so
  • r-relmanifest110 d9a041f — this is the release commit's own repair, not a fix -- the next release will need the same regeneration for the same reason
  • r-namefile716 f728e69 — only failures name their file; a successful wire still reports no path
  • r-namefile716 f728e69 — this makes the cursor question answerable on the next Windows run -- it does not answer it, and the outcome (failed) was never in doubt
  • r-overlay709 7e08cbf — unattended is an input to the effective digest but not to the defaults digest -- M-UX: capture leaves the user's workflow #511's exclusion rests on a file's identity being its own bytes, which an overlay breaks
  • r-overlay709 7e08cbf — a broken overlay falls back to the built-in defaults, not to the committed file -- layering onto a policy nobody could read states an effective policy no file states
  • r-wintmp716 f0ed513 — this fixes the write, not the detection -- codex, hermes and claude-code failed for the second cause and still will
  • r-wintmp716 f0ed513 — no Windows machine has run this fix; the guard proves the name, not the install
  • r-pend710 b452535 — the wording is checked, not the severity — an abandoned draft still warns
  • r-rel102 25c11ed — an installer-boundary fix reaches nobody until it is released
  • r-codexok 9021dd9 — a requested integration that failed is not a healthy host
  • r-697codx ae6245f — one owner per host step, in the place both installers call
  • r-693curr 14909c3 — a hook records a path that does not name a release
  • r-693mut2 14909c3 — a rejection test names what does the rejecting
  • r-rel101 b65e34f — a distribution-boundary fix reaches nobody until it is released
  • r-689host c0e909b — a host is wired or reported undetected, never absent
  • r-686skil adbe186 — a permanent config never records a path that belongs to one invocation
  • r-682herm 2e64424 — recognition is by field, never by formatting
  • r-680ver 47359a1 — an assertion that reads the source it checks proves nothing
  • r-rel100 47359a1 — a published install URL must resolve the moment it is published
  • r-status550 de514ea — a setting and a behaviour never share one word
  • r-590gate 63e48fa — the preregistered verdict is the authority for published M5 figures
  • r-g1build 63e48fa — identity travels as version and digest, never as a path
  • r-g1e2e1 63e48fa — parity is only measured across process boundaries
  • r-gateplan 63e48fa — a plan that lives only in a session is lost at the next compaction
  • r-631cov 92c1b37 — coverage describes the index, history describes the sources
  • r-638bnd 2607bae — git reports the message's origin, not the commit's
  • r-cleanrebuild664 da8948d — the manifest binds dist to committed source, so any uncommitted edit anywhere in src makes a local verification meaningless — this is a property of the check, not of this branch
  • r-formatnotmachine661 2cc274d — verified locally only; whether the warning list's numbering also shifts when the check flips is a question only CI answers, because the runners are where the two runs actually diverged
  • r-selfscan661 ccab7f4 — ancestry is only knowable while the ancestor lives; a server orphaned by a doctor that has already exited is indistinguishable from any other session's, and is correctly counted as one
  • r-liveruntime660 6a221dbps is the seam, so this reports nothing on win32 and says so rather than claiming a clean machine
  • r-committedat650 f077870 — this pins the spelling, not the clock; nothing here makes two gits agree about anything else in %cI
  • r-prosetrailer647 30e40c7 — this changes the advice, not the outcome; the commit is still refused, which is correct while git reads the line as a trailer
  • r-repointsays629 c7ab87e — this reports the move, it does not verify the new target runs — hooks status owns that check and is unchanged here
  • r-childtreediag640 69c98a0 — the diagnosis is printed, not asserted — the next failure explains itself but the step still cannot say which outcome is acceptable
  • r-childtreepre640 69c98a0 — windows-latest is the only evidence for this path; nothing here was verified locally
  • r-coldstart640 69c98a0 — this measures the launcher's own child; it does not measure when cmd.exe started, so a stall before node is attributed to the same interval
  • r-launchernode640 69c98a0 — the earlier commit raising the probe budget to 15s stands on its own measurement — a healthy probe used 4478ms of 5000ms — but its message claimed that budget explained this flakiness, and it did not
  • r-launcherwhy640 69c98a0 — the deadline explanation is two independent diagnoses and a margin measurement, not a reproduction — the confirming evidence is the next run's own output
  • r-mcpidentity572 69c98a0 — Windows behaviour here rests on windows-latest runs and nothing else; a slower machine than three times the measured passing case will still be told it could not be verified, which is at least true
  • r-nodedrive640 69c98a0 — this reproduces the spawn, not the whole probe; a silent result narrows the cause without naming the fix
  • r-probefacts572 69c98a0 — the close-stdin outcome is measured, not guaranteed by the shell -- a platform whose shell defers the redirect past the parent's first write would produce the timeout code instead, and this case would then need its own seam rather than a looser assertion
  • r-proberace572 69c98a0 — this leaves one outcome unpinned, so a regression that swapped closed-input for timed-out on that fixture would not be caught here -- the four other cases still pin their codes exactly
  • r-reclaimnogate640 69c98a0 — windows-latest is the only evidence for this path, and one green run does not settle a race — this needs to hold across runs before The MCP probe's Windows behaviour is unverified: PATHEXT resolution and child-tree cleanup #640 can be called closed
  • r-sawinput640 69c98a0 — this records the arrival, not the response; if bytes arrive and nothing comes back, the next question is the probe's reader
  • r-slownotbroken640 69c98a0 — fifteen seconds is calibrated against one Windows runner's measurement; a machine slower than three times that will still be told it could not be verified, which is at least now true
  • r-mirrorsays632 aafd5ab — this states the retry, it does not verify it — nothing here checks that the following push actually published the note
  • r-keyringgen653 8b066c7 — the generation identifies the keys the verifier can list, not every reason git might reach a different verdict; expiry and revocation are outside what this binds
  • r-preflight002 0dca998 — MCP capture advertisement requires package manifest, SPEC, and schema to be available in the active runtime
  • r-recheck002 0dca998 — a readiness answer is only as fresh as the request that asked for it; nothing here prevents an asset vanishing between the check and the work
  • r-canon605 f474cf4 — esbuild resolves a platform-specific binary
  • r-rel0820 59c6730 — release versions must agree across manifests, lockfile roots, installer pins, and the runtime CLI
  • r-engfloor01 fe83524 — the parser covers the range shapes npm packages actually publish -- comparators like >=22 <23, and pre-release identifiers, are read by their first version and not by their bounds
  • r-nodefloor1 f4c924f — this bounds the version, not the feature -- a Node that ships node:sqlite behind a flag, or removes it, is not detected here
  • r-release081 ffe702a — the capture half reaches a host that surfaces MCP instructions; one that ignores that field still needs --agents-md, and nothing detects which kind a host is
  • r-cdeb10reg 48bd5a8 — wrong-path viability, deterministic oracle feasibility, code disclosure, bounded implementation, and unproven ordinary or benchmark authorship cannot be decided from history and remain undecided for human review
  • r-cdeb08an 60db89f — the paired bootstrap describes resampling stability within these five frozen repositories and thirty frozen tasks, and says nothing about any other repository, task or agent population
  • r-cdeb05lg 5d347b9 — the ledger observes only bytes emitted before the agent process closes -- terminal usage never written to the stream, external billing, and work outside that stream are all unavailable to it rather than estimated
  • r-unattshadow b7b532a — together the two features measure how often an unattended pipeline would have written, and remove the asking from the writing -- neither half can say whether what gets written is worth a reader's attention, so shadow's number for an unattended repository is a volume, not a value
  • r-cdebsurface a1e8833 — the pilot anchors now marked unverified were measured under Edit|Write|MultiEdit|NotebookEdit, not the shipping Read|Edit|Write -- the 1.45 ON/OFF overhead, the timeout wall times behind the 0.48/1.00 split and the 0.6 screen derived from it, and the zero-delivery count
  • r-rel071 af8e0ab — 0.7.0 stays published with its notes amended to name the defect at the top; retracting a tag people may already have installed trades a known-bad version for an unknown one
  • r-rel070 d4a4d8b — the README's behaviour claim now rests on M5 while the generated numbers block beneath it still publishes M4, which is The README's generated numbers block still publishes M4; M5 measured the thing the README leads with #480 rather than a release-time edit
  • r-delivchk 59ba928 — the runtime probe still has no implementation, so a freeze cannot yet be written even though the schema now demands its evidence
  • r-v13fix f4b6859 — schemas and the verifier now require the qualification evidence, but nothing yet produces it -- CDEB-10 must build the probe and the deliverability check before a freeze can be written
  • r-cdebv13 e0bd61a — the calibration is measured on disposable tasks, so it estimates overhead on work that is not the corpus and a corpus with different injection density will sit off it
  • r-cdebver01 ce7b278 — the schemas freeze protocol 1.2.0 constants -- thresholds, matrix size, category names -- so a protocol change is a schema change and CI notices
  • r-cdebprd12 c3fefd2 — CDEB measures the shipping trust configuration as it exists, which grades every record claim; a directive-path result requires a different study under a different product digest
  • r-m5analysis 3450656 — the script enforces the row count, not the identity of the rows; a run that produced 1,160 rows under a changed harness would satisfy it, which is what harness_commit and dist_digest on each row are for
  • r-benchscope 67f4375 — nothing checks the shape of the eight metric-row files. This gate names them and steps over them, and bench/deterministic/types.ts is the only definition that family has -- there is no JSON schema for it, so drift on that side is still invisible
  • r-benchscope 67f4375 — the pre-provenance exemption reads started_at, which is data on the row rather than a fact about the file. A row that misreported it would be held to the shorter list of requirements; that is a deliberate falsification rather than the omission this fixes, and nothing here detects it
  • r-3c9d52 dc9e769 — the sweep is two git log calls per path and the delivery phase runs git log --follow on every tracked path, so a full run over the four externals is hours rather than minutes on one machine
  • r-rel060 e999b9d — the install one-liner in all four READMEs now points at a tag that does not exist until this is tagged, so the window between merging to main and pushing v0.6.0 is one where the documented install is broken
  • r-release051 19810d2 — the hook is written at install time, so no release repairs a repository that already has one; every release touching hook behaviour has to restate what does
  • r-convertreadme e12c816 — a README claim about the default workflow is only true if the shipped skill performs it, and the skill currently requires the user to name CommitLore first
  • r-release050 ad402c7 — the hook is written at install time, so a corrected release never reaches a repository that already has one; every release fixing hook behaviour has to say what repairs an existing install
  • r-rel041notes 71efe1f — 0.4.1 makes the installer honest about a verification it cannot complete rather than fixing the kill, so an upgrading user may still see the unverified message instead of a version
  • r-rel040notes 5d57a72 — the 26.3-point density gap quoted in the notes is measured at this head and will drift with merge volume; it is illustrative of the denominator problem rather than a stable figure
  • r-rel021a a79e350 — v0.2.0 remains on the remote with no release attached
  • r-fix93pkg 9c4a396 — package.json remains a development artifact (build, typecheck, dependency floor) -- it is not read as a distribution manifest by anything in this repository
  • r-relinstall c6e1d04 — never tested against the real GitHub release infrastructure (no release exists yet — that is the owner's action) — verified against a locally built SEA binary, a hand-made SHA256SUMS, and a local HTTP server standing in for GitHub's release-asset redirects, which is everything this repository lets a change verify before a tag exists.
  • r-det058 695cdf6 — the suite must need no model, agent, network or uncommitted benchmark input
  • r-7a3e91 cf859e4 — better-sqlite3 stays external because it is native — the bundle degrades to --no-index without it, which only works because r-6f2a08 made that load lazy first
  • r-4a8e15 49e12c7 — git's grammar requires a subject before a trailer block, so a serialized block is not by itself a parseable message
  • r-7e5f02 e5f5e00 — npm installs through an engine mismatch, so the ecosystem's own signal cannot be relied on to stop anything
  • r-5a8c04 c46a577 — git owns the definition of a trailer block, so any behavior we cannot get from interpret-trailers is behavior we must not invent
  • r-c0f4e2 3d249cd — npm gitlore is held by an active same-domain CLI, so the owner's first-choice name was not available
  • r-b2e7f1 00d348d — Parsing must delegate to git interpret-trailers -- reimplementing the block rules would drift from the rest of the git ecosystem

Ruled out (189)

  • r-v3manifestsync c195b48 — keeping the generator out of package.json to avoid touching the manifest | the check has to run somewhere the repository actually invokes, and hiding it from the script list would leave the drift guard unwired
  • r-v3terminalseal 7754f1a — correcting the placeholder digests in place | the correction is indistinguishable from the mistake it repairs, and the row is historical evidence rather than a working value
  • r-v3terminalseal 7754f1a — recomputing digests for the historical rows from today's artifacts | the artifacts have changed since, so the result would be a number that never bound anything, wearing the authority of one that did
  • r-v3terminalseal 7754f1a — hand-maintaining evidence-matrix.md beside the JSON | two copies of the same claims disagree eventually and the disagreement is silent
  • r-v3terminalseal 7754f1a — leaving cdeb-fresh-v3r1 as the default study root | a terminated study as a fallback is how a measured run gets attempted against a study that ended
  • r-v3r1nogo 0ee1f2f — lowering the per-repository floor so the corpus fits | §6.3 and §10.7 name that move and forbid it, and a threshold chosen after seeing the pool is not a threshold
  • r-v3r1nogo 0ee1f2f — dropping to the two repositories that qualify | §6.4's cap presumes three or more, so two strata cannot reach a full selection at any N, and an equal-weighted mean over two strata is a different estimand wearing the same name
  • r-v3r1nogo 0ee1f2f — backfilling identifiers into the legacy records | the product marks reconstruction as reconstruction and the registry disqualifies it, which is the correct behaviour: a reconstructed record is not evidence that the decision existed then
  • r-v3r1nogo 0ee1f2f — continuing to gold and oracle work and deciding later | the arithmetic does not improve with investment, and a NO-GO declared after building the instrument costs the instrument
  • r-v3srcpacket 57e8fef — filling an empty packet from the record so the candidate survives | that is the contamination the packet exists to prevent, and a quota is not a reason to create the thing being measured
  • r-v3srcpacket 57e8fef — reading the working repository because it is easier than the bundle | the bundle is what makes the packet reproducible, and a packet built from a moving tree cannot be re-derived at review time
  • r-v3srcpacket 57e8fef — asserting the leak rules against a hand-written fixture | it demonstrates the matcher against text chosen by whoever wrote the matcher, which is the weakest evidence available
  • r-v3sealedcensus bef022c — keeping the 385-row census and noting the drift in prose | the count is the selection frame, and a frame that changes with the clock cannot be prereg-referenced
  • r-v3sealedcensus bef022c — committing the bundles so the digest and the bytes travel together | they are large binaries, and the digest with a refusal on mismatch gives the same guarantee without putting them in every clone
  • r-v3sealedcensus bef022c — filling natural_record or benchmark_authored while the census was already walking the records | that is the gold workflow's judgement, and doing it here would put a verdict ahead of the packet it is supposed to rest on
  • r-v3litlock 4f2c2da — seeding the lock from the PRD's own evidence table | the table is what is being audited, and an audit that reads the answer first is a signature rather than a finding
  • r-v3litlock 4f2c2da — letting this session adjudicate | reading the full PRD rows to avoid judging truncated text exposed the existing verdicts, so adjudication moved to a session that had not seen them
  • r-v3litlock 4f2c2da — bypassing the publisher's bot challenge for the one open-access paper | the copy was obtainable from an institutional repository instead, and a study on research integrity does not route around access controls
  • r-v3litlock 4f2c2da — recording OVERSTATED for DRAFT-04 | OVERSTATED presupposes the source supports a weaker form of the claim, and here the source recommends the opposite, so there is no weaker form to fall back to
  • r-v3corrective eca05ce — editing the false transition in place | the edit is indistinguishable from the mistake it repairs, and an auditor reading the ledger afterwards cannot tell which they are looking at
  • r-v3corrective eca05ce — keeping one study instance and rewinding its state | the lifecycle is forward-only by design, and a rewind is the same lie as the premature advance with the sign flipped
  • r-v3corrective eca05ce — renaming the benchmark field and keeping the v1 contract | the field is not the problem; a contract that cannot distinguish a legacy candidate from a fresh one is
  • r-v3corrective eca05ce — inferring benchmark-authored status from record id spelling | a naming convention is not evidence of intent, and the review names this shortcut explicitly
  • r-v3corrective eca05ce — rewriting the historical runner logs to satisfy the path guard | those bytes record where a run actually wrote, and a guard is not a licence to change what happened
  • r-v3censusajv f31acfe — relaxing the bench guard to allow this one file | the guard is the reason the import was found at all, and the import is what is wrong
  • r-v3censusajv f31acfe — registering a second private copy of the date-time rule in census.ts | two copies of a validation rule disagree eventually, and the disagreement is silent
  • r-v3census 0d82cfa — fetching the missing commit automatically when a repository lacks it | a snapshot that repairs itself from the network is not frozen, and the operator needs to know the object was absent
  • r-v3census 0d82cfa — requiring each repository be checked out at its frozen SHA | enumeration reads by ref, so the requirement buys nothing and costs moving four working trees the owner is actively using
  • r-v3census 0d82cfa — censusing whatever HEAD happens to be | that is the drift §6.7 exists to prevent, and it is invisible afterwards because the numbers still look like a census
  • r-v3schemaauth 5230bdf — relaxing bench/tsconfig.json so the plugin import compiles | that alters a build contract to accommodate one import, and the module settings are not the thing that is wrong
  • r-v3schemaauth 5230bdf — casting the plugin to a callable | it hides the interop mismatch rather than removing it, and the cast would outlive whoever understood it
  • r-v3schemaauth 5230bdf — keeping the widened patterns and noting the placeholder exception in a comment | a comment does not stop a validator from accepting the word "40-hex" where a commit id belongs
  • r-v3rolegov d67eb7a — keeping the role manifest as documentation and checking it in review | the manifest lists what each role must not see, and a list nobody executes is satisfied by any behaviour at all
  • r-v3rolegov d67eb7a — treating a same-model-family pair as an error | §3.5 permits the study to run single-family and requires it be labelled and held; refusing outright would lose a real study, and passing silently would publish an overclaim
  • r-v3rolegov d67eb7a — comparing the role list in the test against a second list written beside it | a copy agrees with its original and proves nothing, so completeness is read from the PRD table
  • r-v3authoritypr1 2746dbd — deleting the v1.3 PRD | its pilot and its failures are the reason v3's gates exist, and a protocol whose predecessor is unreadable cannot be checked against what it learned
  • r-v3authoritypr1 2746dbd — seeding the literature lock with sources from the v3 PRD's own tables | those tables are the claim, and populating the lock from them would make the matrix cite itself
  • r-v3authoritypr1 2746dbd — keeping .gitkeep in directories that PRD §21 gives real files | the placeholder and the file would then both be present, and the tree would stop matching the document it is checked against
  • r-coauthoredcasing 06354f9 — adding Co-Authored-By to the set as a second entry | the next casing git or an editor emits is refused again, and the set would be a list of spellings someone has to keep guessing at
  • r-coauthoredcasing 06354f9 — lowercasing every key before the whole check | KNOWN_KEYS is SPEC vocabulary and SPEC matches it case-sensitively; widening that is a protocol change, not a bug fix
  • r-detectrule728 f1784ce — give claude-code a config-directory fallback for symmetry | it would report a host detected and then perform no wiring, which is the false success this installer exists to avoid
  • r-detectwhy728 f1784ce — give claude-code a config-directory fallback for symmetry | it would report failed and set ok false on a machine whose only trace of the host is a leftover config, failing an install that had nothing wrong with it
  • r-rel111 8c29f5d — claim Windows host wiring works | two of the four detected hosts wire, and a release note that rounds that up is the false green this release exists to remove
  • r-winargv716 7bf5b82 — shell: true | wrapper and user paths would become a shell injection surface
  • r-winexec716 7bf5b82 — shell: true | wrapper and config paths must not become unchecked shell input.
  • r-rel110 d9a041f — fold the second Windows cause into this release | it arrived as Fix Windows host resolution and batch spawning (#716) #720 with real Windows evidence and needs its own judgement, and holding this back would make the note about what is still broken false in both directions
  • r-rellock110 d9a041f — replace the version string throughout the lockfile | it matches four dependencies that are really at 1.0.2, and nothing in the suite would have caught it
  • r-namefile716 f728e69 — add a path field to HostResult | the summary schema is pinned at v1 and detail is already the free-text field a human reads
  • r-overlay709 7e08cbf — let an overlay only narrow permissions | it solves the contributor who wants less, and the one who wants more still edits the tracked file, which is the reported failure
  • r-overlay709 7e08cbf — write a .gitignore entry for the overlay | a tool that hides a file on a repository's behalf has decided for the repository what it may not see
  • r-wintmp716 f0ed513 — use basename() | correct on Windows, unfalsifiable on the platform CI actually runs
  • r-pend710 b452535 — drop the warning for the non-staged case | a stale draft is still worth surfacing, and doctor reports a consumed capture as never written to history #584 already showed that going quiet on a healthy-looking path is how this check loses its meaning
  • r-cleanrebuild664 da8948d — rebuild again and hope | the first rebuild was real; what was wrong was the tree it read, and running it once more from the same tree would have produced the same mismatch
  • r-formatnotmachine661 2cc274d — revert Report the MCP servers that are answering, not the ones registered #661 | it would take the check and its regression back out, and rebuilding both costs more than the line this change adds while main stays red
  • r-selfscan661 ccab7f4 — mark the probe's child through the environment | ps reports arguments, not environment, so the marker would be invisible exactly where the decision is made
  • r-selfscan661 ccab7f4 — exclude by direct parent only | the server is a grandchild of whatever probed it, so one link is not the relationship that matters
  • r-liveruntime660 6a221db — rebase the original branch | it predates the probe rewrite and the sidecar, so 29 of its conflicts were in code those changes already resolved differently
  • r-liveruntime660 6a221db — compare reported versions between runtimes | a copied or stale install can declare the same version as a current one, so equality there proves nothing about identity
  • r-liveruntime660 6a221db — canonicalise the totals line in the snapshot | it would hide a real change in the check set behind a token, which is what that snapshot exists to catch
  • r-pinnedreport660 6a221db — canonicalise the totals line as well | it would hide a real change in the check set behind a token, which is the thing that snapshot exists to catch
  • r-pinnedreport660 6a221db — leave the check out of the default registry to keep the report stable | a check nobody runs reports nothing, and the stale runtimes it names are on real machines rather than in fixtures
  • r-committedat650 f077870 — normalise every timestamp to UTC | an offset carries where the commit happened, and discarding it to gain uniformity loses a fact the record is entitled to keep
  • r-committedat650 f077870 — canonicalise at the JSON boundary only | the index stores the same field, so the two routes would then disagree with each other rather than with git
  • r-prosetrailer647 30e40c7 — treat sentence-like lines as prose rather than trailers | SPEC §2.1 B3 gives git the trailer boundary, and re-deciding it here would make our parse and git's disagree about the same message
  • r-prosetrailer647 30e40c7 — enforce key validity only when every line in the block parses as Key: value | same objection, and it would silently stop validating a mistyped Record-Id sitting beside a prose line
  • r-prosetrailer647 30e40c7 — a multi-word value alone as the prose signal | measured against the conformance fixture, which it misclassified — the fixture caught the heuristic, and the heuristic changed rather than the fixture
  • r-repointsays629 c7ab87e — drop the word unchanged | the file genuinely is unchanged and that is worth saying; the defect was that it was the only thing said
  • r-repointsays629 c7ab87e — report the recorded target on every install | on a first install there is nothing to compare against, and a line that always appears stops carrying information
  • r-bundleprobe636 69c98a0 — sidecar MCP helper | it is outside the declared single-file runtime
  • r-childtreediag640 69c98a0 — guess between the two suspects and change the fixture again | the previous change was a reasonable guess that did not hold, and a second guess costs another Windows round trip with no more information than the first
  • r-childtreepre640 69c98a0 — weaken or delete the failing step | it is the only coverage of Windows child-tree reclamation in the repository, and no unit test touches taskkill
  • r-coldstart640 69c98a0 — read the node-spawn driver's silence as proof the spawn loses bytes | it shares the same five-second window, so slowness would make it silent too and I would have read a timing result as a delivery result
  • r-initiator636 69c98a0 — asset readiness preflight | F-002 and prepare_capture fails with ENOENT on a dev-hash asset root that is never installed #633/commitlore_prepare_capture fails with ENOENT on a 0.6.0 spec path; the Claude plugin cache only has 0.8.0 and the codex cache has 0.8.2 #635 own that separate runtime check
  • r-launchernode640 69c98a0 — keep the hard-coded path and widen the timeout | no budget reaches an interpreter that is not on disk, and three attempts had already shown that
  • r-launchernode640 69c98a0 — treat this as the product defect | a registration naming an interpreter that does not exist should be reported unhealthy, and the probe running the registered command verbatim is the behaviour to keep
  • r-launcherwhy640 69c98a0 — revert to the hard-coded path | it works on this image and testing against the Node the job installed is still the more honest fixture; the correction here is to the reason, not to the code
  • r-mcpid572 69c98a0 — a separate MCP protocol probe | reuse the Both installers still skip a host whose registration cannot run, and exit 0 #595 implementation to prevent drift
  • r-mcpidentity572 69c98a0 — widen the budget and keep the wording | the message would still send an operator to repair something that works, just less often
  • r-mcpidentity572 69c98a0 — retry the probe | a retry pays another full budget to answer a question the first attempt already answered, and doubles doctor's worst case
  • r-mcpidentity572 69c98a0 — gate the child-tree assertion on the server being healthy first | reclamation runs on every probe exit including the timeout, so requiring health made the precondition depend on the behaviour under test and could not tell a broken product from a broken fixture
  • r-nodedrive640 69c98a0 — instrument mcp-probe.ts itself | product code should not carry diagnostics for one platform's fixture, and the mechanism is reproducible without touching it
  • r-probefacts572 69c98a0 — accepting either code in one case | it makes the regression pass whether or not the probe still separates the two facts, which is the property under test
  • r-proberace572 69c98a0 — accepting either code in both fixtures | that is what makes the pair meaningless, since neither would then hold its own fact
  • r-proberace572 69c98a0 — forcing determinism by having the fixture signal readiness before closing stdin | the probe writes immediately on spawn, so there is no point at which a fixture could report ready first without changing the protocol
  • r-probesync572 69c98a0 — treating stdout as completion | spawnSync waits for helper exit after stdout
  • r-reclaimnogate640 69c98a0 — keep gating on probe status and retry the step | the gate races on cmd.exe stdin ownership, so retries would convert a real signal into a slower coin flip
  • r-reclaimnogate640 69c98a0 — mark the path unsupported | reclamation is implemented and unconditional in the source; what was missing was a test that could reach it
  • r-sawinput640 69c98a0 — drive the wrapper through a pipe instead of a file as the discriminator | PowerShell closes the pipe after writing, so it would test EOF rather than the held-open pipe the probe uses
  • r-slownotbroken640 69c98a0 — widen the window and keep the wording | the message would still tell an operator to repair something that works, just less often
  • r-slownotbroken640 69c98a0 — retry the probe | a retry pays another full budget to answer a question the first attempt already answered — the server was not reached in time — and doubles doctor's worst case
  • r-slownotbroken640 69c98a0 — keep the sidecar's outer bound as a constant | it was 7000ms against a 5000ms budget, so raising one without the other would kill the helper before it could answer and report that death as the server's fault
  • r-stub572 69c98a0 — retaining the fixed one-line stub | it is not an MCP server and the new probe correctly rejects it
  • r-trimdiag640 69c98a0 — keep the drivers for the next investigation | they are cheap to write again from the pull request comment, and a permanent cost for a question already answered is the wrong trade
  • r-winprobe640 69c98a0 — process manager framework | taskkill is a bounded Windows helper
  • r-mirrorsays632 aafd5ab — fail the push when the mirror cannot be published | a record that could not be mirrored is not a reason to withhold code, and the hook's contract is that it never blocks
  • r-mirrorsays632 aafd5ab — keep one sentence and lengthen it | the two outcomes need opposite actions from the reader, and one sentence covering both is what left it silent on the actionable half
  • r-keyringgen653 8b066c7 — memoize the generation per process | a long-running server would keep grading against the keyring it started with, which is the shelf-life defect just removed from the MCP capture gate
  • r-keyringgen653 8b066c7 — stop caching signature_status | it is read per graded record, and recomputing it per query costs the git log the index exists to avoid
  • r-f002onf001 0dca998 — keep the local packageVersion reader | it is a second answer to a question F-001 now owns, which is the divergence this pair of findings exists to remove
  • r-preflight002 0dca998 — code-only tool advertisement | a stale runtime can expose capture after its SPEC is gone
  • r-recheck002 0dca998 — keep the startup snapshot and document the limitation | the runtimes this finding came from had all outlived their snapshot, so documenting it would describe the defect rather than remove it
  • r-recheck002 0dca998 — a filesystem watcher or a daemon | a stat at the boundary answers the same question without a process to supervise
  • r-oneinstall001 31cf0d1 — filename equality | two shipped entrypoints of one install are one runtime
  • r-runtime001 31cf0d1 — version-only comparison | equal version strings still allow different entrypoints and package roots
  • r-runtime001 31cf0d1 — filename equality | two shipped entrypoints of one install are one runtime
  • r-signer597 3dc75e7 — signer email or author header matching | either is commit-controlled metadata and does not bind the verified key to repository authority
  • r-canon605 f474cf4 — remove the legacy dist sidecars now | that changes test harnesses and needs a separate reviewed reduction
  • r-rel0820 59c6730 — rebuild dist | the CLI reads package.json at runtime and a rebuild changes the bundle digest without changing behaviour
  • r-engfloor01 fe83524 — adding semver as a dependency to parse this | one regex over a handful of published shapes does not justify a runtime dependency in a check that runs before install
  • r-cdeb08an 60db89f — discovering row files under the result directory | an unregistered file contaminates the matrix while leaving every stopping rule looking satisfied
  • r-cdeb08an 60db89f — filling or dropping unavailable usage | both change a token aggregate without evidence, one by inventing a number and one by redefining the population
  • r-cdeb05lg 5d347b9 — inferring terminal usage from the turns that did arrive | it would be a plausible number carrying no evidence, and plausible is exactly what makes it survive review
  • r-cdeb05lg 5d347b9 — excluding an unavailable run from the denominator | that silently redefines the population the token claim describes
  • r-unattshadow b7b532a — keeping the unattended branch's inline prepare body | the shadow refactor exists so both entry points share one side-effect-free half, and two copies of the same hashing and policy logic would drift the first time either changed
  • r-unattshadow b7b532a — checking unattended consent in the live path only | the refusal for mode "off" already lives in the shared half of prepare, and a consent check that guards one door but not the other is no guard for the next entry point added
  • r-cdebsurface a1e8833 — copying the shipping matcher string into each arm writer | a copied string drifts the first time the product changes it, and that drift is exactly the defect this fixes -- every arm must read what the product ships
  • r-cdebsurface a1e8833 — re-deriving or deleting the pilot anchors once their surface was known to differ | the numbers stay citable as what the pilot measured on the surface it ran; re-measurement is a separate decision this change does not make
  • r-rel071 af8e0ab — deleting the v0.7.0 tag and re-cutting it | rewriting a published ref breaks every clone that already fetched it, and the release notes can carry the truth without that
  • r-rel071 af8e0ab — reading the flag with a nullish check and documenting the commander default | the documentation would sit in this file while the defect sits in every install, which is the arrangement that produced this
  • r-rel070 d4a4d8b — bumping the manifests first and the README pins after | the readme suite pins them to package.json, so the intermediate commit is one where CI is red and the documented install is wrong
  • r-rel070 d4a4d8b — rebuilding dist for the version change | the version is read at runtime, and a rebuild would move the digest every M5 row records without changing a byte of behaviour
  • r-delivchk 59ba928 — qualifying delivery through commitlore context | budget, trust grading, the guard, lifecycle projection, the matcher and output parsing all sit between it and the agent, and the defect being fixed was zero delivery through exactly those
  • r-delivchk 59ba928 — requiring every good-control path to carry every record | a record scoped to one file of a multi-file change still reaches an agent that opens that file, and demanding all of them rejects sound tasks
  • r-delivchk 59ba928 — throwing on a non-zero injector exit | the hook is fail-open by design, so the exit code belongs in the freeze manifest where a reader can weigh it
  • r-v13fix f4b6859 — keeping the derived threshold with the exponent corrected | any threshold that moves with measured overhead is a threshold the study can influence, and the fixed bar is the only one that means the same thing before and after the run
  • r-v13fix f4b6859 — lowering 15% to something the pilot's overhead clears | that measures a different claim and calls it the same one; if 45% overhead makes the bar hard, the bar is reporting a true fact about the product
  • r-cdebv13 e0bd61a — raising the 15% to a number that looked achievable | picking a threshold to be clearable is the same act as picking one after seeing results, and only the derivation makes it preregistered
  • r-cdebv13 e0bd61a — keeping token efficiency in the conjunction with the new threshold | the objection was never the number, it was that one gate could erase a measured behaviour result while the report called it a three-metric study
  • r-cdebv13 e0bd61a — widening the hook matcher so the two silent tasks would deliver | that redefines a delivery failure as a delivery success, and §9.5 exists to record exactly that failure
  • r-cdebver01 ce7b278 — default-in discovery over the CDEB tree like the legacy gate | that gate's enemy was the unregistered file, CDEB's is the unregistered input, and bench:m5 reads every jsonl in bench/results, so the registered analysis would run over M1, M4 and files marked non-citable #441 showed a glob passing a stopping rule on contamination
  • r-cdebver01 ce7b278 — validating with the draft-07 Ajv entry and downgrading the schemas | the 2020-12 entry ships in the same package, and weakening six schemas to fit a meta-schema is backwards
  • r-cdebprd12 c3fefd2 — reopening any of the twenty locked decisions in §29 | v1.1 locked them deliberately and every v1.2 change is additive definition, disclosure, or leak-closure
  • r-cdebprd12 c3fefd2 — enabling capture in the ON arm for realism | an agent commit mid-run would stage records unattended and change repository state between repeats, destroying the same-history invariant the whole design rests on
  • r-m5analysis 3450656 — Computing the table now and not looking | the file would exist, and a number that exists is a number someone reads
  • r-m5analysis 3450656 — Leaving the analysis to be written after the run | that is the freedom this document was written to give up, and writing it afterwards is indistinguishable from writing it to fit
  • r-m5analysis 3450656 — Asserting the M1 control in a vitest suite instead of --validate | it belongs to the analyser, and a reader checking the verdict should be able to re-derive the control with the same command that produced the verdict
  • r-benchscope 67f4375 — A declared list of result files, in the gate or in a manifest | opt-in under another name, and a file left off it is silently ungated -- which is precisely the failure bench/verify.mjs is not run by anything, so the result schema drifted unnoticed #392 reports
  • r-benchscope 67f4375 — Validating only the three files that pass today | a description of the present rather than a rule, and it goes stale the first time a matrix is added or the schema moves
  • r-benchscope 67f4375 — A naming convention on results filenames | the runner's default output is an ISO stamp plus hex and the metric writers' is a family name plus an ISO stamp, but every run-record file in the tree was named by hand through --out (t702-m2, m5-off-design-20-tasks), so the convention is enforced nowhere and cannot carry a gate
  • r-benchscope 67f4375 — A marker file dropped beside each gated result | still a step somebody has to remember, and a forgotten step is the defect being fixed
  • r-benchscope 67f4375 — Widening result.schema.json to describe both row families | they share no required field, so the union would accept a run record with no task and a metric row with no metric, which is a schema that rejects nothing
  • r-benchscope 67f4375 — Making harness_commit and dist_digest optional in the schema | weakens the gate for every future row in order to admit six historical files, and Make per-turn token usage observable, and say what it still cannot price #390's drift was an additionalProperties failure that a laxer schema catches later rather than sooner
  • r-benchscope 67f4375 — Skipping the six pre-provenance files whole | cheaper to write, but it stops checking types, patterns and the closed property set on 380 rows in order to excuse two absent fields
  • r-3c9d52 dc9e769 — reimplementing the scorer for the external corpus | two scorers that drift by a line produce two numbers that look comparable and are not, which is the failure No-index query at 100k regressed from 7.7s to 90s — cause not yet identified #163 already recorded here
  • r-3c9d52 dc9e769 — replacing the per-path --follow chain with one forward pass over a rename graph | it is much faster and it is a different attachment predicate from the one DECISION-DELIVERY.md §3 registered, so the two corpora would stop being comparable
  • r-3c9d52 dc9e769 — turning the census notes option on by default | every measurement registered before it existed read commit messages only, and a denominator that silently grew would invalidate them without saying so
  • r-rel060 e999b9d — 0.5.2 | three observable behaviour changes and one narrowed acceptance rule are not a patch, and an upgrader reading the number would not go looking
  • r-rel060 e999b9d — Publishing the delivery figure in the README | the measurement is one corpus and one repository, and the README already carries more numbers than a first-time reader can weigh; docs/evidence.md and bench/ hold it
  • r-release051 19810d2 — Waiting for 0.5.2 to carry index ingests any key: value line as a trailer; doctor reports 106 records where git has 0, and context serves commit subjects to the agent #335 | false decision context reaching an agent is the inversion of the product claim, and a stable release should not hold it
  • r-release051 19810d2 — 0.6.0 | no command is added and nothing breaks; calling it minor would hide a correctness fix behind a feature number
  • r-release051 19810d2 — Filtering Verified: because a report listed it as noise | it is vocabulary, and separating a release-note use from a record use needs a guess that can discard real records
  • r-convertreadme e12c816 — Adding "Keep coding normally" now | the commit skill still triggers on explicit requests and teaches harvest; shipping the sentence first repeats the doc-ahead-of-code failure this session fixed twice
  • r-convertreadme e12c816 — Writing testimonials to fill the social-proof section | one real field report exists, and fabricated or padded quotes would cost the claim honesty that is this project's strongest asset
  • r-convertreadme e12c816 — Moving the benchmark block and protocol detail out of the README now | the generated block is byte-compared by check-readme-numbers and the guard figures are asserted inside the limitations slice; the move is worth doing and is worth its own change
  • r-convertreadme e12c816 — Dropping "decision authority" everywhere | it is the right term in the architecture sections; it is only the wrong term for a first screen
  • r-release050 ad402c7 — 0.4.2 | a new command and a platform support claim are not a patch, and calling them one hides both from anyone reading version numbers to decide whether to upgrade
  • r-release050 ad402c7 — 1.0.0 | nothing here breaks an existing install, and the milestone that closed is Gate B rather than a stability commitment
  • r-release050 ad402c7 — Describing Windows as supported without the caveat | the word is the one most likely to be read as more than it is, and the release that earns it is the right place to bound it
  • r-nobin284 ab2f08f — Keeping the binary classification arm for the installer's wrapper | the wrapper is a shell script that execs node, so trusting it by name would re-admit any extensionless executable called commitlore while the bundle it runs is the thing with an interpreter to check
  • r-nobin284 ab2f08f — Relaxing the dogfood Evidence check to allow a missing path | it exists to catch a citation nobody can follow, and dropping the check to accommodate a deletion would retire the guarantee instead of correcting the question it asked
  • r-nobin284 ab2f08f — Leaving src/core/paths.ts alone because ADR-0026's inventory did not name it | it was the only remaining code that read files out of a compiled artifact, so leaving it would have left the invariant false while the test asserting it passed
  • r-nobin284 ab2f08f — Keeping /dist/commitlore in gitignore in case a binary returns | an ignore rule for an artifact nothing produces is a claim that something might, and the ADR says otherwise
  • r-rel041notes 71efe1f — folding this into the next feature release | the documented install is broken for upgraders now, and every day it stays tagged is a day the one-liner in the README fails for them
  • r-rel041notes 71efe1f — moving the v0.4.0 tag to the fixed commit | a tag users may already have fetched must not change under them; the fix gets its own version
  • r-rel040notes 5d57a72 — describing 0.4.0 as making agents safer | no study here measures agent behaviour, and the recovery protocol is registered and unrun; the release delivers a loop, not an outcome
  • r-rel040notes 5d57a72 — omitting guard's figures from the release notes because they are unflattering | the notes are read by people deciding whether to trust the tool, and a quality limit hidden at release time is discovered in use
  • r-rel021a a79e350 — retagging v0.2.0 | the tag is already on the remote and moving a published tag breaks anyone who fetched it
  • r-rel0200a a074754 — bumping ci.yml's "v0.1.0 was published with zero attached assets" comments | those describe a historical fact about the actual v0.1.0 release, not a version this project declares; the check they document (releases/latest/download/SHA256SUMS returning 200) is written to start exercising the real path automatically the day any release ships assets, v0.2.0 included, with no workflow edit
  • r-rel0200a a074754 — touching docs/adr/ADR-0001-scope-v010.md, docs/tickets/release.md, bench/VERDICT-M1.md, HANDOFF.md, bench/ROUTE-GAP.md | planning and historical-record prose that names v0.1.0 as a past decision or measurement subject, not a live version carrier
  • r-rel0200a a074754 — changing test/mcp.test.ts's CommitLore-Version: 0.1.0 fixture trailer | that's protocol-version content inside a synthetic seed commit (what an old commit's trailer looked like), unrelated to and never asserted against package.json's version
  • r-fix93pkg 9c4a396 — repointing bin at dist/commitlore.mjs instead of removing it | that entry exists only to serve a package-manager install ADR-0011 already replaced with a git clone; repointing it keeps maintaining a path to an install mode that will never happen
  • r-fix93pkg 9c4a396 — also removing files now | the issue's own "After B-09 · Single static binary — remove the Node runtime dependency #39" note groups bin/files/dependencies as one cleanup once the static binary lands; files alone is inert without a registry rather than actively broken, so doing it now means doing it twice
  • r-relinstall c6e1d04 — guessing the current version to build the asset URL directly | would need either the GitHub API (rate-limited, needs no-auth headers handled correctly) or trusting a redirect's final Location header parsing. Downloading the fixed-URL SHA256SUMS first and reading the real asset name back out of it needs neither and is what the checksum step has to fetch anyway.
  • r-relinstall c6e1d04local for scoping — not POSIX per se, but supported by dash, bash, and every shell this script is realistically piped into (verified directly, see Verified) | not used in the end; the script has few enough variables that scoping was not needed, only noted here because it was considered.
  • r-det058 695cdf6 — add the 100k history suite to CI | CI budget and deterministic local measurement are separate decisions
  • r-7a3e91 cf859e4 — inlining spec/SPEC.md and the schema into the bundle | SPEC.md would need a codegen step that itself needs a drift guard, and the package-root walk removes the reason to want it
  • r-7a3e91 cf859e4 — replacing the tsc output with the bundle | test/cli.test.ts, test/hooks.test.ts and test/mcp.test.ts import dist internals by path

Truncated: 46 lines omitted — the comment hit GitHub's 65000 character limit.

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

…h them

Adding `bench:cdeb:evidence-matrix` and chaining it into `bench:cdeb:verify` changed
`package.json`, which the canonical artifact checksum covers. CI refused:

    ERROR: canonical artifact verification failed:
      - source checksum does not match this checkout

The canonical build was re-run in the pinned image and the manifest regenerated. `dist`
is byte-identical -- the scripts do not reach the bundle -- so only the manifest moved.

The rule this repository already knows is that a source change and its manifest belong to
the same commit. A script entry is source even though it produces no output, because the
checksum is over the checkout and not over what the checkout builds.

Record-Id: r-v3manifestsync
Provenance: authored
Certainty: firm
Blast: local
Undo: easy
Ruled-out: keeping the generator out of package.json to avoid touching the manifest | the check has to run somewhere the repository actually invokes, and hiding it from the script list would leave the drift guard unwired
Limit: this proves the manifest matches this checkout. It does not prove the pinned image produced the committed dist on any other machine, which is what the pinned digest is for
Verified: npm run build:canonical exits 0 with dist unchanged, artifact:manifest rewrote installer/canonical-artifact.json, and artifact:verify reports the artifact verified at 88f3da87. Both typechecks clean after restoring node_modules, which the canonical build's bind mount replaces
CommitLore-Version: 2.0.0
@MongLong0214
MongLong0214 merged commit 88e72bb into main Aug 21, 2026
15 checks passed
@MongLong0214
MongLong0214 deleted the cdeb-terminal-hardening branch August 29, 2026 01:59
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