assemble_bundle is a single-pass pipeline: one query in, one fused, reranked, cited section set out. The managed platforms now demo agentic retrieval: decompose a complex question into sub-queries, retrieve per sub-query (possibly across sources), iterate, and evaluate sufficiency before returning. Wikantik's philosophical answer — "the agent drives the loop through MCP tools, informed by the coverage signal" — is real, but the project's own behavioral looping evaluation came back flat: client agents did not actually loop better given the signal. That makes server-side decomposition worth a measured attempt.
); AWS prices the agentic retriever per-query.
).
; LightOn, retrieval in the age of agents
). Wikantik holds the strong position on that side already — this brief is about also matching the managed-loop behavior where it demonstrably helps.com.wikantik.knowledge.bundle.DefaultBundleAssemblyService (package inside wikantik-main — see the naming trap in RoadmapTargetArchitecture); surfaces GET /api/bundle + assemble_bundle MCP. ADR-0001: never answer synthesis — any agentic loop must return evidence, not answers.[OWNER] sign-off at design-doc review.eval/bundle-corpus/ harness to measure any variant; multi-question eval sets can be added.coverage=weak|partial, decompose the query into 2–4 sub-queries via the local LLM, run per-sub-query retrieval in parallel, fuse and dedupe into one bundle. Single-pass behavior preserved when coverage is strong — bounds latency and cost to the queries that need it. (Superseded by the Phase 1 measurement — see below: coverage does NOT discriminate the addressable class, so the built prototype triggers on query STRUCTURE, not coverage.)First session scope: the multi-hop eval set ONLY — 15–25 multi-part/comparative questions with agreed gold sections, added to eval/bundle-corpus. No pipeline code. (The KG-rerank lesson: measure the ceiling before building. If single-pass retrieval already scores well on the multi-hop set, this brief may be closable without code.)
The decomposition feature is accepted only when all four hold:
[OWNER] — a product parameter; propose ≤ 2 s against the 1.25 s single-pass baseline), with strong-coverage queries unchanged.The measure-first step ran without building pipeline code (the LLM-on-query-path decision stays [OWNER]-gated). The [MEASURE] gate — run the full RELATIONAL set through the dense-chunk bundle — is now complete (a working local qwen3-embedding:0.6b embedder was stood up to unblock the dense path; see eval/bundle-corpus/baseline-notes.md).
The multi-hop eval set already exists. eval/bundle-corpus/queries.csv has a RELATIONAL category = 9 multi-part/comparative questions (r01–r10), most with 2 gold sections (two "hops") — the "author a multi-hop eval set" first-session scope is largely already met; extend rather than author from scratch.
Rigorous single-pass result (n=9, dense-chunk path, per-hop). Each RELATIONAL question ran through the dense-chunk bundle (real cosines), scoring each of its 2 gold sections in top-12:
boost=0.0 default on a different page). A single dense query embedding sits closer to one page's vocabulary. This is what sub-query decomposition targets.Trigger insight (invalidates coverage-conditional). All nine RELATIONAL queries return strong coverage (topSim 0.65–0.86) — including every cross-page miss, because one side matches strongly and pins topSimilarity high while the other hop is crowded out. So the roadmap's coverage-conditional trigger would never fire for the addressable class. The built prototype therefore triggers on query structure (a lexical comparative/conjunctive heuristic gating the LLM planner), not coverage.
Projected ceiling (pre-build). If decomposition recovered all four cross-page comparative questions, full multi-hop success rises 3/9 → 7/9 (78%) — the addressable ceiling. The two intra-page misses are out of scope for decomposition.
The scoped prototype was built and measured (structure-conditional; lexical heuristic → fail-closed LlmQueryPlanner gemma4-assist:latest think:false → per-sub-query retrieval → fusion → existing rerank/cut; default-off, byte-identical off, fail-closed; 6 SDD tasks + final-review fix, all reviewed clean, on main). Two fusion strategies were built and A/B'd over the 9 RELATIONAL questions (local qwen3-embedding dense + remote gemma4-assist planner, warm):
| Arm | hop-recall@12 | full multi-hop (both hops) |
|---|---|---|
| Control (decomposition off) | 0.611 | 3/9 |
| Treatment — N-ary RRF fusion | 0.500 | 2/9 |
| Treatment — round-robin fusion | 0.556 | 2/9 |
Verdict: REJECTED — decomposition ships behind a flag, default OFF. Neither fusion clears the gate; both are net-negative vs single-pass. RRF is worse because it score-sums 1/(k+rank) across sub-queries, so a topic co-mentioned by several sub-queries outranks a gold section present in only one list — amplifying the majority side. Round-robin interleave (reserves per-sub-query position) fixes that amplification and recovers r07, but is still below control.
The cost is structural, not a fusion-tuning problem (this is the load-bearing finding):
Both fusion modes ship behind the default-off flag (wikantik.bundle.decomposition.fusion = rrf | roundrobin) as measured, documented dead-ends. Full write-up: eval/bundle-corpus/baseline-notes.md.
Honest prerequisite before more tuning: the remaining levers (a planner prompt that forces one sub-query per named comparison entity; a trigger that skips single-page conjunctive questions) are ≥2 coupled knobs — tuning them against n=9 risks overfitting. Do the [AGENT] corpus-expansion step (15–25 multi-hop questions) FIRST, then tune against a set large enough to trust.
[AGENT] ← the live next step. Extend the multi-hop eval set to 15–25 questions (the RELATIONAL category seeds 9) — taxonomy: comparative ("X vs Y"), conjunctive ("A and its effect on B"), bridging (answer requires an intermediate fact). This is now the prerequisite to any further decomposition tuning (n=9 is too small to tune the planner-prompt / trigger-selectivity knobs without overfitting).[MEASURE] ✅ Done (2026-07-11): single-pass RELATIONAL through dense-chunk = 0.61 / 3-9; decomposition A/B = RRF 0.50 / 2-9, round-robin 0.56 / 2-9 — both REJECTED (see Phase 2). The SubQueryFusion RRF + round-robin modes are built (default off); the cost is structural (full-bundle displacement + planner per-side coverage gap), not a fusion-tuning gap.[MEASURE] Planner prompt: force one sub-query per named comparison entity (r08's blue-green side was never retrieved). Measure only after the corpus is expanded.[MEASURE] Trigger selectivity: skip single-page conjunctive questions (r05 is purely harmed by firing). Needs a signal for "is this one page or two" that the heuristic lacks today.[OWNER] The latency envelope (gate 4) + a faster planner model (gemma4-assist is 35–49 s cold, ~1 s warm); LLM-on-query-path sign-off remains gated on a variant that actually clears gate 1.[OWNER] Whether to also expose decomposition as a client-visible MCP tool (decompose_query) — a public API-surface addition.