v0.10.9
Highlights
Chat-aware retrieval ranking actually ships, plus a substantial cut to embedding-phase wall time and a sweep of internal module splits to lower per-file surface area.
Added
- Chat-aware Personalized PageRank re-ranking on
sdl.symbol.searchandsdl.context. PasschatMentions: string[](plus optionalchatMentionWeights,pprDirection,pprWeight) to bias ranking toward symbols structurally close to what the user just talked about. Andersen-Chung-Lang forward-push PPR overDEPENDS_ON, multiplicative boost on the fused RRF list, native Rust impl viacompute_personalized_pageranknapi export with a JS push fallback (parity within 1e-3). Per-call cap 2× score, stack cap 4× over the original RRF score when composed with feedback boost.- Default
pprWeight = 2.0tuned via 20-query sweep — 85% NDCG@10 lift over RRF baseline on near-target mentions, zero effect on irrelevant or empty mention sets, no recall regression, ~5ms PPR overhead. See devdocs/ppr-weight-tune-results.md. - Auto-extract
chatMentions: when the caller omits the field, the server pulls identifier-like tokens fromquery/taskTextand uses those as PPR seeds. PasschatMentions: []to opt out entirely. pprBoostsevidence surface:SymbolSearchResponse.pprBoostsexposes{ resolvedSeeds, unresolvedMentions, ambiguousMentions, symbolsBoosted, latencyMs, backend }whenincludeRetrievalEvidence: trueand PPR ran.- Bench harness:
npm run bench:ppr(scripts/bench-ppr-weight.ts) with--baseline(fail on >2% NDCG regression) and--holdout N(cross-validation drift) flags. - Deep dive: docs/feature-deep-dives/semantic-engine.md → Chat-Aware PageRank Boost.
- New code: src/retrieval/ppr.ts, src/retrieval/seed-resolver.ts, native/src/pagerank/.
- Default
Changed
sdl.symbol.searchdefaults to hybrid retrieval (FTS + vector + RRF) unless the caller explicitly passessemantic: false. Previouslysemantic: undefinedskipped the hybrid path; now only an explicit opt-out bypasses it, matchingsdl.context's default-on behavior since v0.10.7.- Internal module splits to reduce per-file surface area (no behavior change):
src/graph/slice.ts(~700 LoC) split intoslice/{beam-search-engine,card-hydrator,detail-level,edge-projector,types}.ts.src/agent/executor.tsidentifier-extraction helpers extracted tosrc/agent/identifier-extraction.ts.src/retrieval/orchestrator.tsfusion math extracted tosrc/retrieval/fusion.ts.- Refactor scripts under
scripts/refactor-extract-*.mjsare reproducible.
Performance
- Embedding refresh: batched DB writes per model batch. Previously each symbol got its own
withWriteConn → setSymbolEmbeddingOnNodecall (~8K lock acquisitions per model on a full index). NewsetSymbolEmbeddingBatchOnNodeprocesses the whole batch inside one write connection. Cuts write-lock acquisitions ~97% (N → N/32 at batch size 32); expected ~60–70% reduction in embedding-phase wall time.
Notes
- The chat-aware PPR feature was documented under v0.10.8 in earlier
CHANGELOG.mdrevisions; the code actually shipped in this release.
Full Changelog: v0.10.8...v0.10.9