{
  "schema": "vm101-local-plan-milestones-v1",
  "schema_version": 1,
  "plan_id": "vm101-hmn-autonomous-egress-recovery",
  "created_at_utc": "20260711-150958",
  "updated_at_utc": "20260711-150958",
  "scope": [
    "VM101"
  ],
  "excluded_blocking_scopes": [
    "VM100",
    "VM121"
  ],
  "current_milestone": "M06",
  "milestones": [
    {
      "id": "M01",
      "title": "Health monitor обнаруживает отказ VPN-слота",
      "status": "done",
      "evidence": [
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-113010_step050h2_salvage_counter_state_after_guard_test/"
      ],
      "notes": "Watcher и strict status checks доказаны."
    },
    {
      "id": "M02",
      "title": "Локальная замена отказавшего VPN-туннеля",
      "status": "done",
      "evidence": [
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-113010_step050h2_salvage_counter_state_after_guard_test/"
      ],
      "notes": "Watcher → dispatcher → adapter repair доказан."
    },
    {
      "id": "M03",
      "title": "Quarantine отказавших endpoints",
      "status": "done",
      "evidence": [
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-113010_step050h2_salvage_counter_state_after_guard_test/"
      ],
      "notes": "Отказавший endpoint исключается из повторного выбора."
    },
    {
      "id": "M04",
      "title": "Глобальный repair counter после локальных замен",
      "status": "done",
      "evidence": [
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-113010_step050h2_salvage_counter_state_after_guard_test/"
      ],
      "notes": "Счётчик увеличивается после успешного ремонта."
    },
    {
      "id": "M05",
      "title": "Порог full refresh и dry-run решения",
      "status": "done",
      "evidence": [
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-113010_step050h2_salvage_counter_state_after_guard_test/",
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-141947_step050i9_full_audit_minimal_enable_commit_dryrun/"
      ],
      "notes": "При изолированном count=5 доказано would_run_emergency_refresh."
    },
    {
      "id": "M06",
      "title": "Постоянно включить emergency commit на VM101",
      "status": "in_progress",
      "evidence": [
        "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-141947_step050i9_full_audit_minimal_enable_commit_dryrun/"
      ],
      "notes": "VM101-проверка прошла в STEP_050I9, но изменение было откачено из-за нерелевантного VM121-блокера."
    },
    {
      "id": "M07",
      "title": "Выполнить контролируемый реальный full HideMyName refresh",
      "status": "pending",
      "evidence": [],
      "notes": "Обновить список, протестировать и безопасно установить пять слотов."
    },
    {
      "id": "M08",
      "title": "Реализовать DEGRADED_POOL при ошибке HideMyName refresh",
      "status": "pending",
      "evidence": [],
      "notes": "Продолжать работу на оставшихся VPN и старом резервном пуле."
    },
    {
      "id": "M09",
      "title": "Реализовать SLOT_EXHAUSTED и консолидацию пользователей",
      "status": "pending",
      "evidence": [],
      "notes": "Перераспределять пользователей только по рабочим слотам."
    },
    {
      "id": "M10",
      "title": "Реализовать DIRECT_EMERGENCY при нуле рабочих VPN",
      "status": "pending",
      "evidence": [],
      "notes": "Перевести всех пользователей в Direct и продолжить recovery."
    },
    {
      "id": "M11",
      "title": "Реализовать cached-pool bootstrap через vpn1",
      "status": "pending",
      "evidence": [],
      "notes": "Перебирать сохранённые кандидаты с настраиваемым интервалом."
    },
    {
      "id": "M12",
      "title": "Реализовать абстрактный bootstrap strategy contract",
      "status": "pending",
      "evidence": [],
      "notes": "Поддержать будущий резервный транспорт, включая Деденево."
    },
    {
      "id": "M13",
      "title": "Реализовать безопасный возврат Direct → VPN",
      "status": "pending",
      "evidence": [],
      "notes": "Возврат только после проверки полного рабочего набора."
    },
    {
      "id": "M14",
      "title": "Провести полную последовательную имитацию отказов на VM101",
      "status": "pending",
      "evidence": [],
      "notes": "От единичного отказа до Direct и обратного восстановления."
    },
    {
      "id": "M15",
      "title": "Доказать перезагрузочную устойчивость state machine",
      "status": "pending",
      "evidence": [],
      "notes": "Состояние, timers, services, pool и quarantine переживают reboot."
    }
  ]
}
