Corrections

Author: Christopher Betances
Corrections logged: 4
Last correction: 2026-09-15
Licence: CatQualia Structural Isomorphism License (CSIL) v3.0

This page exists because a record that claims to detect its own errors has to be the first place those errors are published. Every correction below is a claim this record made that did not survive re-reading the artefact it described. Each one states what was published, what the artefact actually says, why the two differed, and the command that reproduces the corrected figure. Nothing here was quietly edited into place: the superseded figure stays quoted, because a correction that erases what it corrects cannot be checked.

The standing policy. A number in this record is a claim about a file. When the file and the number disagree, the file wins, and the disagreement is logged here rather than resolved in private. If you find a claim on this site that does not match the artefact it cites, that is a correction and it belongs on this page.

Correction 1. The verifier ratchet was not net zero.

PublishedCorrected (checker schema v2)
Distinct checks324323
Checks re-run at least twice277276
Verdict transitions7963
Hardening events3831
Loosening events3832
Unclassifiable transitions3 (excluded from the net silently)0
Net0−1

What was published. That verification does not monotonically improve, or degrade, and that the signed net of verdict movement was exactly zero. It was presented as the honest, self-abnegating result: a flattering number is what the apparatus exists to catch, and zero is what an unflattering instrument reads.

What the artefact says. The checker grouped ledger rows by the raw check field without guarding for rows that carry no check name. Twenty-five such rows exist, and they are twenty-five unrelated claims — a loop-ingest ratio, a GGUF fleet size, a spectral gap, a Kuramoto order parameter. Under a null grouping key they were concatenated into one sequence and their consecutive verdicts were differenced as though they were repeated measurements of a single instrument. That manufactured 7 hardening events, 6 loosening events, and all 3 of the transitions the checker could not classify: 16 of the 79 published transitions, 20%, were artifacts of the grouping. Removing the null key leaves 63 transitions and a net of −1.

Why it differed. The published figure was flattering in a way nobody was looking for. Both directions were reported, so the result looked like candour — but the grouping bug inflated both sides, and the inflation was not equal-and-opposite by design, it was equal-and-opposite by accident. A bug that pads a ledger with a balanced number of fake events reads exactly like integrity. This is the failure mode the record calls spec-compliant divergence, and it occurred in the record's own headline measurement.

A second, narrower defect found at the same time. Three transitions are unclassifiable because the ledger contains verdict strings outside the checker's own documented vocabulary — SURVIVES, CRASH, DRY, CONFIRMED-PROVEN. The old checker counted these in the denominator and dropped them from the net, so the net was a claim about a subset it never named, and its printed ratio divided by 76 while calling the divisor "transitions" (79). The checker now reports excluded rows and unclassifiable transitions explicitly, and declares a schema version, because a number classified under different rules is a different measurement.

A limit on the corrected number itself. The events are not independent. 74% of all recorded movement comes from just 12 checks that flip in both directions. The largest single contributor is one claim with one pre-registered threshold, run 35 times, producing 10 transitions — five hardening, five loosening. A near-zero net is therefore as much a property of a handful of oscillating checks as of the instrument as a whole. The corrected −1 inherits that weakness, and it is stated here rather than left for a reader to discover.

Reproduce it. curl -O https://catqualia.com/ledger.jsonl python3 ratchet.py ledger.jsonl Expected: 276 re-run checks, 63 transitions, 31 hardening, 32 loosening, −1. The checker is 133 lines and is published at /ratchet.py.

Affected pages, all corrected on 2026-09-15: /thesis, /findings, /reproduce, /ledger, /claims, /instruments, /definitions, the front page, llms.txt, feed.xml. The reproduction instruction on /claims pointed at a second copy of the checker that still contained the bug, so the path the site told readers to run was itself the broken one; both copies now carry schema v2 and produce identical output.

Correction 2. gnarp-m2 did not train on its own refutations. The opposite.

What was published. That the model's training data "includes the claims the system refuted against itself," that the refuted rows "become contrastive pairs," and that the model therefore "learns the shape of a wrong answer rather than only the shape of a right one." This appeared on /findings, in the model's own card, and in a post announcing the result. It was the most distinctive claim made about the model.

What the artefact says. The trainer discards negatives outright. In run_qlora_gnarpm2.py, before the normalised corpus is even written: if r.get("label") == "negative": continue. Measured against clean_corpus_v5.jsonl: 74,395 rows read, of which 11,669 are labelled positive, 4,450 are labelled negative, and 58,276 are unlabelled — leaving 69,945 train-eligible rows. Every one of those 4,450 refuted rows was excluded from the loss. Zero of them reached the model as context, as masked targets, or as contrastive pairs.

