You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Layering: hybrid. A new orchestration layer on top owns the agent; ir grows a tight set of retrieval-adjacent seams that each independently improve ir's own non-agentic search. ir stays the retrieval substrate ('retrieval-first, extensible into RAG without being one by default'); the new layer depends ON ir and ir never imports it.
The decision rule for every seam: does this make ir's single-shot, agent-free search measurably better? Yes -> it lands in ir. If it is the back-edge / cross-corpus reasoning that makes a system an agent rather than a DAG -> it lives in the new layer.
Role map (ir_09 §3) vs ir 0.1.11 (verified this session)
ir at leaf; cross-source rerank at fan-in -> new layer
Evaluator/Critic
relevant + sufficient + refinement
partial — Selection has relevant/abstain + signals
ir owns verdict SHAPE (+ derived sufficient); the loop/refinement -> new layer
Formulator
rewrite/decompose/HyDE/filter-synth
absent — query embedded as-is
ir (identity-default seam; improves ir's own recall)
Planner/Orchestrator
decompose + source-select + budget + terminate
absent
new layer
Citer/Verifier
confirm pointer supports claim
absent (needs generation ir omits)
new layer (srag)
Value types: Result already = SearchHit+Disclosure (pointer-passing, §5, implemented in ir). Query/SubTask/LowLevelQuery/Judgement are agent-layer types (ir keeps a plain str query + a derived sufficient signal).
Each is strictly additive, keyword-only, defaults to today's behavior, verified against the existing eval harness. None breaks backcompat.
What the new layer owns (stub issue)
Planner/Orchestrator, the control loop with the back-edge (evaluator->reformulate), the budget governor, the live Mapping[name, Retriever] source registry across heterogeneous backends, Citer/Verifier, and the SingleContext-vs-MultiAgent orchestrator split. New-layer stub: #37.
Two load-bearing boundaries (guard in every review)
Formulate returns QUERIES, never SubTasks. Decomposition into goal+sources is the Planner -> agent layer.
ir gains a sufficient SIGNAL, never a refinement directive or a loop. The back-edge (ir_09 §4) is what makes it an agent; it must not live in ir.
Build order
Matches ir_09 §8: (1) Retriever adapter + registry view [#2, #3]; (2) new-layer single-context orchestrator with trivial planner + pass-through evaluator wrapping today's search/select/disclose [stub]; (3) Formulator + an LLM Evaluator returning sufficient/refinement, turn on the back-edge [#1 in ir; loop in new layer]; (4) move rerank to fan-in + Citer in srag [new layer]; (5) budget governor + run-log [new layer]; (6) multi-agent orchestrator if breadth justifies [new layer].
Links
ir_09 design doc: misc/docs/ir_09 -- A Composable Search Agent ...md
Decision
Layering: hybrid. A new orchestration layer on top owns the agent; ir grows a tight set of retrieval-adjacent seams that each independently improve ir's own non-agentic search. ir stays the retrieval substrate ('retrieval-first, extensible into RAG without being one by default'); the new layer depends ON ir and ir never imports it.
The decision rule for every seam: does this make ir's single-shot, agent-free search measurably better? Yes -> it lands in ir. If it is the back-edge / cross-corpus reasoning that makes a system an agent rather than a DAG -> it lives in the new layer.
Role map (ir_09 §3) vs ir 0.1.11 (verified this session)
ir.retrieve.search(dense/lexical/hybrid)search(rerank=ef.Reranker), per-corpusSelectionhasrelevant/abstain + signalssufficient); the loop/refinement-> new layerValue types:
Resultalready =SearchHit+Disclosure(pointer-passing, §5, implemented in ir).Query/SubTask/LowLevelQuery/Judgementare agent-layer types (ir keeps a plainstrquery + a derivedsufficientsignal).What ir owns (this epic's ir-side issues)
formulate=, identity default;make_llm_formulatormirroringmake_llm_selector. Add an injectable Formulator seam to ir.search / ir.discover (identity default; opt-in rewrite/expand/HyDE) #32ir.as_retriever(corpus)— the corpus->Retriever adapter matching ir_09's leaf contract. Publish a stable Retriever adapter — ir.as_retriever(corpus) -> Callable matching ir_09's leaf contract #33registry.retrievers()view + multi-corpusdiscover— a read-projectionMapping[name, Retriever]+ federated single-shot search. Project the corpus registry into a Mapping[name, Retriever] view + multi-corpus discover (single-shot, no loop) #34sufficientsignal onSelection— derived, model-free;refinementstays OUT. Extend Selection toward a Judgement-shaped result — add a derivedsufficientsignal (keeprefinementOUT) #35disclose+SearchHit.to_dict()— formalize §5 pointer-passing over dol/URLs; serialization-clean leaf. Make disclosure's resource-store contract explicit and injectable (BodyLoader -> Mapping resource store) + SearchHit.to_dict() #36Each is strictly additive, keyword-only, defaults to today's behavior, verified against the existing eval harness. None breaks backcompat.
What the new layer owns (stub issue)
Planner/Orchestrator, the control loop with the back-edge (evaluator->reformulate), the budget governor, the live
Mapping[name, Retriever]source registry across heterogeneous backends, Citer/Verifier, and the SingleContext-vs-MultiAgent orchestrator split. New-layer stub: #37.Two load-bearing boundaries (guard in every review)
sufficientSIGNAL, never arefinementdirective or a loop. The back-edge (ir_09 §4) is what makes it an agent; it must not live in ir.Build order
Matches ir_09 §8: (1) Retriever adapter + registry view [#2, #3]; (2) new-layer single-context orchestrator with trivial planner + pass-through evaluator wrapping today's search/select/disclose [stub]; (3) Formulator + an LLM Evaluator returning sufficient/refinement, turn on the back-edge [#1 in ir; loop in new layer]; (4) move rerank to fan-in + Citer in srag [new layer]; (5) budget governor + run-log [new layer]; (6) multi-agent orchestrator if breadth justifies [new layer].
Links
misc/docs/ir_09 -- A Composable Search Agent ...mdsufficientsignal (keeprefinementOUT) #35, Make disclosure's resource-store contract explicit and injectable (BodyLoader -> Mapping resource store) + SearchHit.to_dict() #36