Files
gps-denied-onboard/_docs/03_implementation/batch_97_cycle1_report.md
T
Oleksandr Bezdieniezhnykh 2551829b98 [AZ-687] [autodev] Backfill batch 97 cycle1 report
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>
2026-05-19 12:34:44 +03:00

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) -> bool predicate. Returns True iff config.mode == "replay" AND block_name not in config.components. Returns False outside 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 behind if not _replay_omits_component_block(config, "<block>"):
      • c6_tile_cache → skips c6_descriptor_index + c6_tile_store seeds.
      • c7_inference → skips c7_inference + c3_lightglue_runtime seeds (the LightGlue runtime cascades on the InferenceRuntime).
      • c5_state → skips the eager (StateEstimator, ISam2GraphHandle) pair build, leaving c5_isam2_graph_handle and the private _c5_prebuilt_estimator key 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 in compose_root are still safe (they only run for slugs actually in config.components).
    • Inline comments at each guard site document the WHY (which wrappers consume the slot, why the skip is safe in replay).

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-mode Config() with empty components exits build_pre_constructed cleanly; 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 via monkeypatch).
    • test_ac_687_1_replay_mode_with_c6_block_present_still_builds_c6_seeds — AC-687-1 inverse: a replay-mode Config.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-mode Config() exercises every guarded builder and seeds every key in set.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-mode KeyError still surfaces), and architecture compliance (composition root owns the config.mode branch 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 in 9bdc868).

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_config to fall back silently" → storage_factory._c6_config is 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_estimator all keep their existing kwargs. ✓
  • Scope discipline (per .cursor/rules/coderule.mdc "Scope discipline"): edits confined to airborne_bootstrap.py (the BUILD-PRE-CONSTRUCTED owner) plus a new test file under tests/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 getTransitionsForJiraIssue per 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 to done/. Two Tier-2 follow-up tasks remain in backlog/: 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.md Rerun 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 both replay.compose_root.ready AND replay.input.frame_emitted log 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.