u32 lane of abc.index — scalar 4-byte postings for the TRI laneabc.index (quickjab cont.c IDX table, pup.c PUP_DEF/PUP_REG) instantiates three lanes, kv64, wh128 and u64. BEE-071 wants a fourth, u32: a trigram posting is tri:16 | path_hl16:16, and at u64 the lane costs twice what it has to (ruled 2026-09-17, gritzko: u32 entries, the alphabet folded so a trigram fits 16 bits). The pieces exist — abc/QSORTx.h for u32 comes with abc/INT.h, hit.c already registers _sort_u32/_merge_u32/_isect_u32, and the Pup family (DOG-027) is a lane template — so this is one more macro instantiation, one IDX row and a test leg, no format logic.
pup.c:33:TC..44: the X(M, name) blocks instantiate wh128, kv64, u64 over abc/PUPx.h (and the HIT/QSORT they need); pup.c:726:TC PUP_REG(L) binds the eleven _pup_<lane>_* leaves per lane.cont.c:588:q1.. the JS handle: const IDX = { kv64: { pair: true }, wh128: { pair: true }, u64: { pair: false } }; put/get/range/seek wrap keys in BigInt() on every lane, which is what the 64-bit leaves read. cont.c:19:q1 LANE already lists u32: { A: Uint32Array, w: 1, big: false } for the container side.test/index.js covers the three lanes: put, memtable hit, seal past a page, range, seek/next, reopen, drop; the u64 leg (:29) is the shape a scalar lane is tested in.<10-RON64><ext> files of the lane's elements, sorted; a u32 run is a plain sorted Uint32Array on disk, which is what _pup_u32_run(h, i) hands back.abc.index("u32", { dir, ext, mem, durable, mode }) works exactly as the u64 lane does: put(v), commit(durable), get(v), range(lo, hi, cb), seek(v)/next(), count(), run(i), drop([i]), close(), mem.[0, 2³²) and the handle passes them through untouched (a BigInt() wrap on that lane would throw on range's callback contract); the callback receives a Number. A value out of range or non-integer throws in plain words naming the lane._pup_mem) and the dedup on merge behave as on u64; a rerun that re-puts an existing value adds no second row after compaction.test/index.js: a u32 leg — 5 puts and a memtable hit, 3000 puts sealing past one page, a range over one 16-bit block ([t << 16, (t + 1) << 16)) answering only that block's values ascending, seek landing on the first value >= the needle, reopen and read back, drop of every run.INDEX.md / API.md lane list mentions u32.pup.c, cont.c, test/index.js, the two docs; nothing in dog/ (the submodule is dirty in the main tree and is not this ticket's).test/index.js and the whole ctest suite stay green.build-unbundled (ninja); ~/bin/quickjab is not replaced by the agent — the user promotes a binary. No commit.kv32 one: a posting is one value with the file id in its low bits, so a keyed lane would only add an overwrite semantic the reject filter must not have (a re-put of (tri, file) is the same row).X(M, name) M##u32##name instantiation, PUP_DEF(u32), PUP_REG(u32)u32 row, Number pass-through on non-big lanes