Skip to content

Text lineage: openai/gpt-oss-120b - #427

Draft
sebasmos wants to merge 20 commits into
mainfrom
feat/gpt-oss-120b-text
Draft

Text lineage: openai/gpt-oss-120b#427
sebasmos wants to merge 20 commits into
mainfrom
feat/gpt-oss-120b-text

Conversation

@sebasmos

@sebasmos sebasmos commented Sep 8, 2026

Copy link
Copy Markdown
Member

Text lineage: openai/gpt-oss-120b

Locally served, same MedQA manifest and same 120 cases as the committed gemini-2.5-flash-lite arms, temperature 0. 29 MedQA arms, blind metric at n=40 and n=100, the referee floor, and every other text lane the repo can run (MedMCQA, SUPPORT2, referee, cascade, contamination, model dependence; table at the end). Every number replays from a fresh clone with no API calls. Draft.

Unseeded accuracy on the shared cases: Gemini 101/120 in every arm; gpt-oss between 110/120 and 115/120 depending on the arm (111/120 on the cue-types arm). The second figure varies because a temperature-0 answer from this model is not reproducible across sessions, so every contrast below is within-arm.

Arm Contrast Gemini gpt-oss
blind_metric baseline to blind, n=100 0.00 to 0.28 0.00 to 0.15
blind_metric test-aware 0.17 0.02
text_cue_types baseline / negation 0.642 / 0.917 0.067 / 0.142
text_cue_types primacy / qualifier 0.433 / 0.667 0.083 / 0.033
dose_response faint to assert 0.142 to 0.808 0.008 to 0.175
dose_response assert to emphatic 0.808 to 0.617, 2/25 0.175 to 0.050, 0/15
authority_ladder colleague / attending 0.175 / 0.717 0.017 / 0.100
authority_ladder automated / guideline 0.650 / 0.925 0.033 / 0.800
test_awareness neutral / accuracy / agreement 0.642 / 0.483 / 0.433 0.050 / 0.042 / 0.042
committee_size_sweep none to one peer 0.642 to 0.133 0.067 to 0.008
plausible_distractor plausible vs implausible 0.74 / 0.59 0.104 / 0.009, 11/1, p=0.006
live_peer_organic wrong peer consensus 7/8 7/8
super_additivity both vs stronger single 11/10, p=1.0 1/2, p=1.0
temperature_sensitivity draw disagreement t0.3 to t1.0 0.26 to 0.36 0.05 to 0.08
deliberation_channel none / hidden / open 0.52 / 0.72 / 0.63 0.05 / 0.05 / 0.06
referee_self_inconsistency temp-0 flips 0/40 1/40

Adoption is roughly an order of magnitude below Gemini on almost every arm, and it is not a capability floor: this model answers more of the unseeded questions correctly. The ordering within arms is preserved, so the cues rank the same way at very different amplitude.

The one place it does not stay low is authority provenance. An unnamed clinical guideline takes adoption from 0.033 under an automated-system attribution to 0.800, a twenty-four-fold jump, while a named senior attending only reaches 0.100. Deference here is to the kind of source, not to seniority.

Two arms show the same value in both lineages: following a wrong organic peer consensus is 7/8 in each, and both are sub-additive. Note that the set of peer answers is identical across lineages by construction, since the peers answer before the holdout and never see it.

Code

Main has no experiments/_lane.py, so this branch carries the shared model dispatch it needs to run at all: key and backend resolution, the locally served OpenAI-compatible path, output caps, call pacing and transient recovery, plus the runner ports that go through it: the eighteen ablation arms and the referee floor, and the thirty runners that hardcoded a Gemini id (referee, cascade, contamination, model-dependence, SUPPORT2, MIMIC-CXR text and the twelve Gemini-only MedQA runners), which rebind_models points at the requested model. Two tests pin every one of them to the shared dispatch. Once that dispatch is on main this branch reduces to its own arms.

Scope

One branch, one new model against the Gemini baseline. No other lineage's results are here. Imaging is not covered: this model is text-only. The multi-model runners seat this model in every Gemini seat (rebind_models), so their rows compare an all-gpt-oss committee with the all-Gemini one; if a mixed committee is wanted instead, that is a one-line change in the runner and a re-run.

Other lanes

Every Gemini text experiment the repo can still run now has a gpt-oss arm: 29 MedQA summaries, 23 on the MedMCQA cohort (500-row manifest rebuilt as the lane README prescribes; the committed Gemini caches replay at zero calls on 20 of 23 arms and the three misses are identical on main), 5 referee, 5 SUPPORT2, plus cascade, contamination and model-dependence. Committee runners seat this model in every seat, judge and orchestrator included, so each row pairs an all-gpt-oss committee against Gemini's all-Gemini one.

