# C16 — Engine / project separation; three-tier node reuse: history > FROZEN HISTORICAL RECORD. Each block below was true as of its cycle/date > stamp and may be superseded; this file is NOT current truth and NOT a > grounding surface. Current contract: > [c16-engine-project-split.md](c16-engine-project-split.md). **Realization (cycle 0079, #136 — the analysis leaf becomes its own crate).** The trading-domain **analysis** layer — the post-run reductions that are pure functions of a run's recorded data (`RunMetrics`, `RMetrics`, the R reduction `summarize_r` / `r_metrics_from_rs`, the position-event table `PositionEvent` / `PositionAction` / `derive_position_events`, and the multiple-comparison hurdle math `inv_norm_cdf` / `expected_max_of_normals`) — is extracted out of `aura-engine`'s `report` module into a dedicated **`aura-analysis`** crate (deps: `aura-core` + `serde` only; `serde_json` is a dev-dependency, test-only). This sharpens the engine↔domain seam: the run loop's crate no longer *defines* the trading metrics — it `pub use`-re-exports them for source compatibility this cycle, and still hosts the trace-coupled `summarize`, `RunReport`, `RunManifest`, and the columnar trace utils. The non-node engine-workspace crates are now `aura-engine` (run loop), `aura-cli` (`aura` binary), `aura-ingest` (ingestion edge), `aura-composites` (composite-builder convenience layer), and `aura-analysis` (post-run domain reductions + selection provenance). Behaviour-preserving (C1): every serde shape is byte-identical (C18 goldens green). **Realization (cycle 0080, #136 — engine-side extraction complete).** The last trading-domain types still *defined* in `aura-engine`'s `report` module — the selection-provenance types `FamilySelection` / `SelectionMode` — also move to `aura-analysis` (the only non-cyclic home: `RunManifest.selection` needs the type and the engine already depends on `aura-analysis`; the registry/CLI reach them unchanged via the re-export). Behaviour-preserving (C1; suite 665/0). **Settled (2026-06-27, user-ratified in the #136 thread):** the `aura-registry` `Metric` / `metric_cmp` / deflation vocabulary **stays in the registry by design** — the registry is the trading *selection* layer, not the domain-free engine, and its deflation statistics branch irreducibly on metric identity (R-bootstrap vs. `total_pips` dispersion floor); forcing genericity would be a one-implementor abstraction. *(Superseded 2026-07-20: measurement's IC became the second implementor — #290 — and the vocabulary moved behind the `MetricVocabulary` trait supplied by the outer rungs; see the C28 #147 disposition.)* **Deferred to the World / C21 layer (explicitly *not* #136):** making `RunReport` generic over a metric type and turning the orchestration/registry layer into a reusable domain-agnostic substrate — until then `RunReport` / `RunManifest` / `summarize` stay trace-coupled in the engine. **Realization (cycle 0107, #198 — the campaign-execution leaf).** The non-node engine workspace gains **`aura-campaign`**: campaign-execution *semantics* (cell enumeration, preflight, gate evaluation, winner selection, walk-forward rolling, realization assembly — see C18) as a leaf library crate whose deps deliberately exclude `aura-ingest` / `aura-std` / `aura-composites`; harness construction and data binding enter only through the one-method `MemberRunner` seam, so consumers (the `aura` CLI today; the playground and tests tomorrow) bind their own runners while the semantics live here once. It is explicitly NOT C21's World (a project-side program): it realizes one campaign document and owns no topology, no data sources, no UI. **Realization (2026-07-12 — wiring-only tier, #241).** The smallest project is now data-only: `Aura.toml` + `blueprints/` + `runs/`, no crate. The load boundary tier-selects (a `[nodes]` pointer list in `Aura.toml` → load that crate; a root `Cargo.toml` → the pre-#241 native project, unchanged; neither → std-vocabulary-only). `aura new` scaffolds the data-only tier; `aura nodes new` scaffolds a node crate **beside** the project and attaches it — the visible role-2 switch (C25 role model). Provenance widened additively: a data-only run stamps commit-only. Invariant 9's "a project is always a Rust crate" was deliberately amended (user decision, 2026-07-12).