FrankenSuite research program · A shareable brief

FrankenSearch The Search Engine That Grades Itself Against the One It Replaced

A shareable brief from the FrankenSuite research program. Every claim below traces to the assessed repository; sources are linked at the end. Assessment pinned September 22, 2026.

Assessment pinned September 22, 2026 (the assessed commit)·~1,107 words·5 sections·Every claim traceable to a source
Six definitions. NODUS is the program’s four-ring verdict scale (Invest, Pilot, Explore, Monitor) assigned per assessment packet. TRL is technology readiness level, scored 1 to 9 per packet. CI is continuous integration: the project’s automated test runs. The pin is the exact commit the assessment froze on; every claim is evaluated at the pin, not at HEAD. The rider is the license clause withholding all rights, including benchmarking and analysis, from OpenAI, Anthropic, their affiliates, and anyone acting for them. Bus factor is how many people can leave before the project stalls; it is 1 for every repo here.

01 · What it is

What search software is, and why it matters

Every time you search a codebase, a document store, or a product catalog, a search engine decides what you find. Modern search has two halves. Keyword search finds documents containing your exact words and ranks them by relevance. The classic ranking formula is BM25, and the industry-standard Rust library for it is Tantivy, the Lucene-like engine behind Quickwit and a cluster of other search products. Semantic search finds documents that mean what you asked even when they use different words; that usually means a vector database server like Qdrant or Weaviate, or a managed search service.

Then there is the tool most developers actually use day to day: ripgrep. It searches a directory tree for exact strings, respects your gitignore, answers in milliseconds, and is already installed. Any search project aimed at local codebases is competing with ripgrep, whether it admits it or not.

Search matters because retrieval is the bottleneck for everything built on top of it: documentation lookup, code navigation, and now AI agents, which spend a large share of their tool-call budgets searching.

02 · Why build it

Why build it in Rust?

The maintainer's stated problem: developers and agents working in large local codebases need hybrid search that combines exact keyword and semantic matching, fast enough for interactive use and explicit about its latency budget. His stated bet is a library-first, two-tier progressive design: deliver initial results from a fast tier in under 15 milliseconds, then refine them against a quality tier inside a roughly 150-millisecond budget. That point has no direct occupant. Tantivy does lexical but not semantic. Vector databases do semantic but run as servers. Meilisearch and Typesense are servers too. Nobody offers progressive "answer now, refine within budget" as a first-class API in an embedded library.

The load-bearing decision is the one the project's name only hints at: it re-derived the keyword engine. The project's own 93 KB plan document frames it as owning the full index lifecycle in one dependency-free codebase rather than inheriting Tantivy's: delta-visible indexing, compaction, block-max pruning. Whether owning that surface is worth re-deriving a solved problem is the bet the whole project stands or falls on.

The counter-argument sits in the repo's own docs. By the maintainer's own admission, relevance is unmeasured. Nobody has shown whether the results are actually good. And the true incumbent for the target workload, ripgrep, needs no 621 MB model download, no index build, and no nightly Rust toolchain.

03 · What was built

What the project actually built

About 883,000 lines of Rust across a 15-crate workspace. The pipeline runs in two tiers. The fast tier pairs a small static embedding model (potion-multilingual-128M) with a new native BM25 engine called Quill; the two rank lists are fused with Reciprocal Rank Fusion (K=60). The quality tier re-scores against all-MiniLM-L6-v2, blending 0.7 quality to 0.3 fast, with an optional cross-encoder rerank. A standalone CLI, fsfs, wraps the library with streaming JSONL output aimed at agents. The project ships real release artifacts: multi-platform fsfs 1.10.0 binaries and a published family of crates on crates.io. Unsafe code is under census: 60 counted sites, a workspace-wide deny, and four crates carrying the stricter crate-root forbid.

Three findings matter. First, the receipt machinery. Every benchmark number the README quotes is bound to a committed JSON receipt recording git revision, hostname, load average, and model identity, and the assessment's cross-check found the README matching the receipt to the decimal: initial results at p50 0.40 ms against a 15 ms target. source Second, the gauntlet. Having replaced Tantivy with Quill, the project kept Tantivy, pinned to an exact version, as a conformance oracle that continuously grades the replacement. Third, the self-audit corrections. Release v1.6.0 publicly demoted the project's own FNV-1a hash embedder from "semantic search" to "control," and a standing quality doc disavows its own nDCG figures as Quill certification.

Evidence · CI status

What the project’s own CI said at the pin

CI = continuous integration: automated checks that run on every change.

  • The GitHub Actions lane is stale.
  • Last runs August 2026, mostly red, seven of eight workflows manually disabled.

The uncomfortable findings

Uncomfortable finding

Relevance quality is unproven by the maintainer's own admission: no labeled-corpus comparison of Quill against the Tantivy oracle, or of the two-tier system against keyword-only, exists. The receipts measure a 1,000-document synthetic corpus on a single Threadripper. The prior assessment reported main failing to compile a day before this pin, and this assessment could not re-verify it. The maintainer's stated real gate, a private script, was never observed executing. fsfs watch holds an exclusive writer lock, so the core "keep the index fresh and search it" loop is documented-broken across processes. The project's own agent manual still describes the keyword arm as "Tantivy BM25," three weeks after the Quill-default ruling. And the license names OpenAI and Anthropic as forbidden parties, barring even benchmarking, while the contributor manual addresses Codex and Claude agents by name.

04 · Where it stands

Where it stands

In the program's terms: TRL 5–6, NODUS ring Explore. In plain English: the components are lab-validated — receipted latency, real release binaries, the unsafe census. But relevance is unmeasured, the compile state at the pin (the commit the assessment was pinned to) is unverified, the toolchain is nightly-only, there is one maintainer, and the license bars the AI labs whose agents are the target users.

Technology readiness

TRL 5–6 on a 1-to-9 scale.

NODUS ring

MonitorExplorePilotInvest

The program’s adoption ring for this project.

Verdict key

NODUS ring
Explore: The default for substantive-but-unproven work.
TRL
Technology Readiness Level, a 1-to-9 scale of how proven a technology is. This brief rates the project at TRL 5–6.
CI
Continuous integration: the project’s automated checks, run on every change.
The pin
The exact commit the assessment was pinned to. “At the pin” means as of that commit.

Evidence tiers

  1. Tier 1 · Verified — Confirmed by direct inspection of a fresh clone, an API response, or a live page read by the analyst.
  2. Tier 2 · CI-observed — Observed executing on live CI pages. Attests the suite runs, not that it is green, unless pass/fail is legible.
  3. Tier 3 · Maintainer claim — Asserted in README or docs by the maintainer; not independently executed or reproduced.
  4. Tier 4 · External — Independent sources: APIs, papers, press, third-party benchmarks. Absence of coverage is reported as a finding.
  5. Tier 5 · Inference — The analyst’s judgment. Always labeled; never presented as fact.

What this verdict rests on. Tier labels are the assessment packet’s own annotations.

  • Tier 1 · Verified: 883,079 lines and release binaries verified from the clone.
  • Tier: unassessed in packet: Compile state at the pin: the prior assessment’s “main failed to compile” report stands neither confirmed nor refuted.
  • Tier 3 · Maintainer claim: No binary was executed; relevance quality is unmeasured by the maintainer’s own admission.
  • Tier 4 · External: Zero independent coverage.
  • Tier 5 · Inference: The Explore ring.

Should you use it?

No.

Should you learn from it?

Yes, emphatically.

The methodology is the export. Three patterns transfer directly: the receipt schema (bind every number to revision, host, load, and model identity), the comparison-class discipline (in-repo before/after numbers are self-speedups: maintenance, not wins; only a named live incumbent run side by side counts as competitive evidence), and the gauntlet (keep the thing you replaced as a pinned oracle that can falsify you).

What would change the verdict, in order

  1. a labeled-corpus quality receipt is the necessary condition — Quill vs the Tantivy oracle and two-tier vs keyword-only, meeting the evidence standard the maintainer's own doc prescribes
  2. A search engine with unmeasured relevance is unadoptable regardless of speed
  3. Then: the rider narrowed or removed, compile-verified main in an independent environment, and a second human committer
source

05 · What it teaches

What this teaches about building with agents

The lesson is about numbers. Agents generate measurements faster than humans can judge them, and every agent-built system arrives with a table of impressive figures. This project built the small piece of machinery the industry needs: a comparison class attached to every claim. An in-repo before/after number is labeled self-speedup. That is maintenance, not a win. Only a named live incumbent, run side by side in the same invocation, counts as competitive evidence. A stored baseline or a previous commit is explicitly not an incumbent win.

For anyone building with agents: require the comparison class before the number. Let the agent print its percentiles, then make it say which class each one belongs to. Most of your "wins" will turn out to be maintenance. The few that survive the label are the ones worth quoting.

Evidence

This page cites selected evidence. The full claim-by-claim audit is in the assessment packet.

Open a panel to see what each source evidences. Full claim-by-claim audit.

Full claim-by-claim audit with evidence tiers lives in the program's assessment packet.

The repositorygithub.com/Dicklesworthstone/frankensearch
README

its README

CHANGELOG

CHANGELOG

docs/SEARCH_QUALITY_FINDINGS.md

docs/SEARCH_QUALITY_FINDINGS.md

docs/NEGATIVE_EVIDENCE.md

docs/NEGATIVE_EVIDENCE.md, and the committed latency receipt at the assessed commit

github.com/quickwit-oss/tantivygithub.com/quickwit-oss/tantivy

Tantivy's project docs (github.com/quickwit-oss/tantivy)

jeffreyemanuel.comjeffreyemanuel.com

Jeffrey Emanuel's site (jeffreyemanuel.com).