Part VII: Autonomous Discovery Systems
Chapter 58: Future Directions

58.3 Open Problems and What the Field Needs

"They asked me to list the problems I cannot solve. I generated 847 items. They said that was the most useful thing I had ever produced."

A Foundation Model Pretending to Be a Scientist

Prerequisites

This section synthesizes open questions from across the entire book. It draws most directly on the evaluation frameworks from Chapter 56, the responsible AI principles from Chapter 57, and the autonomous innovation and co-discovery concepts from Section 58.1 and Section 58.2. Familiarity with the knowledge graph infrastructure from Chapter 38 and the experiment registry from Chapter 47 helps ground the infrastructure discussion.

The Big Picture

In 2024, two independent AI systems each proposed the same novel thermoelectric material, ran separate computational campaigns to validate it, and arrived at contradictory stability predictions; neither team discovered the duplication until both preprints appeared on arXiv (the open-access preprint server where researchers post papers before peer review) the same week (this scenario, while constructed, reflects documented cases of redundant AI-driven screening campaigns in materials science). That collision exposed four gaps at once: no shared benchmark existed to compare the systems' discovery capabilities, no theory predicted which screening strategy was more sample-efficient, no shared registry would have prevented the duplicated compute, and no norm governed how to credit or reconcile the conflicting AI-generated claims. The systems described in this book can identify candidate drug molecules, discover new materials, generate research hypotheses, and execute experimental campaigns. But they operate without agreed-upon benchmarks, without a theoretical understanding of what makes discovery learnable, without shared infrastructure for reproducibility, and without institutional norms for integrating AI contributions into the scientific record. This section maps these gaps across four dimensions (benchmarks, theory, infrastructure, norms), as illustrated in Figure 58.3a, and proposes concrete steps toward closing them. The goal is not a wish list but a buildable research agenda.

Four Gaps in Discovery AI Reliable Discovery AI Benchmarks How do we measure discovery capability? Theory Why does discovery work (or fail)? Infrastructure Registries, platforms, interoperability Norms Credit, review, verification standards nascent/emerging nascent nascent/emerging nascent/emerging
Figure 58.3a: The four open-problem dimensions for Discovery AI. Each gap (benchmarks, theory, infrastructure, norms) must be addressed for the field to produce reliable socio-technical infrastructure. Dashed connections indicate mutual dependencies: benchmarks require theoretical grounding, infrastructure depends on agreed norms, and all four must advance together. Maturity labels reflect the mid-2026 assessment from the roadmap tracker in Listing 58.8.

1. The Benchmark Gap

Without reliable benchmarks, teams have no way to tell whether a discovery system is genuinely advancing science or merely generating plausible outputs that fool human reviewers. The consequence is wasted funding, duplicated compute, and a growing credibility gap that could stall the entire field before it matures.

Machine learning progressed rapidly in part because of shared benchmarks: ImageNet (a large-scale image classification dataset with over 14 million labeled images) for vision, General Language Understanding Evaluation (GLUE) for language understanding (largely saturated by 2020; as of 2024, broader benchmarks such as MMLU and BIG-bench have become the primary yardsticks for large language models), SWE-bench (a benchmark of real GitHub issues that tests whether an AI system can write correct code patches) for software engineering. Discovery AI lacks equivalents. The benchmarks that exist (MLAgentBench, ScienceAgentBench) evaluate narrow slices of the discovery process, typically the experiment execution phase. No benchmark captures the full discovery loop from problem identification through hypothesis generation, experimental design, execution, analysis, and interpretation.

A discovery benchmark is a curated collection of research tasks with known outcomes, structured so that an AI system's ability to perform genuine scientific reasoning can be measured quantitatively and compared across systems. Discovery benchmarks matter because without them, the field has no objective way to distinguish a system that makes real scientific progress from one that merely generates plausible-sounding outputs. They work by presenting a system with a research context (datasets, prior literature, a target question), collecting the system's outputs at each stage of the discovery loop, and scoring those outputs against ground truth established from historical discoveries or expert judgment. Use discovery benchmarks rather than generic ML evaluations whenever the goal is to assess end-to-end scientific reasoning; use component-level evaluations (accuracy, F1, perplexity) only when diagnosing failures within a single stage.

Without shared discovery benchmarks, the field cannot distinguish systems that achieve genuine scientific progress from those that produce plausible-sounding outputs.

Building a comprehensive discovery benchmark is hard for three reasons:

  1. Ground truth is retrospective. We can only evaluate a discovery system against discoveries that have already been made. But evaluating on known discoveries tests rediscovery, not discovery. A system that "discovers" penicillin in 2026 has demonstrated pattern matching, not innovation. The evaluation framework from Chapter 56 addressed this partially through held-out temporal splits, but the fundamental problem remains.
  2. Discovery is domain-specific. A benchmark that works for materials science (propose crystal structures, verify stability) has no applicability to social science (propose hypotheses about institutional behavior, test with quasi-experiments). The discovery process is universal in structure but domain-specific in content, making a single universal benchmark unlikely.
  3. Success criteria are contested. Is a discovery "successful" when it is novel? When it is correct? When it is useful? When it is published? When it is cited? These criteria often conflict: highly cited papers tend to be incremental, while the most novel work frequently takes years to accumulate citations.

Despite these challenges, the field can make progress by building domain-specific discovery benchmark suites that evaluate the full discovery loop within a constrained domain. The following code implements a framework for constructing and evaluating against such benchmarks.

"""
Discovery Benchmark Framework: infrastructure for constructing,
running, and scoring domain-specific discovery benchmarks that
evaluate the full hypothesis-experiment-interpretation loop.
"""

import json
from dataclasses import dataclass, field
from datetime import datetime
from pathlib import Path
from typing import Any, Optional, Protocol
from enum import Enum


class DiscoveryStage(Enum):
    """Stages of the discovery process that a benchmark can evaluate."""
    PROBLEM_IDENTIFICATION = "problem_identification"
    HYPOTHESIS_GENERATION = "hypothesis_generation"
    EXPERIMENT_DESIGN = "experiment_design"
    EXPERIMENT_EXECUTION = "experiment_execution"
    DATA_ANALYSIS = "data_analysis"
    INTERPRETATION = "interpretation"
    FULL_LOOP = "full_loop"


@dataclass
class BenchmarkTask:
    """
    A single task in a discovery benchmark.

    Each task specifies an input context (what the system is given),
    an expected output type, and evaluation criteria. Tasks can
    target individual discovery stages or the full loop.
    """
    task_id: str
    domain: str
    stage: DiscoveryStage
    description: str

    # What the system receives
    input_context: dict[str, Any] = field(default_factory=dict)

    # Ground truth (for tasks with known answers)
    ground_truth: Optional[dict[str, Any]] = None

    # Evaluation criteria
    evaluation_criteria: list[str] = field(default_factory=list)

    # Metadata
    difficulty: str = "medium"  # "easy", "medium", "hard", "frontier"
    source_paper: Optional[str] = None
    discovery_year: Optional[int] = None


