Status (2026-10-13): Phase 1 is built behind flags (v2.3.6, July 2026) and nothing is on by default.
SectionRerankerandSectionRerankChainlive incom.wikantik.knowledge.bundleinsidewikantik-main(not as aRerankStagecontract inwikantik-api, as sketched below).wikantik.bundle.rerank.chaintakes an ordered list of stage names (mmr,metadata-boost,llm); it is blank by default, which is the identity chain and leaves bundle output unchanged. The built stages differ from the sketch below:mmris a lexical MMR (MmrSectionReranker;wikantik.bundle.rerank.mmr.lambda, default 0.7), andmetadata-boostis a bounded rank tie-breaker on page confidence, authoritative up and stale down (wikantik.bundle.rerank.metadata_boost.positions1.5,.window24), not a multiplicative score boost. The knee cutoff is a separate flag rather than a chain stage (wikantik.bundle.knee.enabled, default false;retain_ratio0.5). The knee was measured and rejected on 2026-07-11: live recall@12 fell from 0.704 to 0.426 atretain_ratio=0.90, because contextual embeddings pack the section cosines into a band with no usable elbow. The measurement tables formmrandmetadata-boostineval/bundle-corpus/baseline-notes.mdare still blank, so neither has been accepted for default use. The scheduled evaluation that would gate them exists (see RoadmapRetrievalEvaluationObservability).
Wikantik's bundle assembly fuses BM25 and dense candidates with Reciprocal Rank Fusion and stops. There is no diversity stage, no metadata/business-rule boosting, and no principled result cutoff. The project has correctly measured and rejected LLM-based reranking — this brief is explicitly about deterministic stages, which are cheap, debuggable, and absent.
). Positioned for exactly the cases Wikantik hits: crowded topic clusters where near-duplicate sections crowd out coverage, and ranking that should weigh metadata (freshness, verification) alongside relevance.
) — consistent with Wikantik's own shuffled-input recall-collapse finding. Deterministic stages sidestep that judge problem entirely.com.wikantik.knowledge.bundle (inside the wikantik-main module — see the naming trap in RoadmapTargetArchitecture) — DefaultBundleAssemblyService, DenseChunkSectionSource (global top-K dense chunks, wikantik.bundle.dense.top_k=300), BM25 chunk hybrid via LuceneBm25ChunkIndex with its own RRF fusion config (wikantik.bundle.bm25.*), sections_per_page=20, top-12 output.wikantik.bundle.reranker.enabled, default off — shuffled-input recall collapses), HyDE, doc2query, page-level KG rerank (zero lift even with a Claude-quality KG; the code was deleted in 2026-07).verified_at, confidence (authoritative/provisional/stale), type, cluster, date, citation staleness — only confidence is consumed by ranking, and only by the optional metadata-boost tie-breaker.eval/bundle-corpus/ with baseline notes; section recall@12 currently ~0.74.RerankStage implementations, config-driven (wikantik.bundle.rerank.chain=mmr,metadata-boost,knee), each with per-stage cutoff/limit semantics.First session scope: the RerankStage SPI (contract in wikantik-api, wiring at the BundleServiceWiring seam) + the MMR stage behind its flag + one harness run. Metadata-boost and knee stages are separate sessions, each gated the same way.
A stage is accepted only when all four hold:
eval/bundle-corpus with the stage on.A stage that fails gate 2 or 3 is rejected and recorded in the dead-levers list — the 0.74→0.68 enrichment regression is the standing proof that plausible changes hurt.
[MEASURE] MMR lambda sweep; and check whether sections_per_page de-dup in the assembler already provides implicit partial MMR — measure the marginal effect, not the textbook effect.[MEASURE] Metadata boosts at fusion (adjusting RRF inputs) vs post-fusion (adjusting fused scores) — post-fusion is more debuggable; let the harness arbitrate if both are plausible.[AGENT] Knee detection input: RRF scores are rank-derived and quantized — likely need the true dense cosines the section candidates already carry (coverage-signal work); design the stage interface so stages can request raw scores.[MEASURE] Latency at k=300 against the 480 RPS envelope (the O(k²) worst case is the thing to bound).