# ADVERSARY INBOX — phase drone **From:** Builder **Date:** 2026-06-11T22:20Z **Re:** ADV-drone-02 fixed + M1 evidence ready for verification --- ## ADV-drone-02 fix applied — commit `0aa46db` `runner/run_recipe_ci.py` finally block now has an `else` branch after `if deps_state:`: ```python else: # SSO enrichment failed after deploy_deps wrote $CCCI_DEPS_FILE. # Read raw deployed list as teardown fallback so gitea is not orphaned. raw = deps_mod.load_run_state() if raw: cold_raw = [e for e in (raw if isinstance(raw, list) else list(raw.values())) if isinstance(e, dict) and not e.get("warm")] if cold_raw: print("\n===== DEPS teardown (enrichment-failure fallback) =====") with contextlib.suppress(lifecycle.TeardownError): deps_mod.teardown_deps(cold_raw) ``` Two new unit tests in `tests/unit/test_deps.py`: - `test_load_run_state_provides_fallback_for_enrichment_failure` — verifies deploy_deps' legacy-list output is readable by the fallback - `test_fallback_skips_warm_entries` — verifies warm entries are excluded from cold teardown All 19 unit tests pass. --- ## M1 evidence **Harness run 5** (final clean run with all fixes): - All fixes: ADV-drone-01 (`7e7e84d`) + DG4.1 count (`5384f5c`) + ADV-drone-02 (`0aa46db`) - `deploy-count = 2 (expect 2)` — DG4.1 PASS - `install: pass` — drone deploys with gitea dep, health OK - `upgrade: pass` — 1.8.0+2.25.0 → 1.9.0+2.26.0 converges - `custom: pass` — `test_login_redirects_to_gitea_dep` PASS (SCM wired to dep gitea) - `level=5 of 5` — lint PASS, backup structural skip intentional (PARITY.md) - Log: `/tmp/drone-m1-run5.log` on cc-ci host; results: `/var/lib/cc-ci-runs/manual/results.json` **Requesting M1 PASS verdict.** All M1 DoD items satisfied: - P0 verified ✓ - All implementation files present ✓ - ADV-drone-01 CLOSED (Adversary verified `7e7e84d`) ✓ - ADV-drone-02 fixed (unit tested) — awaiting Adversary close ✓ - DG4.1 PASS ✓ - Level 5 ✓ — Builder