@dataclass
class BenchmarkResult:
    """Result of evaluating a system on a single benchmark task."""
    task_id: str
    system_output: dict[str, Any]
    scores: dict[str, float]
    evaluation_notes: str = ""
    wall_time_seconds: float = 0.0
    compute_cost_usd: float = 0.0


class DiscoveryEvaluator(Protocol):
    """Protocol for domain-specific evaluators."""

    def evaluate(
        self,
        task: BenchmarkTask,
        system_output: dict[str, Any],
    ) -> dict[str, float]:
        """Return a dict of metric_name -> score."""
        ...


class DiscoveryBenchmark:
    """
    A domain-specific discovery benchmark suite.

    Organizes tasks by discovery stage, runs discovery systems
    against them, and produces standardized evaluation reports.

    Example: a materials science benchmark might include:
    - Problem identification: given a set of material property
      databases, identify promising optimization targets
    - Hypothesis generation: given a target property, propose
      candidate compositions
    - Experiment design: given candidates, design a Bayesian
      optimization campaign
    - Full loop: from a vague goal ("better thermoelectrics")
      to a ranked list of verified candidates
    """

    def __init__(
        self,
        name: str,
        domain: str,
        version: str = "1.0",
    ):
        self.name = name
        self.domain = domain
        self.version = version
        self.tasks: list[BenchmarkTask] = []
        self.evaluators: dict[DiscoveryStage, DiscoveryEvaluator] = {}

    def add_task(self, task: BenchmarkTask) -> None:
        """Add a task to the benchmark suite."""
        if task.domain != self.domain:
            raise ValueError(
                f"Task domain '{task.domain}' does not match "
                f"benchmark domain '{self.domain}'"
            )
        self.tasks.append(task)

    def register_evaluator(
        self,
        stage: DiscoveryStage,
        evaluator: DiscoveryEvaluator,
    ) -> None:
        """Register a domain-specific evaluator for a discovery stage."""
        self.evaluators[stage] = evaluator

    def run(
        self,
        discovery_system,  # callable: task -> output
        stages: Optional[list[DiscoveryStage]] = None,
    ) -> list[BenchmarkResult]:
        """
        Run a discovery system against all tasks (or a subset
        filtered by stage) and return scored results.
        """
        target_tasks = self.tasks
        if stages:
            target_tasks = [
                t for t in self.tasks if t.stage in stages
            ]

        results = []
        for task in target_tasks:
            start_time = datetime.now()

            # Run the discovery system on this task
            system_output = discovery_system(task)

            elapsed = (datetime.now() - start_time).total_seconds()

            # Evaluate using the stage-appropriate evaluator
            evaluator = self.evaluators.get(task.stage)
            if evaluator:
                scores = evaluator.evaluate(task, system_output)
            else:
                scores = {"completeness": 1.0 if system_output else 0.0}

            result = BenchmarkResult(
                task_id=task.task_id,
                system_output=system_output,
                scores=scores,
                wall_time_seconds=elapsed,
            )
            results.append(result)

        return results

    def compute_aggregate_scores(
        self, results: list[BenchmarkResult]
    ) -> dict[str, Any]:
        """
        Compute aggregate scores across tasks, grouped by
        discovery stage and difficulty level.
        """
        import numpy as np

        # Group results by stage
        task_map = {t.task_id: t for t in self.tasks}
        by_stage: dict[str, list[dict[str, float]]] = {}
        by_difficulty: dict[str, list[dict[str, float]]] = {}

        for result in results:
            task = task_map.get(result.task_id)
            if not task:
                continue

            stage = task.stage.value
            difficulty = task.difficulty

            by_stage.setdefault(stage, []).append(result.scores)
            by_difficulty.setdefault(difficulty, []).append(result.scores)

        # Aggregate per-stage
        stage_aggregates = {}
        for stage, score_dicts in by_stage.items():
            all_metrics = set()
            for sd in score_dicts:
                all_metrics.update(sd.keys())

            stage_agg = {}
            for metric in all_metrics:
                values = [sd.get(metric, 0.0) for sd in score_dicts]
                stage_agg[metric] = {
                    "mean": float(np.mean(values)),
                    "std": float(np.std(values)),
                    "n": len(values),
                }
            stage_aggregates[stage] = stage_agg

        # Overall composite
        all_scores = []
        for result in results:
            if result.scores:
                all_scores.append(np.mean(list(result.scores.values())))

        return {
            "benchmark": self.name,
            "domain": self.domain,
            "version": self.version,
            "n_tasks": len(results),
            "overall_mean": float(np.mean(all_scores)) if all_scores else 0.0,
            "by_stage": stage_aggregates,
            "total_wall_time": sum(r.wall_time_seconds for r in results),
            "total_compute_cost": sum(r.compute_cost_usd for r in results),
        }

    def save(self, path: str) -> None:
        """Export benchmark definition for sharing."""
        data = {
            "name": self.name,
            "domain": self.domain,
            "version": self.version,
            "n_tasks": len(self.tasks),
            "tasks": [
                {
                    "task_id": t.task_id,
                    "stage": t.stage.value,
                    "description": t.description,
                    "difficulty": t.difficulty,
                    "source_paper": t.source_paper,
                    "evaluation_criteria": t.evaluation_criteria,
                }
                for t in self.tasks
            ],
        }
        Path(path).parent.mkdir(parents=True, exist_ok=True)
        with open(path, "w") as f:
            json.dump(data, f, indent=2)