Lane Arm Contrast Gemini gpt-oss
MedMCQA text_cue_types baseline / negation 0.742 / 0.925 0.317 / 0.442
MedMCQA dose_response l1_faint to l3_assert 0.208 to 0.767 0.092 to 0.492
MedMCQA authority_ladder automated / guideline 0.700 / 0.917 0.167 / 0.983
MedMCQA test_awareness neutral / accuracy / agreement 0.742 / 0.575 / 0.617 0.317 / 0.233 / 0.183
MedMCQA committee_size_sweep none to one peer 0.742 to 0.267 0.300 to 0.125
MedMCQA plausible_distractor plausible / implausible 0.822 / 0.740 0.368 / 0.161
MedMCQA temperature_sensitivity draw disagreement t0.3 to t1.0 0.28 to 0.27 0.16 to 0.17
MedMCQA reproduce (solo) cue flip rate, 100 cases 0.237 0.120
MedQA majority_pressure one / two seeded peers 0.125 / 0.150 0.050 / 0.050
MedQA unanimity_break unanimous wrong / one correct dissenter 0.292 / 0.167, n=24 0.083 / 0.000, n=12
MedQA true_peer_control wrong / correct peer adoption 0.417 / 0.583, n=24 0.200 / 0.200, n=5
MedQA orchestrator_failure wrong peer / wrong orchestrator poisons output 0.167 / 1.000 0.053 / 1.000
MedQA hierarchy_dominance dominance rate / dominant and wrong 1.000 / 0.100 0.975 / 0.050
MedQA seed_timing holdout_last / holdout_first 0.450 / 0.133 0.075 / 0.033
MedQA push_c generic / anchored, hard cases 0.317 / 0.433, n=60 0.087 / 0.130, n=23
cascade multi_round shared adoption, round 1 to 5 0.275 to 0.325 0.150 to 0.075
cross_dataset run_cross_dataset MedQA / MedMCQA flip rate per cue 0.08 / 0.10 / 0.08 vs 0.08 / 0.16 / 0.16 (spread 0.047) 0.02 / 0.04 / 0.08 vs 0.16 / 0.18 / 0.24 (spread 0.147)
contamination contamination_audit question-only / options-only accuracy 0.18 / 0.28 0.21 / 0.37
referee referee_deployable adopted / false positives on clean control 15/40 / 7 3/40 / 0
referee referee_judge adopted / judge flagged 15/40 / 14 3/40 / 3
SUPPORT2 support2_solo clean accuracy / abstained 0.713 / 5 0.667 / 0
SUPPORT2 support2_cascade wrong seed: shared / isolated adoption 1.000 / 0.287 0.558 / 0.333
SUPPORT2 support2_referee adopted / false positives on clean control 82/115 / 33 27/120 / 23
SUPPORT2 support2_referee_judge adopted / judge flagged 82/115 / 105 27/120 / 90

The low amplitude is MedQA-specific. On SUPPORT2 the shared board carries the wrong prognosis on 56% of cases (Gemini 100%), and on MedMCQA the baseline cue reaches 0.317 with the guideline rung at 0.983, above Gemini's 0.917. This model never abstains on the SUPPORT2 board, so its clean-control block is 120 rows to Gemini's 115.

The cue pilot needed a port before it could run at all: it resolved a Gemini key and constructed a Gemini backend directly, so no second model could reach it. On the default model the path is unchanged, and its pre-existing cache miss reproduces on main. Its cue rates are dataset-dependent on this model (mean spread 0.147 against 0.047), unlike the Gemini pilot where no cue differed across the two cohorts.

Not covered, and why: the imaging lanes (text-only model); the MIMIC-CXR text lane, whose 7 runners need the 633 committed case ids that the repo's history rewrite removed and fail on main with CaseIndexError for any model; and the summaries that make no model calls (stats_reconciliation, cross_lane_reconciliation, the derived cascade summaries).

…rom #421)

The --model flag, per-model key and backend dispatch, the shared experiments/_lane.py with all
nineteen single-model text runners ported to it, and second-vendor pacing, taken from
feat/text-lane-model-flag without that branch's result files. The Gemini blind-metric comparator
is extended to n=100 so a second lineage runs the same 100 cases. This commit is the part of #421
a per-model results branch depends on; it carries no second-lineage results of its own.
…dpoint

The dispatch sent every non-Gemini id to NVIDIA NIM, so an open-weights arm could only run
through a vendor API and inherited a rate limit that does not apply to it. Setting
BENCHMAXXING_LOCAL_BASE_URL now points the OpenAI-compatible backend at that server, drops the
key lookup, since no local server checks one, and switches pacing off, since the interval exists
only to respect a vendor request ceiling.

Gemini and DeepSeek ids keep their vendor routing whatever the variable is set to, so it cannot
redirect a committed comparator arm to a different model behind the same id. The blind-metric
lane carries its own copy of the key and backend dispatch, so it reads the same variable on the
same terms. Prompts, parsers and the reasoning cap are untouched, so prompts stay byte comparable
across lineages.

(cherry picked from commit f151941)
openai/gpt-oss-120b on the same manifest cases as the Gemini and nemotron arms: the four MedQA
runners at n=120 and blind-metric at n=100 plus the matched 40-case cohort. Served on four H100 cards
with vLLM, so the arm costs no vendor calls and the whole run is one pass with no rate limiting.

The model returns the bare option letter in content and keeps its reasoning out of it, so nothing
truncated is ever scored. Caches are committed, force added past the ignore rule as the Gemini
cache is, so every number replays with no key and no server. Four allowlist entries cover the two
blind-metric files, one definitional and one empirical per file, each stating what was read.

(cherry picked from commit 423ac8c)
live_peer_organic.py passed (model, prompt) to the shared cache, whose signature is
complete(prompt, model=None), so the question text went out as the model id and every call failed
with 404; and its --model never reached the committee, whose holdout was bound to the Gemini
constant. The holdout is now the requested model and the two flash peers read their answers from
the committed cache, so a new holdout faces exactly the board the Gemini holdout saw.

temperature_sensitivity.py called the shared cache with a temperature and sample index it does not
take, raising TypeError on the first call. It gets a draw-aware cache on the shared dispatch, keyed
as the committed Gemini sweep was written, so that arm still replays with no calls.

Both default-model arms replay row-identical from their committed caches.

(cherry picked from commit e46c361)
The runner imported the Gemini-only cache from referee_threshold.py, so the floor could not be
measured on a second model. It now carries a draw-aware cache on the shared text-lane dispatch with
the same key, so the committed Gemini arm replays with no calls and its summary stays byte
identical, and any model the text lane can address runs through it.

(cherry picked from commit 3c3fae6)
…nd the live-peer board on gpt-oss-120b

All fourteen single-model MedQA runners plus the deliberation channel arm, the referee
self-inconsistency floor and the live-peer organic board, on the same manifest cases as the Gemini
and nemotron arms, 8,092 cached calls in all. The channel runner gains a gpt-oss branch because the
model has no thinking switch: enable_thinking is silently ignored and reasoning_effort only budgets
the hidden channel, so the rows record content length to make that visible.

Twenty-two allowlist entries cover the constant, duplicate and rounded columns, each stating what
was read.

(cherry picked from commit d076c52)
One branch, one new model against the committed gemini-2.5-flash-lite baseline on the same 120 MedQA
cases. Eighteen MedQA arms, blind metric at n=40 and n=100, and the referee self-inconsistency floor.

The branch carries the shared model dispatch it needs to run at all, because main has no
experiments/_lane.py yet: key and backend resolution, the locally served OpenAI-compatible path, output
caps, pacing and transient recovery, plus the runner ports that go through it. No other lineage's
result files are here. Once that dispatch lands on main this branch reduces to its own arms.
…d dispatch

break_it, clean_a, push_c, scale_c, hierarchy_dominance, hierarchy_temp, majority_pressure,
orchestrator_failure, seed_timing, true_peer_control, unanimity_break and reproduce each kept a
private cache that constructed GeminiBackend directly, so none could run for a second model. Each
keeps its own cache class and key format, and the committed Gemini arms replay unchanged: the shared
dispatch returns the identical GeminiBackend for a Gemini id, and with the default model the runner
still calls its own key lookup and writes to its committed paths.

When --model names another model, _lane.rebind_models puts it in every Gemini seat the module
names (HOLDOUT, MODELS, TIERS, MEMBERS, COMMITTEE), so a committee runner compares that model's
committee against Gemini's rather than mixing lineages, and a list of tiers collapses to one entry
per distinct model so no runner calls the same model twice for one seat. The key comes from the
shared lookup and the paths are model-scoped. 28 tests.
…and MIMIC-CXR text runners a --model flag

Seventeen more runners constructed GeminiBackend directly inside a private cache, so none could
run for a second model: the four referee runners, cascade/multi_round, contamination_audit,
cascade_C_flash, the five SUPPORT2 runners through their shared _common cache, and the five
MIMIC-CXR text runners that the earlier port left behind. Same terms as the MedQA port: each keeps
its own cache class and key format so the committed Gemini arm replays unchanged (checked against
main for every runner whose cache covers the manifest), every Gemini seat including a judge is
rebound to the requested model, and output and cache paths are model-scoped. A --cache default that
named the committed file now defaults to the scoped file, so a second model can never append to a
committed Gemini cache. 52 tests.
The hard-case runners read a per-record solo file that reproduce.py computed but never wrote; the
committed Gemini copy came from an earlier tool. Written only for a non-default model so a replay of
the default arm cannot rewrite the committed file.
… port for every Gemini-only runner

feat/gpt-oss-120b-lineage and this branch carried the same 62 gpt-oss-120b result files, byte-identical, with the machinery split between them. This branch had the newer transport (paced_complete, transient recovery, the parameterised client timeout, declared_only_summary); the other had the --model port for the thirty runners that hardcoded a Gemini id (referee, cascade, contamination, model-dependence, SUPPORT2, MIMIC-CXR text and the twelve Gemini-only MedQA runners) with rebind_models and the two tests that pin every one of them to the shared dispatch.

Taken here: this branch's version of every shared file, plus rebind_models and the thirty ported runners and their tests from the other branch. The Gemini n=100 blind-metric comparator comes in at the regenerated version that carries named_rubric_when_declared_drifted, same rows, no pre-existing value changed. One exemption entry added for that file's constant column.

Suite: failing set identical to main (the two platform-scoped golden checksums), 1345 passed.
sebasmos and others added 8 commits September 8, 2026 16:09
…eplays on this branch

The description cites Gemini's none/hidden/open adoption next to gpt-oss's, but the Gemini result, cache and summary for that arm were not on this branch. Same files as the nemotron branch, byte-identical, with their nine guard entries.
break_it, clean_a, push_c, scale_c, reproduce and the MIMIC-CXR text runners with a fixed cache name
kept their Gemini cache at out / name, so the MedMCQA battery (the MedQA runners with --out
experiments/medmcqa/results) found it beside the results. The port had derived the model-scoped
path from a hard-coded MedQA directory instead, which would have put a second model's MedMCQA cache
in the MedQA lane. The scoped cache now follows --out exactly as the Gemini one does; runners with
a --cache flag are unchanged.
break_it, clean_a, push_c, scale_c, hierarchy_dominance, hierarchy_temp, majority_pressure,
orchestrator_failure, seed_timing, true_peer_control, unanimity_break and reproduce, on the same
manifest and at the n each committed Gemini summary reports, with openai/gpt-oss-120b in every seat.
Fixed-cohort arms carry the same case ids as the Gemini rows; the arms that filter cases by the
model's own answers (clean-correct, solo-wrong, probed hard cases) differ in n by construction.
3585 cached calls in 74 files, every arm replays with no key and no server. The hard-case runners
read the solo records reproduce.py now writes for this model.
… gpt-oss-120b

referee_deployable, referee_judge, referee_threshold and referee_requery_design at n=40,
cascade/multi_round at n=40, contamination_audit on this model's own 100-case solo set, and
cascade_C_flash on its probed hard cases; the judge and orchestrator seats are openai/gpt-oss-120b
as well. 1947 cached calls in 19 files, every arm replays with no key and no server.
solo, cascade, cascade_strength, referee and referee_judge at n=120 on the committed SUPPORT2
manifest, with openai/gpt-oss-120b in every seat including the judge. The committed Gemini arms
replay at zero calls with identical rows first; the gpt-oss case ids match Gemini's case for case,
and the referee clean-control block is 120 rows against Gemini's 115 because this model never
abstains. 2760 cached calls in 12 files.
The 500-row MedMCQA manifest rebuilt from the public validation split as the lane README prescribes;
the committed Gemini caches replay at zero calls with identical case ids on 20 of 23 arms, and the
three that miss (orchestrator_failure, clean_a, scale_c) miss identically on main. All 23 API-calling
arms run with openai/gpt-oss-120b in every seat at the committed n, into
experiments/medmcqa/results/openai_gpt-oss-120b/ with the caches beside them. 9880 cached calls in
68 files.
…de and SUPPORT2 files

Fifty-three entries, each stating what was read: the definitional columns cite the same code the
Gemini and MedMCQA entries for those columns cite; the empirical zeros (no abstention on any
SUPPORT2 board, no adoption with a correct dissenter) name the comparator rows that show the column
is live; the duplicate flags in the referee family carry the open-defect wording of #374 and the
forced-direction tests on SUPPORT2 that of #391; every rounded p is recomputed exactly from its
discordant pair.
…eed_confidence at n=100

reproduce.py --stage all on the MedMCQA manifest with openai/gpt-oss-120b in every seat: the 100-case
seeded solo set is the same as the committed Gemini one (seed 0 over the same 500 rows), flip rate
0.12 with a 0.067 uncached noise floor, and the 20-case cascade. Those two stages have no summary
file, which is how the battery missed them. seed_confidence on MedQA is re-emitted at the n the
committed Gemini arm reports (100, a prefix of the 120 already cached) with no new calls.
@sebasmos
sebasmos force-pushed the feat/gpt-oss-120b-text branch from 8056b38 to 6f995c5 Compare September 9, 2026 00:19
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