{
  "actions": {
    "daemon_reload_1": {
      "rc": 0,
      "stderr": "",
      "stdout": ""
    },
    "disable_agent_path": {
      "rc": 0,
      "stderr": "Removed \"/etc/systemd/system/multi-user.target.wants/wg-access-agent.path\".",
      "stdout": ""
    },
    "enable_watcher": {
      "rc": 0,
      "stderr": "Created symlink /etc/systemd/system/multi-user.target.wants/wg-access-trigger-watch.service → /etc/systemd/system/wg-access-trigger-watch.service.",
      "stdout": ""
    },
    "restart_watcher": {
      "rc": 0,
      "stderr": "",
      "stdout": ""
    },
    "stop_agent_path": {
      "rc": 0,
      "stderr": "",
      "stdout": ""
    }
  },
  "assessment": {
    "all_ok": false,
    "ready_for_042J_backend_create_disable_happy_path": false,
    "success_checks": {
      "backend_health_ok": true,
      "backend_helper_still_writes_events": true,
      "direct_helper_call_ok": true,
      "manual_agent_service_start_not_used": true,
      "old_path_disabled_or_inactive": true,
      "pending_global_zero_after": true,
      "private_material_not_published": true,
      "watcher_active": true,
      "watcher_enabled": true,
      "watcher_observed_helper_event_and_started_agent": false,
      "watcher_script_installed": true,
      "watcher_unit_installed": true
    }
  },
  "changes": {
    "backend_helper_changed": "NO",
    "backend_restarted": "NO",
    "host_watcher_installed": "YES",
    "manual_agent_service_start_used": "NO",
    "private_material_published": "NO",
    "systemd_path_disabled": "YES",
    "vm100_changed": "NO_EXPECTED",
    "vm101_changed": "NO",
    "vm121_changed": "YES"
  },
  "errors": [],
  "mode": "INSTALL_HOST_SIDE_WATCHER_FOR_BACKEND_EVENT_FILES",
  "precheck": {
    "agent_path_active_before": {
      "rc": 0,
      "stderr": "",
      "stdout": "active"
    },
    "agent_path_enabled_before": {
      "rc": 0,
      "stderr": "",
      "stdout": "enabled"
    },
    "backend_container": "wgaccess-backend",
    "backend_health": {
      "rc": 0,
      "stderr": "",
      "stdout": "{\"status\":\"ok\",\"service\":\"wg-access-backend\",\"environment\":\"dev\"}"
    },
    "pending_global_before": 0,
    "watcher_active_before": {
      "rc": 3,
      "stderr": "",
      "stdout": "inactive"
    },
    "watcher_enabled_before": {
      "rc": 1,
      "stderr": "Failed to get unit file state for wg-access-trigger-watch.service: No such file or directory",
      "stdout": ""
    }
  },
  "rollback": {
    "script": "/root/rollback-step042i-host-side-watcher-20260709-103758.sh"
  },
  "schema": "router-step-facts-v1",
  "step": "STEP_042I_REPLACE_EVENT_TRIGGER_WITH_RELIABLE_HOST_SIDE_WATCHER",
  "validation": {
    "agent_journal_recent": {
      "rc": 0,
      "stderr": "",
      "stdout": "Jul 09 10:37:58 wg-access-dev systemd[1]: Starting wg-access-agent.service - WG Access Agent real poller...\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.559884+00:00] sync desired enabled peers: 5\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.761999+00:00] remote stdout: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=        10.253.1.10/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=        10.253.1.11/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=        10.253.1.12/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=        10.253.1.13/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=        10.253.1.14/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.762115+00:00] sync current runtime peers: 5\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.766566+00:00] sync keep peer tunnel_ip=10.253.1.10\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.766650+00:00] sync keep peer tunnel_ip=10.253.1.11\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.766715+00:00] sync keep peer tunnel_ip=10.253.1.12\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.766769+00:00] sync keep peer tunnel_ip=10.253.1.13\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:58.766838+00:00] sync keep peer tunnel_ip=10.253.1.14\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:59.061711+00:00] remote stdout: interface: wg_paid\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   public key: FD1J+KVZ965pCjgtO0YWxJsKANY9uz6v1P54JLkiZzY=\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   private key: (hidden)\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   listening port: 51830\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: peer: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   preshared key: (hidden)\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   endpoint: 10.71.100.2:56264\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   allowed ips: 10.253.1.14/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   latest handshake: 57 minutes, 50 seconds ago\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   transfer: 820 B received, 3.61 KiB sent\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: peer: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   preshared key: (hidden)\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   endpoint: 10.71.100.2:39020\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   allowed ips: 10.253.1.13/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   latest handshake: 19 hours, 25 minutes, 26 seconds ago\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: peer: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   preshared key: (hidden)\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   endpoint: 10.71.100.2:41351\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   allowed ips: 10.253.1.12/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   latest handshake: 20 hours, 27 minutes, 33 seconds ago\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   transfer: 692 B received, 3.48 KiB sent\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: peer: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   preshared key: (hidden)\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   endpoint: 10.71.100.2:35150\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   allowed ips: 10.253.1.11/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   latest handshake: 20 hours, 41 minutes, 10 seconds ago\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: peer: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   preshared key: (hidden)\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   endpoint: 10.71.100.2:40520\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   allowed ips: 10.253.1.10/32\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   latest handshake: 21 hours, 32 minutes, 29 seconds ago\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 10:37:59 wg-access-dev wg_access_agent.py[147011]: [2026-07-09T10:37:59.067647+00:00] no pending jobs\nJul 09 10:37:59 wg-access-dev systemd[1]: wg-access-agent.service: Deactivated successfully.\nJul 09 10:37:59 wg-access-dev systemd[1]: Finished wg-access-agent.service - WG Access Agent real poller."
    },
    "agent_path_active_after": {
      "rc": 3,
      "stderr": "",
      "stdout": "inactive"
    },
    "agent_path_enabled_after": {
      "rc": 1,
      "stderr": "",
      "stdout": "disabled"
    },
    "agent_show_after_helper_event": "Result=success\nExecMainStartTimestampMonotonic=62194272147\nExecMainExitTimestampMonotonic=62194947867\nExecMainStatus=0\nInvocationID=47a799b2ace646d087c5cbf9b1399ede",
    "agent_show_before_helper_event": "Result=success\nExecMainStartTimestampMonotonic=62194272147\nExecMainExitTimestampMonotonic=62194947867\nExecMainStatus=0\nInvocationID=47a799b2ace646d087c5cbf9b1399ede",
    "backend_container_after": "wgaccess-backend",
    "backend_health_after": {
      "rc": 0,
      "stderr": "",
      "stdout": "{\"status\":\"ok\",\"service\":\"wg-access-backend\",\"environment\":\"dev\"}"
    },
    "backend_helper_still_has_event_dir": true,
    "direct_helper_call_from_backend_container": {
      "rc": 0,
      "stderr": "",
      "stdout": ""
    },
    "helper_event_observations": [
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 1,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 2,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 3,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 4,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 5,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 6,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 7,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 8,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 9,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 10,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 11,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 12,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 13,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 14,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 15,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 16,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 17,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 18,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 19,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      },
      {
        "agent_journal_seen": true,
        "invocation_changed": false,
        "mono_changed": false,
        "observed": false,
        "t_sec": 20,
        "watcher_saw_new_event": false,
        "watcher_started_agent": false
      }
    ],
    "pending_global_after_helper_event": 0,
    "pending_global_after_install": 0,
    "watcher_active_after": {
      "rc": 0,
      "stderr": "",
      "stdout": "active"
    },
    "watcher_enabled_after": {
      "rc": 0,
      "stderr": "",
      "stdout": "enabled"
    },
    "watcher_journal_after_start": {
      "rc": 0,
      "stderr": "",
      "stdout": "Jul 09 10:37:59 wg-access-dev systemd[1]: Started wg-access-trigger-watch.service - WG Access host-side trigger watcher.\nJul 09 10:37:59 wg-access-dev wg-access-trigger-watch.py[147081]: [2026-07-09T10:37:59Z] wg-access-trigger-watch: initialized seen set with existing_events=0"
    },
    "watcher_journal_recent": {
      "rc": 0,
      "stderr": "",
      "stdout": "Jul 09 10:37:59 wg-access-dev systemd[1]: Started wg-access-trigger-watch.service - WG Access host-side trigger watcher.\nJul 09 10:37:59 wg-access-dev wg-access-trigger-watch.py[147081]: [2026-07-09T10:37:59Z] wg-access-trigger-watch: initialized seen set with existing_events=0"
    },
    "watcher_status": {
      "rc": 0,
      "stderr": "",
      "stdout": "● wg-access-trigger-watch.service - WG Access host-side trigger watcher\n     Loaded: loaded (/etc/systemd/system/wg-access-trigger-watch.service; enabled; preset: enabled)\n     Active: active (running) since Thu 2026-07-09 10:37:59 UTC; 3s ago\n   Main PID: 147081 (python3)\n      Tasks: 1 (limit: 4686)\n     Memory: 5.6M\n        CPU: 28ms\n     CGroup: /system.slice/wg-access-trigger-watch.service\n             └─147081 python3 /usr/local/sbin/wg-access-trigger-watch.py\n\nJul 09 10:37:59 wg-access-dev systemd[1]: Started wg-access-trigger-watch.service - WG Access host-side trigger watcher.\nJul 09 10:37:59 wg-access-dev wg-access-trigger-watch.py[147081]: [2026-07-09T10:37:59Z] wg-access-trigger-watch: initialized seen set with existing_events=0"
    }
  }
}