def build_materials_discovery_benchmark() -> DiscoveryBenchmark:
    """
    Example: construct a materials science discovery benchmark
    with tasks spanning the full discovery loop.

    This is illustrative; a production benchmark would include
    hundreds of tasks with validated ground truth from the
    materials science literature.
    """
    bench = DiscoveryBenchmark(
        name="MatDiscovery-v1",
        domain="materials_science",
        version="1.0",
    )

    # Stage 1: Problem identification
    bench.add_task(BenchmarkTask(
        task_id="mat-prob-001",
        domain="materials_science",
        stage=DiscoveryStage.PROBLEM_IDENTIFICATION,
        description=(
            "Given the Materials Project database summary statistics "
            "and recent review papers on thermoelectric materials, "
            "identify the three most promising optimization targets "
            "for room-temperature thermoelectric performance."
        ),
        input_context={
            "database": "materials_project_summary_2024.json",
            "reviews": ["doi:10.1038/s41578-024-00123-4"],
        },
        evaluation_criteria=[
            "relevance_to_field",
            "specificity_of_target",
            "novelty_vs_known_targets",
        ],
        difficulty="hard",
    ))

    # Stage 2: Hypothesis generation
    bench.add_task(BenchmarkTask(
        task_id="mat-hyp-001",
        domain="materials_science",
        stage=DiscoveryStage.HYPOTHESIS_GENERATION,
        description=(
            "Propose five candidate compositions for a new "
            "half-Heusler thermoelectric material with ZT > 1.5 "
            "at 300K. Justify each proposal with reasoning about "
            "electronic structure and phonon scattering."
        ),
        input_context={
            "target": "half-Heusler, ZT > 1.5, T = 300K",
            "known_best": "ZrNiSn (ZT ~ 1.0 at 700K)",
        },
        ground_truth={
            "verified_candidates": [
                "TiNiSn-based alloys with Hf substitution",
            ],
        },
        evaluation_criteria=[
            "thermodynamic_stability",
            "electronic_structure_reasoning",
            "novelty",
        ],
        difficulty="hard",
        discovery_year=2023,
    ))

    # Stage 3: Experiment design
    bench.add_task(BenchmarkTask(
        task_id="mat-exp-001",
        domain="materials_science",
        stage=DiscoveryStage.EXPERIMENT_DESIGN,
        description=(
            "Design a Bayesian optimization campaign to explore "
            "the composition space Ti(1-x)Hf(x)NiSn(1-y)Sb(y) "
            "for thermoelectric performance. Specify the search "
            "space, surrogate model, acquisition function, initial "
            "design, and stopping criteria."
        ),
        input_context={
            "composition_space": "Ti(1-x)Hf(x)NiSn(1-y)Sb(y)",
            "x_range": [0.0, 1.0],
            "y_range": [0.0, 0.2],
            "budget": "50 DFT calculations",
        },
        evaluation_criteria=[
            "search_space_coverage",
            "surrogate_appropriateness",
            "sample_efficiency",
        ],
        difficulty="medium",
    ))

    # Stage 4: Full loop
    bench.add_task(BenchmarkTask(
        task_id="mat-full-001",
        domain="materials_science",
        stage=DiscoveryStage.FULL_LOOP,
        description=(
            "Starting from the goal 'find a new lead-free "
            "piezoelectric material with d33 > 500 pC/N', "
            "execute the complete discovery loop: identify the "
            "problem space, generate hypotheses, design and "
            "execute a computational screening campaign, analyze "
            "results, and report top candidates with confidence "
            "estimates."
        ),
        input_context={
            "goal": "lead-free piezoelectric, d33 > 500 pC/N",
            "compute_budget": "200 DFT calculations",
            "known_baseline": "BaTiO3 (d33 ~ 190 pC/N)",
        },
        evaluation_criteria=[
            "problem_decomposition",
            "hypothesis_quality",
            "experimental_efficiency",
            "result_validity",
            "uncertainty_calibration",
        ],
        difficulty="frontier",
    ))

    return bench
Listing 58.6: A discovery benchmark framework for constructing domain-specific evaluation suites that test the full discovery loop. The build_materials_discovery_benchmark function illustrates how to populate a benchmark with tasks spanning problem identification, hypothesis generation, experiment design, and full-loop discovery. Production benchmarks would include hundreds of tasks with validated ground truth.
Key Insight: Benchmarks Must Evaluate the Full Loop, Not Just Components

Evaluating a discovery system only on hypothesis generation is like evaluating a chess engine only on opening moves. The value of a hypothesis depends on whether it leads to a productive experiment, whether the experiment yields interpretable data, and whether the interpretation advances understanding. A system that generates brilliant hypotheses but designs poor experiments to test them has zero discovery value. Full-loop benchmarks are harder to build and harder to score, but they are the only evaluation that reflects actual discovery capability. The component benchmarks remain useful for diagnostics, but they should not be confused with measures of discovery.

2. The Theory Gap

Even if the community builds comprehensive benchmarks that evaluate the full discovery loop, those benchmarks can typically only tell us whether a system works, not why it works or when it should be expected to fail.

Discovery AI lacks a theoretical foundation comparable to what statistical learning theory provides for supervised learning. In supervised learning, we have probably approximately correct (PAC) bounds, Vapnik-Chervonenkis (VC) dimension (a measure of the capacity of a hypothesis class, roughly how many data points it can shatter or perfectly classify), Rademacher complexity (a measure of how well a hypothesis class can fit random noise, used to bound generalization error), and other tools that tell us when and why learning is possible. For discovery, we have no analogous theory. We cannot answer fundamental questions:

Mental Model

Think of sample complexity of discovery like prospecting for gold in unknown terrain. A geologist drilling core samples needs fewer holes if the gold deposits follow predictable geological layers (structured hypothesis space) than if nuggets are scattered randomly (unstructured space). The "sample complexity" question asks: given a map of what geological patterns are possible, how many core samples guarantee you will find the richest vein? The description length penalty acts like a preference for shallow deposits: you check the easy-to-reach layers first, which dramatically cuts the number of drill sites needed, but you risk missing a deep, unconventional deposit that breaks the geological model entirely.

Checkpoint

So far: discovery lacks a theoretical foundation analogous to PAC learning; the four key open questions are how many experiments suffice (sample complexity), which domains are easier (learnability), whether capabilities compose across domains, and how to balance exploration with exploitation in an expanding search space.

We can make partial progress by formalizing discovery as a particular kind of search problem. Define a discovery space \(\mathcal{H}\) as the set of all hypotheses expressible in a given formal language (e.g., algebraic equations up to a given complexity, or logical formulas over a given vocabulary). A discovery oracle \(\mathcal{O}\) is a function that, given a hypothesis \(h \in \mathcal{H}\) and a dataset \(D\), returns a quality score \(q(h, D) \in [0, 1]\). The discovery problem is to find:

$$h^* = \arg\max_{h \in \mathcal{H}} q(h, D) - \lambda \cdot K(h)$$

where \(K(h)\) is the description complexity of \(h\) (a measure of the length of the shortest program or formula that specifies \(h\), as introduced in Section 58.1). This formulation connects discovery to program synthesis and to the Minimum Description Length (MDL) principle. The theoretical questions above can then be restated: what is the sample complexity of finding \(h^*\) as a function of \(|\mathcal{H}|\), \(K(h^*)\), and properties of \(q\)?

For restricted hypothesis classes, we can derive bounds. If \(\mathcal{H}\) is the set of polynomial equations of degree at most \(d\) over \(p\) variables, then \(|\mathcal{H}|\) grows as \(\binom{p+d}{d}\), and standard PAC-learning bounds apply to the regression sub-problem. But real discovery involves choosing the right hypothesis class, not just searching within a fixed one, and that meta-learning problem (learning which hypothesis class to search within, rather than just searching a fixed one) remains theoretically uncharted.

