be post to a remote refused with a BOGUS non-fast-forward: native keeper KEEPLookup (keeper/KEEP.c) resolves a sha ONLY through the loaded .keeper.idx LSM runs and returns KEEPNONE on a miss — there is NO pack-scan fallback (Indices). The be/ JS writers do not keep that index complete: a shard with 12 NNNNN.keeper packs carried only 2 .keeper.idx runs (1942 entries), so the newest locally-committed tip was unindexed. KEEPIsAncestor(local, peer) then dead-ends at the missing tip object → native reads it as a non-descendant → KEEPFAIL/WIRECLNFF. jab reads the tip fine via store.js's in-RAM scan fallback; native has none. Fix: index packs INCREMENTALLY, one run per written pack. Method Issues.
be post --nosub ssh://localhost/src/journal/be from a store-backed
wt → keeper: post: non-fast-forward — local tip 4370d67… is not a descendant of peer tip 1f664aa…, then KEEPFAIL / BEDOGEXIT; 0 changes to commit. (?/beagle-ext form of the same wt fails identically as WIRECLNFF.)
keeper get .#4370d67 → KEEPNONE (native,
index-only); jab commit:?4370d67 prints it (JS scan fallback). The object IS on disk in a pack, absent from every .keeper.idx run. parent 9c52537 too.
~/.be/beagle-ext: 12 *.keeper, 2 *.keeper.idx (29440+1632 B =1942 wh128 entries). 6388c34e (also recent) PRESENT but 4370d67/9c525377 MISS — coverage is whatever the last native compaction folded, NOT every pack.
ingest.buildIndex names the run
ron.encode(ron.now())+".keeper.idx" (ingest.js:66) — it IGNORES the unique fileId it is passed, so two packs written in ONE ron tick (rapid post, or a frozen SOURCE_DATE_EPOCH) collide and the 2nd OVERWRITES the 1st run. Minimal repro: 2 same-epoch posts → ONE idx → first commit commitTree MISSING; rm .be/*.keeper.idx (in-RAM re-scan) recovers it. THIS is the "12 packs → 2 runs".
walk-up"); the WRITER holds the completeness contract. store.js scan-fallback (shared/store.js, "no .keeper.idx run → build in-RAM") hides the gap from jab but never from native be/keeper.
fold-commit, wire ingest
clone/add, any barrier re-fold) gets a covering .keeper.idx run — no pack left unindexed, ever. Native keeper get .#<sha> resolves it without scanning.
rebuild the whole shard index; let compaction bound the run count.
be post of locally-committed JS tips
fast-forwards (no false non-FF); native keeper get/verify find every tip.
be/ JS only (beagle-ext shard): shared/ingest.js, verbs/post/*.js. wh128
layout per Indices / keeper/KEEP.h (key=hashlet60|type4, val=offset40|file_id20|flags4) plus the PACK-summary bookmark entry.
pack emits its run in the same op — the idx run IS the commit's visibility to native. store.js's scan fallback stays only as a safety net.
keeper fileId/logName (e.g. 0000000002.keeper.idx), which buildIndex already receives, NOT ron.now(). A .keeper.idx per .keeper is 1:1 and collision-free; the reader merges runs anyway. This alone stops the overwrite.
verbs/post/post.js barrier-re-fold path may ALSO (re)write a
pack without a fresh idx run — audit every pack-write site for a paired ingest.buildIndex. JS-077 (orphan keeper pack) is the sibling no-index failure mode; JS-056 is the read-side half.
ingest.buildIndex: name the run by logName/fileId, not ron.now() — the
verified collision fix (see ROOT CAUSE); tolerate old <ron>.keeper.idx shards. (Re-verified UNFIXED 2026-07-07: be/shared/ingest.js:66 still ron.encode(ron.now()) + ".keeper.idx".)
SOURCE_DATE_EPOCH (same tick) → assertBOTH commits' trees resolve (no MISSING) with NO idx-drop — RED before the fix.
native keeper get .#<tip> resolves — RED before the fix.
ingest.clone/add, fold-commit, barrier
re-fold) → each pairs with a .keeper.idx run: verified 2026-07-07, ingest.js clone:80 / add:116 / fold-commit.js writePack:192 all call buildIndex per pack — the residual hole is the same-tick run-name collision.
ITS OWN run not the world; honor Indices size-tiered run discipline.
be/jab step (or native keeper-side rebuild) to index any
pre-existing unindexed pack — the wild stores already in this state. (PACK-001 PIDXScan from_off — the reindex-on-open leaf — is drafted on the board; the jab runtime landed a js pack-log APPEND leaf under PACK-001.)
keeper get/verify/be post FF on a JS-built store green.repro shard); fixing the writer does not retro-index them — needs the backfill TODO or a native shard reindex.
d80bdb5c ("TEST-003,JS-099,SUBS-046: js tests pass, no
native use", 2026-07-06) MENTIONS this ticket but touched only test harnesses / discover.js / submount.js — it de-nativified the tests (removing the native-keeper oracle this bug needs), NOT the ingest.js writer; the root cause is still in place.