# Batch 104 — Cycle 3 — AZ-777 Phase 1 **Date**: 2026-05-21 **Tasks**: AZ-777 Phase 1 (e2e-runner wire + C11 contract adapt + smoke test). **Story points**: 8 (explicit override; see decision log). **Jira status**: AZ-777 → still `In Progress` — Phase 1 of 5 done; STOP gate before Phase 2. ## What shipped The Jetson e2e harness now consumes the **real** parent-suite `satellite-provider` .NET service over its compose-DNS name + self-signed dev TLS cert + Bearer JWT auth. C11's `HttpTileDownloader` has been adapted to the AZ-505 v1.0.0 `tile-inventory.md` contract — bulk POST inventory lookup keyed by slippy-map (z,x,y) coords, plus per-tile GET via `/tiles/{z}/{x}/{y}`. A Tier-2 smoke test exercises the wire end-to-end against the running service. This batch closes the first of AZ-777's five explicit STOP-gated phases. Phases 2–5 remain on the to-do queue: - Phase 2 — Derkachi tile catalog seed via `POST /api/satellite/request` (CC-BY basemap source, license attribution baked in). - Phase 3 — replace the placeholder `operator_pre_flight_setup` fixture with a real C10 + C11 driver that yields a `PopulatedC6Cache`. - Phase 4 — un-xfail the Tier-2 Derkachi AC-3 + AZ-699 verdict tests. - Phase 5 — extend the replay-protocol / architecture / Derkachi README docs. ## Files changed Production (1): - `src/gps_denied_onboard/components/c11_tile_manager/tile_downloader.py` Tests (3): - `tests/unit/c11_tile_manager/test_tile_downloader.py` (rewritten; 14 AC tests; all PASS) - `tests/e2e/satellite_provider/__init__.py` (new) - `tests/e2e/satellite_provider/test_smoke.py` (new; 2 tier2 tests) Compose / env (2): - `docker-compose.test.jetson.yml` - `.env.test.example` Tooling (2): - `scripts/mint_dev_jwt.py` (new) - `pyproject.toml` (added `pyjwt>=2.8,<3.0` to dev extras) Tracker docs (3): - `_docs/02_tasks/_dependencies_table.md` (AZ-777 5→8pt) - `_docs/03_implementation/reviews/batch_104_review.md` (new) - `_docs/03_implementation/batch_104_cycle3_report.md` (this file) ## AC coverage | AC | Phase 1 portion satisfied? | Evidence | |----|----------------------------|----------| | AC-1 (compose lints; depends_on satellite-provider) | ✅ | `docker compose -f docker-compose.test.jetson.yml config` exits 0 with the new env block. | | AC-2 unit (`_do_enumerate` POST inventory + `_download_one_tile` slippy-map GET) | ✅ | `tests/unit/c11_tile_manager/test_tile_downloader.py` 14/14 PASS. | | AC-2 live (Bearer-authenticated round-trip vs. running service) | ⏸ | `tests/e2e/satellite_provider/test_smoke.py` is in place; runs next time the Jetson harness fires. | | AC-3..6 | ⏳ | Out of scope (Phases 2–5). | ## Test run results ``` $ python -m pytest tests/unit/c11_tile_manager/ -v --tb=short ============================== 58 passed in 3.99s ============================== $ python -m pytest tests/unit/runtime_root/ tests/unit/c11_tile_manager/ -v --tb=short ============================= 113 passed in 3.68s ============================== $ python -m pytest tests/e2e/satellite_provider/test_smoke.py -v --tb=short ============================== 2 skipped in 0.68s ============================== (skip reason: AZ-777 satellite-provider smoke gated by RUN_REPLAY_E2E=1) ``` Suite-wide test run is deferred to the end of the AZ-777 implementation phase per the iterative-skill exception in `.cursor/rules/coderule.mdc` — Phase 1 is a batch, not the end of implementation. The two test trees that depend on the modified code (`tests/unit/c11_tile_manager/` and `tests/unit/runtime_root/`) are green. ## Code review See `_docs/03_implementation/reviews/batch_104_review.md` — **verdict: PASS_WITH_WARNINGS**. Three findings (1 Medium Architecture, 1 Medium Maintainability, 1 Low Maintainability); all deferred to later AZ-777 phases or future tuning with clear ownership. No Critical or High findings. ## Risks acknowledged on this batch - **TLS_INSECURE not in production code path yet** — only the smoke test honours `SATELLITE_PROVIDER_TLS_INSECURE`. Phase 3 (the real `operator_pre_flight_setup` fixture) is the first production-ish consumer of `HttpTileDownloader`; it MUST plumb the flag through. Flagged as F1 in the batch review. - **`_DEFAULT_ESTIMATED_TILE_BYTES = 50 KiB`** — conservative for CARTO Voyager basemap; may under-reserve for UAV-uploaded tiles. Acceptable for Phase 1; revisit in Phase 5. Flagged as F2. - **Smoke test passes when catalog is empty** — by design; exercises the wire pre-Phase-2 and tightens automatically once Phase 2 seeds tiles. Flagged as F3. ## STOP gate This batch closes Phase 1 of AZ-777's 5-phase plan. The next phase (Derkachi tile catalog seed) needs operator alignment on the imagery source (CARTO Voyager Basemap proposed in the spec) and on the bbox / zoom-range envelope. Pause for user decision before Phase 2.