LITE-007 DONT: quickjab log — commit/file logs off the LITE-006 index

Now
DONT
Sev
MED
Ask
gritzko
Rep
///lite
On1
LITE-006

Ruling (gritzko 2026-08-13): the way to test LITE-006 is a log verb in be's output format. quickjab log = log of commits; quickjab log <hex> = log of that commit's ancestors; quickjab log <path> = log of the file's revisions (the commits that amended the file). log uses the index LAZILY — it brings it up to date itself, no explicit index call. Verification = play in real repos under $HOME/src, small to large, compare against git log, fix bugs until the story matches (or the deviation is a genuine model difference).

Input

Context

LITE-006 landed the six-record wh128 lane in .git/be/ plus the lazy mark contract; a file's log is one path_hl prefix scan (REV-CMMT rows), a commit log is a CPAR walk. be/views/log/ is the format precedent (read-only mirror): hashlet8 date message (Author) per row.

Goals

quickjab log / log <hex> / log <path> in a git repo print the be-log-format story that git log / git log <hex> / git log -- <path> tell.

Constraints

WIP

Design decisions

TODOs

The play loop

11 repos, 36 to 81726 commits: strictmark 36, replicated.wiki 72, c-rdx 118, jab 119, ast-rev-ctrl 130, librdx 597, practice 908, dogs 1468, gitoxide 15841, openldap 25310, git 81726. Plus linux 1463798 (see Blockers). Compared per repo: the bare log, log <hex> from the mid-history commit, a 10-char hexlet against the full sha, the first 50 rows' sha/subject/author against git log --format='%h%s (%an)', and the 4 hottest paths against git log -- <path>.

TWO BUGS FIXED BY THE LOOP:

  1. File-log ORDER ignored the per-path ancestry (date-only sort) — now a reverse Kahn over the REV-PARS edges. gitoxide Cargo.toml went from a scrambled 616-row log to exact, dogs beagle/BE.cli.c likewise.
  2. ron60 covers years 2000..2099 only, so openldap's 1998 commits made ron.of THROW and killed the whole log. An out-of-epoch date now renders as ron.date(0n) — the ? column be log already shows for a commit with no usable stamp.

Genuine model differences (NOT bugs)

  1. DELETIONS ARE NOT REVISIONS. A rev is derived from a pruning walk of the commit's OWN tree, so a path absent from that tree yields no rev and the deleting commit is not in its log. 16 of the 174 path deviations. Fixing it needs a both-sides tree diff, which is a different walk than the one LITE-006 rules.
  2. A MERGE EQUAL TO A PARENT IS NOT A REVISION. LITE-006 rules "a new rev of P iff P's blob differs from P's blob in EVERY parent", so a merge that took one side verbatim is no revision of it. git log --simplify-merges still lists such merges. 158 of the 174 — the bulk, and heavily merge-shaped histories show it most (openldap libraries/liblmdb/mdb.c: 147).
  3. SAME-SECOND TIE ORDER is ours (deterministic: highest hashlet first), not git's (a heap artifact). 44 of 81726 rows in the git repo, 0 elsewhere.
  4. git log's DEFAULT order is not --date-order: its plain queue has no topological guarantee and drifts on clock-skewed history (practice line 266, gitoxide line 2692). We always keep the guarantee, so we match --date-order, never the skewed default.
  5. NO RENAME FOLLOWING. log <path> is that path, as git log -- <path> is; neither follows a rename without --follow.
  6. HEAD ONLY. A commit reachable only from another branch has no CPAR rows; rather than answer with a silently-truncated log, log <hex> refuses it in plain words.
  7. Pre-2000 commits show the ? date column (see the ron60 note above) — be log's own behaviour.

Blockers and bummers

Practice on linux (1463798 commits) — the repo that motivated the ruling

Field report under the OLD capped binary: it ran long, printed the newest ~262k commits (the tail landing mid-2020) and then the partial-log notice — exactly WALK_CAP truncation, and it could never do better because a capped run writes no mark and restarts from the tip.

Under the reworked binary, from a rm -rf-ed .git/be, three runs (two real SIGKILLs at 600 s each, then one left running):

528511 commits 1268841 revs 5556200 rows 546980 commits 1308492 revs 5732800 rows 578892 commits 1372265 revs 6018800 rows

That is the proof: 578892 is *more than twice the old 262144 ceiling*, and it was reached by accumulation across interrupted runs rather than by any single pass. The run-size progression 43.5 -> 78.1 -> 91 MB and a census that only ever moves upward say no run redid another's work. Run 3 was stopped at 10h52m / 3.0 GB RSS / 110 MB rather than left to grow — the convergence question was already answered by the census series, and RSS was still climbing (see Blockers). Linux's .git/be was then removed, which costs nothing: it is derived, and by this very ruling a future run would resume from whatever it found. /home/gritzko/src/linux remains listed in $HOME/.config/be/tracks from those runs.

What linux also shows is the COST, not a correctness limit: at ~2.5 GB RSS and hours of wall clock, a full 1.46M-commit index is a long job, and each resume pays the growing full-lane scan up front (see Blockers). The mechanism converges; the constant is large.

Practice on git.git (81726 commits), after the cap removal

Fresh index (rm -rf .git/be first), all timings on the shipped binary:

Outcome

Landed in ///lite (worktree work/LITE-006), zero quickjab edits.

Tests: PASS [lite/index] 89 checks, PASS [lite/pager] 76 checks.

Suggested commit message: LITE-007: quickjab log off the .git/be index