Skip to content

EPIC: PP-TENSOR-001 — a tensor that has no bytes is a different type from one that does (MoE / tied-embedding placeholders) #3428

Closed as not planned

Description

@noahgift

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.rs load_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.

🤖 Generated with Claude Code

Activity

  1. added this to the 0.69.0 milestone on Sep 17, 2026
  2. added
    P1High priority
    epicEpic — multi-story umbrella
    on Sep 17, 2026
  3. modified the milestones: 0.69.0, 0.70.0 on Sep 20, 2026
  4. noahgift commented on Sep 20, 2026

    @noahgift
    MemberAuthor

    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.

    Train-level context: #3081 (0.70) · re-cut reasoning: #3080.

  5. modified the milestones: 0.70.0, 0.74.0 on Sep 23, 2026
  6. noahgift commented on Sep 23, 2026

    @noahgift
    MemberAuthor

    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

  7. modified the milestones: 0.74.0, 0.70.0 on Sep 23, 2026
  8. noahgift commented on Sep 23, 2026

    @noahgift
    MemberAuthor

    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.

  9. modified the milestones: 0.70.0, 0.74.0 on Sep 23, 2026
  10. noahgift commented on Sep 23, 2026

    @noahgift
    MemberAuthor

    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.)

  11. noahgift commented on Sep 25, 2026

    @noahgift
    MemberAuthor

    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).

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High priorityepicEpic — multi-story umbrella

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions