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
EPIC: PP-TENSOR-001 — a tensor that has no bytes is a different type from one that does (MoE / tied-embedding placeholders) #3428
Evidence (fix diffs, #3427): 3 of the 5 user-found crashes cited in #3418 — #1749, #1789, #2535 — are one class: from_gguf_for_moe fills the dense FFN slots of a MoE layer with dense_ffn_placeholder (byte_size: 0, qtype: 0). 0 is the id of F32, so the placeholder is indistinguishable from a real F32 tensor until something indexes it. All three fixes (#1751, #1790, #2541) are guards or re-routes at a consumer; none removes the placeholder. It is still constructed on main (gguf/transformer.rsload_quantized_layer_moe_skeleton, gguf/qwen3_moe_load.rs:819), and a second instance of the pattern exists for tied lm_head (gguf/loader_apr_quantized.rs, #2309/#2441).
Exposure, measured on a672677f4: 63 non-test files in aprender-serve/src read .ffn_{up,gate,down}_weight; 14 contain no guard token at all (moe, is_empty(), placeholder, validate_matmul_weight_shape) — 6 gguf/inference, 4 gguf/cuda, 1 gpu/adapters, 3 other. File-level heuristic [U] as a semantic claim; the CPU matmul entry carries #1790's guard centrally, the CUDA and wgpu paths do not call it.
Direction: make absence a type (TensorStorage::{Present, Absent{reason}} or Option), so a dense consumer cannot be handed an MoE placeholder and the compiler enumerates the consumers — instead of a fourth guard after a fourth crash.
Children: T1 typed storage · T2 sentinel ban · T3 diagnostic contract. Rides 0.69.0 directly after PP-QUANT-001 M1 (operator directive 2026-09-17: crash evidence outranks coverage). Sibling of #3421.
Scheduling under 30-day-plan.md v2.2 — this epic is 0.70, deliberately
Moved out of 0.69 on 2026-09-20 with its children (#3433, #3434, #3429, #3431, #3418) as part of the re-cut recorded on #3080. The reasoning, kept here so it is not re-litigated from memory:
PP-TENSOR is the right fix for a recurring defect class and it is not a three-day train. 0.69's must-carry is PP-QUANT slice M (#3421), and two large type-system changes in one train against one-PR-at-a-time CI and a 62-min p95 gate is how a merge queue gridlocks — especially since both touch contracts/census.json and contracts/lint-baseline.json, the shared files the plan blocks the ontology slot on (plan decision 8, still open).
0.70's purpose is "receipts replace refusals" (#3081), and the exclusion predicates for that train are label:arch-model-new · label:crux-competitor · any PR adding a refusal without removed_by. This epic is not excluded by any of them.
Two doctrine rules now apply to it:
Rule 3, must-carry admission = readiness. If this epic is proposed as 0.70's must-carry row, its plan must be ruled and its falsifier proven satisfiable by a RED test on main before 0.70 opens (09-26). Slice M took four quorum rounds and idled a lane for days — that is precisely what this rule exists to stop, and Two consecutive non-passing plan quorums on a must-carry ticket must escalate automatically — #3452 sat through four #3562 makes two non-passing quorums escalate automatically.
Rule 1, fix-or-refuse is how we ship, never how we measure. A typed TensorStorage that refuses an MoE placeholder is a correct shipping behaviour; it must not appear in this epic's success criteria as "types are correct or refuse".
Relationship to slice M:#3421 delivers one GgmlType with TRAITS[43] verified against upstream at the pin. This epic's premise — a tensor that has no bytes is a different type from one that does — sits directly on top of that table. Sequencing M first is not deferral; it is the dependency.
milestone → 0.74.0 per docs/roadmaps/milestone-triage-2026-09-23.md (#4024), operator approval 2026-09-23 (relayed by aprender-cf). Reason: PP-TENSOR epic: #4001 moves it from 0.73's enablers to 0.74's core
milestone REVERTED to 0.70.0 (its state before #4024's move). The quorum on #4024 found this issue is named as must-carry by #3999 and #4001, and the table's own rule says such an issue is an operator DECIDE, never placed by the author. It was moved in error. It is now listed on #3998 as a pending decision: 0.73.0/0.74.0. No new placement was made.
milestone → 0.74.0, applying the operator's decision on #3999 (2026-09-23 10:43Z): "PP-QUANT (#3421/#3420), PP-ARCH (#3424) and PP-TENSOR (#3428) move to 0.74's epic as its core; 0.73 stays pure performance parity with llama.cpp." Nothing later in the thread reverses it. My earlier revert applied the table's 'two epics name it → DECIDE' rule mechanically, while the operator had already decided. #3999's body still lists these rows and is stale. (#4024 quorum round 11.)
Superseded by EPIC E7 #4001 (APR-EPIC-001 A4). Open children re-parented: none. Owner lines copied to the absorbing epic's body. Applied by aprender-d1: claude+agy both said close, apr shadow row recorded (handoff/close-quorum-2026-09-25.json).
Activity
noahgift commentedon Sep 20, 2026
Scheduling under
30-day-plan.mdv2.2 — this epic is 0.70, deliberatelyMoved out of 0.69 on 2026-09-20 with its children (#3433, #3434, #3429, #3431, #3418) as part of the re-cut recorded on #3080. The reasoning, kept here so it is not re-litigated from memory:
PP-TENSOR is the right fix for a recurring defect class and it is not a three-day train. 0.69's must-carry is PP-QUANT slice M (#3421), and two large type-system changes in one train against one-PR-at-a-time CI and a 62-min p95 gate is how a merge queue gridlocks — especially since both touch
contracts/census.jsonandcontracts/lint-baseline.json, the shared files the plan blocks the ontology slot on (plan decision 8, still open).0.70's purpose is "receipts replace refusals" (#3081), and the exclusion predicates for that train are
label:arch-model-new·label:crux-competitor· any PR adding a refusal withoutremoved_by. This epic is not excluded by any of them.Two doctrine rules now apply to it:
mainbefore 0.70 opens (09-26). Slice M took four quorum rounds and idled a lane for days — that is precisely what this rule exists to stop, and Two consecutive non-passing plan quorums on a must-carry ticket must escalate automatically — #3452 sat through four #3562 makes two non-passing quorums escalate automatically.TensorStoragethat refuses an MoE placeholder is a correct shipping behaviour; it must not appear in this epic's success criteria as "types are correct or refuse".Relationship to slice M: #3421 delivers one
GgmlTypewithTRAITS[43]verified against upstream at the pin. This epic's premise — a tensor that has no bytes is a different type from one that does — sits directly on top of that table. Sequencing M first is not deferral; it is the dependency.Train-level context: #3081 (0.70) · re-cut reasoning: #3080.
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: PP-TENSOR epic: #4001 moves it from 0.73's enablers to 0.74's core
noahgift commentedon Sep 23, 2026
milestone REVERTED to 0.70.0 (its state before #4024's move). The quorum on #4024 found this issue is named as must-carry by #3999 and #4001, and the table's own rule says such an issue is an operator DECIDE, never placed by the author. It was moved in error. It is now listed on #3998 as a pending decision: 0.73.0/0.74.0. No new placement was made.
docs(roadmap): correct the triage after the quorum -- 3 moves reverte…
docs(roadmap): record the 9 applied corrections, the #3513 withdrawal…
docs(roadmap): quorum round 9 -- #3714 back to 0.69.1 in flight: the …
noahgift commentedon Sep 23, 2026
milestone → 0.74.0, applying the operator's decision on #3999 (2026-09-23 10:43Z): "PP-QUANT (#3421/#3420), PP-ARCH (#3424) and PP-TENSOR (#3428) move to 0.74's epic as its core; 0.73 stays pure performance parity with llama.cpp." Nothing later in the thread reverses it. My earlier revert applied the table's 'two epics name it → DECIDE' rule mechanically, while the operator had already decided. #3999's body still lists these rows and is stale. (#4024 quorum round 11.)
docs(roadmap): quorum round 11 -- a reproducible release-tree census …
noahgift commentedon Sep 25, 2026
Superseded by EPIC E7 #4001 (APR-EPIC-001 A4). Open children re-parented: none. Owner lines copied to the absorbing epic's body. Applied by aprender-d1: claude+agy both said close, apr shadow row recorded (handoff/close-quorum-2026-09-25.json).