Skip to content

fix(vision-suite): the rung ⚠ marks escalation, not finetext - #198

Merged
glennneuber merged 1 commit into
mainfrom
fix/rung-row-scope
Aug 18, 2026
Merged

glennneuber merged 1 commit into
mainfrom
fix/rung-row-scope

Conversation

@glennneuber

Copy link
Copy Markdown

Follow-up to #197, and it finishes the qwen3.8 ROCm campaign record.

The ⚠ fired on every arm

_window scans every section of every run. finetext takes its own window — vision_suite.py:1136 gives it NUM_CTX or 32768 where every other section takes NUM_CTX or 16384 — so with NUM_CTX unset the two differ in every run ever measured. The qwen3.8 ROCm arms, whose vision tests all sat at 16384, rendered:

| **num_ctx rung** | 16384/32768 ⚠ | 16384/32768 ⚠ |

I dumped all seven score files section by section: scene, document, multi and all eight bbox_contract arms are at 16384/2200 in every run. Only finetext differs, and it differs by design.

The docstring justifies the ⚠ as "the arm escalated between repeats" — runs within an arm. The implementation also folded in sections within a run. Those are different axes, and collapsing them means the alarm can no longer isolate the one it names. Same shape as token_accounting_ok on #189: a check that always fires stops being read.

Sections that own their window are now excluded from the ⚠ and annotated instead, so the information survives without the false alarm:

| **num_ctx rung** | 16384 (finetext 32768) | 16384 (finetext 32768) |
| **num_predict**  | 2200 (finetext 4000)   | 2200/4400 ⚠ (finetext 4000/4400) |

Requested-over-served is right, and now has a test

sec.get(f"req_{key}") or sec.get(key) looks backwards — two pre-#153 finetext blocks record req_num_ctx 32768 against num_ctx 16384. But those are precisely the files where num_ctx carries the pre-fold defect of reporting the suite default, so reading served-first would report a block at a window it never ran at. Kept, with a test naming the reason.

What this surfaced in the campaign record

The one ⚠ that survives scoping is real, and the doc had never disclosed it:

  • finetext ran at 32768/4000, not the "num_ctx 16384 throughout" the prose claimed.
  • The pooled n=5 think-on arm is not homogeneous in num_predict — four runs at 2200 plus the NUM_PREDICT=4400 ceiling diagnostic. Pooling them is defensible only because no think-on cell was capped (that run used 46% of its ceiling), so no score in the table is budget-limited. The doc now states that rather than leaving it implicit, and flags that it would not hold for a throughput comparison.

Both window rows in the doc are byte-identical to a fresh render.

Verification

mutation result
unscope the warning (OWN_WINDOW = ()) FAILED (4)
drop the annotation FAILED (4)
prefer the served value FAILED (1)
remove the ⚠ entirely FAILED (2)

21 tests in test_summarizers.py, plus 15 rescore and 43 preflight, all green.

#197's rung row scans every section of every run, so the finetext block sets it
off on its own. vision_suite.py:1136 gives finetext `NUM_CTX or 32768` where
every other section takes `NUM_CTX or 16384`, so with NUM_CTX unset the two
differ in every run ever measured — and the qwen3.8 ROCm arms, whose vision
tests all sat at 16384, rendered "16384/32768 ⚠".

A warning that fires on every arm carries no information. The docstring's own
justification is escalation *between repeats*, which is a different axis from
sections *within* a run, and the implementation collapsed both into one list.

Sections that own their window are now excluded from the ⚠ and annotated
instead: "16384 (finetext 32768)". The alarm is left for what the docstring
describes.

Requested-over-served is kept and now has a test. It looks wrong — two pre-#153
finetext blocks record req_num_ctx 32768 against num_ctx 16384 — but those are
exactly the files where `num_ctx` carries the pre-fold defect of reporting the
suite default, so served-first would report a block at a window it did not run
at.

The qwen3.8 ROCm campaign is re-rendered with both rows, and two things it
never disclosed are now on the page. Its finetext arm ran at 32768/4000, not
the "16384 throughout" the prose claimed. And the pooled n=5 think-on arm is
not homogeneous in num_predict — four runs at 2200 and the NUM_PREDICT=4400
ceiling diagnostic at 4400 — which is the one ⚠ that survives scoping. Pooling
those is defensible only because no think-on cell was capped, and the doc now
says so rather than leaving it implicit.

Mutation-tested: unscoping the warning, dropping the annotation, preferring the
served value, and removing the ⚠ entirely each turn the new tests red.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@glennneuber

Copy link
Copy Markdown
Author

Reviewing as consolidator. The "different axes" observation is the whole PR and it is correct.

The docstring justifies the ⚠ as "the arm escalated between repeats" — runs within an arm. The implementation also folded in sections within a run. Those are different axes, and collapsing them means the alarm can no longer isolate the one it names.

That is precise, and the cross-reference to token_accounting_ok is apt — I shipped that one, and it is the same failure: a check that always fires stops being read. Mine at least fired for a real reason I had not yet understood; this one fired for a designed-in difference, which is worse, because the first person to investigate finds nothing wrong and the next person stops looking.

The evidence is the right kind, too: dumping all seven score files section by section, and finding scene/document/multi and all eight bbox_contract arms at 16384/2200 in every run with only finetext differing, is what distinguishes "the alarm is wrong" from "the alarm is right and the data is bad". Without that dump the safe reading would have been to trust the ⚠.

Annotating rather than dropping — 16384 (finetext 32768) — is the right resolution. The information is real and a reader wants it; it just is not escalation. And keeping the ⚠ live on the axis it names is what makes 2200/4400 ⚠ meaningful in the same row.

On req_ over served

Keeping sec.get(f"req_{key}") or sec.get(key) is right and the justification is the non-obvious half. It reads backwards until you know that pre-0d3d8935 blocks record the suite default in the bare field rather than the window the cell ran at — so served-first would report a block at a window it never used. That is the same caveat the ROCm campaign carries in its own text, and pinning it with a test naming the reason is better than the comment it would otherwise be.

One thing worth stating in the file

finetext owning its window is currently discovered by reading vision_suite.py:1136. Now that a summarizer has to special-case it, the fact has two dependents and no single home — the suite sets it, the summarizer excludes it, and nothing declares it. A one-line list of window-owning sections, referenced by both, would keep the next section that takes its own window from re-creating this bug silently.

Not a blocker. The fix is correct and the campaign record is better for it.

@glennneuber
glennneuber merged commit 35a15b4 into main Aug 18, 2026
1 check passed
@glennneuber
glennneuber deleted the fix/rung-row-scope branch August 18, 2026 08:01
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