CODE-060: rev overflow at 2^20 is refused silently; linux drivers is at 72%

Now
OPEN
Sev
LOW
Rep
///bee
Ask
gritzko
Rev
///bee#8cb69a0
See
LITE-044
See
LITE-006

Input

Context

index/index.js:1189:Wt and :1228 if (rev >= REV_MAX) return false stop minting with no counter, no warning and no record. Not theoretical: in ~/src/linux the dir drivers stands at rev 752210 = 71.7% of the 20-bit ceiling (arch 23.5%, include 16.9%). When it hits, that dir's bee list attribution freezes and nothing says so. Found in the 2026-09-18 review.

Goals

At minimum count the refusals into rec and say them on the summary line; properly, spill to a second vnib-tagged rev space for hot dirs.

WIP

Design decisions

  1. The refusal is one guard both emit halves mint through (mintable), so a file and a dir are counted the same way. The count rides the ARRIVAL STATE (st.froze, path_hl -> refusals), which is where the ceiling is already known, and bringUp folds it into rec.refused (revs) and rec.frozen (paths) after the seal.
  2. The summary line gains a counting clause beside the other three, and only when a run refused something: indexed N commits, N revs, N rows, 2 revs refused at the rev ceiling on 1 path. A ceiling-free run says nothing, so no existing line changes.
  3. A SECOND REV SPACE — designed, NOT implemented, the call is gritzko's. The key is full: kind:4|path_hl:40| rev:20 is 64 bits with no spare, and the rev field is what ORDERS the chain and what lastRev gallops over. a. A vnib tag in the REV-CMMT value (the Goals'

    spelling) does NOT work: the epoch would sit in the VALUE while the key restarts at rev 0, so two rows share a key and nothing says which is newer — the MARK problem of LITE-006, and lastRev's density assumption breaks with it.

    b. WHAT WORKS, at zero format cost: put the epoch in

    the PATH, not in the row. At the ceiling the dir continues under a synthetic path_hl minted from the path text plus the epoch (hlOfText(path + "\0" + e)). No key layout changes, no new kind, no extension bump and no re-derive; readers pay one exact-key probe (revValAt(phl_e+1, 0, CMMT)) to find the live epoch, which is also the only marker needed. Readers to change: loadDir here, the dir fuse (view/list.js:52:cn) and view/todo.js:348:i4.

    c. Widening rev to 24 bits by taking 4 from path_hl is

    the other real option and the expensive one: every key in the lane is rekeyed, so the extension bumps (BEE-002 sweep) and EVERY repo re-derives from scratch — at linux scale that is the 1.46M-commit walk — and path_hl collisions grow 16-fold.

  4. The bee list side is told apart cheaply but not said: lastCommitOf (view/list.js:52:cn) already holds the rev, so rev === REV_MAX - 1 is a free tell, but WHAT a frozen dir row should show is a rendering decision that belongs with 3 above. Not implemented.

TODOs

Blockers and bummers

Outcome