Ruling (gritzko 2026-08-13): a user names a file as a PARTIAL path (abc/TCP.c), and the index must turn that into the full repo-relative path it stands for. The LITE-006 lane is hash-only and hands back no text, so the index cannot answer alone: it narrows, a real tree object answers. A new record keyed by the filename hash carries the ancestor segment hashes, which prune a descent of the commit's tree down to (almost always) one line; the tree entries carry the real names, so the recovered path is TEXT, and path_hl falls out of hashing it. Resolution is always RELATIVE TO A COMMIT, most often HEAD.
lite log <path> / lite diff <path> take a path today only because the caller spells it in full: INDEXES.mkd states the gap outright — "NO name or suffix lookup: dog/git/ZINF.h, git/ZINF.h and ZINF.h hash to three unrelated keys". path_hl is a one-way 40-bit hash of the WHOLE path, so a partial spelling hashes to nothing the lane holds.
6 is free: LITE-006 spends 1..5 and F (index/index.js:60).path_hl is USELESS (it hashes the whole path); the record's job is to prune a tree descent, not to name a key.resolve(commit, "abc/TCP.c") returns the full repo-relative path(s) that partial names in that commit, or none, in plain words.
FSEG (kind 6), one row per distinct path ever seen:
fn_hl:40 | prnt_hl:20 | 6 — fn_hl = the top 40 bits of the LAST segment's hashlet, prnt_hl = the top 20 of the immediate parent DIR SEGMENT's hashlet (not of the parent path), 0 = no parent (a repo-root file), a genuine 0 hash bumps to 1.seg0:10 | seg1:10 | seg2:10 | seg3:10 | seg4:10 | seg5:10 | vnib:4 — the ancestor dir segments ROOT-FIRST (seg0 = the topmost dir under the repo root), each the top 10 bits of that segment's hashlet, 0 = no such level, a genuine 0 bumps to 1.vnib = the TRUE depth (count of dir segments, 0..15), so a path deeper than 6 is self-declaring instead of looking 6-deep; the chain then holds the TOP 6 and the near tail is missing.top guard, no watermark and no invalidation. Deletions and rebases never touch it: the row describes a NAME, not a content state.index.js emits one FSEG row per path it first sees during its existing tree descent; a rerun over an indexed repo puts nothing new.index/resolve.js) exported for log/diff/any future verb, plus the wiring so a partial path arg is accepted where a full one is today.Work in lite/ only; be/ and jab/ are READ-ONLY precedent, never imported; never read beagle/. Zero quickjab edits are the expectation (LITE-006 managed it) — a missing binding is a REPORT, not an improvisation.
<gitdir>/be/*.lite.idx family, so rm -rf .git/be still rebuilds everything.~/tmp; no VC ops (put + report only).test/index/ checks must stay green; the row count in their assertions will move — adjust the counts, not the semantics.Ruled in chat 2026-08-13, before any code:
resolve(commit, partial) -> 0..n paths, the commit defaulting to the HEAD tip; each verb already has one (diff <hex> that commit, log/diff <path> the tip). A row that does not descend in THAT commit is simply not a hit — "no such path at <sha8>" is the answer, never a widening to other commits.fn_hl|prnt_hl (60 bits) when the partial has a parent, fn_hl alone (40 bits) for a bare filename;i keep only the entries whose name's top-10 hashlet equals seg_i, recursing into those trees, accumulating the real segment names;vnib) the walk goes wide for those levels;prnt_hl and the entry name at 40 against fn_hl;path_hl = hlOfText(path) >> 20 re-enters the LITE-006 scans unchanged.depth tree reads, no blob is ever opened, so resolution results need no cache and no record of their own.TCP.c) descend in ONE pass — union their seg0 at the root, seg1 at the next level, carrying the still-live row set down each branch — so a bare filename costs about what a qualified one does.TCP.c under different dirs come back as two paths and get printed as two paths. A hash collision costs one wasted tree read and never a wrong answer, because the bottom verifies against real names.FSEG kind + pack/unpack in index/index.js (mirror the existing key/val helpers)index/resolve.js — prefix scan, batched iterative descent, bottom verifylog and diff path args; ambiguous = list the pathstest/index/ — fixture repo cases: qualified, bare filename, ambiguous, root-level file, depth > 6, absent-in-this-commit, deleted-before-HEAD-but-present-in-<hex>