# juliangeymonat-jpg/mothrag architecture

> Architecture diagram of the GitHub repository juliangeymonat-jpg/mothrag, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-20). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/juliangeymonat-jpg/mothrag
- Repository: https://github.com/juliangeymonat-jpg/mothrag

## Overview

1. **Overall shape**
   - MOTHRAG is a Python package for multi-hop question answering.
   - The architecture is centered on a deterministic orchestration layer that coordinates retrieval, multiple “reasoning arms,” and arbitration to produce a proof-tree-style answer.
   - The top-level user-facing entry point is the package API, with `mothrag/core/mothrag.py` as the main orchestrator and `mothrag/api/simple.py` as the simplified public surface.

2. **Document ingestion boundary**
   - Raw sources enter through the loader layer in `mothrag/loaders/`:
     - text, JSON, HTML, PDF, and URL loaders.
   - Domain-specific preprocessing lives in `mothrag/data/preprocess_wikipedia.py` and the Wikipedia plugin in `mothrag/plugins/wikipedia.py`.
   - This layer normalizes heterogeneous inputs into chunks and structured artifacts used by retrieval and graph-building subsystems.

3. **Indexing and knowledge representations**
   - The repo supports both vector retrieval and graph-style retrieval.
   - `mothrag/graph/` handles graph construction/indexing and OpenIE-related processing.
   - `mothrag/retrieval/openie.py`, `mothrag/retrieval/ner.py`, and `mothrag/core/symbolic_memory.py` provide symbolic/structured representations that feed multi-hop reasoning.
   - `mothrag/core/anchor.py` and `mothrag/core/decompose.py` support anchoring and question decomposition for multi-step retrieval.

4. **Embedding and vector storage layer**
   - Embedding backends are abstracted in `mothrag/embedders/` with implementations for OpenAI, Gemini, Cohere, Vertex, and sentence-transformers.
   - Vector database adapters live in `mothrag/vector_dbs/` and include in-memory, FAISS, Chroma, Pinecone, and Qdrant.
   - This layer is a clear infrastructure boundary: the rest of the system depends on a vector-store interface, not a specific backend.

5. **Primary retrieval substrate**
   - Core retrieval logic is in `mothrag/core/retrieval/` and `mothrag/retrieval/`.
   - The README’s “bridge retrieval substrate” is implemented by the `bridge_haiku` family under `mothrag/retrieval/bridge_haiku/`, which combines ANN retrieval, entity/SVO extraction, fusion, and a judge stage.
   - Additional retrieval modes include dense, hybrid graph, infobox, and multimodal retrieval in `mothrag/core/retrieval/`.
   - `mothrag/retrieval/chain_filter/` adds post-retrieval filtering based on chain density over graph/triple structure.

6. **Reasoning arms**
   - The system does not rely on one monolithic pipeline; it runs multiple arms in parallel and arbitrates among them.
   - Core arms are defined in `mothrag/arms/`:
     - `mothgraph_arm.py`
     - `infobox_arm.py`
     - `legacy.py`
     - `base.py`
   - The README describes a four-arm pool: direct read, decomposition, iterative refinement, and PDD-style duplication of the iterative candidate.
   - `mothrag/core/arms_runner.py` coordinates execution of these arms.

7. **Routing and arm applicability**
   - Query-to-arm selection is handled in `mothrag/routing/`.
   - Important pieces include:
     - `query_type_classifier.py` in `mothrag/core/`
     - `arm_applicability.py`
     - specialist routing for slot-based/adaptive routing
     - duplicate-arm handling and infobox routing
   - This routing boundary is deterministic and feature-driven, not learned online from dataset identity.

8. **Arbitration and abstention**
   - Final answer selection happens in `mothrag/core/arbitrate/`.
   - Arbitration modules combine evidence from grounding, cross-arm agreement, faithfulness, and abstention handling.
   - The system has explicit abstain markers and refusal/abstention logic in `mothrag/core/abstain_markers.py` and arbitration helpers such as `refuse_abstention.py`.
   - The result is not just an answer string; it is a selected arm, confidence signal, and proof-trace-oriented output.