Two further defects surfaced in the same measurement. The corpus contains no failure_class field at all — 0 of 74,395 rows — although the card attributes it to the 53,403 isomorphism rows; the only taxonomy present is verdict_raw, with four values (VERIFIED/GENERATIVE 7,758, REFUTED/DECORATIVE 4,231, GENERATIVE 3,160, REFUTED 12). And every row carries train_eligible: true, including the 4,450 the trainer throws away — two mechanisms in one pipeline disagreeing about the same fact, in the direction the card reads best. The card's headline figure of 74,395 rows is the pre-filter read, not the number that trained.

Why it differed. The refutations are real, numerous and documented: the ledger retains 5,837 of them. What was wrong was the inference from "the system kept its refutations" to "the model trained on them." Those are different artefacts, and the sentence that joined them was written from the ledger's properties rather than the corpus's contents. The claim failed because it was checked against the wrong file.

Still unmeasured. The model card's refusal-rate row for m2 is blank because it was never computed; the earlier lineage (base 0.130, v1 0.385, v2 0.340, v3 0.400) exists and m2's does not. So calibration drift for the current model is unmeasured, not favourable. The ablation that would settle whether any of the corpus structure carries the transfer gain — same rows, failure labels stripped or shuffled, same benchmark — has not been run, and cannot be run as stated, because the labels it would strip are not in the corpus.

Affected: /findings finding 8, the model card. The corpus itself is unchanged; only the description of what trained on it was wrong.

Correction 3. The 28,226 divergences are scoped to my own systems.

What was published. "Differential testing across 301 campaigns found 28,226 spec-compliant divergences ... The checks passed while real state detached from what the specification meant." Stated without a scope, which invites the reader to hear a claim about software in general.

What the artefact says. The targets are owned synthetic in-process simulators — a warehouse management system, a web server, a medical domain, a matching engine — and their entire model is written as named constants inside the same module, deliberately, "so specification mining can recover them." The oracle is therefore a hand-written specification by the same author as the system under test. There is no second implementation anywhere in the harness. What the number measures is how far an implementation drifted from a spec I wrote, inside a system I also wrote, with the model exposed on purpose.

Why it is disclosed rather than retracted. The design decision was deliberate and defensible: owned synthetic targets mean no network, no third-party systems, and no real targets. The same decision is what stops the harness being an independent oracle. The number stands as a measurement of those systems; what changes is that it may no longer be cited as evidence about divergence in anyone else's.

Affected: /findings finding 5, /definitions (both the visible definition and its schema.org DefinedTerm).

Correction 4. There is no publication-to-check map, so "was it verified?" is unanswerable.

What was implied. That 135 dated publications and a 16,217-row falsification ledger form one verificatory record — that the disclosures are backed by checks.

What the artefact says. Zero of the 16,217 ledger rows mention a DOI or Zenodo anywhere. The ledger is keyed by falsifier name (fals_*.py), not by publication. There is no edge in either direction between the 135 disclosures and the 324 distinct checks, so the question "which of these publications has been tested against an outcome since posting?" cannot currently be answered at all. This is logged as a correction rather than a gap because the record's own pages imply the mapping exists.

Status. Open. The fix is a map from each DOI to the checks that bear on its claims, published as its own artefact. Until it exists, no page here should imply that a DOI verifies anything: a DOI timestamps priority, and does not test a claim.

How these were found

Not by a reviewer, and not by the standing replication invitation being taken up. Three of the four were found by reading the artefact while answering questions about it.

Correction 1 came from a reader asking what prevents state-pardon loops during transient errors in an append-only ledger. The honest answer required describing the grouping key, and the grouping key was the bug. Correction 2 came from a reader who checked the model card instead of the announcement and noticed that "negatives become contrastive pairs" and "negative rows excluded from SFT targets" cannot both be true. Correction 3 came from a reader asking whether the differential harness used a hand-written spec or a second implementation — the one question whose answer is not flattering. Correction 4 came from a reader asking which of the 135 publications had actually been checked against outcomes.

That is the mechanism working, and it is worth stating plainly what it implies: this record is currently more reliable about its measurements than about its summaries. Every correction above is a summary sentence that drifted from the file it summarised, while the underlying measurements were sound and reproducible. The summaries are the weak surface, which is also the surface that gets quoted.

If you find a fifth. Open an issue at github.com/OpeningBlackBox/catqualia-ledger-mcp or use the contact on the boundary page. There is no gatekeeping step. A correction that arrives from outside is worth more than one I find myself, because it means the record is checkable by someone who does not already know where it is weak.