BEE-019: shorter permalinks — file.c:58:mJ, a line in the anchored blob plus a 2+ char hashlet

Now
OPEN
Sev
MED
Ask
gritzko
Rep
///bee
On1
LITE-025
On2
DOG-043
See
LITE-026
See
BEE-014
See
BEE-016
See
BEE-018

LITE-025 minted BEE-005:1Jz:mJpI — a ron64 BYTE OFFSET plus a 4..10 char EVEN hashlet — and a page full of them reads heavy (gritzko, 2026-08-16). Two cuts, ruled in chat: segment 1 becomes the LINE in the anchored blob (the hashlet already pins the blob, so a line in it is exactly as stable as a byte offset in it — LITE-025:46:zc ruled blob-vs-weave, not byte-vs-line), and the hashlet shrinks to a 2-char minimum, extended ONE char at a time only when it collides in the path's own history OR to get one non-digit into it. BEE-005:58:mJ: legible before AND after minting, and the mint becomes a pure append. The corpus is migrated once by a temporary converter verb, then the old form is forgotten.

Input

Context

The permalink form and its readers/writers, as landed:

Goals

file.c:58:mJ is the permalink; everything that minted, fused, split or followed the old form does the same for the new one, and one converter run turns the corpus over.

Constraints

WIP

Design decisions

Ruled by gritzko in chat, 2026-08-16.

  1. LINE, not byte offset, in segment 1 — legibility before and after minting; the hashlet pins the blob, so nothing is lost but the column, which prose links never carried. No :LINE:COL:HASH form (YAGNI; the 10-char anchor cap would eat it anyway).
  2. Hashlet min 2, step 1, bit-prefix compare: 6 bits a char, k chars = the sha1's top 6k bits (BigInt shift), so odd lengths mean something. Extend ONLY on collision in the path's own history or to obtain a non-digit. Both hashletBits(h) -> { bits, val } and mintHashlet(sha, others) live in index/perma.js, ONE file owning both directions (LITE-026:102:xo stands).
  3. "First" = EARLIEST in the path's history order, then the working blob (LITE-025:22:zc stands): a younger blob sharing the prefix was minted a longer hashlet of its own.
  4. The mint order of LITE-027 STAYS: line numbers no longer shift when a target's own refs are rewritten, but its blob id does, so a carrier still needs its target final.
  5. NO dual reader. After the flip splitRef reads segment 1 as digits only; an old :1Jz:mJpI splits as no anchor at all (segment 1 is not all-digit) and lands on the file. The converter is the migration; committed history keeps dead old links, accepted.
  6. The converter tells OLD from NEW by segment 1: a non-digit ron64 offset is old; an ALL-DIGIT old offset (:5:mJpI, offset < 10) is indistinguishable from a new-form line and is reported, never guessed. gritzko 2026-08-16: the conversion is offset -> decimal line against the CURRENT file bytes plus hashlet TRIM to 2 chars (3+ only to get a non-digit) — no re-mint, no uniqueness check, no db read: no file here has a history long enough to need it, and the corpus was minted a day ago.
  7. Grammar in the SAME move (DOG-043) — without it a 2-char hashlet is not an F token and the door never sees it; the temporary min-4 compat was weighed and dropped, it forfeits half the point.

TODOs

Blockers and bummers

Outcome

LANDED IN THE WORKTREES, no VC op run: bee in ~/src/bee3 (15 files changed, index/reperma.js + test/reperma/run.sh new), the grammar in ~/src/dog-BEE019 (tok/LINK.rl, six regenerated *.rl.c, test/TOK01.c). ctest -j16 in ~/src/quickjab/build-bee3: *149/149*, up from 145/145 on the base (the new JSRCreperma plus four JABC legs the test/ symlink revived).

Suggested commit (bee3): BEE-019: permalinks name a line and a hashlet