{
  "assessment": {
    "all_inventory_ok": true,
    "gaps_to_fix_after_inventory": [
      "backend create flow event-trigger for wg-access-agent.service not seen",
      "neither enabled agent timer nor backend event trigger is confirmed",
      "reconcile safety timer not confirmed enabled"
    ],
    "production_contract_status_not_blocking_inventory": {
      "agent_service_unit_present": true,
      "agent_timer_active": false,
      "agent_timer_enabled": false,
      "backend_event_trigger_seen": false,
      "happy_path_event_driven_already": false,
      "reconcile_service_unit_present": false,
      "reconcile_timer_enabled": false,
      "runtime_reconcile_logic_seen": true,
      "selector_reconcile_logic_seen": true,
      "vm100_reboot_recovery_already_guaranteed": false
    },
    "report_success_checks": {
      "inventory_completed": true,
      "private_material_not_published": true,
      "readonly_no_manual_agent_start": true,
      "vm100_current_peer_count_five": true,
      "vm100_current_selector_count_five": true,
      "vm100_current_uci_empty": true,
      "vm101_current_legacy_table200_vpn1_ok": true,
      "vm101_current_table202_vpn2_ok": true,
      "vm121_db_pending_zero": true
    }
  },
  "changes": {
    "backend_changed": "NO",
    "manual_agent_start_used": "NO",
    "private_material_published": "NO",
    "services_enabled": "NO",
    "services_started": "NO",
    "vm100_changed": "NO",
    "vm101_changed": "NO",
    "vm121_changed": "NO"
  },
  "current_state_quick": {
    "vm100_peer_count": 5,
    "vm100_selector_count": 5,
    "vm100_uci_wireguard_wg_paid_section_count": 0,
    "vm101_legacy_table200_vpn1_rc": 0,
    "vm101_table202_vpn2_rc": 0
  },
  "mode": "READONLY_AGENT_AUTOMATION_INVENTORY",
  "publish": {
    "local_report": "http://127.0.0.1:8099/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260709-094835_step042a_agent_automation_contract_inventory_readonly/",
    "trycf_report": "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260709-094835_step042a_agent_automation_contract_inventory_readonly/"
  },
  "recommended_next_step": {
    "boot_recovery": "VM100 reboot recovery must be provided by reconcile from VM121 DB, not by UCI peer persistence on VM100.",
    "principle": "No manual systemctl start in happy-path provisioning tests; backend create must trigger agent or test must STOP_AGENT_EVENT_TRIGGER_BROKEN.",
    "step": "STEP_042B_AGENT_EVENT_TRIGGER_AND_RECONCILE_DESIGN"
  },
  "schema": "router-step-facts-v1",
  "step": "STEP_042A_AGENT_AUTOMATION_CONTRACT_INVENTORY_READONLY",
  "vm121_inventory": {
    "assessment": {
      "inventory_completed": true,
      "production_happy_path_already_event_driven": false,
      "readonly_no_manual_agent_start": true,
      "safe_to_design_042b_from_inventory": true,
      "vm100_reboot_recovery_already_guaranteed": false
    },
    "changes": {
      "backend_changed": "NO",
      "manual_agent_start_used": "NO",
      "services_enabled": "NO",
      "services_started": "NO",
      "vm100_changed": "NO",
      "vm101_changed": "NO",
      "vm121_changed": "NO"
    },
    "current_contract_assessment": {
      "agent_code_handles_pending_jobs": true,
      "agent_code_marks_completed_or_failed": true,
      "agent_code_reads_provisioning_jobs": true,
      "agent_service_can_be_run_as_oneshot": true,
      "agent_service_unit_present": true,
      "agent_timer_active": false,
      "agent_timer_enabled": false,
      "agent_timer_unit_present": true,
      "backend_trigger_after_create_seen": false,
      "db_enabled_peers_present": true,
      "db_pending_global_zero": true,
      "manual_agent_start_used_in_this_step": false,
      "reconcile_service_unit_present": false,
      "reconcile_timer_active": false,
      "reconcile_timer_enabled": false,
      "reconcile_timer_unit_present": false,
      "runtime_reconcile_logic_seen": true,
      "selector_reconcile_logic_seen": true
    },
    "db": {
      "enabled_peer_count": 5,
      "enabled_peers_raw": {
        "rc": 0,
        "stderr": "",
        "stdout": "5"
      },
      "job_status_counts_raw": {
        "rc": 0,
        "stderr": "",
        "stdout": "completed|47"
      },
      "pending_global": 0,
      "pending_global_raw": {
        "rc": 0,
        "stderr": "",
        "stdout": "0"
      },
      "pg_container_found": true,
      "pg_container_name": "wgaccess-postgres",
      "recent_jobs_raw": {
        "rc": 0,
        "stderr": "",
        "stdout": "ca984318-a6fb-47b8-9bd7-37ecbaae65d3|enable_peer|e4adcfa1-6fbc-4471-b66b-8d7837f35f9d|completed|2026-07-09 09:40:00.374385+00|2026-07-09 09:40:01.167041+00|2026-07-09 09:40:01.594747+00|\neff9c042-22a2-416f-8b58-4a046fd52609|disable_peer|9898db52-e3cf-41fd-9bc6-a3f31ea601ec|completed|2026-07-09 09:39:57.00193+00|2026-07-09 09:39:58.21706+00|2026-07-09 09:39:58.675368+00|\n6cc361bf-8a23-49e2-b606-306bab676049|enable_peer|9898db52-e3cf-41fd-9bc6-a3f31ea601ec|completed|2026-07-09 09:14:40.065581+00|2026-07-09 09:14:40.781781+00|2026-07-09 09:14:41.154008+00|\na9568f4f-ed81-412f-836a-d649852dc4c2|disable_peer|628dab6b-501f-44ef-bdfd-f918b2ac9589|completed|2026-07-09 09:14:37.016051+00|2026-07-09 09:14:38.020199+00|2026-07-09 09:14:38.405255+00|\n5976916b-6b07-4cdb-b1ee-ea5d03598a46|enable_peer|628dab6b-501f-44ef-bdfd-f918b2ac9589|completed|2026-07-09 09:00:28.611582+00|2026-07-09 09:00:35.193361+00|2026-07-09 09:00:35.659503+00|\n77ebeaff-223e-467d-aa04-534297a99abd|disable_peer|d54cd6da-c416-4245-a0dc-22182495f798|completed|2026-07-09 08:54:38.752327+00|2026-07-09 08:54:39.941276+00|2026-07-09 08:54:41.525704+00|\n455dc5b2-d16f-4606-a088-99dc3fd0f15a|enable_peer|d54cd6da-c416-4245-a0dc-22182495f798|completed|2026-07-09 08:12:15.185453+00|2026-07-09 08:21:18.476185+00|2026-07-09 08:21:19.032836+00|\nd6e07a1e-78d5-401f-a8c7-501cf75a9bf7|enable_peer|219a1f63-ec47-4f72-9663-c1a17d82301e|completed|2026-07-08 15:05:41.53578+00|2026-07-08 15:05:42.296079+00|2026-07-08 15:05:42.77908+00|\n51bcba72-2824-4455-bdc2-4dfccd19c9e5|enable_peer|a3cbe3b5-8416-4847-b5ee-21f42359b465|completed|2026-07-08 14:03:52.371746+00|2026-07-08 14:03:53.023194+00|2026-07-08 14:03:53.415732+00|\n03c6086d-1054-4a5b-983a-3b8273114fe2|enable_peer|cb533a1a-7070-416d-9272-846327545060|completed|2026-07-08 13:42:56.376505+00|2026-07-08 13:42:59.093201+00|2026-07-08 13:43:00.1743+00|\n95463317-b0a0-4117-84fd-2a0dcf387741|enable_peer|376dfa07-0ba4-4182-af39-389a2cb3badd|completed|2026-07-08 12:12:18.382277+00|2026-07-08 12:17:00.577186+00|2026-07-08 12:17:01.081494+00|\nc2d55542-713c-4cb2-9040-7d64bdf511bb|disable_peer|3d03a7a2-c009-48a4-b6ff-214326d26fc0|completed|2026-07-06 18:48:37.967328+00|2026-07-06 18:48:38.435006+00|2026-07-06 18:48:38.907705+00|"
      }
    },
    "errors": [],
    "files": {
      "agent_related_files": {
        "rc": 0,
        "stderr": "",
        "stdout": "/etc/systemd/system/wg-access-agent.service\n/etc/systemd/system/wg-access-agent.timer\n/etc/systemd/system/wg-access-expire-subscriptions.service\n/etc/systemd/system/wg-access-expire-subscriptions.timer\n/lib/systemd/system/qemu-guest-agent.service\n/opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt\n/opt/wg-access/STATUS-STEP-007_AGENT_DRY_RUN_OK.txt\n/opt/wg-access/STATUS-STEP-008_AGENT_TIMER_OK.txt\n/opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt\n/opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt\n/opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt\n/opt/wg-access/agent/__pycache__/wg_access_agent.cpython-311.pyc\n/opt/wg-access/agent/agent.env\n/opt/wg-access/agent/agent.env.BEFORE_MGTS_REMOTE_HOST_20260706-183324\n/opt/wg-access/agent/agent.env.BEFORE_REAL_SSH_WG_SET.20260704-132120\n/opt/wg-access/agent/logs/agent.log\n/opt/wg-access/agent/ssh/wg_access_agent_ed25519\n/opt/wg-access/agent/ssh/wg_access_agent_ed25519.pub\n/opt/wg-access/agent/wg_access_agent.py\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532\n/opt/wg-access/backend/app/api/__pycache__/agent.cpython-312.pyc\n/opt/wg-access/backend/app/api/agent.py\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954\n/opt/wg-access/backups/step020b/wg-access-agent.service.20260704-160536.bak\n/opt/wg-access/backups/step020b/wg-access-agent.timer.20260704-160536.bak\n/opt/wg-access/backups/step020c/wg-access-agent.timer.20260704-160647.bak\n/usr/local/sbin/wg-access-agent-job-selector-plan.py\n/usr/local/sbin/wg-access-agent-selector-apply.py\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py\n/usr/local/sbin/wg-access-expire-subscriptions.sh\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py"
      },
      "opt_wg_access_tree_limited": {
        "rc": 0,
        "stderr": "",
        "stdout": "/opt/wg-access/agent/__pycache__/wg_access_agent.cpython-311.pyc\n/opt/wg-access/agent/agent.env\n/opt/wg-access/agent/agent.env.BEFORE_MGTS_REMOTE_HOST_20260706-183324\n/opt/wg-access/agent/agent.env.BEFORE_REAL_SSH_WG_SET.20260704-132120\n/opt/wg-access/agent/logs/agent.log\n/opt/wg-access/agent/ssh/wg_access_agent_ed25519\n/opt/wg-access/agent/ssh/wg_access_agent_ed25519.pub\n/opt/wg-access/agent/state/active-peers.json\n/opt/wg-access/agent/wg_access_agent.py\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532\n/opt/wg-access/backend/alembic.ini\n/opt/wg-access/backend/alembic/__pycache__/env.cpython-312.pyc\n/opt/wg-access/backend/alembic/env.py\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py\n/opt/wg-access/backend/app/__pycache__/config.cpython-312.pyc\n/opt/wg-access/backend/app/__pycache__/main.cpython-312.pyc\n/opt/wg-access/backend/app/api/admin.py\n/opt/wg-access/backend/app/api/admin.py.BEFORE_DISABLE_PEER.20260704-151253\n/opt/wg-access/backend/app/api/agent.py\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954\n/opt/wg-access/backend/app/api/dev.py\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545\n/opt/wg-access/backend/app/config.py\n/opt/wg-access/backend/app/db/base.py\n/opt/wg-access/backend/app/db/session.py\n/opt/wg-access/backend/app/main.py\n/opt/wg-access/backend/app/models/__init__.py\n/opt/wg-access/backend/app/models/core.py\n/opt/wg-access/backend/app/services/__init__.py\n/opt/wg-access/backend/app/services/wireguard.py\n/opt/wg-access/backups/step018b/peers.20260704-155255.sql\n/opt/wg-access/backups/step020b/wg-access-agent.service.20260704-160536.bak\n/opt/wg-access/backups/step020b/wg-access-agent.timer.20260704-160536.bak\n/opt/wg-access/backups/step020c/wg-access-agent.timer.20260704-160647.bak\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak\n/opt/wg-access/backups/step025a/admin.py.20260704-180655.bak\n/opt/wg-access/backups/step026a/admin.py.20260704-182045.bak\n/opt/wg-access/maintenance-logs/expire-subscriptions.20260705.log\n/opt/wg-access/maintenance-logs/expire-subscriptions.20260706.log\n/opt/wg-access/maintenance-logs/expire-subscriptions.20260707.log\n/opt/wg-access/maintenance-logs/expire-subscriptions.20260708.log\n/opt/wg-access/maintenance-logs/expire-subscriptions.20260709.log\n/opt/wg-access/tmp/mgts-smoke-20260706-183921/peers-before.json"
      },
      "selected_contents": {
        "/etc/systemd/system/wg-access-agent.service": {
          "exists": true,
          "text": "[Unit]\nDescription=WG Access Agent real poller\nAfter=network-online.target docker.service\nWants=network-online.target\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/opt/wg-access/agent\nEnvironment=WG_ACCESS_AGENT_ENV=/opt/wg-access/agent/agent.env\nExecStart=/opt/wg-access/agent/wg_access_agent.py\n"
        },
        "/etc/systemd/system/wg-access-agent.timer": {
          "exists": true,
          "text": "[Unit]\nDescription=Run WG Access Agent periodically\n\n[Timer]\nOnActiveSec=5sec\nOnUnitInactiveSec=30sec\nAccuracySec=5sec\nUnit=wg-access-agent.service\n\n[Install]\nWantedBy=timers.target\n"
        },
        "/opt/wg-access/backups/step020b/wg-access-agent.service.20260704-160536.bak": {
          "exists": true,
          "text": "[Unit]\nDescription=WG Access Agent dry-run poller\nAfter=network-online.target docker.service\nWants=network-online.target\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/opt/wg-access/agent\nEnvironment=WG_ACCESS_AGENT_ENV=/opt/wg-access/agent/agent.env\nExecStart=/opt/wg-access/agent/wg_access_agent.py\n"
        },
        "/opt/wg-access/backups/step020b/wg-access-agent.timer.20260704-160536.bak": {
          "exists": true,
          "text": "[Unit]\nDescription=Run WG Access Agent every 30 seconds\n\n[Timer]\nOnBootSec=30sec\nOnUnitActiveSec=30sec\nAccuracySec=5sec\nUnit=wg-access-agent.service\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n"
        },
        "/opt/wg-access/backups/step020c/wg-access-agent.timer.20260704-160647.bak": {
          "exists": true,
          "text": "[Unit]\nDescription=Run WG Access Agent every 30 seconds\n\n[Timer]\nOnBootSec=30sec\nOnUnitActiveSec=30sec\nAccuracySec=5sec\nUnit=wg-access-agent.service\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n"
        },
        "/usr/local/sbin/wg-access-agent-job-selector-plan.py": {
          "exists": true,
          "text": "#!/usr/bin/env python3\nimport argparse\nimport json\nimport subprocess\nimport tempfile\nfrom pathlib import Path\n\ndef load_json(path):\n    return json.loads(Path(path).read_text(encoding=\"utf-8\", errors=\"replace\"))\n\ndef flatten_job(job):\n    payload = job.get(\"payload\", {})\n    peer = payload.get(\"peer\", {})\n    selector = payload.get(\"selector\", {})\n    provider = payload.get(\"provider\", {})\n\n    return {\n        \"job_type\": job.get(\"job_type\", \"\"),\n        \"dry_run\": True,\n        \"peer_id\": peer.get(\"peer_id\", payload.get(\"peer_id\", \"\")),\n        \"subscription_id\": peer.get(\"subscription_id\", payload.get(\"subscription_id\", \"\")),\n        \"tunnel_ip\": peer.get(\"tunnel_ip\", payload.get(\"tunnel_ip\", \"\")),\n        \"slot_code\": selector.get(\"slot_code\", payload.get(\"slot_code\", \"\")),\n        \"selector_class\": selector.get(\"selector_class\", payload.get(\"selector_class\", \"\")),\n        \"selector_label\": selector.get(\"selector_label\", payload.get(\"selector_label\", \"\")),\n        \"fwmark\": selector.get(\"fwmark\", payload.get(\"fwmark\", \"\")),\n        \"table_id\": selector.get(\"table_id\", payload.get(\"table_id\", \"\")),\n        \"interface_name\": selector.get(\"interface_name\", payload.get(\"interface_name\", \"\")),\n        \"provider_type\": provider.get(\"provider_type\", payload.get(\"provider_type\", \"\")),\n        \"manager_id\": provider.get(\"manager_id\", payload.get(\"manager_id\", \"\")),\n    }\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--job\", required=True)\n    parser.add_argument(\"--selector-file\", required=True)\n    parser.add_argument(\"--slot-status-json\", required=True)\n    parser.add_argument(\"--selector-helper\", default=\"/usr/local/sbin/wg-access-agent-selector-apply.py\")\n    parser.add_argument(\"--mode\", choices=[\"dry-run\"], default=\"dry-run\")\n    parser.add_argument(\"--output-json\", action=\"store_true\")\n    args = parser.parse_args()\n\n    job = load_json(args.job)\n    flat = flatten_job(job)\n\n    result = {\n        \"schema\": \"wg-access-agent-job-selector-plan-v1\",\n        \"mode\": args.mode,\n        \"job\": {\n            \"schema\": job.get(\"schema\", \"\"),\n            \"job_id\": job.get(\"job_id\", \"\"),\n            \"job_type\": job.get(\"job_type\", \"\"),\n            \"dry_run\": bool(job.get(\"dry_run\", False)),\n        },\n        \"flattened_payload\": flat,\n        \"selector_helper\": args.selector_helper,\n        \"selector_plan_rc\": None,\n        \"selector_plan\": None,\n        \"apply_performed\": False,\n    }\n\n    with tempfile.NamedTemporaryFile(\"w\", encoding=\"utf-8\", delete=False) as tmp:\n        json.dump(flat, tmp, ensure_ascii=False, indent=2, sort_keys=True)\n        tmp_payload = tmp.name\n\n    cmd = [\n        args.selector_helper,\n        \"--payload\", tmp_payload,\n        \"--selector-file\", args.selector_file,\n        \"--slot-status-json\", args.slot_status_json,\n        \"--mode\", \"dry-run\",\n        \"--output-json\",\n    ]\n\n    proc = subprocess.run(cmd, text=True, capture_output=True)\n    result[\"selector_plan_rc\"] = proc.returncode\n    result[\"selector_plan_stdout\"] = proc.stdout\n    result[\"selector_plan_stderr\"] = proc.stderr\n\n    try:\n        plan = json.loads(proc.stdout)\n    except Exception as e:\n        plan = {\n            \"schema\": \"parse-error\",\n            \"contract_valid\": False,\n            \"errors\": [\"selector_plan_json_parse_error:\" + type(e).__name__],\n        }\n\n    result[\"selector_plan\"] = plan\n    result[\"contract_valid\"] = bool(plan.get(\"contract_valid\", False))\n    result[\"action\"] = plan.get(\"action\", \"\")\n    result[\"would_append\"] = bool(plan.get(\"would_append\", False))\n    result[\"idempotent_noop\"] = bool(plan.get(\"idempotent_noop\", False))\n    result[\"selector_entry_count_before\"] = plan.get(\"selector_entry_count_before\")\n    result[\"selector_entry_count_after_planned\"] = plan.get(\"selector_entry_count_after_planned\")\n    result[\"errors\"] = plan.get(\"errors\", [])\n    result[\"error_count\"] = len(result[\"errors\"])\n    result[\"apply_performed\"] = bool(plan.get(\"apply_performed\", False))\n\n    if args.output_json:\n        print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True))\n    else:\n        print(\"contract_valid=\" + (\"YES\" if result[\"contract_valid\"] else \"NO\"))\n        print(\"action=\" + str(result[\"action\"]))\n        print(\"selector_plan_rc=\" + str(result[\"selector_plan_rc\"]))\n\n    return 0 if result[\"contract_valid\"] else 2\n\nif __name__ == \"__main__\":\n    raise SystemExit(main())\n"
        },
        "/usr/local/sbin/wg-access-agent-selector-apply.py": {
          "exists": true,
          "text": "#!/usr/bin/env python3\nimport argparse\nimport ipaddress\nimport json\nimport sys\nfrom pathlib import Path\n\nEXPECTED = {\n    \"vpn1\": {\"selector_class\": \"cs4\", \"selector_label\": \"canary_vpn1\", \"fwmark\": \"0x201\", \"table_id\": 201, \"interface_name\": \"vpn1\"},\n    \"vpn2\": {\"selector_class\": \"cs5\", \"selector_label\": \"canary_vpn2\", \"fwmark\": \"0x202\", \"table_id\": 202, \"interface_name\": \"vpn2\"},\n    \"vpn3\": {\"selector_class\": \"cs1\", \"selector_label\": \"canary_vpn3\", \"fwmark\": \"0x203\", \"table_id\": 203, \"interface_name\": \"vpn3\"},\n    \"vpn4\": {\"selector_class\": \"cs2\", \"selector_label\": \"canary_vpn4\", \"fwmark\": \"0x204\", \"table_id\": 204, \"interface_name\": \"vpn4\"},\n    \"vpn5\": {\"selector_class\": \"cs3\", \"selector_label\": \"canary_vpn5\", \"fwmark\": \"0x205\", \"table_id\": 205, \"interface_name\": \"vpn5\"},\n}\n\ndef load_json(path):\n    return json.loads(Path(path).read_text(encoding=\"utf-8\", errors=\"replace\"))\n\ndef parse_selector(path):\n    entries = []\n    raw_lines = Path(path).read_text(encoding=\"utf-8\", errors=\"replace\").splitlines()\n    for line_no, raw in enumerate(raw_lines, 1):\n        line = raw.strip()\n        if not line or line.startswith(\"#\"):\n            continue\n        parts = line.split()\n        if len(parts) < 3:\n            entries.append({\"line_no\": line_no, \"raw\": line, \"valid\": False})\n            continue\n        entries.append({\n            \"line_no\": line_no,\n            \"raw\": line,\n            \"valid\": True,\n            \"tunnel_ip\": parts[0],\n            \"selector_class\": parts[1],\n            \"selector_label\": parts[2],\n        })\n    return entries\n\ndef load_slots(status_json):\n    data = load_json(status_json)\n    return {slot.get(\"slot_code\"): slot for slot in data.get(\"slots\", [])}\n\ndef validate_and_plan(payload, selector_entries, slots, require_peer_visible=False, peer_visible=False):\n    errors = []\n    warnings = []\n\n    tunnel_ip = str(payload.get(\"tunnel_ip\", \"\"))\n    slot_code = str(payload.get(\"slot_code\", \"\"))\n    selector_class = str(payload.get(\"selector_class\", \"\"))\n    selector_label = str(payload.get(\"selector_label\", \"\"))\n    fwmark = str(payload.get(\"fwmark\", \"\"))\n    table_id = payload.get(\"table_id\")\n    interface_name = str(payload.get(\"interface_name\", \"\"))\n\n    try:\n        ipaddress.ip_address(tunnel_ip)\n    except Exception:\n        errors.append(\"invalid_tunnel_ip\")\n\n    expected = EXPECTED.get(slot_code)\n    if not expected:\n        errors.append(\"unknown_slot_code\")\n    else:\n        for key in (\"selector_class\", \"selector_label\", \"fwmark\", \"table_id\", \"interface_name\"):\n            if payload.get(key) != expected[key]:\n                errors.append(f\"mapping_mismatch_{key}\")\n\n    slot = slots.get(slot_code)\n    if not slot:\n        errors.append(\"slot_status_missing\")\n    else:\n        if slot.get(\"status\") != \"healthy\":\n            errors.append(\"slot_not_healthy\")\n        for key in (\"selector_class\", \"fwmark\", \"table_id\", \"interface_name\"):\n            if slot.get(key) != payload.get(key):\n                errors.append(f\"slot_status_mismatch_{key}\")\n\n    if require_peer_visible and not peer_visible:\n        errors.append(\"wg_peer_not_visible\")\n\n    exact_line = f\"{tunnel_ip} {selector_class} {selector_label}\"\n\n    valid_entries = [entry for entry in selector_entries if entry.get(\"valid\")]\n    exact_present = any(entry[\"raw\"] == exact_line for entry in valid_entries)\n\n    same_ip_conflicts = [\n        entry for entry in valid_entries\n        if entry.get(\"tunnel_ip\") == tunnel_ip and entry[\"raw\"] != exact_line\n    ]\n    same_class_conflicts = [\n        entry for entry in valid_entries\n        if entry.get(\"selector_class\") == selector_class and entry[\"raw\"] != exact_line\n    ]\n    same_label_conflicts = [\n        entry for entry in valid_entries\n        if entry.get(\"selector_label\") == selector_label and entry[\"raw\"] != exact_line\n    ]\n\n    if same_ip_conflicts:\n        errors.append(\"same_ip_conflict\")\n    if same_class_conflicts:\n        errors.append(\"same_selector_class_conflict\")\n    if same_label_conflicts:\n        errors.append(\"same_selector_label_conflict\")\n\n    if errors:\n        action = \"error\"\n    elif exact_present:\n        action = \"noop\"\n    else:\n        action = \"append\"\n\n    return {\n        \"schema\": \"wg-access-agent-selector-apply-plan-v1\",\n        \"contract_valid\": not errors,\n        \"errors\": errors,\n        \"warnings\": warnings,\n        \"action\": action,\n        \"exact_line\": exact_line,\n        \"selector_entry_count_before\": len(valid_entries),\n        \"selector_entry_count_after_planned\": len(valid_entries) + (1 if action == \"append\" else 0),\n        \"exact_present\": exact_present,\n        \"would_append\": action == \"append\",\n        \"idempotent_noop\": action == \"noop\",\n        \"same_ip_conflict_count\": len(same_ip_conflicts),\n        \"same_selector_class_conflict_count\": len(same_class_conflicts),\n        \"same_selector_label_conflict_count\": len(same_label_conflicts),\n        \"slot_status\": slot.get(\"status\") if slot else \"\",\n        \"payload_summary\": {\n            \"peer_id\": payload.get(\"peer_id\", \"\"),\n            \"subscription_id\": payload.get(\"subscription_id\", \"\"),\n            \"tunnel_ip\": tunnel_ip,\n            \"slot_code\": slot_code,\n            \"selector_class\": selector_class,\n            \"selector_label\": selector_label,\n            \"fwmark\": fwmark,\n            \"table_id\": table_id,\n            \"interface_name\": interface_name,\n            \"provider_type\": payload.get(\"provider_type\", \"\"),\n            \"manager_id\": payload.get(\"manager_id\", \"\"),\n        },\n    }\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--payload\", required=True)\n    parser.add_argument(\"--selector-file\", required=True)\n    parser.add_argument(\"--slot-status-json\", required=True)\n    parser.add_argument(\"--mode\", choices=[\"dry-run\", \"apply-local\"], default=\"dry-run\")\n    parser.add_argument(\"--output-json\", action=\"store_true\")\n    args = parser.parse_args()\n\n    payload = load_json(args.payload)\n    selector_entries = parse_selector(Path(args.selector_file))\n    slots = load_slots(Path(args.slot_status_json))\n\n    plan = validate_and_plan(payload, selector_entries, slots)\n\n    plan[\"mode\"] = args.mode\n    plan[\"apply_performed\"] = False\n\n    if args.mode == \"apply-local\":\n        if not plan[\"contract_valid\"]:\n            pass\n        elif plan[\"action\"] == \"append\":\n            selector_path = Path(args.selector_file)\n            text = selector_path.read_text(encoding=\"utf-8\", errors=\"replace\")\n            if text and not text.endswith(\"\\n\"):\n                text += \"\\n\"\n            text += plan[\"exact_line\"] + \"\\n\"\n            selector_path.write_text(text, encoding=\"utf-8\")\n            plan[\"apply_performed\"] = True\n        elif plan[\"action\"] == \"noop\":\n            plan[\"apply_performed\"] = False\n\n    if args.output_json:\n        print(json.dumps(plan, ensure_ascii=False, indent=2, sort_keys=True))\n    else:\n        for key, value in plan.items():\n            if isinstance(value, (dict, list)):\n                continue\n            print(f\"{key}={value}\")\n\n    return 0 if plan[\"contract_valid\"] else 2\n\nif __name__ == \"__main__\":\n    raise SystemExit(main())\n"
        },
        "/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py": {
          "exists": true,
          "text": "#!/usr/bin/env python3\nimport argparse\nimport ipaddress\nimport json\nimport re\nfrom pathlib import Path\n\nEXPECTED = {\n    \"vpn1\": {\"selector_class\": \"cs4\", \"selector_label\": \"canary_vpn1\", \"fwmark\": \"0x201\", \"table_id\": 201, \"interface_name\": \"vpn1\"},\n    \"vpn2\": {\"selector_class\": \"cs5\", \"selector_label\": \"canary_vpn2\", \"fwmark\": \"0x202\", \"table_id\": 202, \"interface_name\": \"vpn2\"},\n    \"vpn3\": {\"selector_class\": \"cs1\", \"selector_label\": \"canary_vpn3\", \"fwmark\": \"0x203\", \"table_id\": 203, \"interface_name\": \"vpn3\"},\n    \"vpn4\": {\"selector_class\": \"cs2\", \"selector_label\": \"canary_vpn4\", \"fwmark\": \"0x204\", \"table_id\": 204, \"interface_name\": \"vpn4\"},\n    \"vpn5\": {\"selector_class\": \"cs3\", \"selector_label\": \"canary_vpn5\", \"fwmark\": \"0x205\", \"table_id\": 205, \"interface_name\": \"vpn5\"},\n}\n\ndef load_selector(path: Path):\n    entries = []\n    for raw in path.read_text(encoding=\"utf-8\", errors=\"replace\").splitlines():\n        line = raw.strip()\n        if not line or line.startswith(\"#\"):\n            continue\n        parts = line.split()\n        if len(parts) < 3:\n            entries.append({\"raw\": line, \"valid\": False})\n            continue\n        entries.append({\n            \"raw\": line,\n            \"valid\": True,\n            \"tunnel_ip\": parts[0],\n            \"selector_class\": parts[1],\n            \"selector_label\": parts[2],\n        })\n    return entries\n\ndef load_status(path: Path):\n    data = json.loads(path.read_text(encoding=\"utf-8\", errors=\"replace\"))\n    return {s.get(\"slot_code\"): s for s in data.get(\"slots\", [])}\n\ndef bool_text(v):\n    return \"YES\" if v else \"NO\"\n\ndef main():\n    ap = argparse.ArgumentParser()\n    ap.add_argument(\"--payload\", required=True)\n    ap.add_argument(\"--selector-file\", required=True)\n    ap.add_argument(\"--slot-status-json\", required=True)\n    ap.add_argument(\"--json\", action=\"store_true\")\n    args = ap.parse_args()\n\n    payload = json.loads(Path(args.payload).read_text(encoding=\"utf-8\", errors=\"replace\"))\n    entries = load_selector(Path(args.selector_file))\n    slots = load_status(Path(args.slot_status_json))\n\n    errors = []\n    warnings = []\n\n    tunnel_ip = str(payload.get(\"tunnel_ip\", \"\"))\n    slot_code = str(payload.get(\"slot_code\", \"\"))\n    selector_class = str(payload.get(\"selector_class\", \"\"))\n    selector_label = str(payload.get(\"selector_label\", \"\"))\n    fwmark = str(payload.get(\"fwmark\", \"\"))\n    table_id = payload.get(\"table_id\")\n    interface_name = str(payload.get(\"interface_name\", \"\"))\n    dry_run_allow_missing_peer = bool(payload.get(\"dry_run_allow_missing_peer\", False))\n\n    try:\n        ipaddress.ip_address(tunnel_ip)\n    except Exception:\n        errors.append(\"invalid_tunnel_ip\")\n\n    expected = EXPECTED.get(slot_code)\n    if not expected:\n        errors.append(\"unknown_slot_code\")\n    else:\n        for key in (\"selector_class\", \"selector_label\", \"fwmark\", \"table_id\", \"interface_name\"):\n            if payload.get(key) != expected[key]:\n                errors.append(f\"mapping_mismatch_{key}\")\n\n    slot_status = slots.get(slot_code)\n    if not slot_status:\n        errors.append(\"slot_status_missing\")\n    else:\n        if slot_status.get(\"status\") != \"healthy\":\n            errors.append(\"slot_not_healthy\")\n        for key in (\"selector_class\", \"fwmark\", \"table_id\", \"interface_name\"):\n            if slot_status.get(key) != payload.get(key):\n                errors.append(f\"slot_status_mismatch_{key}\")\n\n    exact_line = f\"{tunnel_ip} {selector_class} {selector_label}\"\n\n    valid_entries = [e for e in entries if e.get(\"valid\")]\n    exact_present = any(e[\"raw\"] == exact_line for e in valid_entries)\n\n    same_ip_conflicts = [\n        e for e in valid_entries\n        if e.get(\"tunnel_ip\") == tunnel_ip and e[\"raw\"] != exact_line\n    ]\n    same_class_conflicts = [\n        e for e in valid_entries\n        if e.get(\"selector_class\") == selector_class and e[\"raw\"] != exact_line\n    ]\n    same_label_conflicts = [\n        e for e in valid_entries\n        if e.get(\"selector_label\") == selector_label and e[\"raw\"] != exact_line\n    ]\n\n    if same_ip_conflicts:\n        errors.append(\"same_ip_conflict\")\n    if same_class_conflicts:\n        errors.append(\"same_selector_class_conflict\")\n    if same_label_conflicts:\n        errors.append(\"same_selector_label_conflict\")\n\n    would_append = not exact_present and not errors\n    idempotent_noop = exact_present and not errors\n\n    simulated_entries = len(valid_entries) + (1 if would_append else 0)\n\n    result = {\n        \"schema\": \"wg-access-agent-selector-contract-dry-run-v1\",\n        \"contract_valid\": not errors,\n        \"errors\": errors,\n        \"warnings\": warnings,\n        \"payload\": payload,\n        \"exact_line\": exact_line,\n        \"selector_entry_count_before\": len(valid_entries),\n        \"selector_entry_count_after_simulated\": simulated_entries,\n        \"exact_present\": exact_present,\n        \"would_append\": would_append,\n        \"idempotent_noop\": idempotent_noop,\n        \"dry_run_allow_missing_peer\": dry_run_allow_missing_peer,\n        \"slot_status\": slot_status.get(\"status\") if slot_status else \"\",\n        \"same_ip_conflict_count\": len(same_ip_conflicts),\n        \"same_selector_class_conflict_count\": len(same_class_conflicts),\n        \"same_selector_label_conflict_count\": len(same_label_conflicts),\n    }\n\n    if args.json:\n        print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True))\n    else:\n        for k, v in result.items():\n            if isinstance(v, (dict, list)):\n                continue\n            print(f\"{k}={v}\")\n\n    raise SystemExit(0 if not errors else 2)\n\nif __name__ == \"__main__\":\n    main()\n"
        },
        "/usr/local/sbin/wg-access-agent-selector-remote-plan.py": {
          "exists": true,
          "text": "#!/usr/bin/env python3\nimport argparse\nimport hashlib\nimport json\nimport shlex\nimport subprocess\nfrom pathlib import Path\n\ndef load_json(path):\n    return json.loads(Path(path).read_text(encoding=\"utf-8\", errors=\"replace\"))\n\ndef q(value):\n    return shlex.quote(str(value))\n\ndef build_remote_script(payload, selector_plan, selector_conf, selector_service):\n    exact_line = selector_plan.get(\"exact_line\", \"\")\n    action = selector_plan.get(\"action\", \"\")\n    tunnel_ip = str(payload.get(\"tunnel_ip\", \"\"))\n    selector_class = str(payload.get(\"selector_class\", \"\"))\n\n    if action == \"append\":\n        apply_block = \"\"\"\nif grep -Fxq \"$LINE\" \"$CONF\"; then\n  echo \"selector_apply_action=noop_already_present\"\nelse\n  printf '%s\\\\n' \"$LINE\" >> \"$CONF\"\n  echo \"selector_apply_action=append\"\nfi\n\"\"\"\n    elif action == \"noop\":\n        apply_block = \"\"\"\ngrep -Fxq \"$LINE\" \"$CONF\"\necho \"selector_apply_action=noop_verified_present\"\n\"\"\"\n    else:\n        apply_block = \"\"\"\necho \"selector_apply_action=error_invalid_plan\"\nexit 42\n\"\"\"\n\n    script = f\"\"\"#!/bin/sh\nset -u\n\nCONF={q(selector_conf)}\nSERVICE={q(selector_service)}\nLINE={q(exact_line)}\nTUNNEL_IP={q(tunnel_ip)}\nSELECTOR_CLASS={q(selector_class)}\nBACKUP=\"/root/peers.conf.before-agent-selector-apply-$(date +%Y%m%d-%H%M%S)\"\nROLLBACK=\"/root/rollback-agent-selector-apply.sh\"\n\necho \"remote_script_schema=wg-access-agent-selector-remote-script-v3\"\necho \"remote_script_action={action}\"\n\ntest -f \"$CONF\"\n\ncp \"$CONF\" \"$BACKUP\"\necho \"selector_backup_path=$BACKUP\"\n\ncat > \"$ROLLBACK\" <<RB\n#!/bin/sh\nset -u\ncp \"$BACKUP\" \"$CONF\"\n/etc/init.d/$SERVICE start\nRB\nchmod 700 \"$ROLLBACK\"\necho \"rollback_path=$ROLLBACK\"\n\n{apply_block}\n\n/etc/init.d/$SERVICE start\n\ngrep -Fxq \"$LINE\" \"$CONF\"\n/etc/init.d/$SERVICE enabled >/dev/null 2>&1\nnft -a list ruleset 2>/dev/null | grep -q \"$TUNNEL_IP.*$SELECTOR_CLASS\"\n\necho \"postcheck_selector_line_present=YES\"\necho \"postcheck_selector_service_enabled=YES\"\necho \"postcheck_nft_rule_visible=YES\"\n\"\"\"\n    return script\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--payload\", required=True)\n    parser.add_argument(\"--selector-file\", required=True)\n    parser.add_argument(\"--slot-status-json\", required=True)\n    parser.add_argument(\"--selector-helper\", default=\"/usr/local/sbin/wg-access-agent-selector-apply.py\")\n    parser.add_argument(\"--target-host\", default=\"10.71.100.1\")\n    parser.add_argument(\"--target-name\", default=\"vm100\")\n    parser.add_argument(\"--selector-conf\", default=\"/etc/router-wgpay-selector.d/peers.conf\")\n    parser.add_argument(\"--selector-service\", default=\"router-wgpay-canary\")\n    parser.add_argument(\"--mode\", choices=[\"remote-dry-run\"], default=\"remote-dry-run\")\n    parser.add_argument(\"--output-json\", action=\"store_true\")\n    args = parser.parse_args()\n\n    payload = load_json(args.payload)\n\n    helper_cmd = [\n        args.selector_helper,\n        \"--payload\", args.payload,\n        \"--selector-file\", args.selector_file,\n        \"--slot-status-json\", args.slot_status_json,\n        \"--mode\", \"dry-run\",\n        \"--output-json\",\n    ]\n\n    proc = subprocess.run(helper_cmd, text=True, capture_output=True)\n\n    try:\n        selector_plan = json.loads(proc.stdout)\n    except Exception as e:\n        selector_plan = {\n            \"schema\": \"parse-error\",\n            \"contract_valid\": False,\n            \"errors\": [\"selector_plan_json_parse_error:\" + type(e).__name__],\n        }\n\n    contract_valid = bool(selector_plan.get(\"contract_valid\", False))\n    action = selector_plan.get(\"action\", \"\")\n    remote_script = build_remote_script(payload, selector_plan, args.selector_conf, args.selector_service)\n\n    result = {\n        \"schema\": \"wg-access-agent-selector-remote-plan-v3\",\n        \"mode\": args.mode,\n        \"remote_script_model\": \"single_shell_script\",\n        \"target\": {\n            \"name\": args.target_name,\n            \"host\": args.target_host,\n            \"selector_conf\": args.selector_conf,\n            \"selector_service\": args.selector_service\n        },\n        \"payload_summary\": {\n            \"tunnel_ip\": payload.get(\"tunnel_ip\", \"\"),\n            \"slot_code\": payload.get(\"slot_code\", \"\"),\n            \"selector_class\": payload.get(\"selector_class\", \"\"),\n            \"selector_label\": payload.get(\"selector_label\", \"\"),\n            \"fwmark\": payload.get(\"fwmark\", \"\"),\n            \"table_id\": payload.get(\"table_id\", \"\"),\n            \"interface_name\": payload.get(\"interface_name\", \"\"),\n            \"provider_type\": payload.get(\"provider_type\", \"\"),\n            \"manager_id\": payload.get(\"manager_id\", \"\")\n        },\n        \"selector_plan_rc\": proc.returncode,\n        \"selector_plan\": selector_plan,\n        \"contract_valid\": contract_valid,\n        \"action\": action,\n        \"would_append\": bool(selector_plan.get(\"would_append\", False)),\n        \"idempotent_noop\": bool(selector_plan.get(\"idempotent_noop\", False)),\n        \"exact_line\": selector_plan.get(\"exact_line\", \"\"),\n        \"requires_wg_peer_before_real_apply\": True,\n        \"remote_commands_executed\": False,\n        \"apply_performed\": False,\n        \"remote_script_executed\": False,\n        \"remote_script_sha256\": hashlib.sha256(remote_script.encode(\"utf-8\")).hexdigest(),\n        \"remote_script_line_count\": len(remote_script.splitlines()),\n        \"remote_script_contains_runtime_backup_date\": \"$(date +%Y%m%d-%H%M%S)\" in remote_script,\n        \"remote_script_contains_actual_backup_rollback\": 'cp \"$BACKUP\" \"$CONF\"' in remote_script,\n        \"remote_script_contains_placeholder_backup\": \"YYYYmmdd-HHMMSS\" in remote_script,\n        \"remote_script_contains_bad_etc_initd_quoted_service\": '/etc/init.d \"$SERVICE\"' in remote_script,\n        \"remote_script_contains_clean_service_start\": \"/etc/init.d/$SERVICE start\" in remote_script,\n        \"remote_script\": remote_script,\n        \"errors\": selector_plan.get(\"errors\", []),\n        \"error_count\": len(selector_plan.get(\"errors\", [])),\n    }\n\n    if args.output_json:\n        print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True))\n    else:\n        print(\"contract_valid=\" + (\"YES\" if contract_valid else \"NO\"))\n        print(\"action=\" + str(action))\n        print(\"remote_script_executed=NO\")\n\n    return 0 if contract_valid else 2\n\nif __name__ == \"__main__\":\n    raise SystemExit(main())\n"
        }
      }
    },
    "gaps_to_fix_after_inventory": [
      "backend create flow event-trigger for wg-access-agent.service not seen",
      "neither enabled agent timer nor backend event trigger is confirmed",
      "reconcile safety timer not confirmed enabled"
    ],
    "host": {
      "boot_time": "system boot  2026-07-08 17:21",
      "hostname": "wg-access-dev",
      "uptime": "up 16 hours, 27 minutes"
    },
    "mode": "READONLY_INVENTORY",
    "next_contract_needed": {
      "happy_path_should_use_backend_event_trigger": true,
      "manual_agent_start_should_be_forbidden_in_happy_path_tests": true,
      "reconcile_should_restore_runtime_from_db": true,
      "reconcile_should_restore_selector_from_db_or_selector_state": true,
      "safety_timer_should_be_reconcile_not_primary_job_polling": true,
      "test_should_report_agent_start_source": true,
      "vm100_reboot_should_be_recovered_by_reconcile": true
    },
    "schema": "router-step-facts-v1",
    "source_scan": {
      "agent_timer_or_service_refs": {
        "rc": 0,
        "stderr": "",
        "stdout": "/opt/wg-access/DEFERRED_TASKS.md:17:The container installs dependencies at runtime/startup. During restart, backend temporarily failed until `cryptography` and other packages were available.\n/opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:6:Real WireGuard handshake test completed.\n/opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:41:  wg-access-agent.timer remains disabled.\n/opt/wg-access/backend/app/models/core.py:106:    __tablename__ = \"provisioning_jobs\"\n/opt/wg-access/backend/app/models/core.py:115:    status: Mapped[str] = mapped_column(String(32), default=\"pending\", nullable=False, index=True)\n/opt/wg-access/backend/app/models/core.py:120:    completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)\n/opt/wg-access/backend/app/api/admin.py:109:    # It creates a user, an active subscription, a WG peer and a pending enable_peer job.\n/opt/wg-access/backend/app/api/admin.py:154:        status=\"pending\",\n/opt/wg-access/backend/app/api/admin.py:226:                status=\"pending\",\n/opt/wg-access/backend/app/api/admin.py:289:            status=\"pending\",\n/opt/wg-access/backend/app/api/admin.py:337:        status=\"pending\",\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:105:        status=\"pending\",\n/opt/wg-access/backend/app/api/dev.py:86:        status=\"pending\",\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:75:        status=\"pending\",\n/opt/wg-access/backend/app/api/agent.py:69:def get_pending_jobs(\n/opt/wg-access/backend/app/api/agent.py:78:        .where(ProvisioningJob.status == \"pending\")\n/opt/wg-access/backend/app/api/agent.py:94:    if job.status != \"pending\":\n/opt/wg-access/backend/app/api/agent.py:115:    if job.status not in (\"pending\", \"running\"):\n/opt/wg-access/backend/app/api/agent.py:118:    job.status = \"completed\"\n/opt/wg-access/backend/app/api/agent.py:119:    job.completed_at = datetime.now(timezone.utc)\n/opt/wg-access/backend/app/api/agent.py:137:    if job.status not in (\"pending\", \"running\"):\n/opt/wg-access/backend/app/api/agent.py:140:    job.status = \"failed\"\n/opt/wg-access/backend/app/api/agent.py:141:    job.completed_at = datetime.now(timezone.utc)\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:40:def get_pending_jobs(\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:49:        .where(ProvisioningJob.status == \"pending\")\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:65:    if job.status != \"pending\":\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:86:    if job.status not in (\"pending\", \"running\"):\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:89:    job.status = \"completed\"\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:90:    job.completed_at = datetime.now(timezone.utc)\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:108:    if job.status not in (\"pending\", \"running\"):\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:111:    job.status = \"failed\"\n/opt/wg-access/backend/app/api/agent.py.BEFORE_AGENT_PEERS_SYNC.20260704-133954:112:    job.completed_at = datetime.now(timezone.utc)\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:94:        \"provisioning_jobs\",\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:104:        sa.Column(\"completed_at\", sa.DateTime(timezone=True), nullable=True),\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:107:    op.create_index(\"ix_provisioning_jobs_node_id\", \"provisioning_jobs\", [\"node_id\"])\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:108:    op.create_index(\"ix_provisioning_jobs_status\", \"provisioning_jobs\", [\"status\"])\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:109:    op.create_index(\"ix_provisioning_jobs_peer_id\", \"provisioning_jobs\", [\"peer_id\"])\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:113:    op.drop_table(\"provisioning_jobs\")\n/opt/wg-access/maintenance-logs/expire-subscriptions.20260706.log:632:ERROR: expire-subscriptions failed\n/opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:35:  processed pending enable_peer job\n/opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:36:  job status became completed\n/opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:47:  wg-access-agent.timer remains disabled\n/opt/wg-access/STATUS-STEP-002-BACKEND-DB-OK.txt:29:    provisioning_jobs\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:9:  /etc/systemd/system/wg-access-agent.service\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:16:  /etc/systemd/system/wg-access-agent.timer\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:21:    Unit=wg-access-agent.service\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:25:  systemctl restart wg-access-agent.timer: OK\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:39:  no pending jobs\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:43:  Backend active pending/running jobs count: 0\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:50:  wg-access-agent.timer is enabled and active.\n/opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:6:Manual remote WireGuard provisioning test completed.\n/opt/wg-access/agent/logs/agent.log:1:[2026-07-04T10:37:52.238900+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:4:[2026-07-04T10:37:52.256558+00:00] completed job_id=7196bb14-b3ba-4aaf-85f8-aa393fe1b4dc status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:5:[2026-07-04T10:40:57.781938+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:6:[2026-07-04T10:41:28.672378+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:9:[2026-07-04T10:41:28.691422+00:00] completed job_id=338006fa-9b17-45ac-b53f-bc2383421e70 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:10:[2026-07-04T10:42:03.672218+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:11:[2026-07-04T10:42:38.680486+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:12:[2026-07-04T10:43:13.672162+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:13:[2026-07-04T10:43:48.672656+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:14:[2026-07-04T10:44:23.672263+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:15:[2026-07-04T10:44:58.684584+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:16:[2026-07-04T13:28:03.074359+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:27:[2026-07-04T13:28:03.192685+00:00] completed job_id=a16ef565-d195-4302-acb3-c7d963b2f3a5 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:39:[2026-07-04T13:47:56.703737+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:52:[2026-07-04T15:12:56.867442+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:61:[2026-07-04T15:13:42.705881+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:68:[2026-07-04T15:13:43.097094+00:00] completed job_id=8594e558-1c0d-4c49-872e-a1c47dc0f377 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:80:[2026-07-04T15:19:05.266498+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:91:[2026-07-04T15:19:05.678181+00:00] completed job_id=ca3e15c1-91ba-435c-8a40-37faa9e101c9 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:109:[2026-07-04T15:26:17.548266+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:124:[2026-07-04T15:26:17.805374+00:00] completed job_id=7a8fe618-7dc9-4eea-80e7-c4fd09ac2172 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:141:[2026-07-04T15:35:53.627096+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:165:[2026-07-04T15:56:30.590052+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:184:[2026-07-04T15:56:30.803748+00:00] completed job_id=bda6e96e-ef56-44f6-8bc0-867b91ac59bb status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:197:[2026-07-04T15:58:57.951093+00:00] fetched pending jobs: 3\n/opt/wg-access/agent/logs/agent.log:204:[2026-07-04T15:58:58.182067+00:00] completed job_id=fb2c12a5-3f22-4c55-94f1-091240e0019a status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:211:[2026-07-04T15:58:58.494186+00:00] completed job_id=652f82c5-4243-4618-bf17-ccfea3e44d54 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:218:[2026-07-04T15:58:58.793366+00:00] completed job_id=d607c313-cacd-4650-9d39-47c7d43817d6 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:230:[2026-07-04T16:01:58.210830+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:241:[2026-07-04T16:01:58.426171+00:00] completed job_id=cb23b57d-7ec7-4804-a045-495a23705f5d status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:250:[2026-07-04T16:02:02.211109+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:257:[2026-07-04T16:02:02.428942+00:00] completed job_id=8b21d24d-d575-4224-a281-bd2456cccb37 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:264:[2026-07-04T16:05:36.985822+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:271:[2026-07-04T16:06:57.880029+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:278:[2026-07-04T16:07:28.911803+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:285:[2026-07-04T16:08:03.914085+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:292:[2026-07-04T16:08:38.886817+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:299:[2026-07-04T16:09:13.900873+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:306:[2026-07-04T16:09:48.928073+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:313:[2026-07-04T16:10:23.877936+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:320:[2026-07-04T16:10:55.375662+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:327:[2026-07-04T16:11:31.539652+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:334:[2026-07-04T16:12:03.185693+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:341:[2026-07-04T16:12:38.538156+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:348:[2026-07-04T16:13:09.629049+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:355:[2026-07-04T16:13:48.689431+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:362:[2026-07-04T16:14:23.872565+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:369:[2026-07-04T16:14:59.324909+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:376:[2026-07-04T16:15:33.919102+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:383:[2026-07-04T16:16:08.909643+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:390:[2026-07-04T16:16:43.871344+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:397:[2026-07-04T16:17:18.894759+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:404:[2026-07-04T16:17:54.776849+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:411:[2026-07-04T16:18:25.568876+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:418:[2026-07-04T16:18:58.958402+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:430:[2026-07-04T16:19:31.861122+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:441:[2026-07-04T16:19:32.527235+00:00] completed job_id=1912c96e-bda5-4af1-a9ea-9a81a27344fd status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:454:[2026-07-04T16:20:06.926247+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:470:[2026-07-04T16:20:38.889311+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:486:[2026-07-04T16:21:13.919385+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:495:[2026-07-04T16:21:45.598754+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:502:[2026-07-04T16:21:45.893614+00:00] completed job_id=9057b4c7-68b5-4b9e-8cf0-f624a07e30d0 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:509:[2026-07-04T16:22:18.915271+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:516:[2026-07-04T16:22:54.187724+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:523:[2026-07-04T16:23:28.906864+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:530:[2026-07-04T16:24:04.020901+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:537:[2026-07-04T16:24:38.926746+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:544:[2026-07-04T16:25:10.569410+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:551:[2026-07-04T16:25:45.040196+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:558:[2026-07-04T16:26:19.082616+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:565:[2026-07-04T16:26:53.972296+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:572:[2026-07-04T16:27:25.613748+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:579:[2026-07-04T16:27:58.930609+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:586:[2026-07-04T16:28:34.556394+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:593:[2026-07-04T16:29:08.942221+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:600:[2026-07-04T16:29:40.663217+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:607:[2026-07-04T16:30:16.021636+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:614:[2026-07-04T16:30:49.163725+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:621:[2026-07-04T16:31:23.999536+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:628:[2026-07-04T16:31:55.718206+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:640:[2026-07-04T16:32:28.432797+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:651:[2026-07-04T16:32:28.650289+00:00] completed job_id=bb71b4cd-a615-45f5-9135-4aa0efca9cb7 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:660:[2026-07-04T16:33:04.084201+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:667:[2026-07-04T16:33:04.278739+00:00] completed job_id=6e273fdf-781f-4992-ad42-4bf83bc7b6f5 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:674:[2026-07-04T16:33:38.910184+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:681:[2026-07-04T16:34:10.653152+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:688:[2026-07-04T16:34:45.945183+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:695:[2026-07-04T16:35:19.204548+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:702:[2026-07-04T16:35:53.905763+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:709:[2026-07-04T16:36:25.695436+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:716:[2026-07-04T16:36:59.661121+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:723:[2026-07-04T16:37:34.914619+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:730:[2026-07-04T16:38:08.914363+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:737:[2026-07-04T16:38:40.691541+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:749:[2026-07-04T16:39:14.733233+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:760:[2026-07-04T16:39:14.933849+00:00] completed job_id=15b8a865-a437-4222-9f5b-6427aeaf75b3 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:769:[2026-07-04T16:39:49.108143+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:776:[2026-07-04T16:39:49.313650+00:00] completed job_id=279dd804-7951-47a0-876a-1262f27aa629 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:783:[2026-07-04T16:40:23.996547+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:790:[2026-07-04T16:40:55.696266+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:797:[2026-07-04T16:41:28.943030+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:804:[2026-07-04T16:42:03.963830+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:811:[2026-07-04T16:42:40.565442+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:818:[2026-07-04T16:43:14.895530+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:825:[2026-07-04T16:43:48.043488+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:832:[2026-07-04T16:44:18.928407+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:839:[2026-07-04T16:44:53.176279+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:846:[2026-07-04T16:45:25.813126+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:853:[2026-07-04T16:45:58.967363+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:860:[2026-07-04T16:46:34.127140+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:867:[2026-07-04T16:47:08.874710+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:874:[2026-07-04T16:47:40.885605+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:881:[2026-07-04T16:48:15.898762+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:888:[2026-07-04T16:48:49.417159+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:895:[2026-07-04T16:49:24.415717+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:902:[2026-07-04T16:49:55.869280+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:909:[2026-07-04T16:50:28.922546+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:916:[2026-07-04T16:51:03.870292+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:923:[2026-07-04T16:51:38.953403+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:930:[2026-07-04T16:52:10.888148+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:937:[2026-07-04T16:52:45.985510+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:944:[2026-07-04T16:53:18.895950+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:951:[2026-07-04T16:53:53.874016+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:958:[2026-07-04T16:54:25.840292+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:965:[2026-07-04T16:54:58.990522+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:972:[2026-07-04T16:55:34.052044+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:979:[2026-07-04T16:56:08.937313+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:986:[2026-07-04T16:56:40.908954+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:993:[2026-07-04T16:57:15.963624+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1000:[2026-07-04T16:57:48.948660+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1007:[2026-07-04T16:58:23.890424+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1014:[2026-07-04T16:58:56.009557+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1021:[2026-07-04T16:59:28.966510+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1028:[2026-07-04T17:00:03.958294+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1035:[2026-07-04T17:00:40.049568+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1042:[2026-07-04T17:01:11.403125+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1049:[2026-07-04T17:01:45.895010+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1056:[2026-07-04T17:02:19.700647+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1063:[2026-07-04T17:02:55.087414+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1070:[2026-07-04T17:03:25.980560+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1077:[2026-07-04T17:03:59.029864+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1084:[2026-07-04T17:04:34.088310+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1091:[2026-07-04T17:05:08.900508+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1098:[2026-07-04T17:05:40.989841+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1105:[2026-07-04T17:06:16.447805+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1112:[2026-07-04T17:06:48.996550+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1119:[2026-07-04T17:07:23.914256+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1126:[2026-07-04T17:07:56.189966+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1133:[2026-07-04T17:08:31.316818+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1140:[2026-07-04T17:09:03.361183+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1147:[2026-07-04T17:09:39.533476+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1154:[2026-07-04T17:10:11.116648+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1161:[2026-07-04T17:10:48.349311+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1168:[2026-07-04T17:11:20.839127+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1175:[2026-07-04T17:11:55.897313+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1182:[2026-07-04T17:12:34.113442+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1189:[2026-07-04T17:13:09.162050+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1196:[2026-07-04T17:13:43.901535+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1203:[2026-07-04T17:14:18.878169+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1210:[2026-07-04T17:14:53.909568+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1217:[2026-07-04T17:15:26.999472+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1224:[2026-07-04T17:16:00.514159+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1231:[2026-07-04T17:16:35.067472+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1238:[2026-07-04T17:17:09.669649+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1245:[2026-07-04T17:17:41.137980+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1252:[2026-07-04T17:18:16.297359+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1259:[2026-07-04T17:18:50.095133+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1266:[2026-07-04T17:19:26.250551+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1273:[2026-07-04T17:19:58.902730+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1280:[2026-07-04T17:20:33.919288+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1287:[2026-07-04T17:21:09.201059+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1294:[2026-07-04T17:21:44.263305+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1301:[2026-07-04T17:22:18.965596+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1313:[2026-07-04T17:22:51.693230+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:1324:[2026-07-04T17:22:52.052106+00:00] completed job_id=13a61a08-8eeb-4402-8a5c-624bc606c023 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:1333:[2026-07-04T17:23:27.046934+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:1340:[2026-07-04T17:23:27.257694+00:00] completed job_id=ef0e8472-6e80-45eb-9bcb-ec0a9d7be598 status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:1347:[2026-07-04T17:23:59.912386+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1354:[2026-07-04T17:24:35.248840+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1361:[2026-07-04T17:25:08.898362+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1368:[2026-07-04T17:25:44.722016+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1375:[2026-07-04T17:26:19.923621+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1382:[2026-07-04T17:26:54.942499+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1389:[2026-07-04T17:27:26.287942+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1401:[2026-07-04T17:28:33.044654+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:1412:[2026-07-04T17:28:33.270334+00:00] completed job_id=cef3e913-d69a-4f61-a5af-7d10eeb8b2da status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:1421:[2026-07-04T17:29:08.018489+00:00] fetched pending jobs: 1\n/opt/wg-access/agent/logs/agent.log:1428:[2026-07-04T17:29:08.280892+00:00] completed job_id=de335c08-7807-465b-9065-bce2c77a955f status=completed attempts=1\n/opt/wg-access/agent/logs/agent.log:1435:[2026-07-04T17:29:38.949583+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1442:[2026-07-04T17:30:13.909267+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1449:[2026-07-04T17:30:49.023522+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1456:[2026-07-04T17:31:24.256779+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1463:[2026-07-04T17:31:56.478932+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1470:[2026-07-04T17:32:29.019770+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1477:[2026-07-04T17:33:03.949856+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1484:[2026-07-04T17:33:38.887930+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1491:[2026-07-04T17:34:11.333448+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1498:[2026-07-04T17:34:45.871301+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1505:[2026-07-04T17:35:18.974881+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1512:[2026-07-04T17:35:51.434390+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1519:[2026-07-04T17:36:27.344324+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1526:[2026-07-04T17:36:58.898996+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1533:[2026-07-04T17:37:33.887048+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1540:[2026-07-04T17:38:10.169904+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1547:[2026-07-04T17:38:41.706724+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1554:[2026-07-04T17:39:17.022210+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1561:[2026-07-04T17:39:50.418696+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1568:[2026-07-04T17:40:24.922071+00:00] no pending jobs\n/opt/wg-access/agent/logs/agent.log:1575:[2026-07-04T17:40:56.658013+00:00] no pending jobs"
      },
      "backend_create_refs": {
        "rc": 0,
        "stderr": "",
        "stdout": "/opt/wg-access/backend/app/models/core.py:84:        # tunnel_ip uniqueness is enforced in PostgreSQL by partial unique index:\n/opt/wg-access/backend/app/models/core.py:85:        # uq_peers_node_tunnel_ip_enabled (node_id, tunnel_ip) WHERE enabled = true,\n/opt/wg-access/backend/app/models/core.py:94:    tunnel_ip: Mapped[str] = mapped_column(String(64), nullable=False)\n/opt/wg-access/backend/app/models/core.py:106:    __tablename__ = \"provisioning_jobs\"\n/opt/wg-access/backend/app/services/wireguard.py:41:def next_tunnel_ip(db: Session, node_id: str) -> str:\n/opt/wg-access/backend/app/services/wireguard.py:58:            select(Peer.tunnel_ip).where(\n/opt/wg-access/backend/app/services/wireguard.py:77:def build_client_config(private_key: str, tunnel_ip: str, preshared_key: str) -> str:\n/opt/wg-access/backend/app/services/wireguard.py:91:        f\"Address = {tunnel_ip}/32\",\n/opt/wg-access/backend/app/api/admin.py:16:    next_tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:68:    tunnel_ip: str\n/opt/wg-access/backend/app/api/admin.py:98:    tunnel_ip: str\n/opt/wg-access/backend/app/api/admin.py:107:def create_subscription(payload: SubscriptionCreateRequest, db: Session = Depends(get_db)):\n/opt/wg-access/backend/app/api/admin.py:109:    # It creates a user, an active subscription, a WG peer and a pending enable_peer job.\n/opt/wg-access/backend/app/api/admin.py:127:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backend/app/api/admin.py:130:    client_config = build_client_config(private_key, tunnel_ip, preshared_key)\n/opt/wg-access/backend/app/api/admin.py:137:        tunnel_ip=tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:146:        action=\"enable_peer\",\n/opt/wg-access/backend/app/api/admin.py:151:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:170:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:220:                action=\"disable_peer\",\n/opt/wg-access/backend/app/api/admin.py:224:                    \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:283:            action=\"disable_peer\",\n/opt/wg-access/backend/app/api/admin.py:287:                \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:315:    tunnel_ip: str\n/opt/wg-access/backend/app/api/admin.py:320:def disable_peer(peer_id: UUID, db: Session = Depends(get_db)):\n/opt/wg-access/backend/app/api/admin.py:331:        action=\"disable_peer\",\n/opt/wg-access/backend/app/api/admin.py:335:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:350:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backend/app/api/admin.py:394:    tunnel_ip: str\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:29:    tunnel_ip: str\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:63:def next_tunnel_ip(db: Session, node_id: str) -> str:\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:78:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:88:        tunnel_ip=tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:97:        action=\"enable_peer\",\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:102:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:118:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py:14:    next_tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py:36:    tunnel_ip: str\n/opt/wg-access/backend/app/api/dev.py:58:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backend/app/api/dev.py:62:    client_config = build_client_config(private_key, tunnel_ip, preshared_key)\n/opt/wg-access/backend/app/api/dev.py:69:        tunnel_ip=tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py:78:        action=\"enable_peer\",\n/opt/wg-access/backend/app/api/dev.py:83:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py:99:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:26:    tunnel_ip: str\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:36:def next_tunnel_ip(db: Session, node_id: str) -> str:\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:51:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:58:        tunnel_ip=tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:67:        action=\"enable_peer\",\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:72:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:88:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backend/app/api/agent.py:26:    tunnel_ip: str\n/opt/wg-access/backend/app/api/admin.py.BEFORE_DISABLE_PEER.20260704-151253:61:    tunnel_ip: str\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:81:        sa.Column(\"tunnel_ip\", sa.String(length=64), nullable=False),\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:86:        sa.UniqueConstraint(\"node_id\", \"tunnel_ip\", name=\"uq_peers_node_tunnel_ip\"),\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:94:        \"provisioning_jobs\",\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:107:    op.create_index(\"ix_provisioning_jobs_node_id\", \"provisioning_jobs\", [\"node_id\"])\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:108:    op.create_index(\"ix_provisioning_jobs_status\", \"provisioning_jobs\", [\"status\"])\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:109:    op.create_index(\"ix_provisioning_jobs_peer_id\", \"provisioning_jobs\", [\"peer_id\"])\n/opt/wg-access/backend/alembic/versions/0001_initial_schema.py:113:    op.drop_table(\"provisioning_jobs\")\n/opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:30:  tunnel_ip: 10.253.1.15/32\n/opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:35:  processed pending enable_peer job\n/opt/wg-access/STATUS-STEP-002-BACKEND-DB-OK.txt:29:    provisioning_jobs\n/opt/wg-access/agent/logs/agent.log:2:[2026-07-04T10:37:52.239091+00:00] starting job_id=7196bb14-b3ba-4aaf-85f8-aa393fe1b4dc action=enable_peer\n/opt/wg-access/agent/logs/agent.log:3:[2026-07-04T10:37:52.249864+00:00] DRY-RUN enable_peer peer_id=4b39aa87-4b59-4c71-950b-cf2dca3e606f tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:7:[2026-07-04T10:41:28.672498+00:00] starting job_id=338006fa-9b17-45ac-b53f-bc2383421e70 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:8:[2026-07-04T10:41:28.685370+00:00] DRY-RUN enable_peer peer_id=754b76bd-0e69-4184-ac0b-a9c5706dbf19 tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:17:[2026-07-04T13:28:03.074605+00:00] starting job_id=a16ef565-d195-4302-acb3-c7d963b2f3a5 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:26:[2026-07-04T13:28:03.185952+00:00] REAL enable_peer peer_id=813515db-bf25-46c9-bc83-c9c45d51ba68 tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:30:[2026-07-04T13:47:56.597862+00:00] sync set peer tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:43:[2026-07-04T15:12:55.806757+00:00] sync keep peer tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:62:[2026-07-04T15:13:42.706242+00:00] starting job_id=8594e558-1c0d-4c49-872e-a1c47dc0f377 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:67:[2026-07-04T15:13:43.089290+00:00] REAL disable_peer peer_id=813515db-bf25-46c9-bc83-c9c45d51ba68\n/opt/wg-access/agent/logs/agent.log:71:[2026-07-04T15:19:04.221203+00:00] sync set peer tunnel_ip=10.253.1.15\n/opt/wg-access/agent/logs/agent.log:81:[2026-07-04T15:19:05.266596+00:00] starting job_id=ca3e15c1-91ba-435c-8a40-37faa9e101c9 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:90:[2026-07-04T15:19:05.670502+00:00] REAL enable_peer peer_id=13543224-39f7-4cfc-917d-66a16e2e0e55 tunnel_ip=10.253.1.15\n/opt/wg-access/agent/logs/agent.log:95:[2026-07-04T15:26:17.337783+00:00] sync keep peer tunnel_ip=10.253.1.15\n/opt/wg-access/agent/logs/agent.log:96:[2026-07-04T15:26:17.449846+00:00] sync set peer tunnel_ip=10.253.1.16\n/opt/wg-access/agent/logs/agent.log:110:[2026-07-04T15:26:17.548589+00:00] starting job_id=7a8fe618-7dc9-4eea-80e7-c4fd09ac2172 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:123:[2026-07-04T15:26:17.798837+00:00] REAL enable_peer peer_id=1b19ed83-1cad-4d57-be9f-fded5270213c tunnel_ip=10.253.1.16\n/opt/wg-access/agent/logs/agent.log:127:[2026-07-04T15:35:53.401701+00:00] sync set peer tunnel_ip=10.253.1.15\n/opt/wg-access/agent/logs/agent.log:128:[2026-07-04T15:35:53.526725+00:00] sync set peer tunnel_ip=10.253.1.16\n/opt/wg-access/agent/logs/agent.log:146:[2026-07-04T15:56:30.380410+00:00] sync keep peer tunnel_ip=10.253.1.15\n/opt/wg-access/agent/logs/agent.log:147:[2026-07-04T15:56:30.380482+00:00] sync keep peer tunnel_ip=10.253.1.16\n/opt/wg-access/agent/logs/agent.log:148:[2026-07-04T15:56:30.487352+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:166:[2026-07-04T15:56:30.590256+00:00] starting job_id=bda6e96e-ef56-44f6-8bc0-867b91ac59bb action=enable_peer\n/opt/wg-access/agent/logs/agent.log:183:[2026-07-04T15:56:30.796545+00:00] REAL enable_peer peer_id=9298ec04-26cf-44a7-8079-7a13664612fa tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:198:[2026-07-04T15:58:57.951315+00:00] starting job_id=fb2c12a5-3f22-4c55-94f1-091240e0019a action=disable_peer\n/opt/wg-access/agent/logs/agent.log:203:[2026-07-04T15:58:58.173938+00:00] REAL disable_peer peer_id=9298ec04-26cf-44a7-8079-7a13664612fa\n/opt/wg-access/agent/logs/agent.log:205:[2026-07-04T15:58:58.182160+00:00] starting job_id=652f82c5-4243-4618-bf17-ccfea3e44d54 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:210:[2026-07-04T15:58:58.487298+00:00] REAL disable_peer peer_id=13543224-39f7-4cfc-917d-66a16e2e0e55\n/opt/wg-access/agent/logs/agent.log:212:[2026-07-04T15:58:58.494611+00:00] starting job_id=d607c313-cacd-4650-9d39-47c7d43817d6 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:217:[2026-07-04T15:58:58.786748+00:00] REAL disable_peer peer_id=1b19ed83-1cad-4d57-be9f-fded5270213c\n/opt/wg-access/agent/logs/agent.log:221:[2026-07-04T16:01:58.111619+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:231:[2026-07-04T16:01:58.211032+00:00] starting job_id=cb23b57d-7ec7-4804-a045-495a23705f5d action=enable_peer\n/opt/wg-access/agent/logs/agent.log:240:[2026-07-04T16:01:58.417633+00:00] REAL enable_peer peer_id=6a5f1655-8ebe-435e-bba6-1af2412d40c2 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:251:[2026-07-04T16:02:02.211330+00:00] starting job_id=8b21d24d-d575-4224-a281-bd2456cccb37 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:256:[2026-07-04T16:02:02.422058+00:00] REAL disable_peer peer_id=6a5f1655-8ebe-435e-bba6-1af2412d40c2\n/opt/wg-access/agent/logs/agent.log:421:[2026-07-04T16:19:31.269641+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:431:[2026-07-04T16:19:31.861206+00:00] starting job_id=1912c96e-bda5-4af1-a9ea-9a81a27344fd action=enable_peer\n/opt/wg-access/agent/logs/agent.log:440:[2026-07-04T16:19:32.520183+00:00] REAL enable_peer peer_id=267835b6-84b6-4527-bd47-eee963e7a5c9 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:445:[2026-07-04T16:20:06.820946+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:458:[2026-07-04T16:20:38.777684+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:474:[2026-07-04T16:21:13.812792+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:496:[2026-07-04T16:21:45.598838+00:00] starting job_id=9057b4c7-68b5-4b9e-8cf0-f624a07e30d0 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:501:[2026-07-04T16:21:45.887266+00:00] REAL disable_peer peer_id=267835b6-84b6-4527-bd47-eee963e7a5c9\n/opt/wg-access/agent/logs/agent.log:631:[2026-07-04T16:32:28.307404+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:641:[2026-07-04T16:32:28.432886+00:00] starting job_id=bb71b4cd-a615-45f5-9135-4aa0efca9cb7 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:650:[2026-07-04T16:32:28.640286+00:00] REAL enable_peer peer_id=00fde00e-a169-4397-841f-5cc99de475d5 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:661:[2026-07-04T16:33:04.084287+00:00] starting job_id=6e273fdf-781f-4992-ad42-4bf83bc7b6f5 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:666:[2026-07-04T16:33:04.272588+00:00] REAL disable_peer peer_id=00fde00e-a169-4397-841f-5cc99de475d5\n/opt/wg-access/agent/logs/agent.log:740:[2026-07-04T16:39:14.578599+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:750:[2026-07-04T16:39:14.733316+00:00] starting job_id=15b8a865-a437-4222-9f5b-6427aeaf75b3 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:759:[2026-07-04T16:39:14.926534+00:00] REAL enable_peer peer_id=966f8262-b25c-4a13-ae1d-694b0378910a tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:770:[2026-07-04T16:39:49.108332+00:00] starting job_id=279dd804-7951-47a0-876a-1262f27aa629 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:775:[2026-07-04T16:39:49.306298+00:00] REAL disable_peer peer_id=966f8262-b25c-4a13-ae1d-694b0378910a\n/opt/wg-access/agent/logs/agent.log:1304:[2026-07-04T17:22:51.537583+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:1314:[2026-07-04T17:22:51.693315+00:00] starting job_id=13a61a08-8eeb-4402-8a5c-624bc606c023 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:1323:[2026-07-04T17:22:52.045863+00:00] REAL enable_peer peer_id=da134a09-caa8-4209-bbfa-93dd06f310fb tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:1334:[2026-07-04T17:23:27.047019+00:00] starting job_id=ef0e8472-6e80-45eb-9bcb-ec0a9d7be598 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:1339:[2026-07-04T17:23:27.248256+00:00] REAL disable_peer peer_id=da134a09-caa8-4209-bbfa-93dd06f310fb\n/opt/wg-access/agent/logs/agent.log:1392:[2026-07-04T17:28:32.842466+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:1402:[2026-07-04T17:28:33.044741+00:00] starting job_id=cef3e913-d69a-4f61-a5af-7d10eeb8b2da action=enable_peer\n/opt/wg-access/agent/logs/agent.log:1411:[2026-07-04T17:28:33.263032+00:00] REAL enable_peer peer_id=486ee88e-2515-4203-8541-44f89cdaba89 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:1422:[2026-07-04T17:29:08.018580+00:00] starting job_id=de335c08-7807-465b-9065-bce2c77a955f action=disable_peer\n/opt/wg-access/agent/logs/agent.log:1427:[2026-07-04T17:29:08.274531+00:00] REAL disable_peer peer_id=486ee88e-2515-4203-8541-44f89cdaba89\n/opt/wg-access/agent/logs/agent.log:1893:[2026-07-04T18:08:08.906586+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:1903:[2026-07-04T18:08:09.025671+00:00] starting job_id=74ccc2cf-bbb2-4621-8bbe-ce3096d8366d action=enable_peer\n/opt/wg-access/agent/logs/agent.log:1912:[2026-07-04T18:08:09.328847+00:00] REAL enable_peer peer_id=3460b486-358c-44d6-8f47-c960d6254e3a tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:1923:[2026-07-04T18:08:41.896311+00:00] starting job_id=8aa5d01c-1a51-48e9-8b86-834f379e829d action=disable_peer\n/opt/wg-access/agent/logs/agent.log:1928:[2026-07-04T18:08:42.180466+00:00] REAL disable_peer peer_id=3460b486-358c-44d6-8f47-c960d6254e3a\n/opt/wg-access/agent/logs/agent.log:2079:[2026-07-04T18:21:39.040225+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:2089:[2026-07-04T18:21:39.211909+00:00] starting job_id=838a2aaf-64ed-4346-9996-1ef7889fda2f action=enable_peer\n/opt/wg-access/agent/logs/agent.log:2098:[2026-07-04T18:21:39.643218+00:00] REAL enable_peer peer_id=f45a349d-25a7-426d-b88a-4479b28aec18 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:2109:[2026-07-04T18:22:12.217184+00:00] starting job_id=f6431127-27e3-49fe-9da0-ef03fc52c2d9 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:2114:[2026-07-04T18:22:12.871487+00:00] REAL disable_peer peer_id=f45a349d-25a7-426d-b88a-4479b28aec18\n/opt/wg-access/agent/logs/agent.log:14081:[2026-07-05T10:30:52.663662+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:14091:[2026-07-05T10:30:52.764874+00:00] starting job_id=96fcd41d-94a0-4432-a685-9171b0235ff1 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:14100:[2026-07-05T10:30:52.981466+00:00] REAL enable_peer peer_id=40b76a1d-e1ef-4a26-ac11-f39043a6a190 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:14111:[2026-07-05T10:30:53.756406+00:00] starting job_id=5983e13b-738d-4723-aee0-cfd8a51566f1 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:14116:[2026-07-05T10:30:53.970791+00:00] REAL disable_peer peer_id=40b76a1d-e1ef-4a26-ac11-f39043a6a190\n/opt/wg-access/agent/logs/agent.log:14176:[2026-07-05T10:35:47.820638+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:14186:[2026-07-05T10:35:47.960209+00:00] starting job_id=d6677788-9b08-4465-92ac-550a158e944e action=enable_peer\n/opt/wg-access/agent/logs/agent.log:14195:[2026-07-05T10:35:48.172231+00:00] REAL enable_peer peer_id=28aefe9e-25b0-434a-aedc-a4df15609e98 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:14206:[2026-07-05T10:35:48.999114+00:00] starting job_id=5a2f6b29-1451-4aad-95e4-69356ab2ec64 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:14211:[2026-07-05T10:35:49.199610+00:00] REAL disable_peer peer_id=28aefe9e-25b0-434a-aedc-a4df15609e98\n/opt/wg-access/agent/logs/agent.log:14229:[2026-07-05T10:37:17.278770+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:14239:[2026-07-05T10:37:17.377002+00:00] starting job_id=44d5a0e8-73f9-4010-9ac6-9f16d07ad2df action=enable_peer\n/opt/wg-access/agent/logs/agent.log:14248:[2026-07-05T10:37:17.758833+00:00] REAL enable_peer peer_id=0f808400-74ad-437b-a716-c6389aa3f057 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:14259:[2026-07-05T10:37:19.114065+00:00] starting job_id=373f631b-63d9-4622-b41a-181f5f0be73f action=disable_peer\n/opt/wg-access/agent/logs/agent.log:14264:[2026-07-05T10:37:19.574385+00:00] REAL disable_peer peer_id=0f808400-74ad-437b-a716-c6389aa3f057\n/opt/wg-access/agent/logs/agent.log:35046:[2026-07-06T18:41:41.026994+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35056:[2026-07-06T18:41:41.144359+00:00] starting job_id=814ba665-f6e5-4ba4-b1ba-8af1ec4954e6 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35065:[2026-07-06T18:41:41.537427+00:00] REAL enable_peer peer_id=3d03a7a2-c009-48a4-b6ff-214326d26fc0 tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35076:[2026-07-06T18:48:38.432485+00:00] starting job_id=c2d55542-713c-4cb2-9040-7d64bdf511bb action=disable_peer\n/opt/wg-access/agent/logs/agent.log:35081:[2026-07-06T18:48:38.905015+00:00] REAL disable_peer peer_id=3d03a7a2-c009-48a4-b6ff-214326d26fc0\n/opt/wg-access/agent/logs/agent.log:35085:[2026-07-08T12:17:00.406550+00:00] sync set peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35095:[2026-07-08T12:17:00.573457+00:00] starting job_id=95463317-b0a0-4117-84fd-2a0dcf387741 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35104:[2026-07-08T12:17:01.077810+00:00] REAL enable_peer peer_id=376dfa07-0ba4-4182-af39-389a2cb3badd tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35109:[2026-07-08T13:34:13.217559+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35125:[2026-07-08T13:42:58.037531+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35126:[2026-07-08T13:42:58.504952+00:00] sync set peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35143:[2026-07-08T13:42:59.090696+00:00] starting job_id=03c6086d-1054-4a5b-983a-3b8273114fe2 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35159:[2026-07-08T13:43:00.171001+00:00] REAL enable_peer peer_id=cb533a1a-7070-416d-9272-846327545060 tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35165:[2026-07-08T14:03:52.649650+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35166:[2026-07-08T14:03:52.649707+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35167:[2026-07-08T14:03:52.809937+00:00] sync set peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35191:[2026-07-08T14:03:53.020773+00:00] starting job_id=51bcba72-2824-4455-bdc2-4dfccd19c9e5 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35214:[2026-07-08T14:03:53.412396+00:00] REAL enable_peer peer_id=a3cbe3b5-8416-4847-b5ee-21f42359b465 tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35221:[2026-07-08T15:05:41.795153+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35222:[2026-07-08T15:05:41.795210+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35223:[2026-07-08T15:05:41.795263+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35224:[2026-07-08T15:05:42.055366+00:00] sync set peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35255:[2026-07-08T15:05:42.293612+00:00] starting job_id=d6e07a1e-78d5-401f-a8c7-501cf75a9bf7 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35285:[2026-07-08T15:05:42.776389+00:00] REAL enable_peer peer_id=219a1f63-ec47-4f72-9663-c1a17d82301e tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35293:[2026-07-09T08:21:17.830869+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35294:[2026-07-09T08:21:17.830924+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35295:[2026-07-09T08:21:17.831000+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35296:[2026-07-09T08:21:17.831051+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35297:[2026-07-09T08:21:18.143056+00:00] sync set peer tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35335:[2026-07-09T08:21:18.472690+00:00] starting job_id=455dc5b2-d16f-4606-a088-99dc3fd0f15a action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35372:[2026-07-09T08:21:19.029851+00:00] REAL enable_peer peer_id=d54cd6da-c416-4245-a0dc-22182495f798 tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35381:[2026-07-09T08:54:39.411652+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35382:[2026-07-09T08:54:39.411706+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35383:[2026-07-09T08:54:39.411755+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35384:[2026-07-09T08:54:39.411808+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35419:[2026-07-09T08:54:39.938785+00:00] starting job_id=77ebeaff-223e-467d-aa04-534297a99abd action=disable_peer\n/opt/wg-access/agent/logs/agent.log:35452:[2026-07-09T08:54:41.522788+00:00] REAL disable_peer peer_id=d54cd6da-c416-4245-a0dc-22182495f798\n/opt/wg-access/agent/logs/agent.log:35460:[2026-07-09T09:00:32.027251+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35461:[2026-07-09T09:00:32.027307+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35462:[2026-07-09T09:00:32.027362+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35463:[2026-07-09T09:00:32.027412+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35464:[2026-07-09T09:00:34.110822+00:00] sync set peer tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35502:[2026-07-09T09:00:35.190693+00:00] starting job_id=5976916b-6b07-4cdb-b1ee-ea5d03598a46 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35539:[2026-07-09T09:00:35.656805+00:00] REAL enable_peer peer_id=628dab6b-501f-44ef-bdfd-f918b2ac9589 tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35548:[2026-07-09T09:14:37.597898+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35549:[2026-07-09T09:14:37.597951+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35550:[2026-07-09T09:14:37.598000+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35551:[2026-07-09T09:14:37.598051+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35586:[2026-07-09T09:14:38.017679+00:00] starting job_id=a9568f4f-ed81-412f-836a-d649852dc4c2 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:35619:[2026-07-09T09:14:38.402011+00:00] REAL disable_peer peer_id=628dab6b-501f-44ef-bdfd-f918b2ac9589\n/opt/wg-access/agent/logs/agent.log:35627:[2026-07-09T09:14:40.428152+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35628:[2026-07-09T09:14:40.428207+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35629:[2026-07-09T09:14:40.428260+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35630:[2026-07-09T09:14:40.428321+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35631:[2026-07-09T09:14:40.590645+00:00] sync set peer tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35669:[2026-07-09T09:14:40.779396+00:00] starting job_id=6cc361bf-8a23-49e2-b606-306bab676049 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35706:[2026-07-09T09:14:41.151355+00:00] REAL enable_peer peer_id=9898db52-e3cf-41fd-9bc6-a3f31ea601ec tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35715:[2026-07-09T09:39:57.652046+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35716:[2026-07-09T09:39:57.652100+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35717:[2026-07-09T09:39:57.652148+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35718:[2026-07-09T09:39:57.652211+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35753:[2026-07-09T09:39:58.214484+00:00] starting job_id=eff9c042-22a2-416f-8b58-4a046fd52609 action=disable_peer\n/opt/wg-access/agent/logs/agent.log:35786:[2026-07-09T09:39:58.672733+00:00] REAL disable_peer peer_id=9898db52-e3cf-41fd-9bc6-a3f31ea601ec\n/opt/wg-access/agent/logs/agent.log:35794:[2026-07-09T09:40:00.721370+00:00] sync keep peer tunnel_ip=10.253.1.10\n/opt/wg-access/agent/logs/agent.log:35795:[2026-07-09T09:40:00.721424+00:00] sync keep peer tunnel_ip=10.253.1.11\n/opt/wg-access/agent/logs/agent.log:35796:[2026-07-09T09:40:00.721477+00:00] sync keep peer tunnel_ip=10.253.1.12\n/opt/wg-access/agent/logs/agent.log:35797:[2026-07-09T09:40:00.721526+00:00] sync keep peer tunnel_ip=10.253.1.13\n/opt/wg-access/agent/logs/agent.log:35798:[2026-07-09T09:40:00.942009+00:00] sync set peer tunnel_ip=10.253.1.14\n/opt/wg-access/agent/logs/agent.log:35836:[2026-07-09T09:40:01.164483+00:00] starting job_id=ca984318-a6fb-47b8-9bd7-37ecbaae65d3 action=enable_peer\n/opt/wg-access/agent/logs/agent.log:35873:[2026-07-09T09:40:01.592209+00:00] REAL enable_peer peer_id=e4adcfa1-6fbc-4471-b66b-8d7837f35f9d tunnel_ip=10.253.1.14\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:110:def require_tunnel_ip(value):\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:113:        raise RuntimeError(\"only IPv4 tunnel_ip is supported\")\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:158:    if action == \"enable_peer\":\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:161:        tunnel_ip = require_tunnel_ip(payload[\"tunnel_ip\"])\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:162:        allowed_ips = f\"{tunnel_ip}/32\"\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:184:            \"tunnel_ip\": tunnel_ip,\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:192:        log(f\"REAL enable_peer peer_id={peer_id} tunnel_ip={tunnel_ip}\")\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:195:    if action == \"disable_peer\":\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_RECONCILE_SYNC.20260704-134532:222:        log(f\"REAL disable_peer peer_id={peer_id}\")\n/opt/wg-access/agent/state/active-peers.json:11:      \"tunnel_ip\": \"10.253.1.12\",\n/opt/wg-access/agent/state/active-peers.json:21:      \"tunnel_ip\": \"10.253.1.13\",\n/opt/wg-access/agent/state/active-peers.json:26:      \"last_action\": \"enable_peer\",\n/opt/wg-access/agent/state/active-peers.json:32:      \"tunnel_ip\": \"10.253.1.14\",\n/opt/wg-access/agent/state/active-peers.json:42:      \"tunnel_ip\": \"10.253.1.10\",\n/opt/wg-access/agent/state/active-peers.json:52:      \"tunnel_ip\": \"10.253.1.11\",\n/opt/wg-access/agent/wg_access_agent.py:110:def require_tunnel_ip(value):\n/opt/wg-access/agent/wg_access_agent.py:113:        raise RuntimeError(\"only IPv4 tunnel_ip is supported\")\n/opt/wg-access/agent/wg_access_agent.py:120:    tunnel_ip = require_tunnel_ip(peer[\"tunnel_ip\"])\n/opt/wg-access/agent/wg_access_agent.py:127:        \"tunnel_ip\": tunnel_ip,\n/opt/wg-access/agent/wg_access_agent.py:128:        \"allowed_ips\": f\"{tunnel_ip}/32\",\n/opt/wg-access/agent/wg_access_agent.py:228:            log(f\"sync keep peer tunnel_ip={peer['tunnel_ip']}\")\n/opt/wg-access/agent/wg_access_agent.py:232:        log(f\"sync set peer tunnel_ip={peer['tunnel_ip']}\")\n/opt/wg-access/agent/wg_access_agent.py:248:            \"tunnel_ip\": peer[\"tunnel_ip\"],\n/opt/wg-access/agent/wg_access_agent.py:262:    if action == \"enable_peer\":\n/opt/wg-access/agent/wg_access_agent.py:268:            \"tunnel_ip\": payload[\"tunnel_ip\"],\n/opt/wg-access/agent/wg_access_agent.py:281:            \"tunnel_ip\": peer[\"tunnel_ip\"],\n/opt/wg-access/agent/wg_access_agent.py:289:        log(f\"REAL enable_peer peer_id={peer_id} tunnel_ip={peer['tunnel_ip']}\")\n/opt/wg-access/agent/wg_access_agent.py:292:    if action == \"disable_peer\":\n/opt/wg-access/agent/wg_access_agent.py:311:        log(f\"REAL disable_peer peer_id={peer_id}\")\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120:99:    if action == \"enable_peer\":\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120:105:            \"tunnel_ip\": payload[\"tunnel_ip\"],\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120:113:        log(f\"DRY-RUN enable_peer peer_id={peer_id} tunnel_ip={payload['tunnel_ip']}\")\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120:116:    if action == \"disable_peer\":\n/opt/wg-access/agent/wg_access_agent.py.BEFORE_REAL_SSH_WG_SET.20260704-132120:124:        log(f\"DRY-RUN disable_peer peer_id={peer_id}\")\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:15:    next_tunnel_ip,\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:67:    tunnel_ip: str\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:97:    tunnel_ip: str\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:106:def create_subscription(payload: SubscriptionCreateRequest, db: Session = Depends(get_db)):\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:108:    # It creates a user, an active subscription, a WG peer and a pending enable_peer job.\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:126:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:129:    client_config = build_client_config(private_key, tunnel_ip, preshared_key)\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:136:        tunnel_ip=tunnel_ip,\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:145:        action=\"enable_peer\",\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:150:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:169:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:183:    tunnel_ip: str\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:188:def disable_peer(peer_id: UUID, db: Session = Depends(get_db)):\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:199:        action=\"disable_peer\",\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:203:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backups/step024a/admin.py.20260704-174718.bak:218:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:31:    tunnel_ip: str\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:66:def next_tunnel_ip(db: Session, node_id: str) -> str:\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:83:            select(Peer.tunnel_ip).where(\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:102:def build_client_config(private_key: str, tunnel_ip: str, preshared_key: str) -> str:\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:116:        f\"Address = {tunnel_ip}/32\",\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:143:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:147:    client_config = build_client_config(private_key, tunnel_ip, preshared_key)\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:154:        tunnel_ip=tunnel_ip,\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:163:        action=\"enable_peer\",\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:168:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backups/step022a/dev.py.20260704-163658.bak:184:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backups/step022a/wireguard.py.20260704-163658.bak:41:def next_tunnel_ip(db: Session, node_id: str) -> str:\n/opt/wg-access/backups/step022a/wireguard.py.20260704-163658.bak:58:            select(Peer.tunnel_ip).where(\n/opt/wg-access/backups/step022a/wireguard.py.20260704-163658.bak:77:def build_client_config(private_key: str, tunnel_ip: str, preshared_key: str) -> str:\n/opt/wg-access/backups/step022a/wireguard.py.20260704-163658.bak:91:        f\"Address = {tunnel_ip}/32\",\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak:61:    tunnel_ip: str\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak:81:    tunnel_ip: str\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak:86:def disable_peer(peer_id: UUID, db: Session = Depends(get_db)):\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak:97:        action=\"disable_peer\",\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak:101:            \"tunnel_ip\": peer.tunnel_ip,\n/opt/wg-access/backups/step021b/admin.py.20260704-162930.bak:116:        tunnel_ip=peer.tunnel_ip,\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:31:    tunnel_ip: str\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:66:def next_tunnel_ip(db: Session, node_id: str) -> str:\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:83:            select(Peer.tunnel_ip).where(\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:102:def build_client_config(private_key: str, tunnel_ip: str, preshared_key: str) -> str:\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:116:        f\"Address = {tunnel_ip}/32\",\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:143:    tunnel_ip = next_tunnel_ip(db, payload.node_id)\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:147:    client_config = build_client_config(private_key, tunnel_ip, preshared_key)\n/opt/wg-access/backups/step021b/dev.py.20260704-162930.bak:154:        tunnel_ip=tunnel_ip,"
      },
      "reconcile_refs": {
        "rc": 0,
        "stderr": "",
        "stdout": "/opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:33:  The peer was added to VM100 using runtime wg set.\n/opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:36:    - agent reconciliation/sync of enabled peers from backend to VM100\n/opt/wg-access/backend/app/services/wireguard.py:45:    # - only enabled peers reserve addresses\n/opt/wg-access/backend/app/api/admin.py:263:    # cancel subscription once, then disable any currently enabled peers for this user.\n/opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt:30:    - use SSH to execute wg set on VM100\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:37:  sync desired enabled peers: 0\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:38:  sync current runtime peers: 0\n/opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:42:  Backend enabled peers count: 0\n/opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:18:  2. Added peer to VM100 wg_paid using SSH + wg set.\n/opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:22:       wg set wg_paid peer <public_key> remove\n/opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:32:  Next step is to update the VM121 agent from dry-run JSON mode to real SSH wg set mode.\n/opt/wg-access/agent/logs/agent.log:28:[2026-07-04T13:47:56.360799+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:29:[2026-07-04T13:47:56.479781+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:40:[2026-07-04T15:12:54.576715+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:42:[2026-07-04T15:12:55.806675+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:53:[2026-07-04T15:13:42.063808+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:55:[2026-07-04T15:13:42.495447+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:69:[2026-07-04T15:19:03.615898+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:70:[2026-07-04T15:19:03.954892+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:92:[2026-07-04T15:26:17.199390+00:00] sync desired enabled peers: 2\n/opt/wg-access/agent/logs/agent.log:94:[2026-07-04T15:26:17.337698+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:125:[2026-07-04T15:35:52.741243+00:00] sync desired enabled peers: 2\n/opt/wg-access/agent/logs/agent.log:126:[2026-07-04T15:35:53.306310+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:142:[2026-07-04T15:56:30.286651+00:00] sync desired enabled peers: 3\n/opt/wg-access/agent/logs/agent.log:145:[2026-07-04T15:56:30.380320+00:00] sync current runtime peers: 2\n/opt/wg-access/agent/logs/agent.log:185:[2026-07-04T15:58:57.370294+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:189:[2026-07-04T15:58:57.477509+00:00] sync current runtime peers: 3\n/opt/wg-access/agent/logs/agent.log:219:[2026-07-04T16:01:57.846873+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:220:[2026-07-04T16:01:57.935512+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:242:[2026-07-04T16:02:01.901657+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:244:[2026-07-04T16:02:01.995271+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:258:[2026-07-04T16:05:36.732089+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:259:[2026-07-04T16:05:36.828585+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:265:[2026-07-04T16:06:57.680005+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:266:[2026-07-04T16:06:57.779254+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:272:[2026-07-04T16:07:28.675320+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:273:[2026-07-04T16:07:28.770194+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:279:[2026-07-04T16:08:03.679821+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:280:[2026-07-04T16:08:03.818696+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:286:[2026-07-04T16:08:38.671674+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:287:[2026-07-04T16:08:38.783090+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:293:[2026-07-04T16:09:13.676624+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:294:[2026-07-04T16:09:13.770350+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:300:[2026-07-04T16:09:48.679888+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:301:[2026-07-04T16:09:48.783070+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:307:[2026-07-04T16:10:23.675518+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:308:[2026-07-04T16:10:23.774403+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:314:[2026-07-04T16:10:55.127701+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:315:[2026-07-04T16:10:55.224942+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:321:[2026-07-04T16:11:28.675554+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:322:[2026-07-04T16:11:31.438188+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:328:[2026-07-04T16:12:02.903849+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:329:[2026-07-04T16:12:03.078314+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:335:[2026-07-04T16:12:37.675761+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:336:[2026-07-04T16:12:38.316685+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:342:[2026-07-04T16:13:08.684165+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:343:[2026-07-04T16:13:09.533010+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:349:[2026-07-04T16:13:44.684277+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:350:[2026-07-04T16:13:47.002914+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:356:[2026-07-04T16:14:23.675698+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:357:[2026-07-04T16:14:23.774270+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:363:[2026-07-04T16:14:58.679925+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:364:[2026-07-04T16:14:58.930446+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:370:[2026-07-04T16:15:33.679662+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:371:[2026-07-04T16:15:33.822381+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:377:[2026-07-04T16:16:08.679758+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:378:[2026-07-04T16:16:08.816371+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:384:[2026-07-04T16:16:43.679898+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:385:[2026-07-04T16:16:43.774709+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:391:[2026-07-04T16:17:18.679467+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:392:[2026-07-04T16:17:18.776722+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:398:[2026-07-04T16:17:53.675716+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:399:[2026-07-04T16:17:54.538121+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:405:[2026-07-04T16:18:25.215448+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:406:[2026-07-04T16:18:25.369481+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:412:[2026-07-04T16:18:58.675465+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:413:[2026-07-04T16:18:58.819586+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:419:[2026-07-04T16:19:30.272499+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:420:[2026-07-04T16:19:31.101289+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:442:[2026-07-04T16:20:06.676247+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:444:[2026-07-04T16:20:06.820881+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:455:[2026-07-04T16:20:38.679873+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:457:[2026-07-04T16:20:38.777618+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:471:[2026-07-04T16:21:13.680087+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:473:[2026-07-04T16:21:13.812724+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:487:[2026-07-04T16:21:45.192228+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:489:[2026-07-04T16:21:45.347490+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:503:[2026-07-04T16:22:18.679626+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:504:[2026-07-04T16:22:18.813004+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:510:[2026-07-04T16:22:53.671427+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:511:[2026-07-04T16:22:53.838977+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:517:[2026-07-04T16:23:28.675921+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:518:[2026-07-04T16:23:28.798766+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:524:[2026-07-04T16:24:03.676553+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:525:[2026-07-04T16:24:03.816495+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:531:[2026-07-04T16:24:38.679845+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:532:[2026-07-04T16:24:38.774877+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:538:[2026-07-04T16:25:10.300361+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:539:[2026-07-04T16:25:10.442101+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:545:[2026-07-04T16:25:44.675800+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:546:[2026-07-04T16:25:44.870998+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:552:[2026-07-04T16:26:18.679808+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:553:[2026-07-04T16:26:18.852255+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:559:[2026-07-04T16:26:53.675737+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:560:[2026-07-04T16:26:53.865350+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:566:[2026-07-04T16:27:25.339471+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:567:[2026-07-04T16:27:25.506752+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:573:[2026-07-04T16:27:58.675749+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:574:[2026-07-04T16:27:58.836220+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:580:[2026-07-04T16:28:33.679935+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:581:[2026-07-04T16:28:34.460949+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:587:[2026-07-04T16:29:08.675622+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:588:[2026-07-04T16:29:08.818256+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:594:[2026-07-04T16:29:40.407759+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:595:[2026-07-04T16:29:40.559223+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:601:[2026-07-04T16:30:15.683005+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:602:[2026-07-04T16:30:15.818673+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:608:[2026-07-04T16:30:48.676016+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:609:[2026-07-04T16:30:48.870200+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:615:[2026-07-04T16:31:23.675496+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:616:[2026-07-04T16:31:23.810698+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:622:[2026-07-04T16:31:55.387929+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:623:[2026-07-04T16:31:55.562850+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:629:[2026-07-04T16:32:28.044495+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:630:[2026-07-04T16:32:28.207673+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:652:[2026-07-04T16:33:03.675512+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:654:[2026-07-04T16:33:03.779891+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:668:[2026-07-04T16:33:38.675595+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:669:[2026-07-04T16:33:38.768337+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:675:[2026-07-04T16:34:10.415557+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:676:[2026-07-04T16:34:10.532239+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:682:[2026-07-04T16:34:45.676143+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:683:[2026-07-04T16:34:45.787821+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:689:[2026-07-04T16:35:18.683338+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:690:[2026-07-04T16:35:19.098488+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:696:[2026-07-04T16:35:53.675621+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:697:[2026-07-04T16:35:53.769225+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:703:[2026-07-04T16:36:25.431630+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:704:[2026-07-04T16:36:25.587792+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:710:[2026-07-04T16:36:59.409515+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:711:[2026-07-04T16:36:59.539958+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:717:[2026-07-04T16:37:34.682785+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:718:[2026-07-04T16:37:34.776131+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:724:[2026-07-04T16:38:08.684072+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:725:[2026-07-04T16:38:08.808752+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:731:[2026-07-04T16:38:40.460222+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:732:[2026-07-04T16:38:40.560656+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:738:[2026-07-04T16:39:14.343635+00:00] sync desired enabled peers: 1\n/opt/wg-access/agent/logs/agent.log:739:[2026-07-04T16:39:14.482282+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:761:[2026-07-04T16:39:48.675930+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:763:[2026-07-04T16:39:48.773120+00:00] sync current runtime peers: 1\n/opt/wg-access/agent/logs/agent.log:777:[2026-07-04T16:40:23.680821+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:778:[2026-07-04T16:40:23.818252+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:784:[2026-07-04T16:40:55.496165+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:785:[2026-07-04T16:40:55.590836+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:791:[2026-07-04T16:41:28.687816+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:792:[2026-07-04T16:41:28.844201+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:798:[2026-07-04T16:42:03.680271+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:799:[2026-07-04T16:42:03.846966+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:805:[2026-07-04T16:42:38.675998+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:806:[2026-07-04T16:42:39.872724+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:812:[2026-07-04T16:43:14.675779+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:813:[2026-07-04T16:43:14.799231+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:819:[2026-07-04T16:43:47.788682+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:820:[2026-07-04T16:43:47.900783+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:826:[2026-07-04T16:44:18.675593+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:827:[2026-07-04T16:44:18.827292+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:833:[2026-07-04T16:44:52.803677+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:834:[2026-07-04T16:44:52.965670+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:840:[2026-07-04T16:45:25.540261+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:841:[2026-07-04T16:45:25.716170+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:847:[2026-07-04T16:45:58.675901+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:848:[2026-07-04T16:45:58.787933+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:854:[2026-07-04T16:46:33.681530+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:855:[2026-07-04T16:46:33.866077+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:861:[2026-07-04T16:47:08.676700+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:862:[2026-07-04T16:47:08.772577+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:868:[2026-07-04T16:47:40.579475+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:869:[2026-07-04T16:47:40.687722+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:875:[2026-07-04T16:48:15.676028+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:876:[2026-07-04T16:48:15.794273+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:882:[2026-07-04T16:48:48.676016+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:883:[2026-07-04T16:48:49.300992+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:889:[2026-07-04T16:49:23.691638+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:890:[2026-07-04T16:49:24.200760+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:896:[2026-07-04T16:49:55.595532+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:897:[2026-07-04T16:49:55.705080+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:903:[2026-07-04T16:50:28.676435+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:904:[2026-07-04T16:50:28.775911+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:910:[2026-07-04T16:51:03.679456+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:911:[2026-07-04T16:51:03.775532+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:917:[2026-07-04T16:51:38.675645+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:918:[2026-07-04T16:51:38.791846+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:924:[2026-07-04T16:52:10.619784+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:925:[2026-07-04T16:52:10.724577+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:931:[2026-07-04T16:52:45.679440+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:932:[2026-07-04T16:52:45.827948+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:938:[2026-07-04T16:53:18.675676+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:939:[2026-07-04T16:53:18.797713+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:945:[2026-07-04T16:53:53.676212+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:946:[2026-07-04T16:53:53.773352+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:952:[2026-07-04T16:54:25.655468+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:953:[2026-07-04T16:54:25.744514+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:959:[2026-07-04T16:54:58.679676+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:960:[2026-07-04T16:54:58.774723+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:966:[2026-07-04T16:55:33.675504+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:967:[2026-07-04T16:55:33.855421+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:973:[2026-07-04T16:56:08.676195+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:974:[2026-07-04T16:56:08.783374+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:980:[2026-07-04T16:56:40.671897+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:981:[2026-07-04T16:56:40.803930+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:987:[2026-07-04T16:57:15.675834+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:988:[2026-07-04T16:57:15.837983+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:994:[2026-07-04T16:57:48.676548+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:995:[2026-07-04T16:57:48.813724+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1001:[2026-07-04T16:58:23.677023+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1002:[2026-07-04T16:58:23.783892+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1008:[2026-07-04T16:58:55.699893+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1009:[2026-07-04T16:58:55.852751+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1015:[2026-07-04T16:59:28.675710+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1016:[2026-07-04T16:59:28.784140+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1022:[2026-07-04T17:00:03.676011+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1023:[2026-07-04T17:00:03.802600+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1029:[2026-07-04T17:00:38.676069+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1030:[2026-07-04T17:00:39.325402+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1036:[2026-07-04T17:01:10.740036+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1037:[2026-07-04T17:01:11.300570+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1043:[2026-07-04T17:01:45.675924+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1044:[2026-07-04T17:01:45.779700+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1050:[2026-07-04T17:02:18.687365+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1051:[2026-07-04T17:02:19.459955+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1057:[2026-07-04T17:02:54.676059+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1058:[2026-07-04T17:02:54.907469+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1064:[2026-07-04T17:03:25.751414+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1065:[2026-07-04T17:03:25.850930+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1071:[2026-07-04T17:03:58.679476+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1072:[2026-07-04T17:03:58.876441+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1078:[2026-07-04T17:04:33.675617+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1079:[2026-07-04T17:04:33.913164+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1085:[2026-07-04T17:05:08.679897+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1086:[2026-07-04T17:05:08.805989+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1092:[2026-07-04T17:05:40.780037+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1093:[2026-07-04T17:05:40.897314+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1099:[2026-07-04T17:06:15.679658+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1100:[2026-07-04T17:06:16.232622+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1106:[2026-07-04T17:06:48.679799+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1107:[2026-07-04T17:06:48.780247+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1113:[2026-07-04T17:07:23.679935+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1114:[2026-07-04T17:07:23.775675+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1120:[2026-07-04T17:07:55.808197+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1121:[2026-07-04T17:07:55.898670+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1127:[2026-07-04T17:08:28.675460+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1128:[2026-07-04T17:08:30.806995+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1134:[2026-07-04T17:09:02.999906+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1135:[2026-07-04T17:09:03.203875+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1141:[2026-07-04T17:09:37.679859+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1142:[2026-07-04T17:09:37.888979+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1148:[2026-07-04T17:10:10.839745+00:00] sync desired enabled peers: 0\n/opt/wg-access/agent/logs/agent.log:1149:[2026-07-04T17:10:10.993815+00:00] sync current runtime peers: 0\n/opt/wg-access/agent/logs/agent.log:1155:[2026-07-04T17:10:45.679693+00:00] sync desired enabled peers: 0"
      },
      "selector_refs": {
        "rc": 0,
        "stderr": "",
        "stdout": "/usr/local/sbin/wg-access-agent-selector-remote-plan.py:19:    selector_class = str(payload.get(\"selector_class\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py:48:SELECTOR_CLASS={q(selector_class)}\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py:49:BACKUP=\"/root/peers.conf.before-agent-selector-apply-$(date +%Y%m%d-%H%M%S)\"\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py:91:    parser.add_argument(\"--selector-conf\", default=\"/etc/router-wgpay-selector.d/peers.conf\")\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py:135:            \"slot_code\": payload.get(\"slot_code\", \"\"),\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py:136:            \"selector_class\": payload.get(\"selector_class\", \"\"),\n/usr/local/sbin/wg-access-agent-selector-remote-plan.py:137:            \"selector_label\": payload.get(\"selector_label\", \"\"),\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:28:        selector_class = parts[1]\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:31:        used_classes.add(selector_class)\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:39:            \"selector_class\": selector_class,\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:55:        code = slot.get(\"slot_code\", \"\")\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:56:        cls = slot.get(\"selector_class\", \"\")\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:67:            reason.append(\"selector_class_already_assigned\")\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:73:                \"slot_code\": code,\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:74:                \"selector_class\": cls,\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:82:        candidates.sort(key=lambda s: ORDER.index(s.get(\"slot_code\")) if s.get(\"slot_code\") in ORDER else 999)\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:87:                ORDER.index(s.get(\"slot_code\")) if s.get(\"slot_code\") in ORDER else 999,\n/usr/local/sbin/wg-access-slot-allocator-dry-run.py:100:        \"used_selector_classes\": sorted(used_classes),\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:9:    \"vpn1\": {\"selector_class\": \"cs4\", \"selector_label\": \"canary_vpn1\", \"fwmark\": \"0x201\", \"table_id\": 201, \"interface_name\": \"vpn1\"},\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:10:    \"vpn2\": {\"selector_class\": \"cs5\", \"selector_label\": \"canary_vpn2\", \"fwmark\": \"0x202\", \"table_id\": 202, \"interface_name\": \"vpn2\"},\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:11:    \"vpn3\": {\"selector_class\": \"cs1\", \"selector_label\": \"canary_vpn3\", \"fwmark\": \"0x203\", \"table_id\": 203, \"interface_name\": \"vpn3\"},\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:12:    \"vpn4\": {\"selector_class\": \"cs2\", \"selector_label\": \"canary_vpn4\", \"fwmark\": \"0x204\", \"table_id\": 204, \"interface_name\": \"vpn4\"},\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:13:    \"vpn5\": {\"selector_class\": \"cs3\", \"selector_label\": \"canary_vpn5\", \"fwmark\": \"0x205\", \"table_id\": 205, \"interface_name\": \"vpn5\"},\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:30:            \"selector_class\": parts[1],\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:31:            \"selector_label\": parts[2],\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:37:    return {s.get(\"slot_code\"): s for s in data.get(\"slots\", [])}\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:58:    slot_code = str(payload.get(\"slot_code\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:59:    selector_class = str(payload.get(\"selector_class\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:60:    selector_label = str(payload.get(\"selector_label\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:71:    expected = EXPECTED.get(slot_code)\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:73:        errors.append(\"unknown_slot_code\")\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:75:        for key in (\"selector_class\", \"selector_label\", \"fwmark\", \"table_id\", \"interface_name\"):\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:79:    slot_status = slots.get(slot_code)\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:85:        for key in (\"selector_class\", \"fwmark\", \"table_id\", \"interface_name\"):\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:89:    exact_line = f\"{tunnel_ip} {selector_class} {selector_label}\"\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:100:        if e.get(\"selector_class\") == selector_class and e[\"raw\"] != exact_line\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:104:        if e.get(\"selector_label\") == selector_label and e[\"raw\"] != exact_line\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:110:        errors.append(\"same_selector_class_conflict\")\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:112:        errors.append(\"same_selector_label_conflict\")\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:134:        \"same_selector_class_conflict_count\": len(same_class_conflicts),\n/usr/local/sbin/wg-access-agent-selector-contract-dry-run.py:135:        \"same_selector_label_conflict_count\": len(same_label_conflicts),\n/usr/local/sbin/wg-access-agent-selector-apply.py:9:    \"vpn1\": {\"selector_class\": \"cs4\", \"selector_label\": \"canary_vpn1\", \"fwmark\": \"0x201\", \"table_id\": 201, \"interface_name\": \"vpn1\"},\n/usr/local/sbin/wg-access-agent-selector-apply.py:10:    \"vpn2\": {\"selector_class\": \"cs5\", \"selector_label\": \"canary_vpn2\", \"fwmark\": \"0x202\", \"table_id\": 202, \"interface_name\": \"vpn2\"},\n/usr/local/sbin/wg-access-agent-selector-apply.py:11:    \"vpn3\": {\"selector_class\": \"cs1\", \"selector_label\": \"canary_vpn3\", \"fwmark\": \"0x203\", \"table_id\": 203, \"interface_name\": \"vpn3\"},\n/usr/local/sbin/wg-access-agent-selector-apply.py:12:    \"vpn4\": {\"selector_class\": \"cs2\", \"selector_label\": \"canary_vpn4\", \"fwmark\": \"0x204\", \"table_id\": 204, \"interface_name\": \"vpn4\"},\n/usr/local/sbin/wg-access-agent-selector-apply.py:13:    \"vpn5\": {\"selector_class\": \"cs3\", \"selector_label\": \"canary_vpn5\", \"fwmark\": \"0x205\", \"table_id\": 205, \"interface_name\": \"vpn5\"},\n/usr/local/sbin/wg-access-agent-selector-apply.py:35:            \"selector_class\": parts[1],\n/usr/local/sbin/wg-access-agent-selector-apply.py:36:            \"selector_label\": parts[2],\n/usr/local/sbin/wg-access-agent-selector-apply.py:42:    return {slot.get(\"slot_code\"): slot for slot in data.get(\"slots\", [])}\n/usr/local/sbin/wg-access-agent-selector-apply.py:49:    slot_code = str(payload.get(\"slot_code\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-apply.py:50:    selector_class = str(payload.get(\"selector_class\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-apply.py:51:    selector_label = str(payload.get(\"selector_label\", \"\"))\n/usr/local/sbin/wg-access-agent-selector-apply.py:61:    expected = EXPECTED.get(slot_code)\n/usr/local/sbin/wg-access-agent-selector-apply.py:63:        errors.append(\"unknown_slot_code\")\n/usr/local/sbin/wg-access-agent-selector-apply.py:65:        for key in (\"selector_class\", \"selector_label\", \"fwmark\", \"table_id\", \"interface_name\"):\n/usr/local/sbin/wg-access-agent-selector-apply.py:69:    slot = slots.get(slot_code)\n/usr/local/sbin/wg-access-agent-selector-apply.py:75:        for key in (\"selector_class\", \"fwmark\", \"table_id\", \"interface_name\"):\n/usr/local/sbin/wg-access-agent-selector-apply.py:82:    exact_line = f\"{tunnel_ip} {selector_class} {selector_label}\"\n/usr/local/sbin/wg-access-agent-selector-apply.py:93:        if entry.get(\"selector_class\") == selector_class and entry[\"raw\"] != exact_line\n/usr/local/sbin/wg-access-agent-selector-apply.py:97:        if entry.get(\"selector_label\") == selector_label and entry[\"raw\"] != exact_line\n/usr/local/sbin/wg-access-agent-selector-apply.py:103:        errors.append(\"same_selector_class_conflict\")\n/usr/local/sbin/wg-access-agent-selector-apply.py:105:        errors.append(\"same_selector_label_conflict\")\n/usr/local/sbin/wg-access-agent-selector-apply.py:127:        \"same_selector_class_conflict_count\": len(same_class_conflicts),\n/usr/local/sbin/wg-access-agent-selector-apply.py:128:        \"same_selector_label_conflict_count\": len(same_label_conflicts),\n/usr/local/sbin/wg-access-agent-selector-apply.py:134:            \"slot_code\": slot_code,\n/usr/local/sbin/wg-access-agent-selector-apply.py:135:            \"selector_class\": selector_class,\n/usr/local/sbin/wg-access-agent-selector-apply.py:136:            \"selector_label\": selector_label,\n/usr/local/sbin/wg-access-agent-job-selector-plan.py:23:        \"slot_code\": selector.get(\"slot_code\", payload.get(\"slot_code\", \"\")),\n/usr/local/sbin/wg-access-agent-job-selector-plan.py:24:        \"selector_class\": selector.get(\"selector_class\", payload.get(\"selector_class\", \"\")),\n/usr/local/sbin/wg-access-agent-job-selector-plan.py:25:        \"selector_label\": selector.get(\"selector_label\", payload.get(\"selector_label\", \"\")),"
      }
    },
    "step": "STEP_042A_AGENT_AUTOMATION_CONTRACT_INVENTORY_READONLY",
    "systemd": {
      "agent_journal_tail": {
        "rc": 0,
        "stderr": "",
        "stdout": "Jul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: peer: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   preshared key: (hidden)\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   endpoint: 10.71.100.2:40520\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   allowed ips: 10.253.1.10/32\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   latest handshake: 20 hours, 34 minutes, 28 seconds ago\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: [2026-07-09T09:39:58.214403+00:00] fetched pending jobs: 1\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: [2026-07-09T09:39:58.214484+00:00] starting job_id=eff9c042-22a2-416f-8b58-4a046fd52609 action=disable_peer\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: [2026-07-09T09:39:58.672286+00:00] remote stdout: interface: wg_paid\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   public key: FD1J+KVZ965pCjgtO0YWxJsKANY9uz6v1P54JLkiZzY=\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   private key: (hidden)\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   listening port: 51830\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: peer: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   preshared key: (hidden)\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   endpoint: 10.71.100.2:39020\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   allowed ips: 10.253.1.13/32\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   latest handshake: 18 hours, 27 minutes, 25 seconds ago\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: peer: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   preshared key: (hidden)\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   endpoint: 10.71.100.2:41351\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   allowed ips: 10.253.1.12/32\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   latest handshake: 19 hours, 29 minutes, 32 seconds ago\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   transfer: 692 B received, 3.48 KiB sent\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: peer: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   preshared key: (hidden)\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   endpoint: 10.71.100.2:35150\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   allowed ips: 10.253.1.11/32\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   latest handshake: 19 hours, 43 minutes, 9 seconds ago\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: peer: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   preshared key: (hidden)\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   endpoint: 10.71.100.2:40520\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   allowed ips: 10.253.1.10/32\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   latest handshake: 20 hours, 34 minutes, 28 seconds ago\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: [2026-07-09T09:39:58.672733+00:00] REAL disable_peer peer_id=9898db52-e3cf-41fd-9bc6-a3f31ea601ec\nJul 09 09:39:58 wg-access-dev wg_access_agent.py[124193]: [2026-07-09T09:39:58.680120+00:00] completed job_id=eff9c042-22a2-416f-8b58-4a046fd52609 status=completed attempts=1\nJul 09 09:39:58 wg-access-dev systemd[1]: wg-access-agent.service: Deactivated successfully.\nJul 09 09:39:58 wg-access-dev systemd[1]: Finished wg-access-agent.service - WG Access Agent real poller.\nJul 09 09:40:00 wg-access-dev systemd[1]: Starting wg-access-agent.service - WG Access Agent real poller...\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.547137+00:00] sync desired enabled peers: 5\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.721213+00:00] remote stdout: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=        10.253.1.10/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=        10.253.1.11/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=        10.253.1.12/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=        10.253.1.13/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.721307+00:00] sync current runtime peers: 4\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.721370+00:00] sync keep peer tunnel_ip=10.253.1.10\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.721424+00:00] sync keep peer tunnel_ip=10.253.1.11\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.721477+00:00] sync keep peer tunnel_ip=10.253.1.12\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.721526+00:00] sync keep peer tunnel_ip=10.253.1.13\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:00.942009+00:00] sync set peer tunnel_ip=10.253.1.14\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.159550+00:00] remote stdout: interface: wg_paid\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   public key: FD1J+KVZ965pCjgtO0YWxJsKANY9uz6v1P54JLkiZzY=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   private key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   listening port: 51830\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:39020\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.13/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 18 hours, 27 minutes, 28 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:41351\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.12/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 19 hours, 29 minutes, 35 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 692 B received, 3.48 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:35150\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.11/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 19 hours, 43 minutes, 12 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:40520\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.10/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 20 hours, 34 minutes, 31 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.14/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.164404+00:00] fetched pending jobs: 1\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.164483+00:00] starting job_id=ca984318-a6fb-47b8-9bd7-37ecbaae65d3 action=enable_peer\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.591753+00:00] remote stdout: interface: wg_paid\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   public key: FD1J+KVZ965pCjgtO0YWxJsKANY9uz6v1P54JLkiZzY=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   private key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   listening port: 51830\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:39020\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.13/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 18 hours, 27 minutes, 28 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:41351\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.12/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 19 hours, 29 minutes, 35 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 692 B received, 3.48 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:35150\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.11/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 19 hours, 43 minutes, 12 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   endpoint: 10.71.100.2:40520\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.10/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 20 hours, 34 minutes, 31 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.14/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.592209+00:00] REAL enable_peer peer_id=e4adcfa1-6fbc-4471-b66b-8d7837f35f9d tunnel_ip=10.253.1.14\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.598543+00:00] completed job_id=ca984318-a6fb-47b8-9bd7-37ecbaae65d3 status=completed attempts=1\nJul 09 09:40:01 wg-access-dev systemd[1]: wg-access-agent.service: Deactivated successfully.\nJul 09 09:40:01 wg-access-dev systemd[1]: Finished wg-access-agent.service - WG Access Agent real poller."
      },
      "agent_timer_journal_tail": {
        "rc": 0,
        "stderr": "",
        "stdout": "Jul 04 10:40:57 wg-access-dev systemd[1]: Started wg-access-agent.timer - Run WG Access Agent every 30 seconds.\nJul 04 10:45:12 wg-access-dev systemd[1]: wg-access-agent.timer: Deactivated successfully.\nJul 04 10:45:12 wg-access-dev systemd[1]: Stopped wg-access-agent.timer - Run WG Access Agent every 30 seconds.\nJul 04 16:05:37 wg-access-dev systemd[1]: Started wg-access-agent.timer - Run WG Access Agent every 30 seconds.\nJul 04 16:06:47 wg-access-dev systemd[1]: wg-access-agent.timer: Deactivated successfully.\nJul 04 16:06:47 wg-access-dev systemd[1]: Stopped wg-access-agent.timer - Run WG Access Agent periodically.\nJul 04 16:06:47 wg-access-dev systemd[1]: Stopping wg-access-agent.timer - Run WG Access Agent periodically...\nJul 04 16:06:47 wg-access-dev systemd[1]: Started wg-access-agent.timer - Run WG Access Agent periodically.\nJul 06 14:49:54 wg-access-dev systemd[1]: wg-access-agent.timer: Deactivated successfully.\nJul 06 14:49:54 wg-access-dev systemd[1]: Stopped wg-access-agent.timer - Run WG Access Agent periodically."
      },
      "list_timers_wg_access": {
        "rc": 0,
        "stderr": "",
        "stdout": "Thu 2026-07-09 09:53:34 UTC 4min 58s left Thu 2026-07-09 09:48:06 UTC 30s ago      wg-access-expire-subscriptions.timer wg-access-expire-subscriptions.service"
      },
      "list_units_wg_access": {
        "rc": 0,
        "stderr": "",
        "stdout": "dev-virtio\\x2dports-org.qemu.guest_agent.0.device                                                      loaded    active   plugged   /dev/virtio-ports/org.qemu.guest_agent.0\n  qemu-guest-agent.service                                                                               loaded    active   running   QEMU Guest Agent\n  wg-access-agent.service                                                                                loaded    inactive dead      WG Access Agent real poller\n  wg-access-expire-subscriptions.service                                                                 loaded    inactive dead      WG Access expire subscriptions maintenance\n  wg-access-expire-subscriptions.timer                                                                   loaded    active   waiting   Run WG Access expire subscriptions maintenance periodically"
      },
      "unit_files_wg_access": {
        "rc": 0,
        "stderr": "",
        "stdout": "qemu-guest-agent.service                                                      static          -\nwg-access-agent.service                                                       static          -\nwg-access-expire-subscriptions.service                                        static          -\nwg-access-agent.timer                                                         disabled        enabled\nwg-access-expire-subscriptions.timer                                          enabled         enabled"
      },
      "wg-access-agent.service": {
        "cat": {
          "rc": 0,
          "stderr": "",
          "stdout": "# /etc/systemd/system/wg-access-agent.service\n[Unit]\nDescription=WG Access Agent real poller\nAfter=network-online.target docker.service\nWants=network-online.target\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/opt/wg-access/agent\nEnvironment=WG_ACCESS_AGENT_ENV=/opt/wg-access/agent/agent.env\nExecStart=/opt/wg-access/agent/wg_access_agent.py"
        },
        "is_active_rc": 3,
        "is_active_stdout": "inactive",
        "is_enabled_rc": 0,
        "is_enabled_stdout": "static",
        "status_no_pager": {
          "rc": 3,
          "stderr": "",
          "stdout": "○ wg-access-agent.service - WG Access Agent real poller\n     Loaded: loaded (/etc/systemd/system/wg-access-agent.service; static)\n     Active: inactive (dead) since Thu 2026-07-09 09:40:01 UTC; 8min ago\n    Process: 124431 ExecStart=/opt/wg-access/agent/wg_access_agent.py (code=exited, status=0/SUCCESS)\n   Main PID: 124431 (code=exited, status=0/SUCCESS)\n        CPU: 134ms\n\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.10/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   latest handshake: 20 hours, 34 minutes, 31 seconds ago\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: peer: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   preshared key: (hidden)\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]:   allowed ips: 10.253.1.14/32\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.592209+00:00] REAL enable_peer peer_id=e4adcfa1-6fbc-4471-b66b-8d7837f35f9d tunnel_ip=10.253.1.14\nJul 09 09:40:01 wg-access-dev wg_access_agent.py[124431]: [2026-07-09T09:40:01.598543+00:00] completed job_id=ca984318-a6fb-47b8-9bd7-37ecbaae65d3 status=completed attempts=1\nJul 09 09:40:01 wg-access-dev systemd[1]: wg-access-agent.service: Deactivated successfully.\nJul 09 09:40:01 wg-access-dev systemd[1]: Finished wg-access-agent.service - WG Access Agent real poller."
        }
      },
      "wg-access-agent.timer": {
        "cat": {
          "rc": 0,
          "stderr": "",
          "stdout": "# /etc/systemd/system/wg-access-agent.timer\n[Unit]\nDescription=Run WG Access Agent periodically\n\n[Timer]\nOnActiveSec=5sec\nOnUnitInactiveSec=30sec\nAccuracySec=5sec\nUnit=wg-access-agent.service\n\n[Install]\nWantedBy=timers.target"
        },
        "is_active_rc": 3,
        "is_active_stdout": "inactive",
        "is_enabled_rc": 1,
        "is_enabled_stdout": "disabled",
        "status_no_pager": {
          "rc": 3,
          "stderr": "",
          "stdout": "○ wg-access-agent.timer - Run WG Access Agent periodically\n     Loaded: loaded (/etc/systemd/system/wg-access-agent.timer; disabled; preset: enabled)\n     Active: inactive (dead)\n    Trigger: n/a\n   Triggers: ● wg-access-agent.service"
        }
      },
      "wg-access-expire-subscriptions.service": {
        "cat": {
          "rc": 0,
          "stderr": "",
          "stdout": "# /etc/systemd/system/wg-access-expire-subscriptions.service\n[Unit]\nDescription=WG Access expire subscriptions maintenance\nWants=network-online.target\nAfter=network-online.target docker.service wg-access-agent.service\n\n[Service]\nType=oneshot\nExecStart=/usr/local/sbin/wg-access-expire-subscriptions.sh\nUser=root\nGroup=root"
        },
        "is_active_rc": 3,
        "is_active_stdout": "inactive",
        "is_enabled_rc": 0,
        "is_enabled_stdout": "static",
        "status_no_pager": {
          "rc": 3,
          "stderr": "",
          "stdout": "○ wg-access-expire-subscriptions.service - WG Access expire subscriptions maintenance\n     Loaded: loaded (/etc/systemd/system/wg-access-expire-subscriptions.service; static)\n     Active: inactive (dead) since Thu 2026-07-09 09:48:06 UTC; 30s ago\nTriggeredBy: ● wg-access-expire-subscriptions.timer\n    Process: 125628 ExecStart=/usr/local/sbin/wg-access-expire-subscriptions.sh (code=exited, status=0/SUCCESS)\n   Main PID: 125628 (code=exited, status=0/SUCCESS)\n        CPU: 19ms\n\nJul 09 09:48:06 wg-access-dev systemd[1]: Starting wg-access-expire-subscriptions.service - WG Access expire subscriptions maintenance...\nJul 09 09:48:06 wg-access-dev wg-access-expire-subscriptions.sh[125633]: == 2026-07-09T09:48:06+00:00 expire-subscriptions ==\nJul 09 09:48:06 wg-access-dev wg-access-expire-subscriptions.sh[125633]: http_code=200\nJul 09 09:48:06 wg-access-dev wg-access-expire-subscriptions.sh[125633]: {\"expired_subscription_count\":0,\"disabled_peer_count\":0,\"job_ids\":[],\"subscription_ids\":[]}\nJul 09 09:48:06 wg-access-dev systemd[1]: wg-access-expire-subscriptions.service: Deactivated successfully.\nJul 09 09:48:06 wg-access-dev systemd[1]: Finished wg-access-expire-subscriptions.service - WG Access expire subscriptions maintenance."
        }
      },
      "wg-access-expire-subscriptions.timer": {
        "cat": {
          "rc": 0,
          "stderr": "",
          "stdout": "# /etc/systemd/system/wg-access-expire-subscriptions.timer\n[Unit]\nDescription=Run WG Access expire subscriptions maintenance periodically\n\n[Timer]\nOnBootSec=2min\nOnUnitActiveSec=5min\nAccuracySec=30s\nRandomizedDelaySec=30s\nPersistent=true\n\n[Install]\nWantedBy=timers.target"
        },
        "is_active_rc": 0,
        "is_active_stdout": "active",
        "is_enabled_rc": 0,
        "is_enabled_stdout": "enabled",
        "status_no_pager": {
          "rc": 0,
          "stderr": "",
          "stdout": "● wg-access-expire-subscriptions.timer - Run WG Access expire subscriptions maintenance periodically\n     Loaded: loaded (/etc/systemd/system/wg-access-expire-subscriptions.timer; enabled; preset: enabled)\n     Active: active (waiting) since Wed 2026-07-08 17:21:30 UTC; 16h ago\n    Trigger: Thu 2026-07-09 09:53:34 UTC; 4min 58s left\n   Triggers: ● wg-access-expire-subscriptions.service\n\nJul 08 17:21:30 wg-access-dev systemd[1]: Started wg-access-expire-subscriptions.timer - Run WG Access expire subscriptions maintenance periodically."
        }
      },
      "wg-access-reconcile.service": {
        "cat": {
          "rc": 1,
          "stderr": "No files found for wg-access-reconcile.service.",
          "stdout": ""
        },
        "is_active_rc": 3,
        "is_active_stdout": "inactive",
        "is_enabled_rc": 1,
        "is_enabled_stdout": "",
        "status_no_pager": {
          "rc": 4,
          "stderr": "Unit wg-access-reconcile.service could not be found.",
          "stdout": ""
        }
      },
      "wg-access-reconcile.timer": {
        "cat": {
          "rc": 1,
          "stderr": "No files found for wg-access-reconcile.timer.",
          "stdout": ""
        },
        "is_active_rc": 3,
        "is_active_stdout": "inactive",
        "is_enabled_rc": 1,
        "is_enabled_stdout": "",
        "status_no_pager": {
          "rc": 4,
          "stderr": "Unit wg-access-reconcile.timer could not be found.",
          "stdout": ""
        }
      }
    }
  }
}
