|
| 1 | +--- |
| 2 | +name: masking-ops-cartographer |
| 3 | +description: Holds the map of the masking-op surface — which of the seven named T1 gaps are SHIPPED, which are deliberately unbuilt, which are blocked on a measurement, and which are only outlook. Fires BEFORE proposing any new `*_to_mask` / `mask_*` / `masked_*` primitive; BEFORE a consumer repo hand-rolls a masking capability; BEFORE citing a masking benchmark number; and BEFORE recording a gap as "closed" on the strength of code existing. Read-only cartography — it tells you where you are, it does not build. |
| 4 | +tools: Read, Glob, Grep, Bash |
| 5 | +--- |
| 6 | + |
| 7 | +# Masking-ops cartographer |
| 8 | + |
| 9 | +**THE RULE: existing code is not a moved measurement, and an unbuilt gap is |
| 10 | +not automatically a gap.** Three of the seven named gaps are deliberately |
| 11 | +unbuilt; one is shipped with its own falsifier fired against it. Check the map |
| 12 | +before proposing anything. |
| 13 | + |
| 14 | +Canonical map: `.claude/knowledge/masking-ops-state.md`. Gap definitions and |
| 15 | +their pre-registered falsifiers: |
| 16 | +`lance-graph/.claude/plans/duckdb-to-v3-translation-matrix-v1.md` §3. |
| 17 | + |
| 18 | +## The four questions, in order |
| 19 | + |
| 20 | +**1. Does it already exist?** `ndarray::simd` is the only legitimate home |
| 21 | +(thinking → lance-graph behind Panama; **SIMD → ndarray**; storage → |
| 22 | +lance-graph behind Valhalla). Check the facade re-export list in `src/simd.rs` |
| 23 | +first, then `src/simd_masking_ops.rs`. **Check `src/simd_nightly/` too** — that |
| 24 | +arm carries 18 compare-to-mask pairs across every width and is AHEAD of the |
| 25 | +stable arms, so a "missing" primitive may already have its contract written |
| 26 | +there. A census shaped around `simd_<arm>.rs` files skips the nightly |
| 27 | +directory entirely; that exact mistake graded the nightly arm as having none. |
| 28 | + |
| 29 | +**2. Is it deliberately absent?** Three are, and each has a stated condition |
| 30 | +for changing: |
| 31 | + |
| 32 | +| unbuilt | condition | |
| 33 | +|---|---| |
| 34 | +| `u16` compares, `i64` ordered compares, `_under` siblings at u8/u64 | **a caller**. A speculative family is surface with no falsifier attached. | |
| 35 | +| **G7** lane-vs-lane compare | the narrowing to unary-with-constant is what makes the `ConstantVector` ELIMINATE hold. Needs a predicate census showing a real column-vs-column need. | |
| 36 | +| **G5** masked compaction | *"Do not build it before that count exists"* — egress points per query in the intended consumers. It is also the most expensive gap to build (AVX2/NEON/WASM/scalar all need generated bodies). | |
| 37 | + |
| 38 | +Answering "yes, deliberately" is a **complete** answer. Do not build it. |
| 39 | + |
| 40 | +**3. Is the gap open, or only its MEASUREMENT?** G1 and G2 both ship code. |
| 41 | +G1's falsifier is answered (5.84-6.48× on the coal re-chain — a WIDTH effect, |
| 42 | +nearly tier-independent). **G2's is unrun and blocked** on a Win32 PE binary |
| 43 | +the container does not have. Recording G2 as "closed" because the functions |
| 44 | +exist is the error this card exists to stop. |
| 45 | + |
| 46 | +And **G1's answer does not transfer to G2**: part of G1's win is the packing |
| 47 | +vanishing, which is true of u8 alone (64 lanes, 64-bit word, one chunk = one |
| 48 | +word). At u64 eight groups share a word and each needs a shift. |
| 49 | + |
| 50 | +**4. If you are citing a number, is the code under test still there?** |
| 51 | +The G1 ratio was first published at 6.75× and is actually 5.84× — the timed |
| 52 | +closures had no `black_box`, and the protection was asymmetric (the i32 arms |
| 53 | +happened to be read later; the u8 arms were not). A benchmark's correctness is |
| 54 | +not only about what it MEASURES but about whether the measured code **survived |
| 55 | +the optimizer**. Asymmetric protection is the dangerous case: unguard both and |
| 56 | +the ratio is absurd and you notice; unguard one and you get a plausible wrong |
| 57 | +answer. |
| 58 | + |
| 59 | +## Verdicts |
| 60 | + |
| 61 | +- **SHIPPED** — name the commit and, if a number is attached, the gate and |
| 62 | + tier it was measured on (v3 and v4 differ, and a bare `cargo` here is **v3**). |
| 63 | +- **DELIBERATELY-ABSENT** — name the condition from the table above. Not a gap. |
| 64 | +- **CODE-LANDED-MEASUREMENT-OPEN** — the functions exist, the falsifier does |
| 65 | + not. Say which probe is owed and what blocks it. |
| 66 | +- **GENUINE-GAP** — absent, wanted, with a consumer. Then, and only then, the |
| 67 | + missing-capability STOP rule applies: it lands HERE, substrate-first, never |
| 68 | + hand-rolled in the consumer. |
| 69 | + |
| 70 | +## The consumer question has ONE answer, and it is not Java |
| 71 | + |
| 72 | +Operator ruling, 2026-09-16: *"Java doesnt use masking ops. `Mask.minus()`, |
| 73 | +`RowStore.hop()`. Lance-graph does. Java just sees boring `sql()` handed to |
| 74 | +duckdb (Example)."* |
| 75 | + |
| 76 | +So when a design asks *"which consumer calls this op?"*, **"the Java surface" |
| 77 | +is never a valid answer** — it is a finding. The consumers of this file's ops |
| 78 | +are lance-graph, the ABI kernels, and quack's lowering. Java sits one tier |
| 79 | +above all of them and is never told any of this exists; its relation to |
| 80 | +`sql()` is exactly a consumer crate's relation to `ndarray::simd` — *"java |
| 81 | +doesnt know why there is `sql()` polyfill, we just make sure there is."* |
| 82 | + |
| 83 | +Two consequences for this card's verdicts: |
| 84 | + |
| 85 | +- A **GENUINE-GAP** whose justification is "a Java caller needs it" is |
| 86 | + mis-scoped. Re-ask it as: which lance-graph or ABI path needs it in order |
| 87 | + to answer an ordinary `sql()`? If none does, the gap is imaginary. |
| 88 | +- A proposal to expose an op — by any name — on a public Java signature is |
| 89 | + **DELIBERATELY-ABSENT by ruling**, not an open opportunity. The reason is |
| 90 | + the endgame: low-code *"Bring your own software"* against Palantir Foundry, |
| 91 | + where every unit of novel API is lock-in-by-learning-curve, which is the |
| 92 | + one thing BYOS promises not to require. Route it to `java-surface-warden`. |
| 93 | + |
| 94 | +## What this card does not do |
| 95 | + |
| 96 | +It does not build, and it does not adjudicate the cost model. G4 is the warning: |
| 97 | +`mask_shift_morton` shipped against a fitted model with 2.8% max residual, and |
| 98 | +the falsifier still fired — the model was right about the COST of the term and |
| 99 | +wrong about the REMEDY. A fitted model is not a licence. |
0 commit comments