{
  "assessment": {
    "all_ok": true,
    "success_checks": {
      "backend_health_after_ok": true,
      "backend_health_before_ok": true,
      "bind_mount_visible_in_docker_inspect": true,
      "compose_config_detected": true,
      "compose_service_detected": true,
      "compose_up_backend_ok": true,
      "helper_call_from_backend_ok": true,
      "helper_event_visible_on_host": true,
      "manual_agent_service_start_not_used": true,
      "override_file_created": true,
      "pending_global_zero_after": true,
      "pending_global_zero_before": true,
      "private_material_not_published": true,
      "vm100_ip15_absent": true,
      "vm100_peer_count_five": true,
      "vm100_selector_count_five": true,
      "vm100_uci_empty": true,
      "vm101_legacy_table200_vpn1_ok": true,
      "vm101_table202_vpn2_ok": true,
      "watcher_active": true,
      "watcher_enabled": true,
      "watcher_observed_helper_event_and_started_agent": true
    }
  },
  "changes": {
    "backend_container_recreated": "YES",
    "compose_override_added": "YES",
    "default_override_added_if_absent": "YES",
    "manual_agent_service_start_used": "NO",
    "private_material_published": "NO",
    "vm100_changed": "NO_EXPECTED",
    "vm101_changed": "NO",
    "vm121_changed": "YES"
  },
  "implementation": {
    "actions": {
      "compose_up_backend": {
        "rc": 0,
        "stderr": "Container wgaccess-backend Recreate \n Container wgaccess-backend Recreated \n Container wgaccess-backend Starting \n Container wgaccess-backend Started",
        "stdout": ""
      }
    },
    "assessment": {
      "all_ok": true,
      "ready_for_042J_backend_create_disable_with_host_watcher": true,
      "success_checks": {
        "backend_health_after_ok": true,
        "backend_health_before_ok": true,
        "bind_mount_visible_in_docker_inspect": true,
        "compose_config_detected": true,
        "compose_service_detected": true,
        "compose_up_backend_ok": true,
        "helper_call_from_backend_ok": true,
        "helper_event_visible_on_host": true,
        "manual_agent_service_start_not_used": true,
        "override_file_created": true,
        "pending_global_zero_after": true,
        "pending_global_zero_before": true,
        "private_material_not_published": true,
        "watcher_active": true,
        "watcher_enabled": true,
        "watcher_observed_helper_event_and_started_agent": true
      }
    },
    "changes": {
      "backend_container_recreated": "YES",
      "compose_override_added": "YES",
      "default_override_added_if_absent": "YES",
      "manual_agent_service_start_used": "NO",
      "private_material_published": "NO",
      "vm100_changed": "NO_EXPECTED",
      "vm101_changed": "NO",
      "vm121_changed": "YES"
    },
    "compose": {
      "compose_cmd_sanitized": "docker compose -p wg-access -f /opt/wg-access/docker-compose.yml -f /opt/wg-access/docker-compose.step042i3-trigger-bind.yml up -d --no-deps backend",
      "config_files": [
        "/opt/wg-access/docker-compose.yml"
      ],
      "config_files_raw": "/opt/wg-access/docker-compose.yml",
      "default_override_existing": false,
      "override_path": "/opt/wg-access/docker-compose.step042i3-trigger-bind.yml",
      "project": "wg-access",
      "service": "backend",
      "working_dir": "/opt/wg-access",
      "working_dir_fallback_used": false
    },
    "errors": [],
    "mode": "ADD_BACKEND_BIND_MOUNT_FOR_TRIGGER_DIR_AND_VALIDATE",
    "precheck": {
      "backend_container_before": "wgaccess-backend",
      "backend_health_before": {
        "rc": 0,
        "stderr": "",
        "stdout": "{\"status\":\"ok\",\"service\":\"wg-access-backend\",\"environment\":\"dev\"}"
      },
      "mounts_before": {
        "rc": 0,
        "stderr": "",
        "stdout": "[{\"Type\":\"bind\",\"Source\":\"/opt/wg-access/backend\",\"Destination\":\"/app\",\"Mode\":\"rw\",\"RW\":true,\"Propagation\":\"rprivate\"}]"
      },
      "old_path_active": {
        "rc": 3,
        "stderr": "",
        "stdout": "inactive"
      },
      "pending_global_before": 0,
      "watcher_active": {
        "rc": 0,
        "stderr": "",
        "stdout": "active"
      },
      "watcher_enabled": {
        "rc": 0,
        "stderr": "",
        "stdout": "enabled"
      }
    },
    "rollback": {
      "script": "/root/rollback-step042i3-backend-trigger-bind-mount-20260709-104537.sh"
    },
    "schema": "router-step-facts-v1",
    "step": "STEP_042I3_FIX_BACKEND_TRIGGER_BIND_MOUNT",
    "validation": {
      "agent_journal_recent": {
        "rc": 0,
        "stderr": "",
        "stdout": "Jul 09 10:44:59 wg-access-dev systemd[1]: Starting wg-access-agent.service - WG Access Agent real poller...\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.409333+00:00] sync desired enabled peers: 5\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663156+00:00] remote stdout: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=        10.253.1.10/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=        10.253.1.11/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=        10.253.1.12/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=        10.253.1.13/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=        10.253.1.14/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663254+00:00] sync current runtime peers: 5\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663319+00:00] sync keep peer tunnel_ip=10.253.1.10\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663371+00:00] sync keep peer tunnel_ip=10.253.1.11\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663424+00:00] sync keep peer tunnel_ip=10.253.1.12\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663473+00:00] sync keep peer tunnel_ip=10.253.1.13\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.663527+00:00] sync keep peer tunnel_ip=10.253.1.14\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.835616+00:00] remote stdout: interface: wg_paid\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   public key: FD1J+KVZ965pCjgtO0YWxJsKANY9uz6v1P54JLkiZzY=\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   private key: (hidden)\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   listening port: 51830\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: peer: Kl5Ox5HbG4yvDUxkRuoyZmAF3Wx5HW0lHbVS9B0vFXM=\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   preshared key: (hidden)\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   endpoint: 10.71.100.2:56264\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   allowed ips: 10.253.1.14/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   latest handshake: 1 hour, 4 minutes, 50 seconds ago\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   transfer: 820 B received, 3.61 KiB sent\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: peer: JQXornv9vzH7nn9E1laZehYLnwMXuitP+eP35Gde0D4=\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   preshared key: (hidden)\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   endpoint: 10.71.100.2:39020\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   allowed ips: 10.253.1.13/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   latest handshake: 19 hours, 32 minutes, 26 seconds ago\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: peer: HknQ+VpqOIvsd3RxkrgaUqiR7zkS9nMfDRzDAvdqUVw=\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   preshared key: (hidden)\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   endpoint: 10.71.100.2:41351\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   allowed ips: 10.253.1.12/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   latest handshake: 20 hours, 34 minutes, 33 seconds ago\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   transfer: 692 B received, 3.48 KiB sent\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: peer: zwzkWJkpX7q5PfcT9pG2v52Es4yM0VRP3w1drj7LJmw=\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   preshared key: (hidden)\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   endpoint: 10.71.100.2:35150\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   allowed ips: 10.253.1.11/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   latest handshake: 20 hours, 48 minutes, 10 seconds ago\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   transfer: 1.35 KiB received, 6.96 KiB sent\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: peer: fmcqSUy1fErBV5RrcoVoex2VAgaxz2i79GzK8qd88UI=\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   preshared key: (hidden)\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   endpoint: 10.71.100.2:40520\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   allowed ips: 10.253.1.10/32\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   latest handshake: 21 hours, 39 minutes, 29 seconds ago\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]:   transfer: 3.38 KiB received, 17.40 KiB sent\nJul 09 10:44:59 wg-access-dev wg_access_agent.py[149765]: [2026-07-09T10:44:59.840303+00:00] no pending jobs\nJul 09 10:44:59 wg-access-dev systemd[1]: wg-access-agent.service: Deactivated successfully.\nJul 09 10:44:59 wg-access-dev systemd[1]: Finished wg-access-agent.service - WG Access Agent real poller.\nJul 09 10:45:53 wg-access-dev systemd[1]: Starting wg-access-agent.service - WG Access Agent real poller...\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]: Traceback (most recent call last):\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/opt/wg-access/agent/wg_access_agent.py\", line 351, in <module>\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     sys.exit(run_once())\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:              ^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/opt/wg-access/agent/wg_access_agent.py\", line 319, in run_once\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     sync_enabled_peers()\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/opt/wg-access/agent/wg_access_agent.py\", line 213, in sync_enabled_peers\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     rows = http_json(\"GET\", f\"/agent/peers?{query}\") or []\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/opt/wg-access/agent/wg_access_agent.py\", line 73, in http_json\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     with request.urlopen(req, timeout=20) as resp:\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/urllib/request.py\", line 216, in urlopen\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     return opener.open(url, data, timeout)\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/urllib/request.py\", line 519, in open\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     response = self._open(req, data)\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:                ^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/urllib/request.py\", line 536, in _open\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     result = self._call_chain(self.handle_open, protocol, protocol +\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/urllib/request.py\", line 496, in _call_chain\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     result = func(*args)\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:              ^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/urllib/request.py\", line 1377, in http_open\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     return self.do_open(http.client.HTTPConnection, req)\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/urllib/request.py\", line 1352, in do_open\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     r = h.getresponse()\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:         ^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/http/client.py\", line 1394, in getresponse\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     response.begin()\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/http/client.py\", line 323, in begin\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     version, status, reason = self._read_status()\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:                               ^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/http/client.py\", line 284, in _read_status\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:   File \"/usr/lib/python3.11/socket.py\", line 706, in readinto\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:     return self._sock.recv_into(b)\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]:            ^^^^^^^^^^^^^^^^^^^^^^^\nJul 09 10:45:53 wg-access-dev wg_access_agent.py[150273]: ConnectionResetError: [Errno 104] Connection reset by peer\nJul 09 10:45:53 wg-access-dev systemd[1]: wg-access-agent.service: Main process exited, code=exited, status=1/FAILURE\nJul 09 10:45:53 wg-access-dev systemd[1]: wg-access-agent.service: Failed with result 'exit-code'.\nJul 09 10:45:53 wg-access-dev systemd[1]: Failed to start wg-access-agent.service - WG Access Agent real poller."
      },
      "backend_container_after": "wgaccess-backend",
      "backend_health_after": {
        "rc": 0,
        "stderr": "curl: (56) Recv failure: Connection reset by peer",
        "stdout": ""
      },
      "container_event_dir_stat_after": {
        "rc": 0,
        "stderr": "",
        "stdout": "File: /opt/wg-access/runtime/agent-trigger/events\n  Size: 4096      \tBlocks: 8          IO Block: 4096   directory\nDevice: 8,1\tInode: 131079      Links: 2\nAccess: (0775/drwxrwxr-x)  Uid: (    0/    root)   Gid: (    0/    root)\nAccess: 2026-07-09 10:45:37.857046776 +0000\nModify: 2026-07-09 10:40:22.588056744 +0000\nChange: 2026-07-09 10:45:37.269059309 +0000\n Birth: 2026-07-09 10:24:32.438771049 +0000\nhost-test-1783593622592192232.trigger|20|1783593622.5880567440"
      },
      "helper_call_from_backend_container": {
        "rc": 0,
        "stderr": "",
        "stdout": ""
      },
      "helper_event_after_count": 2,
      "helper_event_before_count": 1,
      "helper_event_observations": [
        {
          "agent_journal_seen": true,
          "event_visible_on_host": true,
          "host_event_count_now": 2,
          "observed_agent_start": true,
          "t_sec": 1,
          "watcher_saw_new_event": true,
          "watcher_started_agent": true
        }
      ],
      "mounts_after": {
        "rc": 0,
        "stderr": "",
        "stdout": "[{\"Type\":\"bind\",\"Source\":\"/opt/wg-access/runtime/agent-trigger\",\"Destination\":\"/opt/wg-access/runtime/agent-trigger\",\"Mode\":\"rw\",\"RW\":true,\"Propagation\":\"rprivate\"},{\"Type\":\"bind\",\"Source\":\"/opt/wg-access/backend\",\"Destination\":\"/app\",\"Mode\":\"rw\",\"RW\":true,\"Propagation\":\"rprivate\"}]"
      },
      "pending_global_after": 0,
      "watcher_journal_recent": {
        "rc": 0,
        "stderr": "",
        "stdout": "Jul 09 10:45:53 wg-access-dev wg-access-trigger-watch.py[147081]: [2026-07-09T10:45:53Z] wg-access-trigger-watch: new_events=1 first=event-1783593953692216166-cf5eb8c928e648cc8eccaa4106128b03.trigger:145790:1783593953688708840:20\nJul 09 10:45:53 wg-access-dev wg-access-trigger-watch.py[147081]: [2026-07-09T10:45:53Z] wg-access-trigger-watch: starting wg-access-agent.service reason=new_events=1\nJul 09 10:45:53 wg-access-dev wg-access-trigger-watch.py[147081]: [2026-07-09T10:45:53Z] wg-access-trigger-watch: wg-access-agent.service start failed rc=1 stdout='' stderr='Job for wg-access-agent.service failed because the control process exited with error code.\\nSee \"systemctl status wg-access-agent.service\" and \"journalctl -xeu wg-access-agent.service\" for details.\\n'"
      }
    }
  },
  "mode": "ADD_BACKEND_BIND_MOUNT_AND_VALIDATE_HELPER_TO_HOST_WATCHER",
  "publish": {
    "local_report": "http://127.0.0.1:8099/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260709-104536_step042i3_fix_backend_trigger_bind_mount/",
    "trycf_report": "https://helena-background-beam-harry.trycloudflare.com/r/e94a0859747d7b96f29c7fdafc2d0351ba603bb0a7e9e5a4/20260709-104536_step042i3_fix_backend_trigger_bind_mount/"
  },
  "rollback": {
    "script": "/root/rollback-step042i3-backend-trigger-bind-mount-20260709-104537.sh"
  },
  "schema": "router-step-facts-v1",
  "step": "STEP_042I3_FIX_BACKEND_TRIGGER_BIND_MOUNT",
  "vm100_raw": "vm100_peer_count=5\nvm100_ip15_present_rc=1\nvm100_selector_count=5\nvm100_uci_count=0\n",
  "vm101_raw": "vm101_table202_vpn2_rc=0\nvm101_table200_vpn1_rc=0\n"
}
