mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-21 21:41:12 +00:00
c3639a5d1c
Wire register_airborne_strategies + build_pre_constructed + compose_root(config, pre_constructed=...) into runtime_root.main(). The existing exception block now catches AirborneBootstrapError distinctly before the broader (ConfigurationError, StrategyNotLinkedError, RuntimeError) clause so the operator-facing "airborne_bootstrap:" prefix carried by every bootstrap error reaches stderr cleanly with EXIT_GENERIC_FAILURE rather than getting absorbed into a generic backtrace. This closes the AZ-618 umbrella: AZ-619..AZ-623 + AZ-625 had built each pre_constructed key; this batch lands the integration that the production main() actually invokes them. Both the live gps-denied-onboard and replay gps-denied-replay binaries dispatch through this main() per ADR-011, so both reach takeoff with pre_constructed populated end-to-end. Tests: tests/unit/runtime_root/test_az618_pre_constructed.py adds 6 tests covering AC-618-1..AC-618-4 + AZ-624 local handler-ordering regression guard. The strategy factories are stubbed at the airborne_bootstrap module boundary so the test exercises the integration seam without standing up gtsam / FAISS / TensorRT / PyTorch / OpenCV at unit-test scope. AC-618-5 (Jetson tier-2 e2e) is BLOCKED on operator-supplied hardware evidence: scripts/run-tests-jetson.sh tests/e2e/replay/test_derkachi_1min.py must run on Jetson Orin Nano (JetPack 6.2.2+b24) and the terminal log path + JetPack version + run timestamp captured per _docs/02_document/tests/tier2-jetson-testing.md. Quality gates: ruff format clean, ruff lint clean, 6/6 new umbrella tests pass, 261/261 runtime_root + c5_state regression suite passes, 25/25 test_az401_compose_root_replay regression passes, full Tier-1 unit suite 2150/2151 passes (1 unrelated pre-existing failure: c12_operator_orchestrator subprocess cold-start NFR fails on Mac dev host's Python startup ~700 ms; not regressed by AZ-624). Code review verdict PASS (1 Low finding; full report in _docs/03_implementation/reviews/batch_96_review.md). Archives AZ-624 task spec + AZ-618 umbrella reference to done/. Co-authored-by: Cursor <cursoragent@cursor.com>
7.5 KiB
7.5 KiB
Code Review Report
Batch: 96
Tasks: AZ-624 (Phase F of AZ-618: wire build_pre_constructed into runtime_root.main() + AC-1..AC-5 verification)
Date: 2026-05-19
Verdict: PASS
Phase 1: Context
Read in this review window:
_docs/02_tasks/todo/AZ-624_pre_constructed_phase_f_wire_main.md(task spec; ACs)_docs/02_tasks/todo/AZ-618_airborne_bootstrap_pre_constructed.md(umbrella; canonical AC-1..AC-5)_docs/03_implementation/batch_95_cycle1_report.md(immediate predecessor — confirms AZ-625 unblocked AZ-624)src/gps_denied_onboard/runtime_root/__init__.py(main() before + after; existing exception block; compose_root signature)src/gps_denied_onboard/runtime_root/airborne_bootstrap.py(build_pre_constructed,register_airborne_strategies,AirborneBootstrapError)tests/unit/test_az401_compose_root_replay.py(env / fixture pattern reused by the new umbrella test file)
Phase 2: Spec Compliance
| AC | Status | Test | Notes |
|---|---|---|---|
| AC-618-1 (every required key populated, no None) | Covered | test_ac_618_1_build_pre_constructed_populates_every_required_key |
Asserts the union of all AIRBORNE_REQUIRED_PRE_CONSTRUCTED_KEYS rows is a subset of the returned dict + every key is non-None. |
| AC-618-2 (compose_root reaches takeoff with 7 slots) | Covered | test_ac_618_2_compose_root_reaches_takeoff_with_all_seven_slots |
Stubs the 7 strategy factories the airborne wrappers delegate to + builds a 7-block Config; asserts the returned RuntimeRoot.components contains all 7 slot names. |
| AC-618-3 (BUILD-flag mismatch raises named error) | Covered | test_ac_618_3_build_flag_off_raises_named_error_with_consuming_component |
Drops the autouse _build_c7_inference stub, forces build_inference_runtime to raise RuntimeNotAvailableError, asserts the wrapping error message names c7_inference + both airborne C7 BUILD flags + the consuming component slug c2_vpr. |
| AC-618-4 (main() exit codes + stderr prefix) | Covered | test_ac_618_4_main_returns_zero_on_success + test_ac_618_4_main_returns_generic_failure_with_airborne_bootstrap_prefix + test_ac_624_local_main_distinct_handler_does_not_double_print |
Three tests: success path returns 0 with no stderr; forced bootstrap failure returns EXIT_GENERIC_FAILURE and stderr contains the airborne_bootstrap: prefix; the dedicated handler does not double-print (regression guard for the catch ordering). |
| AC-618-5 / AC-624.tier2 (Jetson tier-2 e2e) | BLOCKED | n/a (out-of-process) | Requires scripts/run-tests-jetson.sh tests/e2e/replay/test_derkachi_1min.py on real Jetson Orin Nano hardware (JetPack 6.2.2+b24). Cannot run from the Mac dev host. Operator-supplied evidence required: terminal log path + JetPack version + run timestamp. |
| AC-624.local (full Tier-1 pytest green) | Pass with 1 unrelated pre-existing failure | full tests/unit/ suite |
2150 passed, 85 skipped (environment-gated: GPU / Docker / Jetson / TensorRT). One unrelated failure: tests/unit/c12_operator_orchestrator/test_cli_console_script.py::TestConsoleScript::test_cold_start_under_500ms_p99 — Mac dev host's Python subprocess startup is ~700 ms, exceeding the 500 ms NFR. This test exists in a component (c12_operator_orchestrator) AZ-624 does NOT modify or depend on; failure is a host-performance artifact, not a regression. Reported to the user; not blocking AZ-624. |
Constraint compliance:
- "MUST NOT touch any per-component factory signature" →
compose_rootandbuild_pre_constructedsignatures unchanged; only the body ofmain()was extended. ✓ - "MUST NOT introduce new BUILD_* env flags" → no new flag introduced. ✓
- "All changes confined to
runtime_root/__init__.py+runtime_root/airborne_bootstrap.py+ new test file" → diff scope respected. ✓
Phase 3: Code Quality
1 finding — Low / Style; not blocking:
- F1 (Low / Style): the dedicated
except AirborneBootstrapErrorhandler inmain()produces stderr identical to the broader(ConfigurationError, StrategyNotLinkedError, RuntimeError)clause that already exists (sinceAirborneBootstrapErrorextendsRuntimeErrorand the message itself carries theairborne_bootstrap:prefix). The dedicated clause is documentation-as-code: it makes the error path traceable in code review and locks the surfacing format against future broader-clause edits. No functional difference at runtime today; intentional. The inline comment captures the rationale.
Phase 4: Security
No findings.
- No SQL, no command exec, no
eval/exec. - No new external input ingress.
- Error messages include the missing key + flag + component slug — no secret leakage (the bootstrap error format was already audited in AZ-619..AZ-625).
Phase 5: Performance
No findings.
- The
build_pre_constructed(config)call is a one-shot bootstrap; not in any hot path. - The new exception handler in
main()is exercised only on a failure path; zero cost on the success path.
Phase 6: Cross-Task Consistency
Consistent with the AZ-619..AZ-625 batch pattern:
- The umbrella test file uses the same env / config / monkeypatch pattern as the per-phase test files (
test_az619..test_az625). - The
_stub_heavy_buildershelper mirrors the autouse fixtures from each phase test (one explicit stub per documented_build_*builder). - The
_stub_strategy_factorieshelper mirrors the strategy-factory monkeypatch pattern fromtest_az401_compose_root_replay.py's_fake_replay_components_factory— both replace heavy seams in the airborne_bootstrap namespace so wrappers return MagicMock sentinels.
The 1-line addition to build_pre_constructed-callers (none beyond main()) is consistent: the function's contract has not changed since AZ-619 — main() is the first non-test caller.
Phase 7: Architecture Compliance
- Layer direction:
runtime_root/__init__.py::main()(Layer 5 — entry / composition) imports fromruntime_root.airborne_bootstrap(same Layer 5). ✓ - Public API respect: the imports at the top of
main()'s function body (AirborneBootstrapError,build_pre_constructed,register_airborne_strategies) are all inairborne_bootstrap.__all__. ✓ - No new module cycles introduced. The
runtime_root/__init__.py→runtime_root/airborne_bootstrap.pyedge already existed. - No duplicate symbols across components.
- No cross-cutting concerns re-implemented locally.
Findings
| # | Severity | Category | File:Line | Title |
|---|---|---|---|---|
| F1 | Low | Style | src/gps_denied_onboard/runtime_root/__init__.py:680 |
Dedicated AirborneBootstrapError handler is documentation-as-code |
Finding Details
F1: Dedicated AirborneBootstrapError handler is documentation-as-code (Low / Style)
- Location:
src/gps_denied_onboard/runtime_root/__init__.py:680 - Description: At runtime, the dedicated handler produces stderr identical to the broader
RuntimeErrorclause (the bootstrap error message itself carries theairborne_bootstrap:prefix). The dedicated clause makes the error path traceable in code review and locks the surfacing format. - Suggestion: leave as-is — the inline comment captures the rationale; the regression guard test (
test_ac_624_local_main_distinct_handler_does_not_double_print) ensures the catch ordering is not silently broken. - Task: AZ-624
Verdict Logic
- 0 Critical, 0 High → not FAIL.
- 0 Medium → not PASS_WITH_WARNINGS for medium.
- 1 Low → still PASS overall.
Verdict: PASS (with one out-of-scope note: AC-618-5 / AC-624.tier2 BLOCKED on Jetson hardware evidence; user must supply).