Conversation
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
|
No activity since 2026-09-17 13:44Z; 2 release trains have been cut since (v0.68.2, v0.68.1). Age is the only input to this sweep — it is not a judgement on the work, and a train label such as What happens next: if one more train passes while this is still labelled To clear it: push, rebase, or say on the thread what it is waiting for. Any of the three removes the label at the next sweep. If it is blocked on something external, name that here — a blocker with an owner is not sprawl, and it stops the clock. |
|
Adopting this PR (2026-09-21 sweep; author session is not live — branch cut 09-16, no session on the box predates it). Plan, before touching anything: the DIRTY state is the squash-of-the-stack-base class — |
…annot reproduce QE2E-INV-001 could not be judged because nothing in the tree held a MEASURED Qwen3.5 tensor inventory to judge against. This adds one: the 320 tensors of ~/models/Qwen3.5-0.8B-Q4_K_M.gguf (sha256 bd258782...dc517), read straight from the GGUF header rather than from a model card. It already falsifies the current arithmetic. Dense/GQA accounting applied to that file gives 644,400,128 against a measured 752,393,024 — short by 107,992,896, 14.4% of the model, because 18 of the 24 layers are Gated DeltaNet and no term here counts their conv, gate, state or output projections. Two shapes in the file are also not what dense accounting predicts, and both are pinned: attn_q is [1024, 4096] = 2 * num_heads * head_dim (the q projection emits the attention output gate alongside the query; attn_output [2048, 1024] confirms num_heads * head_dim = 2048), and attn_q_norm/attn_k_norm are present at head_dim. The file is also TIED — it has no output.weight. Refs #3346 Pmat-Ticket: PMAT-3346 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… a hybrid model can be counted contracts/model-families/qwen3_5.yaml declares inner_size, state_size, conv_kernel, group_count and full_attention_interval under constraints:, and ModelConstraints carried none of them. A Gated DeltaNet layer's parameters live entirely in those dimensions, so every consumer of the descriptor counted Qwen3.5 as if three quarters of its layers did not exist. Carried through as ModelConstraints::deltanet: Option<DeltaNetShape> — the runtime YAML loader (parsing.rs) and the compiled-in registry (build_parsing.rs + build_codegen.rs) both populate it, and FALSIFY-MF-QWEN35-010 pins that the declared values survive the trip and that no other family acquires a shape it never declared. qwen3_5.yaml is the only descriptor with these keys, so every other family keeps byte-identical accounting. model_arithmetic gains gated_deltanet_layer_params (one term per GGUF tensor: attn_qkv, attn_gate, ssm_conv1d, ssm_alpha/beta, ssm_a, ssm_dt.bias, ssm_norm, ssm_out) and hybrid_layers (the interleaved schedule). attention_layer_params gained two terms the real file has and dense accounting did not model: the gated q projection (2*n_h*d_k) and the q/k norm vectors. Falsified against a real model, not against itself: fed the 0.8B configuration, the equation now reproduces the 320-tensor inventory of Qwen3.5-0.8B-Q4_K_M.gguf EXACTLY — 752,393,024, both layer kinds matching tensor for tensor. QE2E-INV-001 is still NOT asserted, and no range was widened to make it pass. The 9b descriptor now yields 8,344,907,136, up from 8,208,519,168 but still 0.655B below [9.0B, 9.2B]. The remaining gap looks like descriptor drift rather than missing arithmetic: 9b keeps inner_size 2048 — the value the 0.8B uses at hidden_dim 1024 — while quadrupling hidden_dim, and its group_count 8 fails 8 * 128 == 2048, a consistency the measured 0.8B satisfies at 16 * 128. Only a real Qwen3.5-9B file can settle it; none is on this box. Refs #3346, #3347 Pmat-Ticket: PMAT-3346 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…osed The note said the obligation was undischarged because ModelConstraints does not carry the DeltaNet shape keys. It does now, and the 0.8B count reproduces the real GGUF exactly. What actually blocks the obligation is descriptor drift at the 9b variant. Pmat-Ticket: PMAT-3346 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nd pv extract shrank the graph by 356 triples instead of refusing d3cc76f rewrote the note on the QE2E-INV-001 binding and dropped the trailing `"` — contracts/binding.yaml stopped being valid YAML at line 764 (`found unexpected end of stream`). Nothing in the PR noticed because `pv extract contracts` does not refuse a binding registry that will not parse: it emitted a graph with 15,244 triples where main has 15,600 — every bound symbol AFTER the broken entry (prune::run, distill::run, harness_ir::*, ptx_explain::run, …) silently gone — and `--check` would have agreed with itself. Found while regenerating the derivative for this adoption, by the drop, not by any gate. One character. With it, binding.yaml parses (156 entries, same as main) and the extraction is byte-identical to main's committed contracts.nt, so this PR owes no graph change after all. Refs #3346, #3350 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
d3cc76f to
da1ee15
Compare
|
Adopted and rebased — and the rebase found a real defect in the branch, now fixed. What was done. What the rebase found. Regenerating Verified on the new head: Not armed: per the board ruling every PR needs a quorum receipt first; that runs next. Refs #3346. |
…t to judge against Acceptance transcribed from issue #3346 as this PR answers it (the type that reads the descriptor was wrong, not the range or the descriptor), with the 9B range instantiation explicitly out of scope until a real 9B GGUF exists. Refs #3346 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3346",
"head": "1ffdccf2500116a4dd39af6a66a697f7bb841136",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 2
},
{
"lane": 2,
"verdict": "NO-VERDICT",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 4
}
]
} |
…iases Found by the AD-04 quorum on #3350 (lane 1, gemini-3.1-pro-high, cited model_arithmetic.rs:144): the projection term used q_out for a gated family's q matrix (2*n_h*d_k — attn_q emits the output gate, MEASURED in Qwen3.5-0.8B) while the bias term still used q_dim. A bias narrower than its projection is not a model. One token: q_dim -> q_out in the bias sum. Why a delta-0 measurement did not catch it: no shipped family exercises the case. Qwen3.5 has no attention bias; Qwen2.5 has biases but is not gated, so q_out == q_dim there. The test that pinned 12 (a q_dim bias under a q_out matrix) now asserts 16 and says why, and a second test holds the other polarity — a non-gated family with biases is unchanged at 12. 115 model_arithmetic + model_family tests pass; oracle 218; clippy clean. Refs #3346, #3350 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Quorum round 0: 1 FAIL / 1 no-verdict / 1 PASS — and the FAIL was a real finding, now fixed in |
|
quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3346",
"head": "e060c7e2c22bc221b5e454a9b677d09d2b27c2e2",
"width": 3,
"executor": "agy",
"agreed": true,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 5
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 2
}
]
} |
Cross-inspection of
|
| lane | conversation | status | verdict | findings | refs to sibling lanes / receipts / $WORK | duration |
|---|---|---|---|---|---|---|
| lane 1 | f3ea1f1c |
SUCCESS | PASS (structured_output) | 5 (2 cited) | 0 | 644 s |
| lane 2 | 3f01ebe3 |
SUCCESS | PASS (structured_output) | 0 (0 cited) | 0 | 55 s |
| lane 3 | 81760200 |
SUCCESS | PASS (structured_output) | 2 (0 cited) | 0 | 394 s |
Distinct agy conversation ids: 3/3; no lane references a sibling lane, another receipt or $WORK. Read from /tmp/claude-1000/-home-noah-src-aprender/51506a7a-265a-4e5c-bc53-50274de4a757/scratchpad/lanes-3346-round1 on this box. Note: round 0's pro lane found the gated-family bias-term defect (model_arithmetic.rs:144), fixed in e060c7e; this is round 1 on the new head; d4 armed via pmat-merge on the parent rule and this inspection is confirmatory.
Verdict line: 3/3 PASS, independent. Arm confirmed.
|
Folded into the 0.69 release batch #3669 by the cop (08:05Z, operator: "most PRs can be batched"). One CI run and one queue slot for all of them, and the generated files ( |
|
Landed in #3669 (squash |
#3346 asked which was wrong, the range or the descriptor. The answer is neither — it was the type that reads the descriptor. Stacked on #3348.
contracts/model-families/qwen3_5.yamldeclaresinner_size,state_size,conv_kernel,group_countandfull_attention_interval.ModelConstraintscarried none of them, so every consumer counted a hybrid model with dense/GQA accounting and silently missed the conv, the gates, the state norm and the mixer projections of 18 of every 24 layers.Ground truth first, and it now matches exactly
The measurement is against a real file, not against the formula's own assumptions:
~/models/Qwen3.5-0.8B-Q4_K_M.gguf(sha256bd258782…dc517), GGUF header parsed directly — 320 tensors, 752,393,024 parameters.Two shapes in that file contradict dense accounting and are now modelled, both read off the tensors rather than assumed:
attn_qis[1024, 4096]= 2·n_h·d_k — the q projection emits the output gate, andattn_output [2048,1024]proves only q is doubled.output.weight.The mutation: drop the
attn_gateterm andqwen35_0_8b_config_derived_count_equals_the_measured_gguf_inventorygoes RED, short by exactlyd·inner_size= 2,097,152.QE2E-INV-001 is still NOT asserted, and the range was not widened
P(9B) moves 8,208,519,168 → 8,344,907,136, still 0.655 B below [9.0B, 9.2B]. The residual is not arithmetic — the 9b descriptor contradicts itself: it keeps
inner_size: 2048(the value the 0.8B uses athidden_dim1024) while quadruplinghidden_dim, and itsgroup_count: 8failsgroup_count · state_size == inner_size(8·128 ≠ 2048), a consistency the measured 0.8B satisfies at 16·128.Only a real Qwen3.5-9B file settles that, and none is on this box, so the obligation stays unproved and the number is pinned by a test instead of asserted.
DeltaNetShape::heads_span_the_mixer()now catches the descriptor's self-inconsistency directly.Two disclosures
deltanet: None,fixture literals inapr-clitests/oracles. Zero logic change. The enum-payload alternative breaks the same crate, becauseapr-climatchesAttentionType::HybridGatedDeltaNetin two files.qk_normis left alone deliberately. The descriptor says the family has none, the real file hasattn_q_norm/attn_k_normon its attention layers, andtensor_expectation.rsasserts the opposite. Both are true of different layer kinds — the repo should settle whetherqk_normis per-family or per-layer-kind. It is worth 4,096 parameters at 9B, so it does not touch the verdict.The roadmap write
pmat work addproduced was reverted: #3297 moved entries to fragments, and a monolithic write is exactly the contention that PR removed.Gate:
aprender-core --lib model_arithmetic28 passed,aprender-contracts --lib1526 passed, clippy-D warningsclean, fmt clean.Refs #3346, #3347, #3091, #3114
no-close: #3346 stays open — which side of the 9b descriptor is wrong is undecided until a real Qwen3.5-9B GGUF is measured.
ont-delta: shape ModelConstraints gains inner_size, state_size, conv_kernel, group_count and full_attention_interval, and model_parameter_count gains the gated-DeltaNet layer term; no obligation is added or removed, and QE2E-INV-001 is not discharged.
🤖 Generated with Claude Code