Skip to content

fix(beat): the ollama decode floor was calibrated on sm_89 and is now asserted on sm_121 (#2835) - #2838

Draft
noahgift wants to merge 3 commits into
mainfrom
fix/2835-beat-silicon-calibration
Draft

fix(beat): the ollama decode floor was calibrated on sm_89 and is now asserted on sm_121 (#2835)#2838
noahgift wants to merge 3 commits into
mainfrom
fix/2835-beat-silicon-calibration

Conversation

@noahgift

@noahgift noahgift commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

The CUDA nightly has been red four nights. It is not a regression — the beat's silicon moved out from under its threshold, and the threshold did not move with it.

What happened

#2740 retired the ada-4090 matrix leg — correctly; lambda-vector is the workstation and must never be a CI host. In the same commit the step lost the predicate that scoped it to that leg:

-  - name: Pillar-4 ... beat (ada-4090 only)
-    if: steps.decide.outputs.proceed == 'true' && matrix.name == 'ada-4090'
+  - name: Pillar-4 ... beat
+    if: steps.decide.outputs.proceed == 'true'

Removing a matrix leg re-targets every step whose predicate named it. That shape isn't in the existing guard-scope rule, which covers widening a guard deliberately. This was widening by subtraction.

It had never run there before

date head step
2026-08-27…29 e039ed4, de0e3e1, a596b06 skipped… (ada-4090 only) on both legs
2026-08-30 → 09-01 34248e8610d1e1 failure ×4, first executions ever on gx10

No beat line appears in any green log. The green nights are green because the assertion did not execute. So the four reds are the first four measurements this gate has ever taken on this silicon.

Every number in the file's header is an sm_89 number — the four measurements, the 1.015 worst median, the ~300 tok/s incumbent. On GB10, ollama medians 181 and apr medians 112–118:

2026-08-30  105.6 / 182.3 = 0.579      2026-08-31  116.0 / 181.8 = 0.638
2026-08-30  117.9 / 182.3 = 0.647      2026-09-01  112.0 / 180.9 = 0.619

ollama is stable within 0.8% across all four, so this is a reproducible measurement, not a noisy rig.

The fix

SILICON_FLOORS is keyed by compute capability, and each entry must carry its derivation — that's what stops the next silicon inheriting a number nobody measured on it. sm_89 keeps 0.90 with its four measurements behind it.

sm_121 has no entry, and that is the fix rather than an omission. Four nights is data, not a calibration — a threshold comes from samples, never from invention. So the harness now has three outcomes, and an uncalibrated silicon yields UNCALIBRATED-SILICON: not a pass (the ada-4090 only skip is what hid this gate for months), and not a claim that apr regressed. The message names the three ways to resolve it and says plainly that recalibrating and fixing a real deficit are opposite conclusions this gate must not pick by accident.

This PR deliberately does not lower a threshold to make a red gate green.

The silicon is read from nvidia-smi --query-gpu=compute_cap, never from the runner label — a label is a claim about provisioning, and this gate has already been wrong once about which host it was running on.

The failure text was wrong the same way

At ratio 0.619 it led with "at this depth apr is very likely not decoding on the GPU at all" — whose own cited signature is ~20 tok/s / ratio ~0.065. A diagnosis its own arithmetic excludes. The rule against that was already three paragraphs up in this file ("a failure message that confidently names the wrong cause is worse than one that names none") and had not been applied to the ladder itself. The diagnosis is now conditional on the measured ratio.

The unit tests now actually run

The header admitted these tests never execute — an integration TARGET that --lib never reaches, named by one workflow that runs -- --ignored. That was still true today: the target appeared nowhere in ci.yml. It's now in the beat chain, so the five new tests are gated rather than compiled and skipped.

Mutation-verified 5/5, each by its own test

GB10 gets an invented floor entry   killed by: gb10_is_deliberately_uncalibrated
ceiling above the GB10 band         killed by: the_cpu_fallback_diagnosis_does_not_fire...
ceiling BELOW the collapse band     COMPILE-FAIL (build-time invariant)
sm_89 floor lowered below GB10      killed by: inheriting_the_sm_89_floor_would_have_failed...
GB10 observations emptied           killed by: inheriting_the_sm_89_floor_would_have_failed...

The third is a const block — that invariant should not be shippable while the suite happens not to run.

fmt CLEAN · clippy 0 errors · 11 passed / 0 failed · pv validate: 0 errors, 0 warnings

Still open

Whether GB10 is honestly ~0.62x or carries a real sm_121 decode deficit is not decided here (#2835; #2800 argues the #2786 GB10 shortfall is real). This PR makes the gate stop answering that question by accident.

Refs #2835, #2740, #2800.

… asserted on sm_121 (#2835)

The CUDA nightly has been red four nights. It is not a regression: the beat's silicon
moved out from under its threshold, and the threshold did not move with it.

#2740 retired the `ada-4090` matrix leg -- correctly, lambda-vector is the workstation
and must never be a CI host -- and in the same commit the step lost the predicate that
scoped it to that leg:

    -  - name: Pillar-4 ... beat (ada-4090 only)
    -    if: steps.decide.outputs.proceed == 'true' && matrix.name == 'ada-4090'
    +  - name: Pillar-4 ... beat
    +    if: steps.decide.outputs.proceed == 'true'

REMOVING A MATRIX LEG RE-TARGETS EVERY STEP WHOSE PREDICATE NAMED IT. That shape is not
in the existing guard-scope rule, which covers widening a guard deliberately; this was
widening by subtraction.

It had never run on gx10 before. On 2026-08-29 and earlier the step reports `skipped` on
both legs and no beat line appears in any green log -- the green nights are green because
the assertion did not execute. So the four reds are the first four measurements this gate
has ever taken on this silicon, not a change in apr.

Every number in the file's header is an sm_89 number: the four measurements, the 1.015
worst median, the ~300 tok/s incumbent. On GB10 ollama medians 181 and apr medians
112-118, ratio 0.579-0.647 across four nights with ollama stable within 0.8%.

## What changed

SILICON_FLOORS is keyed by compute capability and each entry must carry its derivation.
sm_89 keeps 0.90 with the four measurements behind it. sm_121 has NO entry, and that is
the fix rather than an omission: four nights is data, not a calibration -- a threshold
comes from samples, never from invention -- so the harness now has THREE outcomes and
an uncalibrated silicon yields UNCALIBRATED-SILICON. That is not a pass (the `ada-4090
only` skip is what hid this gate for months) and not a claim that apr regressed. The
message names the three ways to resolve it and says plainly that recalibrating and
fixing a real deficit are opposite conclusions this gate must not pick by accident.

The failure text was wrong the same way the threshold was. At ratio 0.619 it led with
"at this depth apr is very likely not decoding on the GPU at all", whose own cited
signature is ~20 tok/s / ratio ~0.065 -- a diagnosis its own arithmetic excludes. The
rule against that was already three paragraphs up in this file ("a failure message that
confidently names the wrong cause is worse than one that names none") and had not been
applied to the ladder itself. The diagnosis is now conditional on the measured ratio.

The silicon is read from `nvidia-smi --query-gpu=compute_cap`, never from the runner
label: a label is a claim about provisioning, and this gate has already been wrong once
about which host it was running on.

## The unit tests now actually run

The header admitted these tests never execute -- an integration TARGET that `--lib`
never reaches, named by one workflow that runs `-- --ignored`. That was still true
today: the target appears nowhere in ci.yml. It is now in the beat chain, so the five
new tests are gated rather than compiled and skipped.

5/5 mutation-verified, each by its own test: an invented GB10 entry, the ceiling moved
above the observed band, the sm_89 floor lowered under the GB10 nights, and the
observations emptied. The fifth -- the ceiling dropping below the collapse it exists to
catch -- is a `const` block and fails the BUILD, because that invariant should not be
shippable while the suite happens not to run.

Whether GB10 is honestly ~0.62x or carries a real sm_121 deficit stays OPEN (#2835;
#2800 argues the #2786 GB10 shortfall is real). This commit does not decide it, and
deliberately does not lower a threshold to make a red gate green.

Refs #2835, #2740, #2800.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@noahgift
noahgift enabled auto-merge September 1, 2026 09:55
github-merge-queue Bot pushed a commit that referenced this pull request Sep 1, 2026
…urity on every open PR (#2839)

Same signature as #2805: all PRs red, nothing changed in-repo. The advisory was committed
to the RustSec DB at 2026-09-01T07:50:30Z -- two seconds after crates.io yanked manzana
at 07:50:28Z. `ci / security` passed on #2825 at 06:44Z and has failed on #2836/#2837/
#2838 from 09:56Z. An advisory-DB catch-up, not a regression.

CONTAINMENT ONLY. The block records the removal condition, and it is NOT "when a new
manzana ships" -- see below.

Reachability measured on a clean origin/main worktree, x86_64 Linux, absolute cargo
binary (a `cargo` shell function on the dev box shadows it and redirects
CARGO_TARGET_DIR):

  cargo tree -p aprender-gpu                  | grep -c manzana -> 0
  cargo tree -p aprender-gpu --features metal | grep -c manzana -> 0
  cargo tree --workspace                      | grep -c manzana -> 0
  git grep -l 'secure_enclave|SecureEnclave' -- '*.rs'          -> 0 files

The middle line is load-bearing: manzana is BOTH optional AND declared under
[target.'cfg(target_os = "macos")'.dependencies], so enabling `metal` on Linux pulls in
nothing. aprender's only three call sites are `manzana::metal::*`, all behind
cfg(all(target_os = "macos", feature = "metal")). The advisory is about
`secure_enclave::SecureEnclaveSigner`, which this workspace never names.

As with the h2 entry above it, cargo-deny passes WITHOUT an exemption because it walks
the ACTIVATED graph; cargo-audit scans Cargo.lock, which lists target- and feature-gated
deps unconditionally. So the ignore goes in .cargo/audit.toml ONLY -- adding it to
deny.toml would be a dead exemption and fail check_deny_exemptions_live.sh.

WHY AN IGNORE AND NOT AN UPGRADE. Both published versions (0.1.0, 0.2.0) are YANKED, so
crates.io reports max_version 0.0.0 and there is nothing to bump to. More importantly
the advisory carries `[versions] patched = []` -- NO version is considered fixed, so
publishing a corrected manzana does NOT clear this gate on its own. Only amending the
upstream advisory to name a patched range does. The removal condition is written that
way in the file.

VERIFICATION, STATED HONESTLY. This is NOT locally verified green. cargo-audit 0.22.1 on
this x86_64 host does not report RUSTSEC-2026-0273 at all -- manzana surfaces only as
`Warning: yanked` -- so a local run passes with OR without this ignore and proves
nothing. The negative control was run and it FAILED TO FAIL, which is how the vacuity
was found rather than shipped. The fix is sound by construction (CI errors on that exact
id; `--ignore <id>` suppresses that id) and CI is the verifier.

Refs #2805.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=2838 head=e931064998c5d8376e944e73bbf43069e875c627 verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

@noahgift
noahgift marked this pull request as draft September 5, 2026 16:51
auto-merge was automatically disabled September 5, 2026 16:51

Pull request was converted to draft

@noahgift noahgift added the pp-066/carry-0.67 triage 0.66 — carried to 0.67 row label Sep 5, 2026
@noahgift

noahgift commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

PP-066 triage (epic #2873, ticket #2986): CARRY-0.67:W-G. Linked issues #2835 and #2786 both sit in the carried 0.67 row W-G (issue #2942, docs/specifications/pp-066-dag.yaml). Converted to draft and labelled pp-066/carry-0.67; not closed. Note it also edits .github/workflows/ci.yml, so it rebases onto the post-#2985 gate when W-G opens.

@noahgift

noahgift commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

R-7 of YOGA-NIGHTLY-001 belongs in this PR, because SILICON_FLOORS exists nowhere else.

paiml/infra's YOGA-NIGHTLY-001 §7 asks for the floor table to be re-keyed, and the table is only in this branch — it is not on main, so the change cannot land in the yoga work (#3060) or anywhere but here. Recording the measurement so it does not have to be retaken.

The defect this PR fixes has a second instance it does not close. The header here already says it out loud:

THE FLOOR DID NOT MOVE WITH THE HOST (aprender#2835)

and the fix — SILICON_FLOORS keyed by compute_cap, absence yielding UNCALIBRATED-SILICON — is right for sm_121, which has no entry. It does not hold for the host that joined the fleet last week.

Measured on yoga, 2026-09-09:

NVIDIA GeForce RTX 4060 Laptop GPU, 8.9, 8188 MiB, 100.00 W

8.9 is the key this table already has, whose single entry reads arch: "sm_89 (RTX 4090)", floor: 0.90, derived from four measurements on lambda-vector — a 24 GB / ~450 W desktop 4090. yoga is an 8 GB / 100 W mobile Max-Q part. The refusal that exists for exactly this cannot fire, because the key matches while the device does not:

Compute capability is a kernel-compatibility key, not a performance class.

The change: add a device discriminator to the lookup — nvidia-smi --query-gpu=name is already printed beside compute_cap at every call site, so it costs no new probe. Match on (compute_cap, name); an uncalibrated card is then REFUSED rather than silently inheriting another machine's floor. Under the file's own rule ("Adding a silicon here requires the derivation, not just the number"), yoga gets no entry until someone measures it.

Nothing is asserted on yoga in the meantime, and that is enforced rather than assumed (#3060):

  • scripts/perf-matrix.yaml declares yoga status: NA with the reason and a decider, and its W1/W2 cells are NA — so it has no denominator cells and no clock.
  • cuda-nightly.yml's ada-yoga leg carries a VRAM ceiling and a zero-JIT assertion and no throughput number, with the reason in the job's own comment and in its step summary.

Prediction, on the record, so the measurement can falsify it: yoga's decode ratio will land below 0.90. Whichever way it goes it is data — refusing to take the measurement is how a 4090's floor gets inherited by silence.

Refs paiml/infra PMAT-272 (YOGA-NIGHTLY-001 §7, R-7, N-4), #3060, #2835

🤖 Generated with Claude Code

https://claude.ai/code/session_01MSoNFCFvUg465kQBhw8kdL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pp-066/carry-0.67 triage 0.66 — carried to 0.67 row

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant