(sha→offset) into a provided buffer
The pack-log does NOT maintain an index. Its feed and a scan EMIT (sha→offset) entries into a caller-provided buffer (if given); sort / merge / persist / query is entirely the caller's. Native core in dog/git (shared by keeper + the git.pack JABC binding). Method: Issues.
PACKu8sFeedObj / PACKResolveOfs / PACKRecordEnd,GIT-007) is the shared format floor — no pack-log logic in consumers.
git.pack (the JABC binding, JS-024) wraps that core but emits NO
sha→offset today (per js/INDEX.md the index "stays in the caller").
caller buffer, not an index owner — exactly the tok.parse(…, out?) / delt.apply(…, out) shape. The caller pipes entries into a JS-022 abc.index (wh128); the rest is up to the caller.
dog/git scan/index-emit: walk a pack, resolve each object, git-sha it,
emit (sha-hashlet60|type, offset) into a provided buffer (Bwh128).
feed optionally emits the just-fed object's entry intothe same buffer — cheap (hash the content you already hold; no resolve).
git.pack exposes both with an optional out buffer; a JS test pipes the
entries into an abc.index and looks up sha → offset.
dog/git (shared, per the topic architecture) — reuse
PACKResolveOfs (resolve) + dog/git sha1 + GITTypeName (the <type> <len>\0 git object framing). SINGLE-pack, NO keeper coupling, NO fork parallelism (the heavy multi-pack/ingest path stays in keeper/UNPK).
tok.parse/delt.apply: emit into the caller'sregion, hold nothing (JABC rule #4). Don't change the pack format.
wh128 (key=hashlet60|type, val=offset) to match the keeper puppy
registry + the abc.index wh128 lane, so the caller can merge directly.
bases O(objects×depth) (the index design pass), so the SCAN is NATIVE (one pass, shared apply state) — keeper/UNPK.c::UNPKIndex is the algorithm REFERENCE (model the single-pack core on it, minus parallelism + keeper).
dog/git test + a git.pack JS test — build a pack with
raw + OFS_DELTA objects, scan → entries, assert each (sha, offset) resolves byte-correct; pipe into an abc.index and assert sha→offset lookups; assert index-on-append == a full reindex.
dog/git scan-emit (+ feed-emit); bind via git.pack;
update dog/INDEX.md + js/INDEX.md / js/API.md.
single-pack emitter, STOP and report — keep it a small dog/git core.
090658bb (2026-06-21): dog/git/PIDX.{h,c} — `PIDXScan(pack, out,
…) walks one OFS-only pack, resolves via PACKResolveOfs, git-shas, emits wh128 (hashlet60|type → offset) per object into the caller's Bwh128; PIDXFeedEmit = cheap index-on-append. Modeled on UNPKIndex, stripped of keeper/parallel/REF/ingest (a stray REF → PACKREF). Hoisted the key packing into shared dog/WHIFF.h::WHIFFKeyPack (keepKeyPack now an alias). git.pack: pack.scan(out) + pack.feed(…, out?). C PIDXtest + JS JABCpackidx (entries → abc.index → sha→offset`; append == reindex) red→green; full ctest 345/345, ASAN/LSan clean. Caller pipes into JS-022.
UNPKIndex onto PIDXScan (its parallel / REF /ingest paths exceed this single-pack core) — a follow-up ticket.