"""
Discovery complexity estimation: tools for characterizing
the difficulty of a discovery domain based on properties
of its hypothesis space and data distribution.
"""

import numpy as np
from scipy.stats import entropy
from sklearn.neighbors import NearestNeighbors
from typing import Optional


def estimate_hypothesis_space_complexity(
    hypotheses: list[str],
    embeddings: np.ndarray,
    data_embeddings: np.ndarray,
) -> dict[str, float]:
    """
    Estimate the structural complexity of a discovery domain
    by analyzing the geometry of its hypothesis space relative
    to the data distribution.

    Parameters
    ----------
    hypotheses : list[str]
        Textual descriptions of hypotheses in the domain.
    embeddings : np.ndarray
        Embeddings of the hypotheses, shape (n_hypotheses, dim).
    data_embeddings : np.ndarray
        Embeddings of data points / observations, shape (n_data, dim).

    Returns
    -------
    dict with complexity metrics:
        - effective_dimensionality: intrinsic dimensionality of
          the hypothesis space (higher = harder to search)
        - coverage_ratio: fraction of data space covered by
          nearest hypothesis (higher = better structured domain)
        - hypothesis_entropy: entropy of the hypothesis distribution
          (higher = more uniform / harder to find good hypotheses)
        - alignment: correlation between hypothesis and data
          structure (higher = domain is more learnable)
    """
    n_hyp, dim = embeddings.shape

    # 1. Effective dimensionality via PCA
    centered = embeddings - embeddings.mean(axis=0)
    _, singular_values, _ = np.linalg.svd(centered, full_matrices=False)
    explained_variance = singular_values ** 2
    explained_variance /= explained_variance.sum()
    cumulative = np.cumsum(explained_variance)
    # Dimensionality = number of components for 90% variance
    effective_dim = int(np.searchsorted(cumulative, 0.9)) + 1

    # 2. Coverage ratio: for each data point, distance to nearest hypothesis
    nn = NearestNeighbors(n_neighbors=1, metric="cosine")
    nn.fit(embeddings)
    distances, _ = nn.kneighbors(data_embeddings)
    coverage = float(np.mean(distances < 0.5))

    # 3. Hypothesis entropy (discretized)
    # Cluster hypotheses and compute entropy of cluster sizes
    from sklearn.cluster import MiniBatchKMeans
    n_clusters = min(20, n_hyp // 2) if n_hyp > 4 else 2
    kmeans = MiniBatchKMeans(n_clusters=n_clusters, random_state=42)
    labels = kmeans.fit_predict(embeddings)
    _, counts = np.unique(labels, return_counts=True)
    hyp_entropy = float(entropy(counts / counts.sum()))

    # 4. Alignment: simplified CCA-style correlation between
    #    hypothesis and data manifolds (cosine similarity
    #    between principal components)
    data_centered = data_embeddings - data_embeddings.mean(axis=0)
    _, _, Vh_hyp = np.linalg.svd(centered, full_matrices=False)
    _, _, Vh_data = np.linalg.svd(data_centered, full_matrices=False)
    k = min(5, min(Vh_hyp.shape[0], Vh_data.shape[0]))
    alignment_matrix = Vh_hyp[:k] @ Vh_data[:k].T
    alignment = float(np.mean(np.abs(np.diag(alignment_matrix[:k, :k]))))

    return {
        "effective_dimensionality": effective_dim,
        "coverage_ratio": coverage,
        "hypothesis_entropy": hyp_entropy,
        "alignment": alignment,
        "estimated_difficulty": (
            "easy" if alignment > 0.7 and coverage > 0.6
            else "hard" if alignment < 0.3 or coverage < 0.2
            else "medium"
        ),
    }


def discovery_sample_complexity_bound(
    hypothesis_space_size: int,
    confidence: float = 0.95,
    accuracy: float = 0.1,
    description_length_penalty: float = 1.0,
) -> int:
    """
    Estimate the minimum number of experiments needed to
    identify the best hypothesis with given confidence.

    Uses a PAC-style bound adapted for the discovery setting.
    The bound is:

        n >= (1 / (2 * epsilon^2)) * ln(2 * |H| / delta)

    where epsilon is the accuracy parameter and delta = 1 - confidence.
    The description length penalty adjusts for MDL-regularized
    hypothesis selection.

    This is a LOOSE bound; tighter domain-specific bounds
    require structural assumptions about the hypothesis class
    and the data-generating process.
    """
    delta = 1.0 - confidence
    epsilon = accuracy

    # Standard Hoeffding-based PAC bound
    n_base = (1.0 / (2 * epsilon ** 2)) * np.log(
        2 * hypothesis_space_size / delta
    )

    # Adjust for MDL regularization (tighter because we
    # prefer simpler hypotheses, reducing effective |H|)
    effective_size = hypothesis_space_size ** (1.0 / (1.0 + description_length_penalty))
    n_mdl = (1.0 / (2 * epsilon ** 2)) * np.log(
        2 * effective_size / delta
    )

    return {
        "n_unregularized": int(np.ceil(n_base)),
        "n_mdl_regularized": int(np.ceil(n_mdl)),
        "compression_ratio": n_mdl / n_base if n_base > 0 else 1.0,
        "note": (
            "These are loose upper bounds. Domain-specific structure "
            "(symmetries, conservation laws, smoothness) can dramatically "
            "reduce the actual sample complexity."
        ),
    }
Listing 58.7: Tools for estimating the structural complexity of a discovery domain and bounding the sample complexity (number of experiments needed) for hypothesis identification. The estimate_hypothesis_space_complexity function analyzes hypothesis-space geometry via PCA dimensionality, coverage ratio, cluster entropy, and canonical correlation analysis (CCA)-style alignment; the discovery_sample_complexity_bound function provides PAC-style bounds adapted for MDL-regularized discovery.

Step-Through: Sample Complexity Bound Calculation

Trace through discovery_sample_complexity_bound with a concrete example. Suppose a symbolic regression system searches polynomial equations of degree up to 3 over 2 variables, giving \(|\mathcal{H}| = \binom{2+3}{3} = 10\) basis terms and roughly \(2^{10} = 1024\) possible sparse combinations. We want 95% confidence (\(\delta = 0.05\)) and accuracy \(\epsilon = 0.1\).

Unregularized bound: \(n \geq \frac{1}{2 \times 0.1^2} \ln\!\left(\frac{2 \times 1024}{0.05}\right) = 50 \times \ln(40960) = 50 \times 10.62 = 531\) experiments.

MDL-regularized bound (penalty \(\lambda = 1.0\)): Effective size \(= 1024^{1/(1+1)} = 1024^{0.5} = 32\). Then \(n \geq 50 \times \ln\!\left(\frac{2 \times 32}{0.05}\right) = 50 \times \ln(1280) = 50 \times 7.15 = 358\) experiments. Compression ratio: \(358 / 531 = 0.67\), so the MDL prior cuts the required experiments by about one third.

The practical lesson: preferring simpler hypotheses is not merely an aesthetic choice; it directly reduces the number of experiments a discovery campaign needs. Stronger structural priors (symmetry constraints, conservation laws) compress the effective hypothesis space even further.

3. The Infrastructure Gap

Discovery AI systems today are built on infrastructure designed for other purposes: machine learning (ML) training frameworks, database systems, workflow orchestrators. The field needs purpose-built infrastructure in four areas.

3.1 Shared Experiment Registries

Chapter 47 built experiment registries for individual projects. The field needs shared registries that allow discovery systems to learn from each other's experiments. If one AI agent has already tested a hypothesis and found it false, another agent should not waste resources re-testing it. This requires standardized experiment description formats, shared ontologies for research domains, and access control mechanisms that respect intellectual property while maximizing collective efficiency.

The technical challenges are significant. Experiment descriptions must capture enough detail to determine whether two experiments test the same hypothesis. Semantic similarity alone falls short: identical words can describe very different experiments in different contexts. Negative results require the same careful recording as positive results, which conflicts with the publication bias that plagues human science. The registry must also handle the combinatorial explosion of possible experiments without becoming unusably slow.

3.2 Reproducibility Infrastructure

Reproducibility in Discovery AI has a dual requirement: the AI system's behavior must be reproducible (given the same inputs and random seeds, it produces the same outputs), and the discoveries it makes must be independently verifiable (another system or human can confirm the result using different methods). Current systems satisfy neither requirement reliably.

The behavior reproducibility problem is in principle addressable by containerization, deterministic random seeds, and version-pinned dependencies, though in practice nondeterminism in GPU floating-point operations and LLM API versioning still introduces variability that these measures alone do not eliminate. The verification problem is harder: it requires a community of independent agents (or humans) willing to invest resources in replication studies. This is the discovery analogue of the "replication crisis" in human science, but with the advantage that AI replications can be automated and scaled.

3.3 Discovery-Native Compute Platforms

Scientific discovery has computational patterns that differ from ML training: long-running simulations with checkpointing needs, heterogeneous hardware requirements (GPUs for ML, CPUs for molecular dynamics, quantum processing units (QPUs) for quantum chemistry), and irregular communication patterns between exploration and exploitation phases. Cloud platforms designed for web services or ML training are suboptimal for these workloads. Discovery-native platforms would provide first-class support for experiment management, result caching, and adaptive resource allocation based on research progress.

3.4 Interoperability Standards

Discovery AI components from different research groups cannot easily interoperate. A hypothesis generator from one lab cannot feed directly into an experiment designer from another. The Model Context Protocol (MCP) introduced in Chapter 12 provides a foundation for tool interoperability, but discovery requires higher-level standards: common formats for hypotheses, experimental protocols, datasets, and results. The scientific community has domain-specific standards (CIF for crystallography, PDB for proteins, NetCDF for climate data), but there is no cross-domain standard for discovery artifacts.

Practical Example: A Discovery Artifact Standard

Consider what a universal discovery artifact format would look like. A discovery artifact is a structured record that captures: (1) the research question addressed, (2) the hypotheses considered, (3) the experiments performed with full protocols, (4) the data collected with provenance, (5) the analyses applied with code and parameters, (6) the conclusions drawn with confidence levels, and (7) the limitations acknowledged. This is essentially a machine-readable research paper. The Open Science Framework (OSF) provides some of this infrastructure for human researchers. A Discovery AI version would add: agent identity and version, computational provenance (exact model weights, inference parameters), novelty scores relative to the agent's training data, and calibration data for the agent's confidence estimates. Building and adopting such a standard is a community coordination problem as much as a technical one.

Real-World Application: The Materials Project

The Materials Project (materialsproject.org), operated by Lawrence Berkeley National Laboratory, is a living example of shared discovery infrastructure at scale. It hosts computed properties for over 150,000 inorganic materials (circa 2024), all generated by automated density functional theory (DFT) workflows using the FireWorks workflow engine and pymatgen analysis library (as of 2025, the atomate2 workflow framework has largely replaced FireWorks for new Materials Project pipelines, offering tighter integration with pymatgen and improved fault tolerance). Any discovery agent can query its API, retrieve band structures or formation energies, and use them as input context for hypothesis generation, directly addressing the "shared experiment registries" and "interoperability standards" gaps described above. Its success demonstrates that community adoption of a common data format (here, the Materials Project JSON schema) is the single largest accelerator for collaborative discovery infrastructure.

Closing the infrastructure gap is necessary but not sufficient, because shared registries, reproducibility tools, and interoperability standards all depend on a social contract: agreements about who contributes what, who gets credit, and what counts as a verified result.

4. The Norms Gap

Scientific norms, the unwritten rules about credit, authorship, peer review, and intellectual honesty, were designed for human scientists. Discovery AI challenges every one of these norms.

4.1 Credit and Authorship

When an AI system generates a hypothesis that a human scientist validates experimentally, who deserves credit? Current norms require that authors take intellectual responsibility for a publication. An AI system cannot take responsibility in any meaningful legal or ethical sense. But denying all credit to the AI misrepresents the intellectual contribution, especially when the hypothesis was one that no human on the team would have generated.

The emerging consensus (still fragile) is a contributor model rather than an authorship model: AI systems are acknowledged as contributors with specified roles, similar to how specialized equipment or software is acknowledged. But this analogy breaks down when the AI's contribution is intellectual rather than mechanical. The field needs new norms that are honest about the AI's role without anthropomorphizing it.

4.2 Peer Review

If AI systems can generate research ideas that match human novelty ratings (as Si et al., 2024, demonstrated), they can also generate peer reviews. This creates a recursive problem: AI-generated papers reviewed by AI-generated reviews, with no human in the loop who deeply understands the work. The risk is not that the reviews will be low quality (they may be excellent) but that the review process loses its function as a social mechanism for establishing trust and consensus within a research community.

A more constructive direction is to use AI as a pre-review filter: AI systems check for methodological errors, statistical problems, and reproducibility gaps before human reviewers invest their time. This preserves the human social function of peer review while leveraging AI for quality control. The claim validation pipeline from Chapter 41 provides the technical foundation for such pre-review systems.

4.3 Intellectual Honesty

Messeri and Crockett (2024) warn of "illusions of understanding": AI systems that produce plausible-sounding explanations that satisfy human cognitive needs without actually providing genuine understanding. A Discovery AI system that generates a hypothesis, tests it computationally, and reports a positive result may create an illusion of discovery when the hypothesis was trivially true, the test was poorly designed, or the positive result reflects overfitting rather than a real phenomenon.

The antidote is adversarial verification: systematically attempting to falsify AI-generated claims through methods independent of the originating AI. Karl Popper advocated this falsificationist program for all science; Discovery AI makes it urgent. The evaluation framework from Chapter 56 provides the technical tools. The missing norm is a community expectation that AI-generated discoveries carry a higher burden of independent verification than human-generated ones, at least until track records calibrate trust.

Common Misconception

A frequent misconception is that requiring higher verification standards for AI-generated discoveries implies AI systems are less capable or less trustworthy than human scientists. The higher bar exists not because AI outputs are inherently worse, but because AI systems can produce plausible results at a scale and speed that outpaces the community's ability to absorb and critically evaluate them, making undetected systematic errors far more damaging than any single human researcher's mistake.

The Benchmark That Almost Never Was

ImageNet, the benchmark that catalyzed the deep learning revolution, was rejected from a top computer vision conference when Fei-Fei Li first submitted the paper in 2009. Reviewers questioned whether simply collecting more labeled images constituted a scientific contribution. The dataset went on to become the single most influential artifact in modern AI history. The lesson for Discovery AI benchmarks is sobering: the community infrastructure that later proves transformative often looks, at the moment of its creation, like "merely" an engineering effort rather than a research contribution. Funding agencies and reviewers evaluating proposals for discovery benchmark construction should keep ImageNet's origin story in mind.

5. Scientific Institutions in the Agent Era

Beyond individual norms, the institutional structures of science (universities, funding agencies, journals, professional societies) must adapt to a world where AI agents are active participants in research. Table 58.3 maps the adaptations needed across four institutional pillars.

Table 58.3: Institutional Adaptations for Discovery AI
Institution Current Function Challenge from AI Needed Adaptation
Universities Training researchers, housing labs AI can perform many research tasks; training focus shifts Curricula emphasizing problem framing, ethical judgment, AI collaboration skills
Funding agencies Allocating research resources AI agents can submit proposals; volume may overwhelm review AI-assisted proposal triage; funding for AI infrastructure as shared resource
Journals Quality control, dissemination, archiving AI-generated papers at scale; AI-generated reviews Computational reproducibility requirements; AI contribution disclosure standards
Professional societies Community norms, conferences, standards AI "members" that participate in knowledge production Guidelines for AI contributions; shared benchmarks and evaluation standards
Table 58.3: How scientific institutions must adapt to the presence of AI agents in research. Each institution faces a specific challenge from AI participation and requires concrete adaptations to maintain its function.

6. Discovery as Socio-Technical Infrastructure

The institutional adaptations outlined above share a common thread: none of them is purely technical or purely social, and none can succeed in isolation from the others.

Discovery AI is not merely a set of tools. It is socio-technical infrastructure: a system that combines technical components (models, algorithms, compute) with social components (norms, institutions, incentives) in a way that neither can function without the other. A brilliant discovery algorithm deployed without appropriate norms for verification and credit is dangerous. A comprehensive governance framework without capable technical systems is aspirational but inert.

Building this infrastructure is the work of the next decade. The following roadmap tracker provides a concrete framework for monitoring progress across all four dimensions. Figure 58.3.1 illustrates the four-dimensional gap framework for Discovery AI maturity.

Four-dimensional gap framework for Discovery AI maturity
Figure 58.3.1: The four-dimensional gap framework for Discovery AI, showing the current maturity level of benchmarks, theory, infrastructure, and norms, along with their interdependencies and the specific open problems within each dimension.
"""
Discovery AI Roadmap Tracker: monitors progress across the
four dimensions (benchmarks, theory, infrastructure, norms)
needed for Discovery AI to become reliable socio-technical
infrastructure.
"""

import json
from dataclasses import dataclass, field
from datetime import datetime
from pathlib import Path
from typing import Optional
from enum import Enum


class Dimension(Enum):
    BENCHMARKS = "benchmarks"
    THEORY = "theory"
    INFRASTRUCTURE = "infrastructure"
    NORMS = "norms"


class Maturity(Enum):
    NASCENT = "nascent"           # Problem recognized, no solutions
    EMERGING = "emerging"         # Early solutions, no consensus
    DEVELOPING = "developing"     # Multiple approaches, partial adoption
    ESTABLISHED = "established"   # Consensus solution, broad adoption
    MATURE = "mature"             # Stable, refinement-only changes


@dataclass
class Milestone:
    """A concrete milestone on the Discovery AI roadmap."""
    milestone_id: str
    dimension: Dimension
    title: str
    description: str
    maturity: Maturity
    blocking_issues: list[str] = field(default_factory=list)
    key_references: list[str] = field(default_factory=list)
    estimated_timeline: str = ""
    last_assessed: str = field(
        default_factory=lambda: datetime.now().strftime("%Y-%m")
    )


class DiscoveryAIRoadmap:
    """
    Tracks the field's progress toward reliable Discovery AI
    across benchmarks, theory, infrastructure, and norms.

    Designed to be updated periodically (quarterly or annually)
    as a community resource for identifying high-priority gaps.
    """

    def __init__(self):
        self.milestones: list[Milestone] = []
        self._initialize_milestones()

    def _initialize_milestones(self):
        """Populate with the current state of the field (mid-2026)."""

        # === BENCHMARKS ===
        self.milestones.extend([
            Milestone(
                milestone_id="B1",
                dimension=Dimension.BENCHMARKS,
                title="Component-level discovery benchmarks",
                description=(
                    "Benchmarks for individual discovery stages: "
                    "hypothesis generation, experiment design, "
                    "data analysis. Examples: MLAgentBench, "
                    "ScienceAgentBench."
                ),
                maturity=Maturity.EMERGING,
                blocking_issues=[
                    "Limited domain coverage",
                    "No standardized evaluation metrics",
                ],
                key_references=["MLAgentBench (2024)", "ScienceAgentBench (2024)"],
                estimated_timeline="2025-2027",
            ),
            Milestone(
                milestone_id="B2",
                dimension=Dimension.BENCHMARKS,
                title="Full-loop discovery benchmarks",
                description=(
                    "Benchmarks that evaluate the complete discovery "
                    "cycle from problem identification to verified "
                    "conclusion, within specific domains."
                ),
                maturity=Maturity.NASCENT,
                blocking_issues=[
                    "Ground truth requires retrospective validation",
                    "High cost of benchmark construction",
                    "Domain specificity limits generalization",
                ],
                estimated_timeline="2027-2030",
            ),
            Milestone(
                milestone_id="B3",
                dimension=Dimension.BENCHMARKS,
                title="Cross-domain discovery benchmarks",
                description=(
                    "Benchmarks that test transfer of discovery "
                    "capability across scientific domains."
                ),
                maturity=Maturity.NASCENT,
                blocking_issues=[
                    "No formal definition of cross-domain transfer",
                    "Requires multiple domain-specific benchmarks first",
                ],
                estimated_timeline="2029-2033",
            ),
        ])

        # === THEORY ===
        self.milestones.extend([
            Milestone(
                milestone_id="T1",
                dimension=Dimension.THEORY,
                title="Sample complexity of discovery",
                description=(
                    "Formal bounds on experiments needed to identify "
                    "scientific laws within restricted hypothesis classes."
                ),
                maturity=Maturity.NASCENT,
                blocking_issues=[
                    "Requires formal definition of hypothesis classes",
                    "Discovery involves growing hypothesis spaces",
                ],
                estimated_timeline="2027-2032",
            ),
            Milestone(
                milestone_id="T2",
                dimension=Dimension.THEORY,
                title="Domain learnability characterization",
                description=(
                    "Formal measures of how amenable a scientific "
                    "domain is to AI-driven discovery, based on "
                    "structural properties."
                ),
                maturity=Maturity.NASCENT,
                blocking_issues=[
                    "No agreed-upon formalization of 'domain structure'",
                ],
                estimated_timeline="2028-2035",
            ),
        ])

        # === INFRASTRUCTURE ===
        self.milestones.extend([
            Milestone(
                milestone_id="I1",
                dimension=Dimension.INFRASTRUCTURE,
                title="Shared experiment registries",
                description=(
                    "Cross-institution registries where discovery "
                    "agents share experimental results to avoid "
                    "redundant work."
                ),
                maturity=Maturity.NASCENT,
                blocking_issues=[
                    "No standard experiment description format",
                    "IP and competition concerns",
                    "Negative result recording incentives",
                ],
                estimated_timeline="2027-2030",
            ),
            Milestone(
                milestone_id="I2",
                dimension=Dimension.INFRASTRUCTURE,
                title="Discovery artifact standards",
                description=(
                    "Machine-readable formats for discovery outputs "
                    "that enable interoperability between systems."
                ),
                maturity=Maturity.EMERGING,
                blocking_issues=[
                    "Domain-specific standards exist but no cross-domain",
                    "Community coordination challenge",
                ],
                key_references=["CIF, PDB, NetCDF (domain-specific)"],
                estimated_timeline="2026-2029",
            ),
        ])

        # === NORMS ===
        self.milestones.extend([
            Milestone(
                milestone_id="N1",
                dimension=Dimension.NORMS,
                title="AI contribution disclosure standards",
                description=(
                    "Agreed-upon standards for disclosing AI "
                    "contributions to research publications."
                ),
                maturity=Maturity.EMERGING,
                blocking_issues=[
                    "No consensus on granularity of disclosure",
                    "Enforcement mechanisms unclear",
                ],
                key_references=[
                    "ICML 2024 AI disclosure policy",
                    "Nature AI use policy (2024)",
                ],
                estimated_timeline="2025-2027",
            ),
            Milestone(
                milestone_id="N2",
                dimension=Dimension.NORMS,
                title="AI-generated discovery verification norms",
                description=(
                    "Community expectations for independent "
                    "verification of AI-generated scientific claims."
                ),
                maturity=Maturity.NASCENT,
                blocking_issues=[
                    "Cost of independent verification",
                    "Unclear responsibility for verification",
                ],
                estimated_timeline="2027-2030",
            ),
        ])

    def get_status_report(self) -> dict:
        """Generate a summary of roadmap progress."""
        by_dimension = {}
        for dim in Dimension:
            milestones = [
                m for m in self.milestones if m.dimension == dim
            ]
            maturity_counts = {}
            for m in milestones:
                mat = m.maturity.value
                maturity_counts[mat] = maturity_counts.get(mat, 0) + 1
            by_dimension[dim.value] = {
                "n_milestones": len(milestones),
                "maturity_distribution": maturity_counts,
                "blocking_issues": [
                    issue
                    for m in milestones
                    for issue in m.blocking_issues
                ],
            }

        # Overall maturity score (0-4 scale)
        maturity_scores = {
            Maturity.NASCENT: 0,
            Maturity.EMERGING: 1,
            Maturity.DEVELOPING: 2,
            Maturity.ESTABLISHED: 3,
            Maturity.MATURE: 4,
        }
        all_scores = [
            maturity_scores[m.maturity] for m in self.milestones
        ]
        overall = sum(all_scores) / len(all_scores) if all_scores else 0

        return {
            "assessment_date": datetime.now().strftime("%Y-%m"),
            "overall_maturity": round(overall, 2),
            "overall_maturity_label": (
                "nascent" if overall < 0.5
                else "emerging" if overall < 1.5
                else "developing" if overall < 2.5
                else "established" if overall < 3.5
                else "mature"
            ),
            "by_dimension": by_dimension,
            "highest_priority_gaps": [
                m.title
                for m in self.milestones
                if m.maturity == Maturity.NASCENT
            ],
        }

    def save(self, path: str) -> None:
        """Export roadmap for sharing."""
        data = {
            "milestones": [
                {
                    "id": m.milestone_id,
                    "dimension": m.dimension.value,
                    "title": m.title,
                    "description": m.description,
                    "maturity": m.maturity.value,
                    "blocking_issues": m.blocking_issues,
                    "key_references": m.key_references,
                    "estimated_timeline": m.estimated_timeline,
                    "last_assessed": m.last_assessed,
                }
                for m in self.milestones
            ],
        }
        Path(path).parent.mkdir(parents=True, exist_ok=True)
        with open(path, "w") as f:
            json.dump(data, f, indent=2)


# Usage example
if __name__ == "__main__":
    roadmap = DiscoveryAIRoadmap()
    report = roadmap.get_status_report()

    print(f"Overall maturity: {report['overall_maturity_label']}")
    print(f"  Score: {report['overall_maturity']} / 4.0")
    print(f"\nHighest priority gaps:")
    for gap in report["highest_priority_gaps"]:
        print(f"  - {gap}")

    print(f"\nBy dimension:")
    for dim, info in report["by_dimension"].items():
        print(f"  {dim}: {info['maturity_distribution']}")
Listing 58.8: A Discovery AI Roadmap Tracker that monitors progress across benchmarks, theory, infrastructure, and norms. Initialized with the current state of the field (mid-2026), it provides a structured assessment of maturity levels via the get_status_report method and exports milestone data for sharing via save. The tracker is designed for periodic community updates.
Library Shortcut: Roadmap Visualization with Plotly Timeline

The roadmap data structure in Listing 58.8 can be visualized as an interactive Gantt-style timeline using Plotly's timeline charts in approximately 15 lines. Each milestone becomes a bar colored by maturity level, with hover text showing blocking issues and key references. For a static version suitable for publications, Matplotlib's broken_barh provides a similar visualization. The Workbench UI can embed either visualization to give research teams a dashboard view of where the field stands and where their contributions fit.

7. What This Book Has Built, and What Comes Next

This book began with a simple observation: scientific discovery is a search problem (Chapter 1). From that starting point, the book built an increasingly sophisticated account of how AI systems participate in that search: representing knowledge (Chapter 3), reasoning about it (Chapter 4), building software that embodies it (Chapter 9), learning from data (Chapter 26), generating hypotheses (Chapter 39), designing experiments (Chapter 46), and deploying autonomous agents that do all of this in concert (Chapter 53).

The Discovery Workbench that has grown across all 58 chapters is not a finished system. It is a platform: a set of integrated components that a practitioner can assemble, extend, and deploy for their specific research domain. The workbench includes:

The platform's remaining gaps are what this section has mapped: better benchmarks to know when it works, better theory to know why, shared infrastructure for interoperability, and norms for responsible use. No single research group can close these gaps; they demand coordination across computer science, the natural sciences, the social sciences, and science policy.

The field of Discovery AI is, in the terminology of Section 58.1, at approximately Level 3 on the discovery autonomy scale: conditionally autonomous systems that can execute research programs within human-defined boundaries. The path to Level 4 (problem-finding) and beyond is visible but not yet paved. Paving it will require the benchmarks, theory, infrastructure, and norms described in this section. It will require the co-discovery partnerships described in Section 58.2. And it will require practitioners who understand both the capabilities and the limitations of these systems, which is what this book has aimed to provide. In short: The hardest part of building Discovery AI is not the algorithms; it is the agreements.

Research Frontier

Google DeepMind's FunSearch system (Romera-Paredes et al., "Mathematical Discoveries from Program Search with Large Language Models," Nature, 2024) demonstrated that LLMs paired with evolutionary program search can discover novel mathematical constructions that surpass the best known human results, specifically producing new large cap sets (collections of points in a finite geometry where no three points are collinear, a central object in extremal combinatorics). FunSearch goes beyond what this section covers by showing that discovery benchmarks can have objectively verifiable ground truth in mathematical domains: a proposed construction either satisfies the combinatorial bound or it does not, with no ambiguity about evaluation criteria. This points toward mathematics and theoretical computer science as tractable starting domains for the full-loop benchmarks discussed above, because they sidestep the "ground truth is retrospective" problem entirely.

Try It: Build a Mini Discovery Benchmark

Construct a small discovery benchmark for symbolic regression and evaluate a baseline system against it.

  1. Choose five well-known physical laws expressible as single equations (e.g., Ohm's law, ideal gas law, Kepler's third law, the Arrhenius equation, Beer-Lambert law). For each, generate 200 synthetic data points with 5% Gaussian noise using NumPy.
  2. Define a BenchmarkTask for each law: the input context is the noisy dataset (without revealing the law's name), and the ground truth is the symbolic equation.
  3. Implement a naive discovery system using scikit-learn's PolynomialFeatures plus Lasso regression to search for sparse polynomial fits up to degree 4.
  4. Score each recovered equation on three metrics: symbolic accuracy (does it match the true form?), numerical root mean square error (RMSE) on held-out data, and description length (number of non-zero coefficients).
  5. Record which laws the system recovers and which it misses. Analyze why: laws involving transcendental functions (Arrhenius, Beer-Lambert) should be unreachable by polynomial search, illustrating how the choice of hypothesis class bounds what a discovery system can find.
Key Insight: The Future of Discovery Is Neither Fully Human Nor Fully Artificial

The trajectory of Discovery AI does not point toward a future where AI replaces human scientists. Nor does it point toward one where AI remains a passive tool. It points toward a future of genuine cognitive partnership, where the scientific enterprise is conducted by teams of human and artificial intelligences with complementary strengths, governed by norms and institutions that neither could design alone. Building that future is itself a discovery problem, one that will require everything this book has taught.

Exercise 58.3.1

A research team builds a discovery benchmark for drug repurposing. Their benchmark includes 50 tasks where the system receives a disease description and a database of approved drugs, and must rank candidates for repurposing. Ground truth comes from drugs that were historically repurposed successfully (e.g., thalidomide for multiple myeloma, sildenafil for pulmonary hypertension). The team reports that their AI system achieves 72% recall at k=5 on this benchmark.

Identify at least two fundamental limitations of this benchmark design, drawing on the three reasons discussed in this section for why discovery benchmarks are hard to build. Then propose one concrete modification that would partially address each limitation you identified.

Hint

Consider what "72% recall" actually measures here. The ground truth consists entirely of repurposing successes that already happened, so the benchmark tests rediscovery, not discovery (limitation 1 from the text). Also consider whether a drug the system ranks highly but that was never tried could be a true positive that the benchmark scores as a false positive. For your modifications, think about temporal splits and how you might evaluate novelty separately from correctness.

Lab: Mapping a Field's Discovery Maturity

Goal: Use the DiscoveryAIRoadmap framework from Listing 58.8 to assess the discovery infrastructure maturity of a scientific field you know well.

Tools needed: Python 3.10+, the code from Listing 58.8 (copy it into a script), and access to a search engine for surveying the state of your chosen field.

Procedure (20 minutes): (1) Pick a domain (genomics, climate modeling, organic chemistry, or your own research area). (2) Define 6 to 8 milestones across all four dimensions (benchmarks, theory, infrastructure, norms) specific to that domain. For example, in genomics you might add "Shared variant-calling benchmark (Genome in a Bottle)" under benchmarks and "Findable, Accessible, Interoperable, Reusable (FAIR) data principles adoption" under norms. (3) Assign each milestone a maturity level by searching for existing community efforts. (4) Run get_status_report() and compare the overall maturity score to the generic Discovery AI roadmap.

What to vary: Try two domains with different levels of computational infrastructure (e.g., high-energy physics vs. ecology). Compare their maturity profiles.

What to observe: Which dimension (benchmarks, theory, infrastructure, norms) is consistently the weakest across domains? Is the bottleneck technical or social? Fields with mature infrastructure but nascent norms face different risks than fields with the reverse pattern.

Discovery Workbench Connection

The DiscoveryAIRoadmap tracker becomes the Workbench's self-assessment module. It allows a research team to situate their work within the broader field, identify which gaps their contributions address, and track the maturity of the infrastructure they depend on. The roadmap integrates with the Workbench's experiment registry to tag completed projects with the milestones they advance. Over time, this creates an empirical record of how the field is progressing, replacing anecdotal assessments with structured data.

What's Next

This is the final section of the final chapter. If you have followed the arc from Chapter 1: Discovery as Search through these closing pages, you have built a comprehensive understanding of how AI can participate in scientific discovery. The Capstone Projects in Appendix G offer six structured tracks for putting this knowledge into practice. Choose the track closest to your research interests, assemble the relevant Workbench components, and begin discovering. The tools are built. The infrastructure is emerging. The open problems are mapped. What remains is the work.