resolve: every path resolves through the kernel (leg 7f, part 3b, step 1)

Merged
BO
1mo ago
+389-936

Part 3b, step 1 of leg 7f in docs/design/resolution-binding-model-plan.md: no resolution path falls back to TypeScript any more. Step 2 deletes the spine code that is now unreachable.

What changed

  • Full index, no pool. The main-thread kernel opens when the first batch needs it. A kernel that cannot open, or a native failure mid-run, is an error.
  • Full index, pool. The first fan-out waits for the workers to boot, where it used to run TypeScript batches meanwhile. Every later batch fans out whatever its size. The post-prerequisite snapshot refresh now runs in the fan-out step. A pool failure (boot, fan-out, recycle, refresh) continues on a main-thread kernel. A pool without a snapshot copy is not created, and workers refuse to start without one.
  • Sync, resolveReferences, both deferred passes resolve kernel-only.
  • Removed: CODEGRAPH_KERNEL_RESOLVE=0, CODEGRAPH_RESOLVE_SHADOW=1, passthrough handling, and the adaptive mid-loop pool engage. That engage measured only passthrough settle time, which has been zero since #190.
  • Fix: right after an index, node:sqlite has no -shm mapped, so the kernel's readonly_shm=1 open failed at its first query ("unable to open database file"). The TypeScript list paths had hidden this. The resolver now runs one node:sqlite read before opening a kernel on the live db.

Verification

  • tsc --noEmit clean; full suite 317 files / 5,233 tests pass, golden dumps included.
  • Dump gate against the previous build (9cc255a7), default and with the pool forced on (CODEGRAPH_PARALLEL_RESOLVE_MIN=0): all 28 corpora identical in both modes (56/56). init wall-clock unchanged within noise.
  • Incremental sync gate (index 40 commits back, then sync): identical on ktor, celery, Ocelot. sync-resolve went 2,231 → 1,995 ms on ktor.

Ledger §5.91.