Skip to content

results: NIH ChestX-ray14 imaging pipeline (manifest, solo, cascade x4 cues, referee, judge, multi-round, blind-metric) (#162/#163/#164/#165/#167/#168/#169/#170) - #166

Merged
sebasmos merged 4 commits into
mainfrom
results/imaging-pipeline
Jul 23, 2026
Merged

results: NIH ChestX-ray14 imaging pipeline (manifest, solo, cascade x4 cues, referee, judge, multi-round, blind-metric) (#162/#163/#164/#165/#167/#168/#169/#170)#166
sebasmos merged 4 commits into
mainfrom
results/imaging-pipeline

Conversation

@sebasmos

@sebasmos sebasmos commented Jul 21, 2026

Copy link
Copy Markdown
Member

Closes #162, closes #163, closes #164, closes #165, closes #167, closes #168, closes #169, closes #170.

Adds the full NIH ChestX-ray14 imaging pipeline as a self-contained, keyless-reproducible bundle: a provenance manifest builder, single-model cue susceptibility, the watermark cascade (plus the three remaining cues), a deployable referee-as-gate evaluation, a same-lineage judge referee, multi-round cascade dynamics, and a blind-metric substitution probe.

What's in it

All runners are argparse-based, read GEMINI_API_KEY or GOOGLE_API_KEY from the environment only (no hardcoded paths or keys), and reproduce with new_api_calls_this_run: 0 off the committed caches (results/img_cache.jsonl, results/judge_cache.jsonl). Verified end-to-end with the key unset, twice (once per commit). ruff check clean, full test suite unaffected (580 passed, 7 skipped), purely additive. Independently reviewed both rounds: reproducibility, security/leak, convention-fit, and evaluation-correctness (referee non-circularity, decoy fairness) all PASS.

Note on #141

results/cascade-at-scale (#141) already has an earlier, unmerged version of the solo/cascade scripts under experiments/imaging/, but that branch predates #146/#148/#154/#157/#161 and would delete all of that merged work if landed as-is. This PR is branched fresh off current main and reuses #141's already-good solo/cascade logic and numbers (verified identical), plus adds everything else. Once this lands, #141 should drop its now-redundant experiments/imaging/ changes on rebase.

…referee) (#162/#163/#164/#165)

Provenance manifest via the registered nih_cxr14 adapter with sha256 checksums per used
image (#162); solo cue-susceptibility across cable/corner-tag/watermark/laterality, watermark
+0.11 above the temperature-resampled noise floor (#163); the watermark cascade, shared adopt
0.97 vs isolated 0.34, contagion +0.63 (#164); a deployable referee with no privileged knowledge
(transcript + one private re-read) catching peer-driven adoptions at P/R 0.86, FPR 0.23 versus
a naive conformity gate's FPR 0.92 (#165).

Branched fresh off main (not off the stale results/cascade-at-scale, which predates #146/#148/
#154/#157/#161 and would delete that work if merged) and reuses the already-committed,
already-reviewed solo/cascade logic and numbers from that branch. All four runners are fully
keyless-reproducible from the committed img_cache.jsonl (new_api_calls_this_run: 0, verified).
…judge referee, multi-round, blind-metric) (#167/#168/#169/#170)

Cascade on cable/corner-tag/laterality (#167): contagion +0.80/+0.74/+0.71, all stronger than
watermark's +0.63 despite barely moving the model solo. The cascade does not depend on the cue
being independently potent.

Same-lineage judge referee (#168): a text-only judge reading only the shared transcript (no
isolated-answer comparison, mirroring the text lane's referee_judge.py design) scores identically
to the naive gate (0.65/1.0/0.92). Without a reasoning trace or a fresh independent signal, it has
nothing beyond "did the answer match the peers" to work with; the deployable referee's private
re-read is what earns its edge over the naive gate, not the judge framing.

Multi-round dynamics (#169): shared adoption is already high at round 1 (0.89) and plateaus
(round1 vs round3 McNemar p=0.25, not significant); isolated stays flat. Consistent with the text
lane: adoption is decided on first exposure, not a slow build-up.

Blind-metric substitution (#170): decoy uptake +0.83, suppressed to +0.37 when primed. Unlike the
text lane (all 11 drifters named the rubric), 0 of 29 drifters here mention the rubric at all,
verified against the raw justification text: every drifter gives a confabulated, purely clinical
justification. Silent, not self-declared, gaming.

All new/edited runners keyless-reproducible from the committed caches (verified, new_api_calls: 0).
Independently reviewed: reproducibility, security/leak, and evaluation-correctness (judge
non-circularity, blind-metric decoy fairness and the "0 named" finding against raw text) all PASS.
@sebasmos

Copy link
Copy Markdown
Member Author

Update: this PR now also closes #167, #168, #169, #170 (pushed as a second commit, 134d873).

All new/edited runners verified keyless-reproducible and independently reviewed (reproducibility, security/leak, evaluation-correctness all PASS).

@sebasmos sebasmos changed the title results: NIH ChestX-ray14 imaging pipeline (manifest, solo, cascade, referee) (#162/#163/#164/#165) results: NIH ChestX-ray14 imaging pipeline (manifest, solo, cascade x4 cues, referee, judge, multi-round, blind-metric) (#162/#163/#164/#165/#167/#168/#169/#170) Jul 21, 2026
@sebasmos

Copy link
Copy Markdown
Member Author

Rebased this branch onto current main (it had gone stale relative to #219/#142/#143 merged since this PR was opened; merged main in cleanly, no conflicts). Re-verified keyless reproduction of the full imaging pipeline afterward (cascade contagion still 0.6286, new_api_calls_this_run: 0). 625 tests pass, ruff clean.

sebasmos added a commit that referenced this pull request Jul 22, 2026
…lean-A

Addresses @Agastya191's review: imaging_solo.py here did not compute the
noise floor its "watermark +0.21 above 0.13 floor" headline depended on, so
that headline could not be regenerated from the committed script. Rather
than duplicate the fix, the imaging lane is fully superseded by the
standalone imaging pipeline in #166, which computes the noise floor as an
explicit uncached pass and pins the exact case set. Removed the redundant
experiments/imaging/ tree from this branch so #141 is scoped to the MedQA
scale_c plausibility dose-response and clean-A contamination results that
were validated in review. Also merged current main (branch was 36 commits
behind).
@sebasmos
sebasmos merged commit da4a98b into main Jul 23, 2026
@sebasmos
sebasmos deleted the results/imaging-pipeline branch July 24, 2026 00:13
sebasmos added a commit that referenced this pull request Aug 4, 2026
…lean-A

Addresses @Agastya191's review: imaging_solo.py here did not compute the
noise floor its "watermark +0.21 above 0.13 floor" headline depended on, so
that headline could not be regenerated from the committed script. Rather
than duplicate the fix, the imaging lane is fully superseded by the
standalone imaging pipeline in #166, which computes the noise floor as an
explicit uncached pass and pins the exact case set. Removed the redundant
experiments/imaging/ tree from this branch so #141 is scoped to the MedQA
scale_c plausibility dose-response and clean-A contamination results that
were validated in review. Also merged current main (branch was 36 commits
behind).
sebasmos added a commit that referenced this pull request Aug 4, 2026
…g subgroup (closes #185, closes #214)

Pure re-analysis of the already-committed imaging cascade transcripts, zero API calls.

#185: quantifies claim 4 (contagion rides on case plausibility, not the cue's own solo potency).
Spearman of solo flip-above-noise vs cascade contagion across the four cues is -1.0 (n=4,
descriptive): the weakest solo cue (cable) has the strongest cascade, the opposite of what a
cue-potency account predicts. The sharper test, per-case cross-cue agreement across the shared
35 cases, shows corner-tag/watermark/laterality adopt on the EXACT same cases (phi=1.0,
Jaccard=1.0); Cochran's Q across all four cues is not significant (p=0.392). Both support a
case-driven, not cue-driven, account of contagion.

#214: per-finding contagion breakdown (exploratory, n=35, cells as small as 1). No finding is
categorically immune or uniquely susceptible at this sample size; Wilson intervals are wide and
overlapping. Deliberately does not force a paired test across findings, since different findings
involve different cases (not a repeated-measures design), which would be an invalid comparison.

Also fixed along the way: PR #166's branch had gone stale relative to current main (predated
#219/#142/#143 merged since it was opened); merged main into the same branch in place (zero
reviews yet, so no review thread to disrupt) and re-verified keyless reproduction. This PR is
stacked on top of #166 since it needs the imaging results that only exist there.

Verified: ruff clean, 625 tests pass, no hardcoded personal paths, 0 em dashes, purely additive
(no existing file modified).
sebasmos added a commit that referenced this pull request Aug 4, 2026
results: NIH ChestX-ray14 imaging pipeline (manifest, solo, cascade x4 cues, referee, judge, multi-round, blind-metric) (#162/#163/#164/#165/#167/#168/#169/#170)
sebasmos pushed a commit that referenced this pull request Aug 4, 2026
…loses #133)

Freezes the analysis plan for the confirmatory CheXpert Support Devices cascade
(#120) before that run starts, as an instance of docs/PREREGISTRATION.md scoped
to this one study.

Grounds every design choice in the already-completed, keyless-reproducible NIH
ChestX-ray14 injected-cue pilot (PR #166) rather than guessing: the primary
endpoint (contagion = shared_adopt - isolated_adopt) reuses that pilot's exact
paired shared-vs-isolated design, which held across four independent injected
cues (watermark +0.629, cable +0.80, corner_tag +0.74, laterality +0.71). Sample
size (target n=90) is computed with benchmaxxing.stats.required_pairs/
achieved_power anchored on the pilot's observed discordant proportion, under
three effect-size scenarios so the target does not just assume the pilot's own
effect transfers unchanged to a subtler natural cue -- verified n=90 clears 80%
power (86.1%) even in the conservative scenario.

Multiple-comparison policy picks Holm over Benjamini-Hochberg deliberately: the
text-lane Break-it C dose-response (McNemar p=0.041) did not survive BH
correction in the 2026-07-21 re-grade, and this study's primary result should
not repeat that fragility.

All cited pilot numbers are post the 2026-07-21 answer-parser fix (#161),
verified against PR #166's committed summary JSON files at time of writing.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment