{
  "assessment": {
    "all_ok": true,
    "decision": "PASS_STEP_049E_INSTALL_REBALANCE_PLANNER_AND_REPAIR_DISPATCHER_NO_HOOK",
    "success_checks": {
      "all_interfaces_exist": true,
      "all_tables_have_routes": true,
      "apply_not_executed": true,
      "cache_fingerprint_unchanged": true,
      "daily_hook_not_installed": true,
      "dispatcher_dryrun_ok": true,
      "dispatcher_exists": true,
      "dispatcher_installed": true,
      "dispatcher_syntax_ok": true,
      "endpoint_fingerprint_unchanged": true,
      "health_hook_not_installed": true,
      "plan_script_exists": true,
      "plan_syntax_ok": true,
      "planner_dryrun_ok": true,
      "planner_has_five_top_targets": true,
      "planner_installed": true,
      "prod_strict_all_ok": true,
      "production_not_modified": true,
      "refresh_not_executed": true,
      "vm100_controller_running": true,
      "vm100_peer_count_five": true,
      "vm101_rc_zero": true,
      "vm121_db_pending_zero": true
    },
    "warnings": [
      "Planner and dispatcher installed, but no cron/health hooks were installed.",
      "No refresh/apply/endpoint/cache change was performed.",
      "Review planner_plan before enabling daily rebalance apply."
    ]
  },
  "dispatcher": {
    "adapter_dryrun_decision": "dry_run_ok",
    "apply_performed": false,
    "candidate_endpoint": "109.248.198.4:37129",
    "decision": "dry_run_ok",
    "iface": "vpn2",
    "mode": "--dry-run",
    "reason": "dispatcher_ready",
    "reason_input": "contract_test",
    "required_dispatch_confirm": "DISPATCH_egress2_109.248.198.4:37129",
    "safety": {
      "commit_requires_dispatch_confirm": true,
      "dry_run_no_ifup_ifdown": true,
      "dry_run_no_uci_set": true
    },
    "schema": "router-egress-recovery-dispatcher-v1",
    "slot": "egress2"
  },
  "mode": "INSTALL_DRYRUN_TOP5_REBALANCE_PLANNER_AND_REPAIR_DISPATCHER_WITHOUT_HOOKS_OR_APPLY",
  "planner": {
    "changes_count": 0,
    "decision": "plan_ok",
    "mode": "--dry-run",
    "plan": [
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "178.215.227.13:44408",
        "dscp": "cs4",
        "iface": "vpn1",
        "mark": "0x201",
        "provider": "hidemyname",
        "slot": "egress1",
        "table": "201",
        "target": "178.215.227.13:44408",
        "target_avg_ms": "50.900",
        "target_file": "150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf",
        "target_rank": "4"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "192.121.163.235:42530",
        "dscp": "cs5",
        "iface": "vpn2",
        "mark": "0x202",
        "provider": "hidemyname",
        "slot": "egress2",
        "table": "202",
        "target": "192.121.163.235:42530",
        "target_avg_ms": "39.008",
        "target_file": "128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf",
        "target_rank": "1"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "95.211.68.119:45176",
        "dscp": "cs1",
        "iface": "vpn3",
        "mark": "0x203",
        "provider": "hidemyname",
        "slot": "egress3",
        "table": "203",
        "target": "95.211.68.119:45176",
        "target_avg_ms": "44.271",
        "target_file": "075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf",
        "target_rank": "2"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "78.31.250.16:41729",
        "dscp": "cs2",
        "iface": "vpn4",
        "mark": "0x204",
        "provider": "hidemyname",
        "slot": "egress4",
        "table": "204",
        "target": "78.31.250.16:41729",
        "target_avg_ms": "50.697",
        "target_file": "072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf",
        "target_rank": "3"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "157.173.27.69:41797",
        "dscp": "cs3",
        "iface": "vpn5",
        "mark": "0x205",
        "provider": "hidemyname",
        "slot": "egress5",
        "table": "205",
        "target": "157.173.27.69:41797",
        "target_avg_ms": "56.803",
        "target_file": "049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf",
        "target_rank": "5"
      }
    ],
    "pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv",
    "pool_age_sec": 55101,
    "pool_endpoint_count": 15,
    "reason": "top5_pool_ready",
    "safety": {
      "dry_run_no_ifup_ifdown": true,
      "dry_run_no_route_change": true,
      "dry_run_no_uci_set": true
    },
    "schema": "router-egress-hmn-top5-plan-v1",
    "top_count": 5
  },
  "publish": {
    "facts_json": "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-081722_step049e_install_rebalance_planner_and_repair_dispatcher_no_hook/facts.json",
    "report_txt": "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-081722_step049e_install_rebalance_planner_and_repair_dispatcher_no_hook/report.txt",
    "trycf_report": "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260711-081722_step049e_install_rebalance_planner_and_repair_dispatcher_no_hook/"
  },
  "schema": "router-step-facts-v1",
  "step": "STEP_049E_INSTALL_REBALANCE_PLANNER_AND_REPAIR_DISPATCHER_NO_HOOK",
  "summary": {
    "backup_dir": "/root/step049e-planner-dispatcher-20260711-081722",
    "cache_fingerprint_unchanged": true,
    "dispatcher_candidate": "109.248.198.4:37129",
    "dispatcher_decision": "dry_run_ok",
    "dispatcher_required_confirm": "DISPATCH_egress2_109.248.198.4:37129",
    "endpoint_fingerprint_unchanged": true,
    "next_step": "install_daily_rebalance_apply_runner_or_health_hook_after_reviewing_planner_plan",
    "planner_changes_count": 0,
    "planner_decision": "plan_ok",
    "planner_plan": [
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "178.215.227.13:44408",
        "dscp": "cs4",
        "iface": "vpn1",
        "mark": "0x201",
        "provider": "hidemyname",
        "slot": "egress1",
        "table": "201",
        "target": "178.215.227.13:44408",
        "target_avg_ms": "50.900",
        "target_file": "150-NL-Netherlands-Amsterdam-R5-178.215.227.13-awg1.conf",
        "target_rank": "4"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "192.121.163.235:42530",
        "dscp": "cs5",
        "iface": "vpn2",
        "mark": "0x202",
        "provider": "hidemyname",
        "slot": "egress2",
        "table": "202",
        "target": "192.121.163.235:42530",
        "target_avg_ms": "39.008",
        "target_file": "128-LV-Latvia-Riga-S1-192.121.163.235-awg1.conf",
        "target_rank": "1"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "95.211.68.119:45176",
        "dscp": "cs1",
        "iface": "vpn3",
        "mark": "0x203",
        "provider": "hidemyname",
        "slot": "egress3",
        "table": "203",
        "target": "95.211.68.119:45176",
        "target_avg_ms": "44.271",
        "target_file": "075-NL-Netherlands-Amsterdam-H13-95.211.68.119-awg1.conf",
        "target_rank": "2"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "78.31.250.16:41729",
        "dscp": "cs2",
        "iface": "vpn4",
        "mark": "0x204",
        "provider": "hidemyname",
        "slot": "egress4",
        "table": "204",
        "target": "78.31.250.16:41729",
        "target_avg_ms": "50.697",
        "target_file": "072-NL-Netherlands-Amsterdam-S8-78.31.250.16-awg1.conf",
        "target_rank": "3"
      },
      {
        "adapter": "hmn_pool_replace",
        "change": false,
        "current": "157.173.27.69:41797",
        "dscp": "cs3",
        "iface": "vpn5",
        "mark": "0x205",
        "provider": "hidemyname",
        "slot": "egress5",
        "table": "205",
        "target": "157.173.27.69:41797",
        "target_avg_ms": "56.803",
        "target_file": "049-DE-Germany-Berlin-S7-157.173.27.69-awg1.conf",
        "target_rank": "5"
      }
    ],
    "planner_pool": "/root/hmn/cache/ok-awg1-strict-foreign-latest.tsv",
    "planner_pool_age_sec": 55101,
    "prod_strict_ok": {
      "vpn1": "true",
      "vpn2": "true",
      "vpn3": "true",
      "vpn4": "true",
      "vpn5": "true"
    },
    "rollback": "/root/rollback-step049e-planner-dispatcher-20260711-081722.sh",
    "vm100_peer_count": "5",
    "vm121_db_summary": {
      "enabled_peers": 5,
      "lease_rows": 5,
      "pending_jobs": 0
    }
  }
}