9. **Retry and iterative recovery**
   - Failed or weakly grounded answers can trigger retry strategies in `mothrag/core/retry/strategies/`.
   - Strategies include query reformulation, sub-question rerouting, active gap querying, soft fallback, bottom-up boost, and iterative extension.
   - The `iterative_ragnatela/` package contains the multi-step iterative planner/generator path used for repeated retrieval and convergence control.
   - This is the main “agentic-style” loop, but it is still orchestrated deterministically by fixed strategy logic.

10. **LLM/model service boundaries**
   - The system is built around commodity API calls rather than local model hosting.
   - Readers live in `mothrag/readers/` with adapters for OpenAI, Groq, Anthropic, Gemini, and Cohere.
   - Embedders and some judges also use external services, especially Gemini and Anthropic in the premium/economy configurations.
   - `mothrag/core/_api_adapters.py` and `mothrag/core/api.py` provide the abstraction boundary so the rest of the system can swap providers.

11. **Graph, routing, and specialized subpipelines**
   - `mothrag/routing/specialist_slot_router.py` and `specialist_slot_adapters.py` support specialist subpipelines.
   - `mothrag/core/spectral/` and `mothrag/core/selective_ensemble.py` indicate additional ranking/selection logic used in specialized ensemble or disaggregation flows.
   - These subsystems appear to optimize when to invoke a specialist path versus a generic retrieval path.

12. **Observability, evaluation, and offline research workflow**
   - `mothrag/eval/` contains the benchmarking and metric pipeline: faithfulness, latency, soft EM, normalization, and iterative evaluation.
   - `benchmarks/results/` and `paper/results/` store experiment outputs and published paper artifacts.
   - `scripts/route_prospective.py` is the main reproduction script referenced by the README.
   - `tests/` is extensive and acts as a specification for routing, arbitration, retry, graph retrieval, and provider adapters.

13. **Operational surface**
   - `mothrag/cli/smoke.py` provides a smoke-test CLI path.
   - `examples/` demonstrates both the quickstart API and custom-corpus flows.
   - The repo is documentation-heavy (`docs/` and MkDocs config), which suggests the package is intended to be used as a library with reproducible research workflows rather than a standalone service.

14. **What to draw as the main data flow**
   - A useful architecture diagram would show:
     - documents entering loaders/preprocessing,
     - then embeddings/vector DB and graph/index construction,
     - then query intake into routing/classification,
     - then multiple arms performing retrieval + reasoning,
     - then arbitration and abstention handling,
     - then final answer/proof-tree output.
   - Retry strategies and iterative ragnatela should be drawn as a feedback loop from weak answers back into retrieval/reformulation.

