"""Merkle-AGI substrate primitives — paper-spec'd cryptographic + decision
building blocks that future substrate papers (v7 plastic-training, v8
selection/consensus, v9 falsification controller, …) require.

Why one flat dir instead of paper-version subdirs: the substrate-paper
version (v7 / v8 / v9) and the live SQLite schema version (v9.8) are
two unrelated numbering schemes that share decimals. Version-prefixed
dirs (``arborist/v7/``, ``arborist/v8/``) made readers ask "is this
schema-v7 or paper-v7?" and made onboarding harder. Topic-named
``substrate/`` decouples the namespace from the paper version
entirely.

Each module names the paper section it implements + the ticket that
owns its design and acceptance criteria:

- :mod:`arborist.substrate.anchor_prg` — HMAC-SHA-512 anchor map
  φ_PRG (v7 plastic-training spec § 9.10; ticket #000035 + #000018
  M1 mitigation).
- :mod:`arborist.substrate.fork_score` — pure ScoredFork decision
  function over (parent, child) BatteryResult bundles (v8 selection
  / consensus paper; ticket #000012 Phase 1a).
- :mod:`arborist.substrate.weights` — :class:`WeightSet` dataclass +
  :data:`DEFAULT_WEIGHTS` for the fork-score function above.

Future substrate primitives that arrive when their paper specs land
(v9 controller, v7-W frontier kernels, etc.) join this dir.
``arborist.world`` stays separate because its planned shape includes
its own subdirs (``world/pi_star/``, ``world/frontier/``,
``world/adapters/``) — that's a substrate package, not a primitive.
"""

from __future__ import annotations

from arborist.substrate.fork_score import (
    SIGNAL_FLOOR,
    ScoredFork,
    bench_result_to_metrics,
    fork_score,
)
from arborist.substrate.weights import DEFAULT_WEIGHTS, WeightSet

__all__ = [
    "DEFAULT_WEIGHTS",
    "SIGNAL_FLOOR",
    "ScoredFork",
    "WeightSet",
    "bench_result_to_metrics",
    "fork_score",
]
