Every formula, weight, data source, and limitation behind ORION's scores — written to the standard an institutional due-diligence reviewer would require, including the categories that are not yet built and the one backtest that produced a negative result.
| Document status | Living document — reflects the implementation running in production as of this version |
| Owner | ORION Quantitative Research / Engineering |
| Audience | Institutional due-diligence reviewers, compliance, engineering |
| Companion documents | docs/ORION_BUY_SCORE_SPEC.md, docs/ORION_RISK_SCORE_SPEC.md, docs/CASE_STUDY_2022_BACKTEST.md — the audit-grade source specs this whitepaper summarizes |
| Weight/threshold verification | Checking against production scoring code… |
Per this document's own audience — an institutional compliance reviewer — the limitations are stated first, not buried at the end.
Every composite weight described below (Buy Score's 30/20/25/25, Clinical Risk's 40/30/30, Franchise Health's 30/40/30, etc.) is a reasoned allocation — a judgment call about what should matter and how much — not a weight derived from regressing against realized forward returns or outcomes. No component has been backtested to establish predictive accuracy, with the single exception described in Section 6, which returned a negative result and was published rather than suppressed.
Risk Score is specified as a 10-category composite. As of 2026-08-01, 4 categories are live in production and wired into a real composite: Clinical Risk (20% target weight), Regulatory Risk (15%), Cash Burn Risk (15%, reusing the same SEC EDGAR data as the Cash Runway card), and Competition Risk (10%, a ClinicalTrials.gov cross-search by indication counting late-stage/Phase 3-4 direct competitors — requires a resolved indication, so it's excluded rather than estimated when none is available). The remaining 6 categories (40% of target weight) require data feeds ORION does not currently ingest — IP/litigation, pricing/reimbursement, trial-execution history, manufacturing/CMC, political, and macroeconomic data. A single "Risk Score" number is shown in Prediction History and the Explain modal — renormalized over whichever of the 4 live categories are actually computable for a given company (Regulatory Risk needs an active trial or near-term FDA Calendar match; Cash Burn Risk needs the company to file with the SEC; Competition Risk needs a resolved indication) — always alongside an "N of 10 categories live" disclosure, never presented as the full 10-category picture.
Despite the name, this component does not use 13F institutional-ownership filings. It is built from two publicly available market signals — sell-side analyst price-target upside and recent price momentum — as a proxy for what institutional sentiment currently implies. If a structured 13F feed is integrated in the future, this would become a genuine ownership-based measure; until then, treat it as a sentiment proxy.
Buy Score's "Confidence" figure is a data-completeness-and-decisiveness index (how much underlying data exists, and how far from a neutral midpoint the score sits) — it is explicitly not a statistical confidence interval, standard error, or credible interval on the score value. No score in this document should be read as having a calibrated probability distribution around it.
General assumption underlying every score: ORION computes scores only from structured, verifiable data (ClinicalTrials.gov, market data providers, SEC EDGAR, published industry base-rate statistics). No score component is ever inferred from unstructured AI-generated narrative, and no missing sub-score is ever silently backfilled with a fabricated value — see each section's "Missing Data Handling" for the specific rule.
Full specification: docs/ORION_BUY_SCORE_SPEC.md
A 0–100 composite ranking heuristic answering: "Given only public, verifiable data, how attractive is this name right now?" It is not a price target, not a probability of a specific return, and not a substitute for fundamental analysis.
Buy Score = round( Σ(vᵢ · wᵢ) / Σ(wᵢ) for every i where vᵢ is defined )
| Component | Input | Weight |
|---|---|---|
| Pipeline Strength | Breadth + maturity of clinical pipeline | 30% |
| Clinical Safety | 100 − Clinical Risk | 20% |
| FDA Success | Blended historical approval base rate for active trials | 25% |
| Institutional Confidence | Analyst-target upside + price momentum | 25% |
Renormalization rule: if FDA Success is undefined (zero active trials), it is dropped from both the numerator and denominator — the remaining weights (0.75 total) are used as-is. No component is ever assigned a synthetic default value to keep weights summing to 1.0.
FDA Success base rates (Phase 1→9%, Phase 2→14%, Phase 3→57%, Phase 4/Approved→95%) are drawn from published industry clinical-development-success-rate studies — population base rates, not asset-specific predictions. The composite weighting scheme itself (30/20/25/25) is a reasoned allocation, not backtested against realized forward returns or approval outcomes.
If a company has zero trials and no market data, Buy Score is never computed or displayed — the product shows "Report Generation Stopped" instead of a low-information score built entirely from defaults.
Full specification: docs/ORION_RISK_SCORE_SPEC.md
A 0–100 composite (higher = riskier) intended to answer: "Across every category of risk that could impair capital, how much hazard is currently visible in structured, verifiable data?" Deliberately separate from Buy Score rather than netted into one number — a name can carry high upside and high risk simultaneously.
| # | Category | Status | Target Weight |
|---|---|---|---|
| 1 | Clinical Risk | ● LIVE | 20% |
| 2 | Regulatory Risk | ● LIVE (2026-07-13) | 15% |
| 3 | Cash Burn Risk | ● LIVE (2026-07-14) | 15% |
| 4 | Competition Risk | ● LIVE (2026-08-01) | 10% |
| 5 | Patent Risk | ○ PENDING DATA | 10% |
| 6 | Commercial Risk | ○ PENDING DATA | 10% |
| 7 | Execution Risk | ○ PENDING DATA | 8% |
| 8 | Manufacturing Risk | ○ PENDING DATA | 7% |
| 9 | Political Risk | ○ PENDING DATA | 3% |
| 10 | Macroeconomic Risk | ○ PENDING DATA | 2% |
Categories 1–4 (60% of target weight) are computable today and combined into a real Risk Score composite, renormalized over whichever of the four are actually available for a given company — shown in Prediction History and the Explain modal, always alongside an "N of 10 categories live" disclosure. This table is published in full, including the 6 still-pending categories, rather than showing only what's built.
Clinical Risk (20%): terminationRate = (# trials TERMINATED or WITHDRAWN) / (total trials) × 100 earlyStageRatio = (# trials in Phase 1 or 2 only) / (total trials) × 100 concentrationRisk = max(0, 100 − min(100, totalTrials × 12)) ClinicalRisk = round( terminationRate×0.40 + earlyStageRatio×0.30 + concentrationRisk×0.30 ) If zero trials: fixed 50 (neutral/unknown, deliberately not 0). Regulatory Risk (15%): approvalRiskComponent = 100 − FDA Success (blended historical phase-approval base rates) calendarRiskComponent = FDA Calendar event within 90 days? very_high→90 / high→65 / medium→40 / low→20 : excluded (not 0) RegulatoryRisk = weighted average of whichever component(s) are available, 70/30 split Cash Burn Risk (15%): runwayMonths = cashAndEquivalents / quarterlyBurnRate × 3 (SEC EDGAR XBRL, same figure as the Cash Runway card) CashBurnRisk = ≥24mo→10 / ≥18mo→30 / ≥12mo→55 / ≥6mo→80 / <6mo→100 / cash-flow positive→10
Clinical Risk is weighted highest (20%) because a terminated trial is a fact, not a proxy. Regulatory and Cash Burn Risk (15% each) are undefined — excluded from the composite, not defaulted — when their respective inputs aren't resolvable for a given company (no active trials/no near-term calendar match; no SEC filing history), per the renormalization rule in Section 1.
Clinical Risk's 40/30/30 internal weighting, and Regulatory Risk's 90/65/40/20 calendar-proximity constants, are reasoned allocations, not regression-fit. No backtest currently correlates any of these figures against realized outcomes — see Section 6 for what happened when this was tested on Buy Score.
Shown in place of Buy Score for companies whose most advanced asset is already approved/commercial-stage — a probability-of-approval framing doesn't apply to a drug already on the market. A deliberately different composite, not Buy Score renamed: no approval-probability term, since approval already happened.
Franchise Health = round( LifeCycleDepth×0.30 + InstitutionalConfidence×0.40 + Diversification×0.30 )
| Component | Definition | Weight |
|---|---|---|
| Life-Cycle Pipeline Depth | Active non-Phase-4 trials still running behind the approved asset (label expansions, combination studies, follow-ons), capped at 100 | 30% |
| Institutional Confidence | Reused unchanged from Buy Score — a market-sentiment read is equally valid for a commercial-stage company | 40% |
| Portfolio Diversification | Distinct indications addressed, as a proxy for exposure to any single indication's competitive/reimbursement risk | 30% |
Tiers: ≥65 Strong Franchise · ≥45 Stable Franchise · ≥25 Maturing Franchise · <25 At Risk.
A component reused across both Buy Score and Franchise Health — not derived from 13F institutional-ownership filings (see Section 1's limitation). Built from two public market signals:
Institutional Confidence = round( (analystUpside/20)×60 + (momentum/20)×40 )
| Term | Definition |
|---|---|
| Analyst upside | Tiered mapping of (analyst target − current price) / current price. Defaults to neutral midpoint if target data is missing. |
| Momentum | Tiered mapping of 3-month stock return. Defaults to neutral midpoint if price data is missing. |
If both inputs default to their neutral midpoints (no market data at all), Institutional Confidence resolves to exactly 50 — the deliberate "no signal" value, not a guess in either direction.
Frontend module: js/growth-modules.js (Module 12). Fetches GET /impact-chain, a live backend route in orion_biotech.py as of 2026-07-13. This section answers the question institutional reviewers ask most often about ORION's AI layer: when a step in a causal story sounds plausible, how do you stop that from quietly becoming a number?
For a material Watchtower event, Impact Chain renders the full reasoning path ORION traced from that event to a score: input event → affected entity → … → Score → Thesis Ledger → Watchlist. Each step is a discrete, individually-evidenced node — not a single paragraph of AI narrative. Within records actually returned and indexed through ORION's ClinicalTrials.gov-primary workflow, Impact Chain decides which signals may move a real number and which may only be shown as a labeled hypothesis. This is not a claim of complete registry coverage.
| Tier | Meaning | Rendering |
|---|---|---|
| Verified Causal Effect | A disclosed, direct regulatory or ledger fact — not an inference (e.g. a CRL, a Thesis Ledger diff) | Solid line, green |
| Strong Inference | A logical consequence of a verified fact, drawn from ORION's own structured cross-reference (e.g. Discovered's competitor overlap match) | Solid line, accent |
| Weak Inference | A plausible but not independently evidenced connection | Dashed line, amber |
| Speculative Possibility | A hypothesis with no data source behind it — labeled as such, not smoothed over | Dashed line, gray |
As of this version, exactly two upstream signal types resolve to a real, computed ORION score: (1) a clinical-trial-status change flowing into Clinical Risk / Pipeline Strength, which feeds Buy Score, and (2) a price or analyst-target move flowing into Institutional Confidence, which also feeds Buy Score (see Sections 2 and 5). A typical downstream story — competitor pressure eases → market share rises → peak sales rise → valuation rises — has no live scoring destination. Every step past that boundary is always tagged speculative, and its quantitative_impact is forced to null in code, not just by convention. The step is still shown, captioned "No live scoring destination for this step yet" — it is not hidden, only stopped from posing as a computed result.
Two rules are enforced in icTraceEnforceHonesty(), not left to documentation discipline alone: a step with zero evidence entries is dropped from the chain entirely before render; a step tagged speculative has its quantitative_impact field forced to null regardless of what was computed upstream.
ORION's report narrative is generated by two independent tracks: a deterministic scoring engine that owns every number shown in a report, and a separate Claude (Anthropic) call that produces free-text narrative only. The narrative track's prose is never parsed back into a number, score, or recommendation — see docs/ORION_AI_REASONING_ARCHITECTURE.md. Impact Chain's speculative/null-impact rule protects the same boundary at the causal-reasoning layer: an LLM-plausible-sounding multi-step story is not allowed to quietly present itself as a computed figure just because each individual link sounds reasonable.
As of 2026-07-13, GET /impact-chain is a real, live backend endpoint: enter any real company (and optionally its ticker) and ORION assembles a chain from that company's own clinical-trial and market data, tracing only the two signal types that have an actual computed path today — clinical-trial status → Clinical Risk/Pipeline Strength → Buy Score & Risk Score, and analyst-target/price momentum → Institutional Confidence → Buy Score. A chain produced this way is marked ● TRACED FROM LIVE ORION DATA. What is still not built: a structured knowledge graph that can automatically resolve an arbitrary Watchtower event (or news headline) into a trigger company without the user typing it in, and the Competitors → Revenue → Valuation → rNPV hops, which have no live scoring model to source a number from and stay speculative indefinitely (see the architecture notes at the bottom of js/growth-modules.js). Because that event-resolution step is missing, the Watchtower "Trace Impact →" shortcut still shows an illustrative reference chain, clearly marked DEMO PREVIEW, using a fictional company (Kestrel Genomics) rather than real trial data. Impact Chain is gated to Fund and Enterprise tier accounts, enforced both client-side and server-side.
See this mechanism worked through end-to-end on a real regulatory event: How ORION Analyzes a Live Catalyst — the REGN Case Walkthrough →
Full case study: docs/CASE_STUDY_2022_BACKTEST.md · part of a running, dated docs/ORION_BACKTEST_LOG.md, not a one-time document
ORION's own live scoring engine was tested against real historical ClinicalTrials.gov data (via AACT, Duke University's public archive), reconstructed as it looked on real past dates, checked against what actually happened afterward — five separate hypotheses, up to 83,000 trials in the largest sample.
| Test | Sample | Result |
|---|---|---|
| 5 named 2022 FDA decisions | 5 | No clean separation — highest-scored company received a CRL; lowest-scored was approved |
| Systematic sample, Clinical Risk vs. 1-yr termination | 1,806 companies | r = 0.055 — no meaningful correlation |
| Regression-recalibrated weights, held-out test | 1,806, 70/30 split | Recalibrated weights performed worse out-of-sample |
| Recruiting duration as stall proxy | 59,821 trials | r = 0.0005 — essentially zero |
| Completion-date revisions as proxy | 82,935 trials | A real, small effect — opposite the intuitive direction |
ORION published this finding rather than suppressing it. The recalibrated weights were not shipped (a worse-performing, more-sophisticated-sounding formula would have been a strictly worse product). The one place a real signal appeared — actively-revised records behaving differently from quiet ones — pointed toward time-series signal that static snapshots cannot provide, and directly motivated ORION's real-time trial-snapshot infrastructure and the public, continuously-updating Accuracy page.
This is included here, in the compliance document, rather than only in a separate case study, because an institutional risk review should not have to go looking for the one result that didn't flatter the product.
| Source | Used for | Provider |
|---|---|---|
| Clinical trial data | Pipeline Strength, Clinical Risk, FDA Success, Franchise Health | ClinicalTrials.gov v2 API (U.S. National Library of Medicine) |
| Market data | Institutional Confidence, momentum, analyst targets | Financial Modeling Prep / Yahoo Finance |
| Cash runway / dilution | Displayed separately in reports; cash runway also feeds Risk Score's Cash Burn Risk category (live as of 2026-07-14, see Section 3) — dilution is display-only, not a score input | SEC EDGAR company facts API |
| Competitor overlap (same indication) | ORION Impact Chain's competitor-count step only — not a Buy Score, Risk Score, or Franchise Health input | ClinicalTrials.gov v2 API (cross-indication search) |
| Historical approval base rates | FDA Success, Regulatory Risk's approval component | Published industry clinical-development-success-rate studies (constant table, not fetched live) |
| Report narrative | Investment thesis text, cited to the structured sources above | Claude (Anthropic) — AI-generated, not investment advice |
Explicitly not a data source for any score above (Buy Score, Risk Score, Franchise Health): 13F institutional-ownership filings, market-share data, IP/litigation status, pricing/reimbursement data, or any AI-generated free text. Competitor overlap (row above) is the one exception, and only as an Impact Chain trace step, never as a score input — the "market share impact" hop downstream of it stays deliberately unscored, see Section 6. A future version that wants to incorporate any of these into an actual score must add them as structured fields, never infer them from prose.