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".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.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.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) → assert
BOTH commits' trees resolve (no MISSING) with NO idx-drop — RED before the fix.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.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.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.