You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
PP-QUANT-001 M2: reconciliation gate — GgmlType vs the vendored ggml.h id list at a pinned sha; exhaustive matches, no _ => #3431
Parent:#3421 · Slot: 0.69.0 must-carry, after M1. Mechanism: nothing compares the tree to the spec, so the enum lags silently (NVFP4=40, Q1_0=41, Q2_0=42 appeared upstream between 2026-01 and 2026-08-29 with no signal here). Fix: vendored id list [X] with source sha in the header; a test reconciling it to GgmlType both ways; clippy::wildcard_enum_match_arm denied where GgmlType is matched. Falsifier — three mutations, each RED and each naming its own gate: delete a TRAITS row · add a fake id to the vendored list · add _ => to a GgmlType match.
Ĵ: 24 turns [A] — borrowed; estimate.sh aprender pools 0 of 47 ledger rows today, so there is no measured basis.
Plan + evidence: #3427 · design discussion: #3418 · spec PR: #3420
First task (operator decision 2026-09-17): classify the 558 bare-integer qtype lines (regex upper bound, 10+ crates, [U]) into qtype | not-qtype, with unknown = 0 or listed, and ship the pattern with a must-match / must-not-match case table. The reconciliation gate needs that classification as its baseline; only 2 bare-integer sites inside the 33-file union are classified today (PMAT-3427 receipt, Table G).
Recorded verbatim. Lane A is unblocked; no fifth quorum round.
Settled, no further quorum: target (one #[repr(u32)] GgmlType, 43 rows: 35 live + 8 Removed), home crate aprender-quant, Table E, X1 ordering. Undisputed in rounds 1-4; they are closed.
Oracle: upstream ggml at the pinned llama.cpp sha (3173a5647) is the reference [X]. In-tree enums are the defendant, never the reference. Where they disagree, in-tree is a defect.
Falsifier, re-worded. Old wording (agreement with the existing core/compute/serve values) is unsatisfiable: core Q4_1 = 18 bytes/block vs upstream 20 (2xf16 + 16); Q8_1 upstream is 36 by static_assert vs 40 in-tree (pre-f16 layout).
New: for every live row i, TRAITS[i].{blck_size,type_size} equals the value extracted from ggml at the pinned sha by a committed command; the extraction output is a checked-in fixture; mutation of any one row turns the test RED (shown in the PR body).
Every in-tree disagreement is a row in the reconciliation table (PMAT-3431), each with: upstream value, in-tree value, call sites, and a verdict of NEVER-WORKED or REGRESSION, measured on the v0.68.1 binary - not inferred.
Fix-or-refuse per type: a type whose in-tree size was wrong ships in M1 with the upstream value AND a one-line refusal + exit code on load, until a round-trip fixture for that type is green. No silent behaviour change for Q4_1/Q8_1 consumers.
Remaining disputed D-rows: one amendment round, then HRQ. No fifth open round.
One clause needs a correction before it can be executed — clause 2's sha
The ruling makes the pinned llama.cpp sha the oracle, so every number in M1's fixture is extracted from whatever that sha resolves to. It does not resolve here. Measured on the release tree:
sha
status
d1d3c3396
the pin of record — scripts/llama_pin.tomlbuild_commit, pinned_on = 2026-09-15, pin_expiry = 2026-12-01, 216 references in-tree
39173bcac
an older comparator pin, still referenced 124 times (e.g. the CPU-leg parity basis in evidence/parity/thresholds.yaml)
3173a5647 (the ruling's)
appears nowhere in the tree — grep -rl over the repo returns nothing
I am not substituting a sha into the ruling by inference: the whole point of clause 2 is that the oracle is named, and an oracle resolved by guessing is not an oracle. The implementer needs one line back: is the oracle d1d3c3396 (the pin of record), or a deliberate new pin? If it is a new pin, note that bumping the comparator invalidates every ratio measured against the old one — llama_pin.toml says so itself, and that is a decision with a named cost rather than a bump.
Second-order finding, independent of the answer: two comparator pins are live in-tree at once — 216 references to d1d3c3396 and 124 to 39173bcac. Some committed artifacts are therefore measured against a superseded oracle. That deserves its own row regardless of how clause 2 resolves.
What proceeds now, unblocked
Clauses 1, 3, 4, 5, 6 need nothing further. Clause 1 closes the design questions; clause 3 replaces the unsatisfiable falsifier with an extraction-plus-mutation test, which is the shape that can actually turn RED; clause 5's fix-or-refuse matches the doctrine adopted for batched decode in the 0.69 epic — ship the correct value with an explicit refusal rather than a silent behaviour change.
AMENDMENT (operator, 2026-09-20) — clause 2 of the M1 ruling, recorded verbatim
2'. The oracle is scripts/llama_pin.tomlbuild_commit, by reference, never a literal sha. Today that resolves to d1d3c3396. No pin bump is ordered by this ruling. "3173a5647" in the original clause is struck: it was the checkout the 43/35/8 count was first measured at, not a pin.
2a. The TRAITS fixture records the sha it was extracted from. A test asserts fixture.sha == llama_pin.toml build_commit. A pin bump therefore turns the fixture RED until it is regenerated by the committed extraction command — the bump's cost is visible in the bump PR, not discovered later.
2b. Row counts are derived, not ruled. Re-extract at d1d3c3396; if live/Removed differs from 35/8, the extraction wins and the PMAT-3430 title is corrected. "43" is [U] until then.
2b is now measured — the ticket's numbers hold. [U] cleared.
Extracted from the pinned checkout at /home/noah/src/llama.cpp-d1d3c3396 (git rev-parse HEAD → d1d3c3396aa1…, matching llama_pin.tomlbuild_commit), from ggml/include/ggml.h:
So 43 rows: 35 live + 8 Removed is confirmed at the pin. No title correction is needed and the count can stop being [U].
Method note, because it nearly went the other way. A first pass with a one-line grep returned 44/41/3 and looked like a disagreement. It was wrong twice: it counted GGML_TYPE_COUNT as a type, and it classified a commented row as live whenever the comment did not contain the word "removed" (// GGML_TYPE_Q4_0_4_8 = 32, says nothing). Reading the enum settled it. Worth stating because clause 3's fixture will be generated by a command, and a sloppy extractor produces a fixture that is confidently wrong on exactly these rows — the commented block at 31–33 and 36–38 is the trap.
Four live types are recent — MXFP4 (39), NVFP4 (40), Q1_0 (41), Q2_0 (42). Whether in-tree carries them at all is part of clause 4's reconciliation, and a NEVER-WORKED verdict is the likely shape there rather than REGRESSION.
What clause 3's committed extraction command must do
Parse enum ggml_type from ggml/include/ggml.h at the resolved pin, taking commented rows as Removedby position, not by comment wording.
Take blck_size / type_size from ggml's own type-traits table, not from the header comment, and not from any in-tree value.
Emit the fixture with the sha it read, so 2a's assertion has something to compare.
Prove it can fail: mutate one row, expect RED (in the PR body, per clause 3).
2a generalises, and there is already a ticket for the general case
2a — an artifact derived from the pin records the pin, and a test asserts they match, so a bump's cost surfaces in the bump PR — is exactly the mechanism #3563 asks for repo-wide, where two comparator pins are live at once (216 references to d1d3c3396, 124 to the earlier 39173bcac). The TRAITS fixture should be the first artifact built to this shape, and #3563's guard should be written as the general form of it rather than as a separate idea.
milestone → 0.74.0 per docs/roadmaps/milestone-triage-2026-09-23.md (#4024), operator approval 2026-09-23 (relayed by aprender-cf). Reason: quant/tensor/arch dispatch consolidation: Any Model core (#4001)
First task: bare-integer qtype lines classified. 1176 candidates → 170 qtype · 1006 not-qtype · 0 unknown. Ratchet gate scripts/classify_bare_int_qtype.py (31-case table) + baseline docs/audits/bare-int-qtype-baseline.tsv, CI fragment 480.
Falsifiers, each RED naming its own gate: TRAITS row drift → traits_table_equals_the_upstream_fixture_row_for_row; fake fixture id 43 → "live id 43 (FAKE) is not constructible"; planted _ => → clippy wildcard_enum_match_arm rc 101.
clippy measured 3 wildcard arms on GgmlType workspace-wide (all compute inference/model.rs, all zero-fill). Now named + fn-level deny.
Open follow-up: those sites still load unsupported dtypes as zeros; they should refuse.
merged into #5315 (master ticket for epic #4001; triage rule 7b, 2026-10-14). It is a checklist row there; reopen this issue when work on it starts or its PR opens.
Activity
noahgift commentedon Sep 20, 2026
RULING (operator, 2026-09-20) — PMAT-3430 M1
Recorded verbatim. Lane A is unblocked; no fifth quorum round.
One clause needs a correction before it can be executed — clause 2's sha
The ruling makes the pinned llama.cpp sha the oracle, so every number in M1's fixture is extracted from whatever that sha resolves to. It does not resolve here. Measured on the release tree:
d1d3c3396scripts/llama_pin.tomlbuild_commit,pinned_on = 2026-09-15,pin_expiry = 2026-12-01, 216 references in-tree39173bcacevidence/parity/thresholds.yaml)3173a5647(the ruling's)grep -rlover the repo returns nothingI am not substituting a sha into the ruling by inference: the whole point of clause 2 is that the oracle is named, and an oracle resolved by guessing is not an oracle. The implementer needs one line back: is the oracle
d1d3c3396(the pin of record), or a deliberate new pin? If it is a new pin, note that bumping the comparator invalidates every ratio measured against the old one —llama_pin.tomlsays so itself, and that is a decision with a named cost rather than a bump.Second-order finding, independent of the answer: two comparator pins are live in-tree at once — 216 references to
d1d3c3396and 124 to39173bcac. Some committed artifacts are therefore measured against a superseded oracle. That deserves its own row regardless of how clause 2 resolves.What proceeds now, unblocked
#[repr(u32)] GgmlType(43 rows: 35 live + 8 Removed) +TRAITS[43]below core/compute/serve — ggml enums 3 → 1 #3430's original falsifier is superseded by clause 3 and must not be implemented as written.GgmlTypevs the vendoredggml.hid list at a pinned sha; exhaustive matches, no_ =>#3431 is now scoped by clause 4: every disagreement is a row with upstream value, in-tree value, call sites, and a NEVER-WORKED / REGRESSION verdict measured on the v0.68.1 binary, not inferred.#[repr(u32)] GgmlType(43 rows: 35 live + 8 Removed) +TRAITS[43]below core/compute/serve — ggml enums 3 → 1 #3430 → PMAT-3427: PP-QUANT-001 slice M is 0.69.0 must-carry — measured tables, fix-diff Pareto, the queue #3447 → docs(release): APR-RELEASE-001 has no must-carry section onmain— land §1.5 (must-carry rows; T-0 waits; > 72 h andon) #3446, epic EPIC: PP-QUANT-001 — quant-type dispatch, Phase 0/1 (0.69 train) #3421. This is Band 0 of EPIC: release train 0.69.0 — COMPLETE Qwen usability on pure CUDA (all 0.68.x folded in) #3080 and it gates T-0.Refs #3080, #3430, #3431, #3421, #3562
noahgift commentedon Sep 20, 2026
AMENDMENT (operator, 2026-09-20) — clause 2 of the M1 ruling, recorded verbatim
2b is now measured — the ticket's numbers hold.
[U]cleared.Extracted from the pinned checkout at
/home/noah/src/llama.cpp-d1d3c3396(git rev-parse HEAD→d1d3c3396aa1…, matchingllama_pin.tomlbuild_commit), fromggml/include/ggml.h:Q4_2, 5Q4_3, 31Q4_0_4_4, 32Q4_0_4_8, 33Q4_0_8_8, 36IQ4_NL_4_4, 37IQ4_NL_4_8, 38IQ4_NL_8_8GGML_TYPE_COUNT = 43, ids 0…42, and 35 + 8 = 43 ✓So
43 rows: 35 live + 8 Removedis confirmed at the pin. No title correction is needed and the count can stop being[U].Method note, because it nearly went the other way. A first pass with a one-line grep returned 44/41/3 and looked like a disagreement. It was wrong twice: it counted
GGML_TYPE_COUNTas a type, and it classified a commented row as live whenever the comment did not contain the word "removed" (// GGML_TYPE_Q4_0_4_8 = 32,says nothing). Reading the enum settled it. Worth stating because clause 3's fixture will be generated by a command, and a sloppy extractor produces a fixture that is confidently wrong on exactly these rows — the commented block at 31–33 and 36–38 is the trap.Four live types are recent —
MXFP4(39),NVFP4(40),Q1_0(41),Q2_0(42). Whether in-tree carries them at all is part of clause 4's reconciliation, and aNEVER-WORKEDverdict is the likely shape there rather thanREGRESSION.What clause 3's committed extraction command must do
enum ggml_typefromggml/include/ggml.hat the resolved pin, taking commented rows asRemovedby position, not by comment wording.blck_size/type_sizefrom ggml's own type-traits table, not from the header comment, and not from any in-tree value.2a generalises, and there is already a ticket for the general case
2a — an artifact derived from the pin records the pin, and a test asserts they match, so a bump's cost surfaces in the bump PR — is exactly the mechanism #3563 asks for repo-wide, where two comparator pins are live at once (216 references to
d1d3c3396, 124 to the earlier39173bcac). The TRAITS fixture should be the first artifact built to this shape, and #3563's guard should be written as the general form of it rather than as a separate idea.Refs #3080, #3430, #3431, #3452, #3563
noahgift commentedon Sep 23, 2026
milestone → 0.74.0 per docs/roadmaps/milestone-triage-2026-09-23.md (#4024), operator approval 2026-09-23 (relayed by aprender-cf). Reason: quant/tensor/arch dispatch consolidation: Any Model core (#4001)
fix(#3431): the 558 bare-integer qtype lines are classified — 170 qty…
fix(#3431): the 3 GgmlType matches that swallowed every other id with…
noahgift commentedon Sep 25, 2026
Landed on
stage/0.70.1(7a5a906, b8edaf1):scripts/classify_bare_int_qtype.py(31-case table) + baselinedocs/audits/bare-int-qtype-baseline.tsv, CI fragment 480.traits_table_equals_the_upstream_fixture_row_for_row; fake fixture id 43 → "live id 43 (FAKE) is not constructible"; planted_ =>→ clippywildcard_enum_match_armrc 101.inference/model.rs, all zero-fill). Now named + fn-level deny.PMAT-3430 M1: one ggml tensor-type table, extracted from upstream rat…
docs(lookahead): A2 measured, #3431 mutation 3 ungated with 4 live Gg…
noahgift commentedon Oct 14, 2026
merged into #5315 (master ticket for epic #4001; triage rule 7b, 2026-10-14). It is a checklist row there; reopen this issue when work on it starts or its PR opens.
fix(paiml#3431): GgmlType matches name every id instead of swallowing…