Diaspore

All documents · source file docs/methodology.md · changed 2026-10-27 · sha256 8ab5bf810798

Methodology

Question

Given only what was public at a cutoff date, can a scoring system rank candidates at each step of the biotech pipeline — lab → pre-seed → seed → Series A → Series B — so that those that later advanced appear near the top, better than simple baselines?

Stages (config/project.yaml → stages)

stagecandidates at cutoffhit = within horizoncutoff / horizon
S0 lab → companylabs (PI × panel institution, ≥5 last-author papers 2010–2014)the lab's PI or an inferred trainee is an officer/director of a company with no public trace (Form D of any amount, SBIR, link) by the cutoff, incorporated ≤ 3 years before it, that raises within the horizon2014-12-31 / 72 mo
S1 formed → seedprivate companies with a Form D (any amount) filed by the cutoff, no round above pre-seed, first public trace ≤ 36 mo beforea round inferred ≥ seed2018-12-31 / 24 mo
S2 seed → Aprivate companies whose latest round is seed, raised in the prior 24 moa round ≥ Series A, or IPO2018-12-31 / 36 mo
S3 A → Bprivate companies whose latest round is Series A, raised in the prior 24 moa round ≥ Series B or IPO (clinical trials and pharma deals not yet ingested)2018-12-31 / 36 mo

Company stages are re-run at a 2016-12-31 cutoff (robustness: the outcome window ends before the 2020–21 funding bubble).

The gate (no lookahead)

diaspore.backtest.gate.split(events, cutoff, horizon) is the only place an event date is compared to a cutoff: dated ≤ cutoff → may be a feature; dated in (cutoff, cutoff + horizon] → may be a label; undated → neither. Signals are written with as_of_date and read only through score.features.features_as_of. Tests in tests/test_gate.py, tests/test_signals.py and a leakage trap in tests/test_run.py (a post-cutoff round that must not change features).

The "knowable" date of each fact:

Data (all public)

Scoring

Rubrics are pre-declared JSON (config/rubrics/v0.2-S*.json), registered in rubric_versions, and cannot be edited in place (the runner refuses). A component = mean percentile rank of its signals among that stage's candidates; missing components are excluded, not zeroed.

Metrics

precision@k (with 95% Wilson interval), recall@k, lift vs random; base rate and n always reported. k = min(25, n/10).

Baselines

stagebaselines
S0declared: random · citation_rank (not run: no as-of citation counts) · plain_llm · rubric_no_economics; extras: volume_rank, nih_dollars_rank
S1declared: random · sbir_flag · founder_prior_company · plain_llm
S2–S3declared: random · investor_tier (not run: Form D has no lead investors) · round_size · plain_llm; extra: total_raised

A run's verdict is INCOMPLETE unless every declared baseline ran. plain_llm is compared on its sample by average precision and ROC AUC (precision@k on a small sample is meaningless).

plain_llm (Claude Opus 5.5) gets the same pre-cutoff evidence with names withheld, on a seeded sample; the rubric is re-scored on the same sample (AP, ROC AUC). Two routes: the Batches API, or in-session blind subagents (/llm-baseline) that see only anonymized batch text under opaque ids; any batch whose scorer used a tool is discarded. The report states which route produced the number. A --named variant measures memorization. Baselines that could not run are stored as not_run with the reason, never silently dropped.

Known threats

  1. Label incompleteness. Stealth, non-US and never-filed companies are invisible → some misses are hits.
  2. Link precision. Name matching can attach a common-named person to the wrong lab; needs a hand-audited sample (evals/) before headline numbers are published.
  3. Board seats ≠ founding. A PI on a startup board may be an advisor, not a founder.
  4. Inferred stages. A $16M "seed" is labelled Series A by amount.
  5. Bubble years. 2020–21 inflates company-stage base rates (robustness cutoff addresses).
  6. Author disambiguation is today's OpenAlex, not the cutoff's.
  7. LLM memorization for plain_llm (names withheld; named variant quantifies it).
  8. Small k. With k = 25, precision differences under ~10 points are noise. Average precision is reported too.
  9. Dead features at company cutoffs. Papers are ingested for 2010–2014 only, so origin-lab paper signals are ~0 at the 2016/2018 cutoffs (neutral in percentile scoring, but they add nothing).
  10. Label rule chosen after a dry run. The PI/trainee-only link rule was introduced after a dry run on partial data (see decisions.md 2026-10-14). Disclosed; the rule is principled but was not pre-registered.

Technology value vs capital (added 2026-10-15)

Money raised measures investor belief, not technology value. Diaspore scores technology separately and compares the two.

Corrections and known limits after the 2026-10-15 audit (docs/audits/2026-10-15-runs1-7.md)

Fixed (all runs rebuilt after these changes; earlier runs 1–7 are void):

Known limits (not fixed; stated in every report's caveats):

IDEA-001 M9(i) estimator notes (added 2026-10-27, re-read r-m4)