# AZ-624 — Phase F: wire build_pre_constructed into runtime_root.main() + AC-1..AC-5 verification

**Task**: AZ-624_pre_constructed_phase_f_wire_main
**Name**: AZ-618 Phase F: wire build_pre_constructed into runtime_root.main() + AC-1..AC-5 verification
**Description**: Final / umbrella subtask of AZ-618. Wires `build_pre_constructed` into `runtime_root.main()` and lands the FULL AC suite from the AZ-618 umbrella (AC-1..AC-5), including the Jetson tier-2 verification.
**Complexity**: 2 points
**Dependencies**: AZ-619, AZ-620, AZ-621, AZ-622, AZ-623, AZ-625 (all phases must be in `done/` before this lands; AZ-625 was added 2026-05-19 when the `c5_isam2_graph_handle` ordering work was split out of AZ-623).
**Component**: runtime_root (cross-cutting)
**Tracker**: AZ-624
**Epic**: AZ-602 (parent: AZ-618 umbrella)

## Outcome

- `runtime_root/__init__.py::main()` calls `register_airborne_strategies()` then `pre_constructed = build_pre_constructed(config)` then `compose_root(config, pre_constructed=pre_constructed)`.
- Existing exception block extended to surface `AirborneBootstrapError` cleanly with `EXIT_GENERIC_FAILURE` and a clear operator-facing stderr message (rather than the current implicit traceback).
- New unit test file `tests/unit/runtime_root/test_az618_pre_constructed.py` lands the FULL AC-1..AC-4 suite from the AZ-618 umbrella spec.
- Jetson AC-5 verified via `scripts/run-tests-jetson.sh tests/e2e/replay/test_derkachi_1min.py`.

## Scope

### Included

- 2-line addition in `main()` between `register_airborne_strategies()` and `compose_root(config)`.
- Extension of the `except (ConfigurationError, StrategyNotLinkedError, RuntimeError)` block to surface `AirborneBootstrapError` distinctly.
- New unit test `tests/unit/runtime_root/test_az618_pre_constructed.py` covering AC-1..AC-4 from the umbrella spec.
- Jetson tier-2 run + evidence capture in batch report.

### Excluded

- Any new builders (those live in AZ-619..AZ-623).
- New `BUILD_*` env flags.
- Operator binary's pre_constructed assembly (AZ-591 explicitly deferred that; this remains airborne-only).

## Acceptance Criteria

The full AZ-618 umbrella AC suite plus this subtask's verification gates:

**AC-618-1: `build_pre_constructed(config)` populates every required key**
Given `register_airborne_strategies()` has run
And a `Config` selecting every component's default strategy
When `build_pre_constructed(config)` is called
Then the returned dict contains exactly `set.union(*AIRBORNE_REQUIRED_PRE_CONSTRUCTED_KEYS.values())`
And no key maps to `None`.

**AC-618-2: `compose_root(config, pre_constructed=...)` reaches takeoff**
Given `register_airborne_strategies()` has run
And `pre_constructed = build_pre_constructed(config)` for the default config
When `compose_root(config, pre_constructed=pre_constructed)` runs
Then it returns a `RuntimeRoot` whose `components` dict contains all 7 registered slots without raising `AirborneBootstrapError`.

**AC-618-3: `BUILD_*` flag mismatch surfaces a clear error**
Given a config selecting a strategy whose `BUILD_*` flag is OFF
When `build_pre_constructed(config)` is called
Then it raises `AirborneBootstrapError` whose message names both the missing flag and the consuming component.

**AC-618-4: `runtime_root.main()` end-to-end exit codes**
Given a minimal in-process Config selecting all-defaults
When `main(config)` is called with every required `BUILD_*` flag ON
Then it returns 0 (success).
And when a single required infra dep is forcibly unavailable
Then it returns `EXIT_GENERIC_FAILURE` (1) and stderr contains the `airborne_bootstrap:` prefix with the missing key + consuming component.

**AC-618-5 / AC-624.tier2: Jetson tier-2 e2e replay tests cross compose_root.ready**
Given the AZ-624 changes are landed and AZ-619..AZ-623 are in `done/`
When the Jetson tier-2 e2e harness is invoked (`scripts/run-tests-jetson.sh tests/e2e/replay/test_derkachi_1min.py`)
Then each test crosses BOTH `replay.compose_root.ready` AND `replay.input.frame_emitted` log lines.
And the batch report's `Tier-2 evidence:` field captures the terminal log path, JetPack version, and run timestamp per `_docs/02_document/tests/tier2-jetson-testing.md`.

**AC-624.local**: full Tier-1 pytest suite green after the wire-in.

## Constraints

- This subtask MUST NOT touch any per-component factory signature.
- MUST NOT introduce new `BUILD_*` env flags.

## Evidence

- Umbrella spec: `_docs/02_tasks/todo/AZ-618_airborne_bootstrap_pre_constructed.md` (AC-1..AC-5 narrative)
- Tier-2 testing policy: `_docs/02_document/tests/tier2-jetson-testing.md`
- Current incomplete `main()`: `src/gps_denied_onboard/runtime_root/__init__.py:636`
- Existing replay-mode merge in `compose_root`: `src/gps_denied_onboard/runtime_root/__init__.py:419-484`