Main entry points: [`mothrag/core/mothrag.py`](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/mothrag.py) (Mothrag Core), [`mothrag/core/arms_runner.py`](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/arms_runner.py) (Arms Runner), [`mothrag/core/arbitrate/arbitrator.py`](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/arbitrate/arbitrator.py) (Arbitration), [`mothrag/routing/__init__.py`](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/routing/__init__.py) (Routing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Ingestion"]
  node_loader["Loaders<br/>document ingestion<br/>[__init__.py]"]
  node_wiki_prep["Wikipedia Prep<br/>domain preprocessing"]
end

subgraph group_repr["Representations"]
  node_vector_dbs[("Vector DBs<br/>vector storage<br/>[base.py]")]
  node_graph_index["Graph Index<br/>[index.py]"]
  node_symbolic_mem["Symbolic Memory<br/>structured memory<br/>[symbolic_memory.py]"]
  node_dense_retrieval["Dense Retrieval<br/>retrieval substrate<br/>[dense.py]"]
  node_hybrid_graph["Hybrid Graph<br/>retrieval substrate<br/>[hybrid_graph.py]"]
  node_bridge_haiku{{"Bridge Haiku<br/>bridge retrieval<br/>[bridge_arm.py]"}}
  node_chain_filter["Chain Filter<br/>post-filter<br/>[chain_filter.py]"]
end

subgraph group_orchestrate["Orchestration"]
  node_api_simple["Simple API<br/>public API<br/>[simple.py]"]
  node_mothrag_core["Mothrag Core<br/>orchestrator<br/>[mothrag.py]"]
  node_arms_runner["Arms Runner<br/>arm coordinator<br/>[arms_runner.py]"]
  node_routing{{"Routing<br/>deterministic router<br/>[__init__.py]"}}
  node_query_type["Query Type<br/>classifier"]
  node_retry["Retry Loop<br/>recovery loop<br/>[orchestrator.py]"]
  node_arbitrate{{"Arbitration<br/>answer selector<br/>[arbitrator.py]"}}
  node_abstain["Abstain Logic<br/>refusal policy<br/>[abstain_markers.py]"]
  node_decompose["Decomposition<br/>question planner<br/>[decompose.py]"]
  node_anchor["Anchoring<br/>evidence linker<br/>[anchor.py]"]
  node_iterative_ragnatela{{"Iterative Ragnatela<br/>iterative planner"}}
end

subgraph group_services["Provider Layer"]
  node_embedders["Embedders<br/>embedding backends<br/>[__init__.py]"]
  node_llm_reads["Model Reads<br/>LLM providers<br/>[__init__.py]"]
end

subgraph group_ops["Research & Ops"]
  node_eval["Evaluation<br/>benchmarking<br/>[pipeline.py]"]
  node_cli_smoke["Smoke CLI<br/>command line<br/>[smoke.py]"]
  node_examples["Examples<br/>usage demos"]
end

node_api_simple -->|"calls"| node_mothrag_core
node_mothrag_core -->|"classifies"| node_query_type
node_mothrag_core -->|"routes"| node_routing
node_routing -->|"dispatches"| node_arms_runner
node_query_type -->|"guides"| node_decompose
node_mothrag_core -->|"plans"| node_decompose
node_mothrag_core -->|"anchors"| node_anchor
node_arms_runner -->|"retrieves"| node_dense_retrieval
node_arms_runner -->|"retrieves"| node_hybrid_graph
node_arms_runner -->|"retrieves"| node_bridge_haiku
node_arms_runner -->|"filters"| node_chain_filter
node_dense_retrieval -->|"uses"| node_vector_dbs
node_bridge_haiku -->|"embeds"| node_embedders
node_loader -->|"feeds"| node_embedders
node_loader -->|"normalizes"| node_graph_index
node_wiki_prep -->|"preprocesses"| node_loader
node_graph_index -->|"stores"| node_symbolic_mem
node_symbolic_mem -->|"serves"| node_hybrid_graph
node_routing -.->|"may reroute"| node_retry
node_retry -->|"extends"| node_iterative_ragnatela
node_iterative_ragnatela -.->|"retries"| node_arms_runner
node_arms_runner -->|"candidates"| node_arbitrate
node_arbitrate -->|"checks"| node_abstain
node_arbitrate -->|"returns"| node_mothrag_core
node_llm_reads -->|"supports"| node_arbitrate
node_llm_reads -->|"supports"| node_bridge_haiku
node_eval -.->|"measures"| node_mothrag_core
node_cli_smoke -->|"invokes"| node_mothrag_core
node_examples -.->|"demonstrates"| node_api_simple

click node_api_simple "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/api/simple.py"
click node_mothrag_core "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/mothrag.py"
click node_arms_runner "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/arms_runner.py"
click node_routing "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/routing/__init__.py"
click node_query_type "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/query_type_classifier.py"
click node_retry "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/retry/orchestrator.py"
click node_arbitrate "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/arbitrate/arbitrator.py"
click node_abstain "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/abstain_markers.py"
click node_decompose "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/decompose.py"
click node_anchor "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/anchor.py"
click node_loader "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/loaders/__init__.py"
click node_wiki_prep "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/data/preprocess_wikipedia.py"
click node_embedders "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/embedders/__init__.py"
click node_vector_dbs "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/vector_dbs/base.py"
click node_graph_index "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/graph/index.py"
click node_symbolic_mem "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/symbolic_memory.py"
click node_dense_retrieval "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/retrieval/dense.py"
click node_hybrid_graph "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/retrieval/hybrid_graph.py"
click node_bridge_haiku "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/retrieval/bridge_haiku/bridge_arm.py"
click node_chain_filter "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/retrieval/chain_filter/chain_filter.py"
click node_llm_reads "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/readers/__init__.py"
click node_iterative_ragnatela "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/iterative_ragnatela/ragnatela_orchestrator.py"
click node_eval "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/eval/pipeline.py"
click node_cli_smoke "https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/cli/smoke.py"
click node_examples "https://github.com/juliangeymonat-jpg/mothrag/blob/main/examples/00_simple_quickstart.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_loader,node_wiki_prep toneBlue
class node_vector_dbs,node_graph_index,node_symbolic_mem,node_dense_retrieval,node_hybrid_graph,node_bridge_haiku,node_chain_filter toneAmber
class node_api_simple,node_mothrag_core,node_arms_runner,node_routing,node_query_type,node_retry,node_arbitrate,node_abstain,node_decompose,node_anchor,node_iterative_ragnatela toneMint
class node_embedders,node_llm_reads toneRose
class node_eval,node_cli_smoke,node_examples toneIndigo
```

## Components

### Ingestion

Source loading and corpus normalization

- [Loaders](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/loaders/__init__.py): document ingestion · Text, JSON, HTML, PDF, and URL inputs · `mothrag/loaders/__init__.py`
- [Wikipedia Prep](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/data/preprocess_wikipedia.py): domain preprocessing · Wikipedia-specific normalization and plugin integration · `mothrag/data/preprocess_wikipedia.py`

### Representations

Vector, graph, and symbolic knowledge layers

- [Vector DBs](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/vector_dbs/base.py): vector storage · Adapters for in-memory, FAISS, Chroma, Pinecone, and Qdrant · `mothrag/vector_dbs/base.py`
- [Graph Index](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/graph/index.py): graph indexing · Graph construction and OpenIE-oriented indexing · `mothrag/graph/index.py`
- [Symbolic Memory](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/symbolic_memory.py): structured memory · Structured evidence store used by multi-hop reasoning · `mothrag/core/symbolic_memory.py`
- [Dense Retrieval](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/retrieval/dense.py): retrieval substrate · Dense and multimodal retrieval primitives · `mothrag/core/retrieval/dense.py`
- [Hybrid Graph](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/retrieval/hybrid_graph.py): retrieval substrate · Graph-aware retrieval over structured evidence · `mothrag/core/retrieval/hybrid_graph.py`
- [Bridge Haiku](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/retrieval/bridge_haiku/bridge_arm.py): bridge retrieval · ANN, entity/SVO extraction, fusion, and judge stage for bridge retrieval · `mothrag/retrieval/bridge_haiku/bridge_arm.py`
- [Chain Filter](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/retrieval/chain_filter/chain_filter.py): post-filter · Filters retrieved chains using graph/triple density · `mothrag/retrieval/chain_filter/chain_filter.py`

### Orchestration

Query routing, multi-arm execution, retries, and arbitration

- [Simple API](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/api/simple.py): public API · Simplified entry point for package users · `mothrag/api/simple.py`
- [Mothrag Core](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/mothrag.py): orchestrator · Main deterministic coordinator for retrieval, reasoning arms, and final answer assembly · `mothrag/core/mothrag.py`
- [Arms Runner](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/arms_runner.py): arm coordinator · Executes multiple reasoning arms and collects candidate answers · `mothrag/core/arms_runner.py`
- [Routing](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/routing/__init__.py): deterministic router · Query-to-arm selection and specialist dispatch logic · `mothrag/routing/__init__.py`
- [Query Type](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/query_type_classifier.py): classifier · Classifies question shape to guide routing and retrieval choices · `mothrag/core/query_type_classifier.py`
- [Retry Loop](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/retry/orchestrator.py): recovery loop · Reformulates or reroutes weak answers back into retrieval · `mothrag/core/retry/orchestrator.py`
- [Arbitration](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/arbitrate/arbitrator.py): answer selector · Selects final answer using grounding, agreement, and abstention signals · `mothrag/core/arbitrate/arbitrator.py`
- [Abstain Logic](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/abstain_markers.py): refusal policy · Explicit abstention markers and refusal handling · `mothrag/core/abstain_markers.py`
- [Decomposition](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/decompose.py): question planner · Breaks complex questions into sub-questions for multi-hop retrieval · `mothrag/core/decompose.py`
- [Anchoring](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/core/anchor.py): evidence linker · Links intermediate evidence and supports anchored retrieval · `mothrag/core/anchor.py`
- [Iterative Ragnatela](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/iterative_ragnatela/ragnatela_orchestrator.py): iterative planner · Multi-step repeated retrieval and convergence control · `mothrag/iterative_ragnatela/ragnatela_orchestrator.py`

### Provider Layer

Embedding and LLM API adapters

- [Embedders](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/embedders/__init__.py): embedding backends · OpenAI, Gemini, Cohere, Vertex, and sentence-transformer embeddings · `mothrag/embedders/__init__.py`
- [Model Reads](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/readers/__init__.py): LLM providers · OpenAI, Groq, Anthropic, Gemini, and Cohere reader adapters · `mothrag/readers/__init__.py`

### Research & Ops

Evaluation, CLI, examples, and reproduction workflow

- [Evaluation](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/eval/pipeline.py): benchmarking · Faithfulness, latency, soft EM, and iterative evaluation · `mothrag/eval/pipeline.py`
- [Smoke CLI](https://github.com/juliangeymonat-jpg/mothrag/blob/main/mothrag/cli/smoke.py): command line · Minimal operational entry point for quick validation · `mothrag/cli/smoke.py`
- [Examples](https://github.com/juliangeymonat-jpg/mothrag/blob/main/examples/00_simple_quickstart.py): usage demos · Quickstart and custom corpus workflows · `examples/00_simple_quickstart.py`

## Connections

- Simple API → Mothrag Core: calls · Public API delegates to core orchestration
- Mothrag Core → Query Type: classifies · Determines query shape before routing
- Mothrag Core → Routing: routes · Selects relevant arm and specialist paths
- Routing → Arms Runner: dispatches · Sends query to chosen reasoning arms
- Query Type → Decomposition: guides · Complex queries trigger decomposition
- Mothrag Core → Decomposition: plans · Creates sub-questions for multi-hop reasoning
- Mothrag Core → Anchoring: anchors · Binds evidence across hops and retrieval steps
- Arms Runner → Dense Retrieval: retrieves · Candidates are sourced from dense/multimodal retrieval
- Arms Runner → Hybrid Graph: retrieves · Graph-aware retrieval supports multi-hop evidence
- Arms Runner → Bridge Haiku: retrieves · Bridge substrate combines ANN and structured extraction
- Arms Runner → Chain Filter: filters · Post-retrieval chain gating improves precision
- Dense Retrieval → Vector DBs: uses · Vector backend provides ANN storage and search
- Bridge Haiku → Embedders: embeds · Bridge retrieval depends on embedding providers
- Loaders → Embedders: feeds · Loaded chunks are embedded for indexing and retrieval
- Loaders → Graph Index: normalizes · Raw sources become graph/index artifacts
- Wikipedia Prep → Loaders: preprocesses · Wikipedia-specific normalization enters the loader boundary
- Graph Index → Symbolic Memory: stores · Structured graph facts populate symbolic memory
- Symbolic Memory → Hybrid Graph: serves · Structured memory supports graph-aware retrieval
- Routing → Retry Loop: may reroute · Arm selection can trigger recovery strategies
- Retry Loop → Iterative Ragnatela: extends · Iterative loop performs repeated retrieval and convergence control
- Iterative Ragnatela → Arms Runner: retries · Weak answers can re-enter arm execution
- Arms Runner → Arbitration: candidates · Arm outputs are scored and compared
- Arbitration → Abstain Logic: checks · Arbitration considers refusal and abstention signals
- Arbitration → Mothrag Core: returns · Selected answer and trace flow back to core output
- Model Reads → Arbitration: supports · Judging and verification can use model providers
- Model Reads → Bridge Haiku: supports · Bridge stages may call reader providers for extraction/judging
- Evaluation → Mothrag Core: measures · Benchmarking exercises orchestration and retrieval quality
- Smoke CLI → Mothrag Core: invokes · Operational smoke path drives the package core
- Examples → Simple API: demonstrates · Examples show the public entry surface
