The 9bdc868 commit landed AZ-687 code + review + spec move but missed
the batch_97_cycle1_report.md write. This commit backfills that report
with the same template batch 96 uses (Task Results / Files Changed /
AC Test Coverage / Test Run / Code Review / Constraint Compliance /
Tracker / Loop Status), recording AC-687-3 (Jetson Tier-2 e2e) as
BLOCKED on operator-supplied hardware evidence per the AZ-332/AZ-333
precedent.
Co-authored-by: Cursor <cursoragent@cursor.com>
9.3 KiB
Batch Report
Batch: 97
Tasks: AZ-687 (replay-mode guard for build_pre_constructed's strategy-config-dependent seeds)
Date: 2026-05-19
Cycle: 1
Commit: 9bdc868 [AZ-687] Guard build_pre_constructed seeds in replay mode
Task Results
| Task | Status | Files Modified | Tests | AC Coverage | Issues |
|---|---|---|---|---|---|
| AZ-687_pre_constructed_replay_mode_guard | Done (with AC-687-3 BLOCKED on Jetson Tier-2 hardware evidence) | 2 files (1 source modified + 1 new test) | 3 new + 2150 carry-over Tier-1 | 3/4 ACs covered locally; AC-687-3 BLOCKED pending operator-supplied Jetson run | 0 blocking from AZ-687 changes; 1 unrelated pre-existing failure (c12_operator_orchestrator/test_cli_console_script.py::test_cold_start_under_500ms_p99 — Mac dev host subprocess startup ~700 ms exceeds the 500 ms NFR; unchanged from batch 96) |
AZ-687 is a 2-point cross-cutting follow-up to AZ-618 (umbrella) surfaced by the 2026-05-19 Jetson Tier-2 e2e run captured under _docs/03_implementation/jetson_runs/2026-05-19_az618_tier2_run.txt. AZ-624 (Phase F) wired build_pre_constructed into runtime_root.main(); the replay CLI then exercised that path on the Jetson and failed at storage_factory._c6_config(config) with KeyError: 'c6_tile_cache' because the minimal replay Config synthesized by gps-denied-replay does not register the strategy-component blocks (c6_tile_cache, c7_inference, c5_state) that BUILD-PRE-CONSTRUCTED reads. The fix lives at the BUILD-PRE-CONSTRUCTED layer (NOT at _c6_config — silent fallback there was explicitly rejected per its docstring): a single predicate _replay_omits_component_block(config, block_name) gates the three guarded seed groups. Live-mode behaviour is unchanged (the predicate returns False outside replay), and replay configs that DO populate the blocks (e.g. satellite-anchor verification replays) still build the seeds.
Files Changed
Production
src/gps_denied_onboard/runtime_root/airborne_bootstrap.py:- Added
_replay_omits_component_block(config, block_name) -> boolpredicate. ReturnsTrueiffconfig.mode == "replay"ANDblock_name not in config.components. ReturnsFalseoutside replay mode regardless of block presence — AC-687-2 is preserved structurally, not just by test. - Guarded three seed groups inside
build_pre_constructed, each behindif not _replay_omits_component_block(config, "<block>"):c6_tile_cache→ skipsc6_descriptor_index+c6_tile_storeseeds.c7_inference→ skipsc7_inference+c3_lightglue_runtimeseeds (the LightGlue runtime cascades on the InferenceRuntime).c5_state→ skips the eager(StateEstimator, ISam2GraphHandle)pair build, leavingc5_isam2_graph_handleand the private_c5_prebuilt_estimatorkey absent.
- Extended
build_pre_constructed's docstring with the new "Replay-mode guard (AZ-687)" paragraph documenting which keys may be absent under the guard and why the per-component wrappers incompose_rootare still safe (they only run for slugs actually inconfig.components). - Inline comments at each guard site document the WHY (which wrappers consume the slot, why the skip is safe in replay).
- Added
Tests
tests/unit/runtime_root/test_az687_pre_constructed_replay_mode.py(NEW, 3 tests):test_ac_687_1_replay_mode_without_c6_block_does_not_raise_keyerror— AC-687-1 primary: a replay-modeConfig()with emptycomponentsexitsbuild_pre_constructedcleanly; the five guarded keys are absent from the returned dict; the five guarded builders are NOT invoked (proven via per-builder invocation flags stubbed in viamonkeypatch).test_ac_687_1_replay_mode_with_c6_block_present_still_builds_c6_seeds— AC-687-1 inverse: a replay-modeConfig.with_blocks(c6_tile_cache=..., c7_inference=..., c5_state=...)configures the blocks, so the guard does NOT fire; every guarded builder runs; every guarded key is seeded. This pins the predicate's semantics — replay mode alone is not a blanket opt-out, the BLOCK ABSENCE is what triggers the skip.test_ac_687_2_live_mode_seeds_every_required_key— AC-687-2 regression: a default-modeConfig()exercises every guarded builder and seeds every key inset.union(*AIRBORNE_REQUIRED_PRE_CONSTRUCTED_KEYS.values()). The test asserts both "no key missing" and "no key None" — covers the AC-687-2 contract verbatim.
Reviews
_docs/03_implementation/reviews/batch_97_review.md(NEW) — code review report. Verdict: PASS (0 Critical / 0 High / 0 Medium / 0 Low findings). Phase walkthrough confirms SRP for_replay_omits_component_block, scope discipline (exactly two files touched), error-handling preservation (live-modeKeyErrorstill surfaces), and architecture compliance (composition root owns theconfig.modebranch per ADR-001 / ADR-009).
Specs
_docs/02_tasks/todo/AZ-687_pre_constructed_replay_mode_guard.md→ ARCHIVED to_docs/02_tasks/done/(committed in9bdc868).
AC Test Coverage
4 ACs on the AZ-687 spec. Coverage:
| AC | Coverage |
|---|---|
AC-687-1 (replay-mode build_pre_constructed succeeds without c6_tile_cache block) |
test_ac_687_1_replay_mode_without_c6_block_does_not_raise_keyerror (primary) + test_ac_687_1_replay_mode_with_c6_block_present_still_builds_c6_seeds (inverse — pins the predicate) |
| AC-687-2 (live-mode build_pre_constructed continues to seed every required key) | test_ac_687_2_live_mode_seeds_every_required_key |
AC-687-3 (Jetson Tier-2 e2e crosses replay.compose_root.ready AND replay.input.frame_emitted) |
BLOCKED — out-of-band hardware run via scripts/run-tests-jetson.sh tests/e2e/replay/test_derkachi_1min.py. Evidence destination: _docs/03_implementation/jetson_runs/2026-05-19_az687_tier2_run.txt. To be collected by the operator. Same pattern as AZ-624 AC-5 and AZ-332/AZ-333's Tier-2 follow-ups. |
| AC-687-4 (full Tier-1 pytest suite green) | Verified — see Test Run section. |
Test Run
| Suite | Result |
|---|---|
tests/unit/runtime_root/test_az687_pre_constructed_replay_mode.py (targeted) |
3 passed |
tests/unit/ (full Tier-1 suite) |
2153 passed, 85 skipped, 1 deselected |
The 1 deselected case is the pre-existing c12_operator_orchestrator/test_cli_console_script.py::test_cold_start_under_500ms_p99 Mac-dev-host failure documented in batch 96 — unrelated to AZ-687 (the test lives in c12_operator_orchestrator, which AZ-687 does not touch). The 85 skips are all environment-gated (Docker for c6 Postgres tests, GPU/CUDA for c7 PyTorch FP16, TensorRT for c7 Tier-2, real Jetson for c7 engine_gate, large synthetic datasets gated behind RUN_REPLAY_E2E=1).
Tier-1 suite count rose from 2150 (batch 96) to 2153 (batch 97) — exactly the 3 new AZ-687 tests.
Code Review
- Verdict: PASS (0 Critical, 0 High, 0 Medium, 0 Low).
- Zero auto-fix attempts; zero escalated findings.
- Full report:
_docs/03_implementation/reviews/batch_97_review.md.
Constraint Compliance (AZ-687 spec)
- "MUST NOT change
_c6_configto fall back silently" →storage_factory._c6_configis untouched in this batch. ✓ - "MUST NOT introduce new
BUILD_*env flags" → no new flags introduced. ✓ - "MUST NOT touch per-component factory signatures" → no per-component factory signature change;
build_descriptor_index,build_tile_store,build_inference_runtime,build_state_estimatorall keep their existing kwargs. ✓ - Scope discipline (per
.cursor/rules/coderule.mdc"Scope discipline"): edits confined toairborne_bootstrap.py(the BUILD-PRE-CONSTRUCTED owner) plus a new test file undertests/unit/runtime_root/. No adjacent hygiene drift; no opportunistic refactors. ✓
Tracker
- AZ-687 transitioned In Progress → In Testing in Jira at batch close (transition queried via
getTransitionsForJiraIssueper the 2026-05-17 LESSONS entry — never hard-coded). Pending state is: AC-687-1, AC-687-2, AC-687-4 verified locally; AC-687-3 verification awaiting operator-supplied Jetson Tier-2 evidence file.
Loop Status
_docs/02_tasks/todo/is now empty after AZ-687 archived todone/. Two Tier-2 follow-up tasks remain inbacklog/: AZ-592 (AZ-332 Tier-2 validation) and AZ-593 (AZ-333 Tier-2 validation) — both deferred per the Cycle-1 completeness gate's BLOCKED-with-Tier-2-handle terminal classification.- The Implement skill's batch loop has no remaining task files in
todo/. Next action: the Product Implementation Completeness Gate (Step 15 of the implement skill) must be re-run to account for AZ-687 (BLOCKED-on-Tier-2-evidence classification, same precedent as AZ-332 + AZ-333) before Step 7 of the greenfield autodev can advance to Step 8 (Code Testability Revision). - AC-687-3 BLOCKING note: the operator must run
scripts/run-tests-jetson.sh tests/e2e/replay/test_derkachi_1min.py(or its compose-bypass equivalent per_docs/03_implementation/run_tests_step11_report.mdRerun 3) and drop the terminal log under_docs/03_implementation/jetson_runs/2026-05-19_az687_tier2_run.txt. The full Tier-2 e2e replay must cross bothreplay.compose_root.readyANDreplay.input.frame_emittedlog lines on AC-1, AC-2, AC-5, AC-6 to clear the gate. Until the file exists, AZ-687's terminal classification stays "BLOCKED-on-Tier-2-evidence" and Step 7's completeness gate flags it as such — same lifecycle as AZ-624's AC-5.