Auto-resolving ingest
Ingest by PMID, URL, or local file. PMIDs resolve PMC open-access full text automatically, falling back to metadata-only.
Hybrid dense + BM25 retrieval over ingested papers, packaged as a Claude Code plugin.

| Rule | What it means for you |
|---|---|
| doc_key is identity | Every paper's key is its PMID, or a sha256 of the file if there's none — the same key tags its directory, every Chroma chunk, and its BM25 entries, so re-ingest is delete-then-reinsert by key, not by search. |
| Index stays in sync | Any ingest that touches Chroma triggers a full BM25 rebuild for that collection — the two never drift apart. |
| Metadata never touches the index | cite and mine read metadata.json straight off disk; neither ever opens Chroma or BM25. |
| Models don't mix | Each embedding model gets its own Chroma collection and BM25 file — switching models means a fresh index, never a blend. |
| Homes are fully separate | A home's chroma/, bm25/, papers/, and config.json never cross into another home. |
| Answers are grounded | query.py only ranks and returns JSON — it never writes prose. Claude cites every claim by PMID and appends real BibTeX from your own library. |
See Concepts for the reasoning behind each of these.