Skip to content

The extraction term: P = E x A, preregistered on two instruments - #50

Merged
fathomlab merged 12 commits into
mainfrom
feat/extraction-ceiling
Sep 1, 2026
Merged

The extraction term: P = E x A, preregistered on two instruments#50
fathomlab merged 12 commits into
mainfrom
feat/extraction-ceiling

Conversation

@fathomlab

Copy link
Copy Markdown
Contributor

Every precision this lab has published answers "given a claim was extracted, was the verdict right?" None answers the question before it: given the detector fired, was a claim being made at all?

RESULT_v14...md is 84 lines and the word extraction appears in it zero times. That is how a shortfall from a 0.95 floor to 0.16 came to be published as unexplained.

Write it P = E x A. Three repair cycles were spent on A. E has never been measured on the class that shipped an accusation.

Two preregistrations, both pre-committed in both directions

closed-model-frontier — re-asks the question of the already-sealed V14 130-item packet (100 accusations + 30 decoys, key digest committed before judging, published as #43). No new sample is drawn, so no sampling degree of freedom exists.

observed E verdict, fixed now
E <= 0.23 SUPPORTED — the adjudicator was sound; three repair cycles worked the wrong layer
E >= 0.40 REFUTED — extraction exculpates nothing and 0.16 stays unexplained
between INDETERMINATE — no narrative is built on it

Reconciliation obligation: upheld / scored must re-derive 0.16 or the run is VOID, not adjusted.

disjoint-worlds — the same question of the cross-model read. read_top1 is an index-matched argmin over held-out target centroids, so the truth sits in the candidate array with probability 1. There is no threshold and no reject option: E = 1 by construction on every trial those scripts have ever run, and the published read figures are therefore A-terms. E itself comes back UNCHECKABLE — the candidate pool was never committed as an artifact, so no survival ratio exists. That is a verdict, not a failure, and not a claim that the ratio is low.

What these documents do NOT license

The tests_pass census counts are CONTAINMENT figures — they record where a match sits, not whether the extraction was wrong. Whether an unticked task box makes an extraction wrong is precisely what is preregistered here, so no share of matches may be called "not assertions" until a panel answers.

The read census likewise refuses a number that would have flattered the thesis: a 0.9935 dedup-survival ratio is explicitly forbidden as E, because "the literal is the OUTPUT of the selection, not its input."

Also included: 4c90d9c wires the evidence leg into the gate and deletes the --run accusation, plus a regression tripwire pinning the five self-arming probes — a latch that re-arms is a regression, and the latches cannot report that themselves.

Ledger rebuilt. Full suite 3180 passed.

🤖 Generated with Claude Code

darkflobi and others added 12 commits September 1, 2026 09:38
styxx.evidence is now reachable from diffgate via --evidence/--commit, so
tests_pass can resolve from attestation bytes. The leg imports the real
module lazily and calls only load_evidence + adjudicate_tests_pass -- no
second parser, no second verdict table, because a drifting second parser
caused the correction this lab published on 2026-08-31.

THE --run ACCUSATION IS DELETED, not flagged off. A nonzero exit is not
evidence that the author lied: it is also pytest rc=5 'no tests
collected', a misspelled command, a missing dependency, and a flake.
Today rc=5 is read as a lie. --run itself stays -- the execution is
CONTEXTUALLY dangerous and only the operator knows whether the tree is
trusted, but the accusation is UNCONDITIONALLY unearned. VERIFIED on
rc==0 stays on the asymmetry evidence.py already argued: a wrong VERIFIED
repeats what the author said in prose, a wrong CONTRADICTED attacks a
stranger inside their own pull request.

Measured cost of the deletion: zero. 5,514 tests_pass claims corpus-wide,
0 accusations on every split, and no test covered the branch.

WHY, WITH A RECEIPT: extraction_census.json measures the step before the
verdict, which this lab has never measured for any claim kind. Over the
same 71,016 eligible PRs as v14_gates.json: 5,514 matches, of which 179
sit in UNTICKED task-list boxes -- 23.22% of every match on a task-list
line. The author is declining to assert and the extractor emits a claim.
346 matches (6.27%) carry a mechanical non-assertion indicator, which
already exceeds the 5% a 0.95 floor would allow, before any judgment.

These are CONTAINMENT figures -- they record where a match SITS, not that
an extraction was WRONG. That distinction is held in the code, the tests
and the receipt, and the judgment half is marked UNVALIDATED at every
level a consumer can index into.

FOUR REPAIRS, none a verdict change: the no-evidence exemption removed (a
gate printing 'this gate did not run' still exited 1 with an accusation);
one execution per invocation, not per match (50 matches launched 50
subprocesses at 1800s each, author-controlled); TimeoutExpired caught
instead of raised; and repo=None now refuses rather than executing in the
VERIFIER'S OWN working directory.

MONOTONICITY, corrected rather than assumed. Adding evidence never
worsens the gate against the empty baseline -- that is the guarantee.
Extending a non-empty evidence set CAN demote VERIFIED to UNCHECKABLE,
and that is deliberate: a partial read may honestly decline but may not
honestly affirm, because you cannot certify 'all tests pass' from nine
shards of ten. The suite previously asserted the shrink-only property
without naming its baseline; seven distinct weakenings of the partial-read
rule left it fully green. Both properties are now tested separately and
the demotion is pinned so nobody 'fixes' it by letting a partial read
affirm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Every precision this lab has published answers "given a claim was extracted,
was the verdict right?" None answers the question before it: given the
detector fired, was a claim being made at all? RESULT_v14 is 84 lines and the
word "extraction" appears in it zero times, which is how a shortfall from a
0.95 floor to 0.16 came to be published as unexplained.

Write it P = E x A. Three repair cycles were spent on A. E has never been
measured on the class that shipped an accusation.

Two preregistrations freeze the missing term, both in both directions:

  * closed-model-frontier - re-asks the question of the ALREADY-SEALED V14
    130-item packet, so no new sample is drawn and no sampling degree of
    freedom exists. E <= 0.23 SUPPORTED, E >= 0.40 REFUTED, and the
    reconciliation upheld/scored must re-derive 0.16 or the run is VOID.

  * disjoint-worlds - the same question of the cross-model read. read_top1 is
    an index-matched argmin over held-out target centroids, so the truth sits
    in the candidate array with probability 1: E = 1 by construction on every
    trial those scripts have ever run, and the published read figures are
    A-terms. E itself is UNCHECKABLE - the candidate pool was never committed
    as an artifact, so no survival ratio exists. That is a verdict, not a
    failure, and not a claim that the ratio is low.

Neither document may be read as licensing a number. The tests_pass census
counts are CONTAINMENT figures - where a match sits, not whether the
extraction was wrong - and whether an unticked box makes an extraction wrong
is precisely what is preregistered here.

Ledger rebuilt. Full suite 3180 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`.github/workflows/test.yml` sets no fetch-depth, so the matrix jobs check out
at depth 1. `.git/shallow` then exists, `tests/test_ledger.py` SKIPS, and the
regeneration guarantee `papers/LEDGER.md` advertises has never actually run in
CI on any of the four Python versions. An absent measurement surfaced as a
passing check is the exact defect class this repository exists to document.

This branch made it run, and it fails: `papers/build_ledger.py` needs real
history (`git log --diff-filter=A --follow`, `git log -S power_basis`,
`git merge-base --is-ancestor`) to compute the power-basis split, so without it
the regenerated ledger differs from the committed one.

Both tokens are refused by GitHub on any branch touching `.github/`
("refusing to allow a Personal Access Token to create or update workflow ...
without `workflow` scope"), so the fix ships as a patch to be applied by hand,
alongside FIX_telescope_cache.patch which has been waiting on the same wall:

    git apply docs/FIX_ledger_fetch_depth.patch

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The power-basis row is computed with git log -S / --follow / merge-base, so
LEDGER.md is a function of the commit history as well as the receipts. Any
history rewrite moves it, which is a second reason the depth-1 CI checkout
could never have reproduced it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… be built

Opening v14_packet.json to execute PREREG_extraction_ceiling_2026_09_01.md
found that the document specifies a gate the packet cannot supply.

G-E2 PASSES first, and is reported: the 130 items key to 100 sampled
accusations plus 30 decoys, and scoring the committed answers over the
accusation subset gives 16 upheld of 100 = 0.1600, re-deriving the published
0.16 exactly. The join is sound.

G-E1 is unsatisfiable. The prereg assumed the 30 sealed decoys split 15
claim / 15 not-a-claim. They do not. decoy_verified are real claims the gate
verified; decoy_synthetic_contradiction are the same real claims with the
PATH perturbed to a zz_ name. The perturbation operates on the path, never on
the speech act, so all 30 answer CLAIM to the substituted question: 30
positives, zero negatives.

The obvious substitute -- keep all 30, expect CLAIM, require 27/30 -- is
passed by the exact failure it must catch. A panel with its answer stuck on
CLAIM scores 30/30 and returns E = 1.00 for reasons unrelated to the prose.

Drawing not-a-claim decoys mechanically from fenced/blockquoted/unticked
matches is worse: whether those are claims IS the question, so the gate would
license whatever the panel said. Same circularity corrected earlier today when
"provably not assertions" became "containment figures".

G-E1 was frozen as non-negotiable with its consequence in the same sentence:
void the panel, report no E. That is honoured. The panel was not convened, no
seat was prompted, and E is UNMEASURED -- not low, not high.

The repair is stated in the addendum so it is frozen before use: synthesise
15 not-a-claim decoys from development-split sentences by committed frame
perturbations, commit the file and its digest before prompting, and re-state
G-E1 two-sided so a stuck answer fails on the class it agrees with too.

The prereg is not edited. A receipt is history, and so is a preregistration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nothing?

read_top1 is an index-matched argmin over an array containing the truth
(run_b31v2.py:90-93, run_b34v3.py:46-49). No threshold, no reject option, no
way to answer "none of these". E = 1 by construction on every trial these
scripts have ever run, so every published read figure is an A-term: given the
answer was in the list, was it picked?

This preregisters the branch the apparatus cannot express. Partition the 462
committed concepts into a candidate set C and a disjoint out-of-vocabulary
probe set O; show the reader C only. IN trials draw from C (target present,
accept and pick). OOV trials draw from O (target ABSENT, correct behaviour is
to abstain). The reject statistic is the top-1/top-2 margin in the mapped
space, fixed now, chosen over raw d1 because d1 scales with the query norm.
The quantity is AUROC(margin) separating IN from OOV -- threshold-free, so no
operating point has to be picked to report it.

Gates, fixed before any mapper is fit:
  G-O1 with reject disabled the pipeline must reproduce b34v3_result.json
       read_top1 EXACTLY (gemma 0.5714, llama 0.6857) or VOID -- proving this
       is the same apparatus plus a reject option, not a different one.
  G-O2 a random-orthogonal mapper must score AUROC <= 0.55 or VOID. b48 died
       on a mis-specified null in this arc; this gate can fail.
  G-O3 AUROC >= 0.75 OPEN-SET SIGNAL; <= 0.55 CLOSED-SET ONLY, and every
       document of ours describing the read as one model reading another's
       concept must then be corrected; between, INDETERMINATE.

Constructibility was checked against the actual arrays before freezing --
banks index-aligned at 462, C/O disjoint, margin finite, reconciliation target
present -- and NO accuracy or AUROC was computed in that check. That clause
exists because ADDENDUM_extraction_ceiling_gate_unsatisfiable_2026_09_01.md
records a prereg of ours frozen this morning with a gate its packet could not
supply.

CPU-only on committed banks. No model is loaded and nothing is collected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Scored against PREREG_open_set_read_2026_09_01.md, frozen and pushed at
45d7ae5 before this ran. 756s, CPU-only, from the committed banks.

G-O1 PASSES EXACTLY on all three targets. run_open_set_read.py replicates
b34v3's seed, its rng consumption order, and its TransferMap -> fit_mlp
pipeline, and re-derives every published read figure to four decimals:
llama_1b 0.6857, gemma_2b 0.5714, qwen_1p5b 0.1429. The open-set harness is
provably the committed apparatus plus a reject option, not a different
measurement. That is the one clean asset here and a successor can build on it
without re-litigating what it measures.

G-O2 FAILS. A random-orthogonal mapper fit on shuffled targets was required to
score AUROC <= 0.55 and scored 0.5861 (llama_1b) and 0.5584 (gemma_2b). The
top-1/top-2 margin separates present-target from absent-target trials even
when the map carries no correspondence, so on this statistic the separation is
not evidence about transported content. An IN query's own image sits in the
candidate array, and whatever survives a random map -- norm structure, bank
anisotropy -- depresses d1 relative to d2 on its own. Absence is partly
detectable from geometry.

VERDICT: VOID__null_mapper_separates. G-O3 was never reached.

llama_1b's 0.7665 would have cleared the 0.75 OPEN-SET SIGNAL bar. It is void
and must not be quoted. The real-minus-null gaps are not a repaired statistic
either; subtracting a null after seeing it is the post-hoc move preregistration
exists to prevent.

The E = 1 reading is untouched: read_top1 is still an index-matched argmin over
an array containing the truth. This run failed to MEASURE the missing term; it
did not find the term absent. A void is not a null result.

b48 died on a mis-specified null in this same arc. This gate was written
because of that and it did its job.

Second void of the day. The first could not be BUILT; this one was built, ran,
and failed -- a completed experiment with a negative outcome. Three
preregistrations frozen today, two runs void. The disclosure section says so.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
v1 froze G-E1 on a false assumption about v14_packet.json -- that its 30 sealed
decoys split 15 claim / 15 not-a-claim. All 30 are claims. The panel voided and
no E was reported.

This builds the two-sided set the addendum owed, and seals it before any seat
is prompted:

  15 CLAIM       taken UNMODIFIED from decoy_verified. Nothing synthesised.
  15 NOT-A-CLAIM synthesised from real VERIFIED path claims drawn from the
                 DEVELOPMENT split only, by three frames at a committed 5/5/5
                 ratio: negation, quotation, comparative reference.

DEVELOPMENT restriction is SPLIT rule 1 -- held-out prose is not consumed to
build the instrument that scores held-out prose. Population: 15,617 PRs and
3,762 verified path claims, and the PR count reconciles EXACTLY with
v14_gates.json development_bucket.prs = 15617.

The perturbation is the same shape the packet already ships:
decoy_synthetic_contradiction was a stated string transform of a real item
(prefix the path with zz_). This side is a stated string transform too, on the
speech act instead of the path. No more synthetic than what already shipped.

G-E1 restated and now TWO-SIDED:
  G-E1a  >= 27/30 overall, as in v1
  G-E1b  >= 9/15 on EACH side separately, so a panel stuck on one word fails on
         the class it agrees with as well as the class it does not -- exactly
         what v1's all-positive set could not do.

Everything else in v1 is inherited unamended: the P = E x A decomposition, the
100 sampled accusations, the item-by-item computation against the committed
key, G-E2 reconciliation at 0.1600, G-E3's bars in both directions, and every
clause of Honest limits. Neither predecessor is edited.

The NOT-A-CLAIM side is authored by us and the prereg says so in its own
section, including the failure mode it creates: if the frames are too easy,
G-E1 is passed by a panel that would not survive a real ambiguous case. Decoys
are a reliability check, not a difficulty benchmark -- the same standing the
packet's own sealed decoys have.

E is UNMEASURED at freeze. No panel prompted, no seat has seen an item.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
130 blinded items: 100 sampled accusations from the sealed V14 packet plus the
30 two-sided decoys. Seats see the SENTENCE and the PATH only -- no diff, no
changed-files list, no gate verdict, no V14 material -- per the question frozen
in PREREG_extraction_ceiling_2026_09_01.md and inherited by v2.

Derived deterministically under seed 20260901 from inputs that were themselves
committed first, so anyone can rebuild it. Leak-checked: the packet contains no
expected/frame/truth field.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A scorer authored after seeing the answers is a scorer with a thumb on it.
Every threshold in this file is transcribed from a frozen document, not chosen
here: G_E1A_MIN=27 and G_E1B_MIN=9 from prereg v2, G_E2_TARGET=0.16 and the
G_E3 bars 0.23 / 0.40 from v1.

It computes E and A item by item against the sealed key rather than by dividing
one aggregate by another, withholds the decomposition entirely when any gate
fails, and treats a >10% split rate as a void per v1's 'what would make us not
ship'.

The panel is still running as this lands. No answers exist yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every gate passed and the hypothesis lost.

  G-E1a  30/30            (bar >= 27/30)
  G-E1b  15/15 CLAIM, 15/15 NOT-A-CLAIM   (bar >= 9/15 each side)
  G-E2   0.1600 re-derived (target 0.16)
  split  0/130

  E = 0.55    A = 0.20    P = 0.16

v1's G-E3 fixed E >= 0.40 as REFUTED before the packet was opened: "the claims
were real and the gate misjudged them; extraction does not exculpate the
adjudicator, and V14's 0.16 remains unexplained. Published as a failed
hypothesis of ours." E = 0.55. That is the cell, and this is the obligation in
it being paid.

The morning's hypothesis was that three repair cycles were spent on the wrong
layer. They were not. A = 0.20 means that even when the author genuinely was
claiming to have touched the path, the accusation was wrong four times in five.
The adjudicator is bad on its own merits and V14's 0.16 stays unexplained --
now with an account closed rather than open.

THE UNPREREGISTERED FINDING: 0.55 x 0.20 = 0.11, not 0.16. Sixteen accusations
were upheld; only eleven are among the 55 CLAIM items. FIVE upheld accusations
landed on sentences the panel says made no claim at all. So

    P = E*A + (1-E)*A'
    0.16 = 0.55(0.200) + 0.45(0.111)

P = E x A silently assumed upheld is a subset of CLAIM. False here at
A' = 5/45 = 0.111, and that assumption was carried unstated through every
document written today -- both preregistrations, the addendum, and the corpus
survey. The corrected identity is stated, not tested.

LIMITS, and the first is severe. Three seats of the same model on the same
prompt are not three independent judges: 130/130 unanimous is evidence of
correlation, not reliability. The NOT-A-CLAIM decoys are ours and 15/15
suggests they were easy -- prereg v2 wrote that failure mode down in advance.
This panel is blind to the verdicts but not independent of the lab, so it does
NOT satisfy the standing commitment.

E = 0.55 licenses nothing to be re-enabled. If anything it argues harder for
retirement: the accusing verdict is wrong on 45% of the sentences it fires at
AND wrong on 80% of those where a claim really was made.

Scorer committed at b8b52a1 while the panel was still running, before any
answer existed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Four findings, all about our tooling, all re-runnable from the commands in the
document.

1. THE PR SELF-REPORT GATE HAS NEVER CHECKED ANYTHING. `styxx audit-claims`
   over all 13 merged PRs: 331 sentences, 0 claims extracted, coverage 0.00,
   PASS every time. The tool is honest -- it prints "no checkable claims found
   -- nothing to falsify" -- and an independent regex confirms these bodies
   contain no path claims, so 0.00 is CORRECT. The defect is that a required
   check named "falsify PR self-report" showing green reads as "the self-report
   survived falsification" when it means "there was nothing checkable". Same
   shape as test_ledger skipping under a shallow checkout. Repair: fail or go
   neutral when claims_extracted == 0.

2. AN OATH VERDICT IS A FUNCTION OF THE AUTHOR'S RECEIPT LIST. Identical bytes
   of RESULT_extraction_ceiling_REFUTED certified three ways:
     5 receipts  -> 3 UNGROUNDED -> OATH-FAILED
     8 receipts  -> 1 UNGROUNDED -> OATH-FAILED
     full pool   -> 0 UNGROUNDED -> OATH-HELD
   The author picks the list. OATH-HELD is a joint claim about a document AND a
   curated receipt set; readers hear only the first half.

3. THE GROUNDING THAT FLIPPED IT IS COINCIDENCE-ELIGIBLE. The deciding token is
   55 -- the day's headline, E = 0.55. It IS in extraction_panel_result.json at
   /decomposition/n_claim. But 257 numeric leaves in the widened pool equal 55;
   256 are array indices, line numbers and column numbers. The verifier
   value-matches without comparing receipt PATH to claim, so widening the pool
   raises accidental grounding far faster than correct grounding. 256:1 noise.
   This is issue #39's "604 false attestations -- coincidental matches" shown on
   our own headline number.

4. THE VERIFIER ACCUSES A DOI. PREREG_third_party_precision is OATH-FAILED with
   token 3793302.3793583 ungrounded -- that is DOI 10.1145/3793302.3793583
   parsed as a decimal and accused of lacking a receipt. A bibliographic
   identifier cannot have a measurement. By this lab's own definition that is a
   false accusation, and it is the class that got the path accuser retired.

Today's seven documents bind at E = 0.7753 against the corpus-wide 0.7237 over
241 certificates -- same band. Nothing improved today and nothing regressed.

No repair is made here. Items 1 and 3 change shipped behaviour and need their
own preregistration, and the accusing side needs a blind panel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@fathomlab
fathomlab merged commit 4830934 into main Sep 1, 2026
7 checks passed
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