diff --git a/docs/users/nodes/NODE_STATE_node-1-hetzner-gex44.md b/docs/users/nodes/NODE_STATE_node-1-hetzner-gex44.md
new file mode 100644
index 00000000..abce7256
--- /dev/null
+++ b/docs/users/nodes/NODE_STATE_node-1-hetzner-gex44.md
@@ -0,0 +1,221 @@
+# Node node-1-hetzner-gex44 — State
+
+> Generated: 2025-12-01 06:49:52
+
+## Node Info
+
+| Field | Value |
+|-------|-------|
+| Node ID | `node-1-hetzner-gex44` |
+| Name | Hetzner GEX44 Production |
+| Status | online |
+| Environment | production |
+| Hostname | 144.76.224.179 |
+
+## Swapper
+
+- **Status:** ✅ Healthy
+- **Models Loaded:** 1 / 7
+
+### Models
+
+| Name | Type | Loaded | VRAM (GB) |
+|------|------|--------|-----------|
+| qwen3-8b | llm | ✅ | 4.87 |
+| qwen3-vl-8b | vision | ❌ | 5.72 |
+| qwen2.5-7b-instruct | llm | ❌ | 4.36 |
+| qwen2.5-3b-instruct | llm | ❌ | 1.8 |
+| qwen2-math-7b | math | ❌ | 4.13 |
+| mistral-nemo-2_3b | llm | ❌ | 1.6 |
+| qwen2_5-math-1_5b | math | ❌ | 1.2 |
+
+## DAGI Router Agents
+
+- **Total Agents:** 9
+- **Active:** 9
+- **Phantom:** 0
+- **Stale:** 0
+
+### Agent List
+
+| ID | Name | Kind | Status | Runtime | Has DB Record |
+|----|------|------|--------|---------|---------------|
+| clan | Clan Bot | orchestrator | active | node-1-hetzner-gex44-router | True |
+| daarwizz | DAARWIZZ | orchestrator | active | node-1-hetzner-gex44-router | True |
+| druid | Druid | orchestrator | active | node-1-hetzner-gex44-router | True |
+| eonarch | Eonarch | orchestrator | active | node-1-hetzner-gex44-router | True |
+| greenfood | GreenFood Bot | orchestrator | active | node-1-hetzner-gex44-router | True |
+| helion | Helion | orchestrator | active | node-1-hetzner-gex44-router | True |
+| nutra | Nutra Bot | orchestrator | active | node-1-hetzner-gex44-router | True |
+| soul | Soul Bot | orchestrator | active | node-1-hetzner-gex44-router | True |
+| yaromir | Yaromir | orchestrator | active | node-1-hetzner-gex44-router | True |
+
+
+---
+
+## Raw Data
+
+
+Swapper JSON
+
+```json
+{
+ "node_id": "node-1-hetzner-gex44",
+ "healthy": true,
+ "models_loaded": 1,
+ "models_total": 7,
+ "models": [
+ {
+ "name": "qwen3-8b",
+ "loaded": true,
+ "type": "llm",
+ "vram_gb": 4.87
+ },
+ {
+ "name": "qwen3-vl-8b",
+ "loaded": false,
+ "type": "vision",
+ "vram_gb": 5.72
+ },
+ {
+ "name": "qwen2.5-7b-instruct",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 4.36
+ },
+ {
+ "name": "qwen2.5-3b-instruct",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 1.8
+ },
+ {
+ "name": "qwen2-math-7b",
+ "loaded": false,
+ "type": "math",
+ "vram_gb": 4.13
+ },
+ {
+ "name": "mistral-nemo-2_3b",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 1.6
+ },
+ {
+ "name": "qwen2_5-math-1_5b",
+ "loaded": false,
+ "type": "math",
+ "vram_gb": 1.2
+ }
+ ]
+}
+```
+
+
+
+
+DAGI Router JSON
+
+```json
+{
+ "node_id": "node-1-hetzner-gex44",
+ "total": 9,
+ "active": 9,
+ "phantom": 0,
+ "stale": 0,
+ "agents": [
+ {
+ "id": "clan",
+ "name": "Clan Bot",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "daarwizz",
+ "name": "DAARWIZZ",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "druid",
+ "name": "Druid",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "eonarch",
+ "name": "Eonarch",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "greenfood",
+ "name": "GreenFood Bot",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "helion",
+ "name": "Helion",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "nutra",
+ "name": "Nutra Bot",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "soul",
+ "name": "Soul Bot",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ },
+ {
+ "id": "yaromir",
+ "name": "Yaromir",
+ "kind": "orchestrator",
+ "runtime": "node-1-hetzner-gex44-router",
+ "node_id": "node-1-hetzner-gex44",
+ "last_seen_at": null,
+ "status": "active",
+ "has_db_record": true
+ }
+ ]
+}
+```
+
+
diff --git a/docs/users/nodes/NODE_STATE_node-2-macbook-m4max.md b/docs/users/nodes/NODE_STATE_node-2-macbook-m4max.md
new file mode 100644
index 00000000..fe4abe10
--- /dev/null
+++ b/docs/users/nodes/NODE_STATE_node-2-macbook-m4max.md
@@ -0,0 +1,122 @@
+# Node node-2-macbook-m4max — State
+
+> Generated: 2025-12-01 06:49:53
+
+## Node Info
+
+| Field | Value |
+|-------|-------|
+| Node ID | `node-2-macbook-m4max` |
+| Name | MacBook Pro M4 Max |
+| Status | online |
+| Environment | development |
+| Hostname | 192.168.1.33 |
+
+## Swapper
+
+- **Status:** ❌ Unhealthy
+- **Models Loaded:** 0 / 0
+
+### Models
+
+| Name | Type | Loaded | VRAM (GB) |
+|------|------|--------|-----------|
+| qwen3-8b | llm | ❌ | 4.87 |
+| qwen3-vl-8b | vision | ❌ | 5.72 |
+| qwen2.5-7b-instruct | llm | ❌ | 4.36 |
+| qwen2.5-3b-instruct | llm | ❌ | 1.8 |
+| qwen2-math-7b | math | ❌ | 4.13 |
+| mistral-nemo-2_3b | llm | ❌ | 1.6 |
+| qwen2_5-math-1_5b | math | ❌ | 1.2 |
+
+## DAGI Router Agents
+
+- **Total Agents:** 0
+- **Active:** 0
+- **Phantom:** 0
+- **Stale:** 0
+
+### Agent List
+
+| ID | Name | Kind | Status | Runtime | Has DB Record |
+|----|------|------|--------|---------|---------------|
+| (no agents) | | | | | |
+
+
+---
+
+## Raw Data
+
+
+Swapper JSON
+
+```json
+{
+ "node_id": "node-2-macbook-m4max",
+ "healthy": false,
+ "models_loaded": 0,
+ "models_total": 0,
+ "models": [
+ {
+ "name": "qwen3-8b",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 4.87
+ },
+ {
+ "name": "qwen3-vl-8b",
+ "loaded": false,
+ "type": "vision",
+ "vram_gb": 5.72
+ },
+ {
+ "name": "qwen2.5-7b-instruct",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 4.36
+ },
+ {
+ "name": "qwen2.5-3b-instruct",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 1.8
+ },
+ {
+ "name": "qwen2-math-7b",
+ "loaded": false,
+ "type": "math",
+ "vram_gb": 4.13
+ },
+ {
+ "name": "mistral-nemo-2_3b",
+ "loaded": false,
+ "type": "llm",
+ "vram_gb": 1.6
+ },
+ {
+ "name": "qwen2_5-math-1_5b",
+ "loaded": false,
+ "type": "math",
+ "vram_gb": 1.2
+ }
+ ]
+}
+```
+
+
+
+
+DAGI Router JSON
+
+```json
+{
+ "node_id": "node-2-macbook-m4max",
+ "total": 0,
+ "active": 0,
+ "phantom": 0,
+ "stale": 0,
+ "agents": []
+}
+```
+
+
diff --git a/scripts/discover_node_state.py b/scripts/discover_node_state.py
index 5cd76f93..3dd0eac4 100644
--- a/scripts/discover_node_state.py
+++ b/scripts/discover_node_state.py
@@ -213,6 +213,8 @@ def discover_node(node_id: str, output_dir: Path) -> None:
def main():
+ global CITY_API_URL
+
parser = argparse.ArgumentParser(description="Discover DAARION node state")
parser.add_argument("--node", type=str, help="Specific node ID to discover")
parser.add_argument("--all", action="store_true", help="Discover all known nodes")
@@ -226,7 +228,6 @@ def main():
parser.print_help()
sys.exit(1)
- global CITY_API_URL
CITY_API_URL = args.api_url
output_dir = Path(args.output)