From 6777292f6ead3ca33ad6d6709c2f4a4fd00d57e3 Mon Sep 17 00:00:00 2001 From: Alexa Amundson Date: Mon, 16 Mar 2026 18:00:02 -0500 Subject: [PATCH] =?UTF-8?q?sync:=202026-03-16=2018:00=20=E2=80=94=2021=20f?= =?UTF-8?q?iles=20from=20Alexandria?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RoadChain-SHA2048: c316572452cf6246 RoadChain-Identity: alexa@sovereign RoadChain-Full: c316572452cf6246294a9bf089ca177403d4187333252430e919cc2f55176f80722ae82807051dbc5772fa50a393bfc6ba5f1dc464d9ae0a435082d60da68a8f61c7521bc0fbc0509bf9e043035456b80763949d1e1e30cca278c3b264e78a417b62be8636feeda64580bd6eac8adede7fcb7c095eadc922a1057710484f98d08f347104bf31434f66ced3da243d480c58a4dfa0cc068ddfda54acadde593e3964f2a6ee69283eb62557638056c9e69be5cf70d8d9698b4c07f76c3f2d91e713cff5568eef41c51991648e8e28e2e0523cf04269cb5be393cae9250b285c968b97e330f5ddf91836d3f67555a147108c594274f1878fe4dc8f47ec4b2291b82f --- dotfiles/brew-formulae.txt | 1 + fleet/alice/autonomy-log.txt | 100 +++++------ fleet/alice/heartbeat.json | 2 +- fleet/alice/hostname.txt | 1 - fleet/alice/ports.txt | 2 +- fleet/alice/services.txt | 1 + fleet/alice/system-info.json | 18 +- fleet/anastasia/ports.txt | 2 +- fleet/anastasia/system-info.json | 12 +- fleet/aria/status.json | 2 +- fleet/cecilia/status.json | 2 +- fleet/gematria/system-info.json | 14 +- fleet/lucidia/autonomy-log.txt | 100 +++++------ fleet/lucidia/heartbeat.json | 2 +- fleet/lucidia/system-info.json | 16 +- fleet/octavia/status.json | 2 +- operator/memory/memory-agent-dispatch.sh | 0 operator/memory/memory-planner.sh | 8 +- operator/memory/memory-slack.sh | 0 operator/memory/memory-watchdog.sh | 0 scripts/blackroad-llm-train-v4.py | 203 +++++++++++++++++++++++ 21 files changed, 346 insertions(+), 142 deletions(-) mode change 100644 => 100755 operator/memory/memory-agent-dispatch.sh mode change 100644 => 100755 operator/memory/memory-planner.sh mode change 100644 => 100755 operator/memory/memory-slack.sh mode change 100644 => 100755 operator/memory/memory-watchdog.sh create mode 100644 scripts/blackroad-llm-train-v4.py diff --git a/dotfiles/brew-formulae.txt b/dotfiles/brew-formulae.txt index 8699726..b5216b8 100644 --- a/dotfiles/brew-formulae.txt +++ b/dotfiles/brew-formulae.txt @@ -179,6 +179,7 @@ opusfile osx-cpu-temp p11-kit p7zip +pandoc pango pcre2 perl diff --git a/fleet/alice/autonomy-log.txt b/fleet/alice/autonomy-log.txt index a94a5ad..dbb2e5d 100644 --- a/fleet/alice/autonomy-log.txt +++ b/fleet/alice/autonomy-log.txt @@ -1,50 +1,50 @@ -[2026-03-16 17:10:02] [HEAL] [alice] Healed 1 services -[2026-03-16 17:10:04] [FLEET] [alice] cecilia: DOWN (no ping response) -[2026-03-16 17:10:05] [FLEET] [alice] gematria: UP temp=C mem=4148MB disk=68% -[2026-03-16 17:10:06] [FLEET] [alice] lucidia: UP temp=55C mem=1076MB disk=33% -[2026-03-16 17:10:08] [FLEET] [alice] aria: DOWN (no ping response) -[2026-03-16 17:10:09] [FLEET] [alice] anastasia: UP temp=C mem=329MB disk=69% -[2026-03-16 17:11:01] [BEAT] [alice] load=1.07 mem=3281/3794MB temp=32.1C disk=83% -[2026-03-16 17:12:01] [BEAT] [alice] load=1.11 mem=3279/3794MB temp=31.6C disk=83% -[2026-03-16 17:13:01] [BEAT] [alice] load=1.07 mem=3277/3794MB temp=32.1C disk=83% -[2026-03-16 17:13:15] [BEAT] [alice] load=0.83 mem=3279/3794MB temp=32.1C disk=83% -[2026-03-16 17:13:15] [BEAT] [alice] load=0.83 mem=3279/3794MB temp=31.2C disk=83% -[2026-03-16 17:14:02] [BEAT] [alice] load=0.81 mem=3277/3794MB temp=32.1C disk=83% -[2026-03-16 17:15:01] [BEAT] [alice] load=1.30 mem=3272/3794MB temp=32.1C disk=83% -[2026-03-16 17:15:01] [HEAL] [alice] Service blackroad-agent is DOWN — restarting -[2026-03-16 17:15:01] [HEAL] [alice] Service blackroad-agent restarted successfully -[2026-03-16 17:15:02] [HEAL] [alice] Healed 1 services -[2026-03-16 17:15:46] [DIAL] [alice] Switchboard unreachable -[2026-03-16 17:16:01] [BEAT] [alice] load=0.82 mem=3278/3794MB temp=31.2C disk=83% -[2026-03-16 17:16:40] [DIAL] [alice] Switchboard unreachable -[2026-03-16 17:17:01] [BEAT] [alice] load=1.06 mem=3277/3794MB temp=32.6C disk=83% -[2026-03-16 17:18:01] [BEAT] [alice] load=0.92 mem=3277/3794MB temp=31.2C disk=83% -[2026-03-16 17:18:24] [BEAT] [alice] load=1.11 mem=3274/3794MB temp=33.1C disk=83% -[2026-03-16 17:18:24] [BEAT] [alice] load=1.11 mem=3271/3794MB temp=35.0C disk=83% -[2026-03-16 17:19:01] [BEAT] [alice] load=1.48 mem=3278/3794MB temp=31.6C disk=83% -[2026-03-16 17:20:01] [FLEET] [alice] Starting cross-node health check -[2026-03-16 17:20:01] [HEAL] [alice] Service blackroad-agent is DOWN — restarting -[2026-03-16 17:20:01] [BEAT] [alice] load=1.02 mem=3272/3794MB temp=32.6C disk=83% -[2026-03-16 17:20:01] [HEAL] [alice] Service blackroad-agent restarted successfully -[2026-03-16 17:20:01] [FLEET] [alice] octavia: UP temp=35C mem=6372MB disk=68% -[2026-03-16 17:20:02] [HEAL] [alice] Healed 1 services -[2026-03-16 17:20:03] [FLEET] [alice] cecilia: DOWN (no ping response) -[2026-03-16 17:20:05] [FLEET] [alice] gematria: UP temp=C mem=4151MB disk=68% -[2026-03-16 17:20:06] [FLEET] [alice] lucidia: UP temp=53C mem=1068MB disk=33% -[2026-03-16 17:20:08] [FLEET] [alice] aria: DOWN (no ping response) -[2026-03-16 17:20:09] [FLEET] [alice] anastasia: UP temp=C mem=261MB disk=69% -[2026-03-16 17:21:01] [BEAT] [alice] load=0.86 mem=3277/3794MB temp=31.2C disk=83% -[2026-03-16 17:22:01] [BEAT] [alice] load=0.86 mem=3276/3794MB temp=31.2C disk=83% -[2026-03-16 17:23:01] [BEAT] [alice] load=1.03 mem=3264/3794MB temp=32.1C disk=83% -[2026-03-16 17:23:33] [BEAT] [alice] load=0.70 mem=3274/3794MB temp=31.6C disk=83% -[2026-03-16 17:23:33] [BEAT] [alice] load=0.70 mem=3274/3794MB temp=31.6C disk=83% -[2026-03-16 17:24:01] [BEAT] [alice] load=1.72 mem=3275/3794MB temp=32.1C disk=83% -[2026-03-16 17:25:02] [HEAL] [alice] Service blackroad-agent is DOWN — restarting -[2026-03-16 17:25:02] [BEAT] [alice] load=1.49 mem=3275/3794MB temp=33.6C disk=83% -[2026-03-16 17:25:02] [HEAL] [alice] Service blackroad-agent restarted successfully -[2026-03-16 17:25:02] [HEAL] [alice] Healed 1 services -[2026-03-16 17:26:01] [BEAT] [alice] load=1.09 mem=3270/3794MB temp=32.1C disk=83% -[2026-03-16 17:27:02] [BEAT] [alice] load=0.92 mem=3276/3794MB temp=31.6C disk=83% -[2026-03-16 17:28:01] [BEAT] [alice] load=0.61 mem=3270/3794MB temp=33.6C disk=83% -[2026-03-16 17:28:41] [BEAT] [alice] load=0.79 mem=3279/3794MB temp=31.6C disk=83% -[2026-03-16 17:28:42] [BEAT] [alice] load=0.79 mem=3278/3794MB temp=31.6C disk=83% +[2026-03-16 17:40:04] [FLEET] [alice] cecilia: DOWN (no ping response) +[2026-03-16 17:40:06] [FLEET] [alice] gematria: UP temp=C mem=4174MB disk=68% +[2026-03-16 17:40:07] [FLEET] [alice] lucidia: UP temp=53C mem=1121MB disk=33% +[2026-03-16 17:40:09] [FLEET] [alice] aria: DOWN (no ping response) +[2026-03-16 17:40:10] [FLEET] [alice] anastasia: UP temp=C mem=318MB disk=69% +[2026-03-16 17:41:01] [BEAT] [alice] load=0.93 mem=3277/3794MB temp=31.6C disk=83% +[2026-03-16 17:42:01] [BEAT] [alice] load=0.90 mem=3268/3794MB temp=32.6C disk=83% +[2026-03-16 17:43:01] [BEAT] [alice] load=0.58 mem=3277/3794MB temp=32.1C disk=83% +[2026-03-16 17:44:01] [BEAT] [alice] load=0.78 mem=3277/3794MB temp=31.6C disk=83% +[2026-03-16 17:44:07] [BEAT] [alice] load=1.12 mem=3279/3794MB temp=32.1C disk=83% +[2026-03-16 17:44:07] [BEAT] [alice] load=1.12 mem=3279/3794MB temp=31.6C disk=83% +[2026-03-16 17:45:01] [HEAL] [alice] Service blackroad-agent is DOWN — restarting +[2026-03-16 17:45:01] [BEAT] [alice] load=0.62 mem=3269/3794MB temp=33.6C disk=83% +[2026-03-16 17:45:01] [HEAL] [alice] Service blackroad-agent restarted successfully +[2026-03-16 17:45:02] [HEAL] [alice] Healed 1 services +[2026-03-16 17:45:47] [DIAL] [alice] Switchboard unreachable +[2026-03-16 17:46:01] [BEAT] [alice] load=0.88 mem=3275/3794MB temp=32.1C disk=83% +[2026-03-16 17:46:41] [DIAL] [alice] Switchboard unreachable +[2026-03-16 17:47:01] [BEAT] [alice] load=1.18 mem=3282/3794MB temp=33.1C disk=83% +[2026-03-16 17:48:01] [BEAT] [alice] load=1.08 mem=3277/3794MB temp=32.6C disk=83% +[2026-03-16 17:49:01] [BEAT] [alice] load=0.78 mem=3260/3794MB temp=34.1C disk=83% +[2026-03-16 17:49:16] [BEAT] [alice] load=1.06 mem=3274/3794MB temp=34.1C disk=83% +[2026-03-16 17:49:16] [BEAT] [alice] load=1.06 mem=3274/3794MB temp=34.1C disk=83% +[2026-03-16 17:50:02] [FLEET] [alice] Starting cross-node health check +[2026-03-16 17:50:02] [HEAL] [alice] Service blackroad-agent is DOWN — restarting +[2026-03-16 17:50:02] [BEAT] [alice] load=0.81 mem=3252/3794MB temp=34.1C disk=83% +[2026-03-16 17:50:02] [HEAL] [alice] Service blackroad-agent restarted successfully +[2026-03-16 17:50:02] [FLEET] [alice] octavia: UP temp=34C mem=6276MB disk=68% +[2026-03-16 17:50:03] [HEAL] [alice] Healed 1 services +[2026-03-16 17:50:04] [FLEET] [alice] cecilia: DOWN (no ping response) +[2026-03-16 17:50:06] [FLEET] [alice] gematria: UP temp=C mem=4169MB disk=68% +[2026-03-16 17:50:06] [FLEET] [alice] lucidia: UP temp=58C mem=1182MB disk=33% +[2026-03-16 17:50:08] [FLEET] [alice] aria: DOWN (no ping response) +[2026-03-16 17:50:10] [FLEET] [alice] anastasia: UP temp=C mem=318MB disk=69% +[2026-03-16 17:51:01] [BEAT] [alice] load=1.36 mem=3273/3794MB temp=33.6C disk=83% +[2026-03-16 17:52:01] [BEAT] [alice] load=0.86 mem=3278/3794MB temp=31.2C disk=83% +[2026-03-16 17:53:01] [BEAT] [alice] load=0.74 mem=3276/3794MB temp=33.6C disk=83% +[2026-03-16 17:54:01] [BEAT] [alice] load=0.51 mem=3279/3794MB temp=30.7C disk=83% +[2026-03-16 17:54:25] [BEAT] [alice] load=0.36 mem=3275/3794MB temp=31.2C disk=83% +[2026-03-16 17:54:25] [BEAT] [alice] load=0.42 mem=3275/3794MB temp=31.2C disk=83% +[2026-03-16 17:55:01] [HEAL] [alice] Service blackroad-agent is DOWN — restarting +[2026-03-16 17:55:02] [BEAT] [alice] load=0.84 mem=3274/3794MB temp=35.0C disk=83% +[2026-03-16 17:55:02] [HEAL] [alice] Service blackroad-agent restarted successfully +[2026-03-16 17:55:03] [HEAL] [alice] Healed 1 services +[2026-03-16 17:56:01] [BEAT] [alice] load=0.80 mem=3278/3794MB temp=31.2C disk=83% +[2026-03-16 17:57:01] [BEAT] [alice] load=0.95 mem=3275/3794MB temp=34.6C disk=83% +[2026-03-16 17:58:01] [BEAT] [alice] load=1.46 mem=3277/3794MB temp=31.6C disk=83% +[2026-03-16 17:59:01] [BEAT] [alice] load=1.43 mem=3280/3794MB temp=34.1C disk=83% +[2026-03-16 17:59:36] [BEAT] [alice] load=0.85 mem=3274/3794MB temp=32.1C disk=83% +[2026-03-16 17:59:36] [BEAT] [alice] load=0.85 mem=3273/3794MB temp=33.1C disk=83% diff --git a/fleet/alice/heartbeat.json b/fleet/alice/heartbeat.json index 3ff8fbe..fb7b17d 100644 --- a/fleet/alice/heartbeat.json +++ b/fleet/alice/heartbeat.json @@ -1 +1 @@ -{"node":"alice","ts":"2026-03-16T22:28:41Z","load":0.79,"mem_free_mb":3278,"mem_total_mb":3794,"temp_c":31.6,"disk_pct":83,"throttle":"0x0"} +{"node":"alice","ts":"2026-03-16T22:59:36Z","load":0.85,"mem_free_mb":3273,"mem_total_mb":3794,"temp_c":33.1,"disk_pct":83,"throttle":"0x0"} diff --git a/fleet/alice/hostname.txt b/fleet/alice/hostname.txt index c9fc40b..e69de29 100644 --- a/fleet/alice/hostname.txt +++ b/fleet/alice/hostname.txt @@ -1 +0,0 @@ -alice diff --git a/fleet/alice/ports.txt b/fleet/alice/ports.txt index 1603db5..3d5bb81 100644 --- a/fleet/alice/ports.txt +++ b/fleet/alice/ports.txt @@ -11,7 +11,7 @@ LISTEN 0 5 0.0.0.0:8013 0.0.0.0:* users:(("python3",pid LISTEN 0 5 0.0.0.0:8012 0.0.0.0:* LISTEN 0 5 0.0.0.0:8014 0.0.0.0:* LISTEN 0 2048 0.0.0.0:8001 0.0.0.0:* users:(("python3",pid=617,fd=6)) -LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=19808,fd=5)) +LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=6557,fd=5)) LISTEN 0 200 0.0.0.0:443 0.0.0.0:* LISTEN 0 1024 0.0.0.0:6333 0.0.0.0:* LISTEN 0 128 0.0.0.0:6334 0.0.0.0:* diff --git a/fleet/alice/services.txt b/fleet/alice/services.txt index 8f3effd..4c5e40e 100644 --- a/fleet/alice/services.txt +++ b/fleet/alice/services.txt @@ -25,6 +25,7 @@ prism-agent.service qdrant.service redis-server.service rng-tools-debian.service +road-phone.service roadnet-failover.service rsyslog.service rtkit-daemon.service diff --git a/fleet/alice/system-info.json b/fleet/alice/system-info.json index 78eed63..511d93e 100644 --- a/fleet/alice/system-info.json +++ b/fleet/alice/system-info.json @@ -1,19 +1,19 @@ { "hostname": "alice", - "ts": "2026-03-16T22:28:44Z", - "uptime_seconds": 71061, + "ts": "2026-03-16T22:59:37Z", + "uptime_seconds": 72915, "kernel": "6.1.21-v8+", - "temp_c": 33.1, + "temp_c": 32.1, "memory_mb": { "total": 3794, - "used": 424, - "free": 3270 + "used": 419, + "free": 3274 }, "disk": "12G/15G (83%)", "load": [ - 0.97, - 1.0, - 1.02 + 0.85, + 0.94, + 0.94 ], "ollama_models": [ "qwen2.5:3b", @@ -25,5 +25,5 @@ ], "throttle": "0x0", "voltage": "0.9160V", - "services_running": 43 + "services_running": 42 } diff --git a/fleet/anastasia/ports.txt b/fleet/anastasia/ports.txt index a0176b7..dfbf748 100644 --- a/fleet/anastasia/ports.txt +++ b/fleet/anastasia/ports.txt @@ -11,7 +11,7 @@ LISTEN 0 5 0.0.0.0:8787 0.0.0.0:* users:(("python3",pid LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=3461172,fd=8),("nginx",pid=3461171,fd=8)) LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=589,fd=4),("systemd",pid=1,fd=127)) LISTEN 0 4096 *:8080 *:* users:(("headscale",pid=2341808,fd=12)) -LISTEN 0 511 *:3000 *:* users:(("node /srv/hello",pid=1933705,fd=19)) +LISTEN 0 511 *:3000 *:* users:(("node /srv/hello",pid=1939563,fd=19)) LISTEN 0 511 *:3001 *:* users:(("node",pid=757,fd=21)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=991,fd=8)) LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=3461172,fd=9),("nginx",pid=3461171,fd=9)) diff --git a/fleet/anastasia/system-info.json b/fleet/anastasia/system-info.json index acc0271..34533e7 100644 --- a/fleet/anastasia/system-info.json +++ b/fleet/anastasia/system-info.json @@ -1,19 +1,19 @@ { "hostname": "anastasia", - "ts": "2026-03-16T22:28:43Z", - "uptime_seconds": 6842015, + "ts": "2026-03-16T22:59:38Z", + "uptime_seconds": 6843870, "kernel": "5.14.0-651.el9.x86_64", "temp_c": 0, "memory_mb": { "total": 765, - "used": 412, - "free": 352 + "used": 435, + "free": 329 }, "disk": "18G/25G (69%)", "load": [ 0.1, - 0.07, - 0.05 + 0.08, + 0.06 ], "ollama_models": [], "throttle": "N/A", diff --git a/fleet/aria/status.json b/fleet/aria/status.json index 60c3077..78459df 100644 --- a/fleet/aria/status.json +++ b/fleet/aria/status.json @@ -1 +1 @@ -{"node":"aria","status":"down","ts":"2026-03-16T22:28:41Z"} +{"node":"aria","status":"down","ts":"2026-03-16T22:59:36Z"} diff --git a/fleet/cecilia/status.json b/fleet/cecilia/status.json index f983683..74ceb46 100644 --- a/fleet/cecilia/status.json +++ b/fleet/cecilia/status.json @@ -1 +1 @@ -{"node":"cecilia","status":"down","ts":"2026-03-16T22:28:41Z"} +{"node":"cecilia","status":"down","ts":"2026-03-16T22:59:36Z"} diff --git a/fleet/gematria/system-info.json b/fleet/gematria/system-info.json index 7ca0bfc..d9d8379 100644 --- a/fleet/gematria/system-info.json +++ b/fleet/gematria/system-info.json @@ -1,19 +1,19 @@ { "hostname": "gematria", - "ts": "2026-03-16T22:28:44Z", - "uptime_seconds": 5499316, + "ts": "2026-03-16T22:59:39Z", + "uptime_seconds": 5501171, "kernel": "5.15.0-113-generic", "temp_c": 0, "memory_mb": { "total": 7937, - "used": 3302, - "free": 4154 + "used": 3281, + "free": 4176 }, "disk": "53G/78G (68%)", "load": [ - 3.04, - 3.05, - 3.19 + 3.09, + 3.06, + 3.08 ], "ollama_models": [ "qwen2.5:7b", diff --git a/fleet/lucidia/autonomy-log.txt b/fleet/lucidia/autonomy-log.txt index 7e50de7..1c43ee2 100644 --- a/fleet/lucidia/autonomy-log.txt +++ b/fleet/lucidia/autonomy-log.txt @@ -1,50 +1,50 @@ -[2026-03-16 17:08:05] [BEAT] [lucidia] load=3.84 mem=1091/8063MB temp=51.8C disk=33% -[2026-03-16 17:08:05] [BEAT] [lucidia] load=3.84 mem=1089/8063MB temp=50.7C disk=33% -[2026-03-16 17:09:01] [BEAT] [lucidia] load=3.55 mem=1059/8063MB temp=58.4C disk=33% -[2026-03-16 17:10:01] [FLEET] [lucidia] Starting cross-node health check -[2026-03-16 17:10:01] [BEAT] [lucidia] load=1.74 mem=1016/8063MB temp=51.2C disk=33% -[2026-03-16 17:10:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive -[2026-03-16 17:10:02] [FLEET] [lucidia] alice: UP temp=34C mem=3256MB disk=83% -[2026-03-16 17:10:04] [FLEET] [lucidia] octavia: DOWN (no ping response) -[2026-03-16 17:10:06] [FLEET] [lucidia] cecilia: DOWN (no ping response) -[2026-03-16 17:10:07] [FLEET] [lucidia] gematria: UP temp=C mem=4148MB disk=68% -[2026-03-16 17:10:09] [FLEET] [lucidia] aria: DOWN (no ping response) -[2026-03-16 17:10:10] [FLEET] [lucidia] anastasia: UP temp=C mem=329MB disk=69% -[2026-03-16 17:11:12] [BEAT] [lucidia] load=19.78 mem=1112/8063MB temp=50.7C disk=33% -[2026-03-16 17:12:01] [BEAT] [lucidia] load=10.78 mem=1113/8063MB temp=52.9C disk=33% -[2026-03-16 17:13:01] [BEAT] [lucidia] load=4.78 mem=1072/8063MB temp=57.3C disk=33% -[2026-03-16 17:13:15] [BEAT] [lucidia] load=4.75 mem=1094/8063MB temp=59.0C disk=33% -[2026-03-16 17:13:15] [BEAT] [lucidia] load=4.75 mem=1093/8063MB temp=58.4C disk=33% -[2026-03-16 17:14:01] [BEAT] [lucidia] load=2.93 mem=1046/8063MB temp=50.7C disk=33% -[2026-03-16 17:15:01] [BEAT] [lucidia] load=14.84 mem=1058/8063MB temp=52.4C disk=33% -[2026-03-16 17:15:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive -[2026-03-16 17:15:48] [DIAL] [lucidia] Switchboard unreachable -[2026-03-16 17:16:17] [BEAT] [lucidia] load=38.03 mem=1096/8063MB temp=50.1C disk=33% -[2026-03-16 17:17:02] [BEAT] [lucidia] load=19.97 mem=1095/8063MB temp=51.8C disk=33% -[2026-03-16 17:18:01] [BEAT] [lucidia] load=9.42 mem=1107/8063MB temp=59.0C disk=33% -[2026-03-16 17:18:24] [BEAT] [lucidia] load=7.63 mem=1110/8063MB temp=54.0C disk=33% -[2026-03-16 17:18:24] [BEAT] [lucidia] load=7.63 mem=1108/8063MB temp=54.5C disk=33% -[2026-03-16 17:19:01] [BEAT] [lucidia] load=4.60 mem=1069/8063MB temp=51.8C disk=33% -[2026-03-16 17:20:01] [FLEET] [lucidia] Starting cross-node health check -[2026-03-16 17:20:01] [BEAT] [lucidia] load=3.28 mem=1065/8063MB temp=53.5C disk=33% -[2026-03-16 17:20:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive -[2026-03-16 17:20:02] [FLEET] [lucidia] alice: UP temp=33C mem=3266MB disk=83% -[2026-03-16 17:20:04] [FLEET] [lucidia] octavia: DOWN (no ping response) -[2026-03-16 17:20:06] [FLEET] [lucidia] cecilia: DOWN (no ping response) -[2026-03-16 17:20:41] [FLEET] [lucidia] gematria: UP temp=C mem=4149MB disk=68% -[2026-03-16 17:20:43] [FLEET] [lucidia] aria: DOWN (no ping response) -[2026-03-16 17:20:43] [FLEET] [lucidia] anastasia: UP temp=C mem=350MB disk=69% -[2026-03-16 17:21:02] [BEAT] [lucidia] load=18.06 mem=1068/8063MB temp=60.6C disk=33% -[2026-03-16 17:22:01] [BEAT] [lucidia] load=8.15 mem=1122/8063MB temp=54.5C disk=33% -[2026-03-16 17:22:29] [DIAL] [lucidia] Switchboard unreachable -[2026-03-16 17:23:01] [BEAT] [lucidia] load=4.28 mem=1120/8063MB temp=55.6C disk=33% -[2026-03-16 17:23:32] [BEAT] [lucidia] load=3.31 mem=1065/8063MB temp=52.4C disk=33% -[2026-03-16 17:23:32] [BEAT] [lucidia] load=3.31 mem=1062/8063MB temp=54.0C disk=33% -[2026-03-16 17:24:01] [BEAT] [lucidia] load=2.95 mem=1100/8063MB temp=58.4C disk=33% -[2026-03-16 17:25:01] [BEAT] [lucidia] load=3.05 mem=1114/8063MB temp=52.4C disk=33% -[2026-03-16 17:25:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive -[2026-03-16 17:26:01] [BEAT] [lucidia] load=3.92 mem=1118/8063MB temp=62.8C disk=33% -[2026-03-16 17:27:01] [BEAT] [lucidia] load=2.34 mem=1039/8063MB temp=52.4C disk=33% -[2026-03-16 17:28:01] [BEAT] [lucidia] load=2.08 mem=1072/8063MB temp=54.5C disk=33% -[2026-03-16 17:28:41] [BEAT] [lucidia] load=1.82 mem=1093/8063MB temp=56.2C disk=33% -[2026-03-16 17:28:42] [BEAT] [lucidia] load=1.82 mem=1089/8063MB temp=57.3C disk=33% +[2026-03-16 17:38:58] [BEAT] [lucidia] load=1.18 mem=1165/8063MB temp=53.5C disk=33% +[2026-03-16 17:39:01] [BEAT] [lucidia] load=1.17 mem=1109/8063MB temp=52.4C disk=33% +[2026-03-16 17:40:01] [FLEET] [lucidia] Starting cross-node health check +[2026-03-16 17:40:01] [BEAT] [lucidia] load=2.16 mem=1114/8063MB temp=54.5C disk=33% +[2026-03-16 17:40:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive +[2026-03-16 17:40:03] [FLEET] [lucidia] alice: UP temp=34C mem=3269MB disk=83% +[2026-03-16 17:40:05] [FLEET] [lucidia] octavia: DOWN (no ping response) +[2026-03-16 17:40:07] [FLEET] [lucidia] cecilia: DOWN (no ping response) +[2026-03-16 17:40:08] [FLEET] [lucidia] gematria: UP temp=C mem=4177MB disk=68% +[2026-03-16 17:40:10] [FLEET] [lucidia] aria: DOWN (no ping response) +[2026-03-16 17:40:11] [FLEET] [lucidia] anastasia: UP temp=C mem=318MB disk=69% +[2026-03-16 17:41:01] [BEAT] [lucidia] load=2.35 mem=1119/8063MB temp=60.0C disk=33% +[2026-03-16 17:42:01] [BEAT] [lucidia] load=1.28 mem=1107/8063MB temp=52.4C disk=33% +[2026-03-16 17:43:01] [BEAT] [lucidia] load=1.23 mem=1129/8063MB temp=52.4C disk=33% +[2026-03-16 17:44:01] [BEAT] [lucidia] load=2.19 mem=1121/8063MB temp=52.4C disk=33% +[2026-03-16 17:44:07] [BEAT] [lucidia] load=2.18 mem=1128/8063MB temp=52.9C disk=33% +[2026-03-16 17:44:07] [BEAT] [lucidia] load=2.18 mem=1125/8063MB temp=52.9C disk=33% +[2026-03-16 17:45:01] [BEAT] [lucidia] load=2.92 mem=1099/8063MB temp=59.0C disk=33% +[2026-03-16 17:45:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive +[2026-03-16 17:45:47] [DIAL] [lucidia] Switchboard unreachable +[2026-03-16 17:46:33] [BEAT] [lucidia] load=17.05 mem=1136/8063MB temp=50.7C disk=33% +[2026-03-16 17:47:01] [BEAT] [lucidia] load=12.22 mem=1124/8063MB temp=52.4C disk=33% +[2026-03-16 17:48:02] [BEAT] [lucidia] load=5.56 mem=1130/8063MB temp=57.9C disk=33% +[2026-03-16 17:49:01] [BEAT] [lucidia] load=4.64 mem=1124/8063MB temp=56.2C disk=33% +[2026-03-16 17:49:16] [BEAT] [lucidia] load=3.77 mem=1205/8063MB temp=56.8C disk=33% +[2026-03-16 17:49:16] [BEAT] [lucidia] load=3.77 mem=1203/8063MB temp=56.2C disk=33% +[2026-03-16 17:50:01] [FLEET] [lucidia] Starting cross-node health check +[2026-03-16 17:50:01] [BEAT] [lucidia] load=3.24 mem=1205/8063MB temp=58.4C disk=33% +[2026-03-16 17:50:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive +[2026-03-16 17:50:02] [FLEET] [lucidia] alice: UP temp=34C mem=3267MB disk=83% +[2026-03-16 17:50:04] [FLEET] [lucidia] octavia: DOWN (no ping response) +[2026-03-16 17:50:06] [FLEET] [lucidia] cecilia: DOWN (no ping response) +[2026-03-16 17:50:08] [FLEET] [lucidia] gematria: UP temp=C mem=4158MB disk=68% +[2026-03-16 17:50:10] [FLEET] [lucidia] aria: DOWN (no ping response) +[2026-03-16 17:50:10] [FLEET] [lucidia] anastasia: UP temp=C mem=318MB disk=69% +[2026-03-16 17:51:02] [BEAT] [lucidia] load=2.03 mem=1215/8063MB temp=49.0C disk=33% +[2026-03-16 17:52:01] [BEAT] [lucidia] load=2.03 mem=1187/8063MB temp=50.7C disk=33% +[2026-03-16 17:52:30] [DIAL] [lucidia] Switchboard unreachable +[2026-03-16 17:53:01] [BEAT] [lucidia] load=2.07 mem=1188/8063MB temp=56.8C disk=33% +[2026-03-16 17:54:01] [BEAT] [lucidia] load=2.82 mem=1210/8063MB temp=51.2C disk=33% +[2026-03-16 17:54:24] [BEAT] [lucidia] load=2.18 mem=1193/8063MB temp=50.7C disk=33% +[2026-03-16 17:54:24] [BEAT] [lucidia] load=2.18 mem=1191/8063MB temp=50.7C disk=33% +[2026-03-16 17:55:01] [BEAT] [lucidia] load=2.58 mem=1184/8063MB temp=55.6C disk=33% +[2026-03-16 17:55:01] [HEAL] [lucidia] High swap: 2157MB — clearing inactive +[2026-03-16 17:56:33] [BEAT] [lucidia] load=25.83 mem=1176/8063MB temp=46.9C disk=33% +[2026-03-16 17:57:01] [BEAT] [lucidia] load=19.43 mem=1159/8063MB temp=57.3C disk=33% +[2026-03-16 17:58:01] [BEAT] [lucidia] load=7.37 mem=1208/8063MB temp=46.9C disk=33% +[2026-03-16 17:59:01] [BEAT] [lucidia] load=3.98 mem=1195/8063MB temp=48.0C disk=33% +[2026-03-16 17:59:36] [BEAT] [lucidia] load=3.10 mem=1145/8063MB temp=54.0C disk=33% +[2026-03-16 17:59:36] [BEAT] [lucidia] load=3.10 mem=1142/8063MB temp=54.0C disk=33% diff --git a/fleet/lucidia/heartbeat.json b/fleet/lucidia/heartbeat.json index 87bdbec..49d942b 100644 --- a/fleet/lucidia/heartbeat.json +++ b/fleet/lucidia/heartbeat.json @@ -1 +1 @@ -{"node":"lucidia","ts":"2026-03-16T22:28:41Z","load":1.82,"mem_free_mb":1089,"mem_total_mb":8063,"temp_c":57.3,"disk_pct":33,"throttle":"0x0"} +{"node":"lucidia","ts":"2026-03-16T22:59:36Z","load":3.10,"mem_free_mb":1142,"mem_total_mb":8063,"temp_c":54.0,"disk_pct":33,"throttle":"0x0"} diff --git a/fleet/lucidia/system-info.json b/fleet/lucidia/system-info.json index 0342f6e..d09b761 100644 --- a/fleet/lucidia/system-info.json +++ b/fleet/lucidia/system-info.json @@ -1,19 +1,19 @@ { "hostname": "octavia", - "ts": "2026-03-16T22:28:44Z", - "uptime_seconds": 70882, + "ts": "2026-03-16T22:59:37Z", + "uptime_seconds": 72735, "kernel": "6.12.62+rpt-rpi-2712", - "temp_c": 57.9, + "temp_c": 54.5, "memory_mb": { "total": 8063, - "used": 7025, - "free": 1037 + "used": 6914, + "free": 1148 }, "disk": "74G/235G (33%)", "load": [ - 2.16, - 4.65, - 6.97 + 3.1, + 6.25, + 5.37 ], "ollama_models": [ "qwen2.5:3b", diff --git a/fleet/octavia/status.json b/fleet/octavia/status.json index c6bb196..f43a997 100644 --- a/fleet/octavia/status.json +++ b/fleet/octavia/status.json @@ -1 +1 @@ -{"node":"octavia","status":"down","ts":"2026-03-16T22:28:41Z"} +{"node":"octavia","status":"down","ts":"2026-03-16T22:59:36Z"} diff --git a/operator/memory/memory-agent-dispatch.sh b/operator/memory/memory-agent-dispatch.sh old mode 100644 new mode 100755 diff --git a/operator/memory/memory-planner.sh b/operator/memory/memory-planner.sh old mode 100644 new mode 100755 index f6571f0..3dff012 --- a/operator/memory/memory-planner.sh +++ b/operator/memory/memory-planner.sh @@ -57,7 +57,7 @@ cmd_plan() { local title cadence status progress title=$(jq -r '.title' "$project_file") - cadence=$(jq -r '.cadence' "$project_file") + cadence=$(jq -r '.timescale' "$project_file") status=$(jq -r '.status' "$project_file") progress=$(jq -r '.progress' "$project_file") @@ -121,7 +121,7 @@ cmd_next() { pending_count=$(jq '[.todos[] | select(.status == "pending")] | length' "$f") [[ "$pending_count" -eq 0 ]] && continue - cadence=$(jq -r '.cadence' "$f") + cadence=$(jq -r '.timescale' "$f") pid=$(jq -r '.project_id' "$f") title=$(jq -r '.title' "$f") @@ -251,7 +251,7 @@ cmd_roadmap() { for f in "$PROJECTS_DIR"/*.json; do [[ ! -f "$f" ]] && continue local fc - fc=$(jq -r '.cadence' "$f") + fc=$(jq -r '.timescale' "$f") [[ "$fc" != "$cadence" ]] && continue if [[ "$found" -eq 0 ]]; then @@ -340,7 +340,7 @@ cmd_suggest() { pid=$(jq -r '.project_id' "$f") progress=$(jq -r '.progress' "$f") pending=$(jq '[.todos[] | select(.status == "pending")] | length' "$f") - cadence=$(jq -r '.cadence' "$f") + cadence=$(jq -r '.timescale' "$f") title=$(jq -r '.title' "$f") [[ "$pending" -eq 0 ]] && continue diff --git a/operator/memory/memory-slack.sh b/operator/memory/memory-slack.sh old mode 100644 new mode 100755 diff --git a/operator/memory/memory-watchdog.sh b/operator/memory/memory-watchdog.sh old mode 100644 new mode 100755 diff --git a/scripts/blackroad-llm-train-v4.py b/scripts/blackroad-llm-train-v4.py new file mode 100644 index 0000000..3f5db3d --- /dev/null +++ b/scripts/blackroad-llm-train-v4.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 +""" +BlackRoad LLM v4 — Train 8M param transformer on corpus v4 (5.8MB) +Uses word-level tokenizer (fast) + MPS acceleration on Mac +""" +import torch +import torch.nn as nn +import torch.optim as optim +import time +import os +import math +from collections import Counter + +CORPUS_PATH = os.path.expanduser("~/.blackroad/training-corpus-v4.txt") +MODEL_PATH = os.path.expanduser("~/.blackroad/blackroad-llm-8m.pt") +DEVICE = "mps" if torch.backends.mps.is_available() else "cpu" + +# Model config — ~8M params +VOCAB_SIZE = 16000 +DIM = 256 +NUM_LAYERS = 6 +NUM_HEADS = 8 +SEQ_LEN = 128 +BATCH_SIZE = 16 +EPOCHS = 3 +LR = 3e-4 + +print(f"BlackRoad LLM v4 Training") +print(f"Device: {DEVICE} | Params: ~8M | Corpus: v4") +print(f"Config: dim={DIM}, layers={NUM_LAYERS}, heads={NUM_HEADS}, vocab={VOCAB_SIZE}") +print("=" * 60) + +# ============================================================================ +# WORD-LEVEL TOKENIZER (fast — no BPE bottleneck) +# ============================================================================ + +print("Loading corpus...") +with open(CORPUS_PATH, 'r', encoding='utf-8') as f: + text = f.read() +print(f" Corpus: {len(text):,} chars, {len(text.split()):,} words") + +# Build vocabulary from word frequencies +words = text.lower().split() +word_counts = Counter(words) +vocab_words = [w for w, _ in word_counts.most_common(VOCAB_SIZE - 3)] + +word2id = {"": 0, "": 1, "": 2} +for i, w in enumerate(vocab_words, start=3): + word2id[w] = i +id2word = {v: k for k, v in word2id.items()} +actual_vocab = len(word2id) +print(f" Vocabulary: {actual_vocab:,} tokens") + +# Encode entire corpus +print("Encoding corpus...") +token_ids = [word2id.get(w, 1) for w in words] +print(f" Encoded: {len(token_ids):,} tokens") + +# Create sequences +num_sequences = (len(token_ids) - 1) // SEQ_LEN +data = torch.tensor(token_ids[:num_sequences * SEQ_LEN + 1], dtype=torch.long) +print(f" Sequences: {num_sequences:,} (len={SEQ_LEN})") +print() + +# ============================================================================ +# TRANSFORMER MODEL +# ============================================================================ + +class BlackRoadLLM(nn.Module): + def __init__(self): + super().__init__() + self.embedding = nn.Embedding(actual_vocab, DIM) + self.pos_embedding = nn.Embedding(SEQ_LEN, DIM) + + encoder_layer = nn.TransformerEncoderLayer( + d_model=DIM, + nhead=NUM_HEADS, + dim_feedforward=DIM * 4, + dropout=0.1, + batch_first=True, + norm_first=True, + ) + self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=NUM_LAYERS) + self.ln_f = nn.LayerNorm(DIM) + self.head = nn.Linear(DIM, actual_vocab, bias=False) + + # Causal mask + self.register_buffer( + "causal_mask", + torch.triu(torch.ones(SEQ_LEN, SEQ_LEN), diagonal=1).bool() + ) + + def forward(self, x): + B, T = x.shape + pos = torch.arange(T, device=x.device).unsqueeze(0) + x = self.embedding(x) + self.pos_embedding(pos) + x = self.transformer(x, mask=self.causal_mask[:T, :T]) + x = self.ln_f(x) + return self.head(x) + +model = BlackRoadLLM().to(DEVICE) +num_params = sum(p.numel() for p in model.parameters()) +print(f"Model: {num_params:,} parameters ({num_params/1e6:.1f}M)") + +optimizer = optim.AdamW(model.parameters(), lr=LR, weight_decay=0.01) +scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=EPOCHS * (num_sequences // BATCH_SIZE)) + +# ============================================================================ +# TRAINING LOOP +# ============================================================================ + +print(f"\nTraining {EPOCHS} epochs...") +start_time = time.time() + +for epoch in range(EPOCHS): + model.train() + epoch_loss = 0 + num_batches = 0 + + # Shuffle sequence order + perm = torch.randperm(num_sequences) + + for i in range(0, num_sequences - BATCH_SIZE, BATCH_SIZE): + batch_idx = perm[i:i + BATCH_SIZE] + + # Build batch + inputs = torch.stack([data[idx * SEQ_LEN:(idx * SEQ_LEN) + SEQ_LEN] for idx in batch_idx]).to(DEVICE) + targets = torch.stack([data[(idx * SEQ_LEN) + 1:(idx * SEQ_LEN) + SEQ_LEN + 1] for idx in batch_idx]).to(DEVICE) + + logits = model(inputs) + loss = nn.functional.cross_entropy(logits.reshape(-1, actual_vocab), targets.reshape(-1), ignore_index=0) + + optimizer.zero_grad() + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) + optimizer.step() + scheduler.step() + + epoch_loss += loss.item() + num_batches += 1 + + if num_batches % 100 == 0: + avg_loss = epoch_loss / num_batches + ppl = math.exp(min(avg_loss, 20)) + elapsed = time.time() - start_time + print(f" Epoch {epoch+1}/{EPOCHS} | Batch {num_batches} | Loss: {avg_loss:.4f} | PPL: {ppl:.1f} | Time: {elapsed:.0f}s") + + avg_loss = epoch_loss / max(num_batches, 1) + ppl = math.exp(min(avg_loss, 20)) + elapsed = time.time() - start_time + print(f" Epoch {epoch+1} DONE — Loss: {avg_loss:.4f} | PPL: {ppl:.1f} | Time: {elapsed:.0f}s") + print() + +total_time = time.time() - start_time +print(f"Training complete in {total_time:.0f}s ({total_time/60:.1f} min)") + +# ============================================================================ +# SAVE +# ============================================================================ + +torch.save({ + 'model_state_dict': model.state_dict(), + 'word2id': word2id, + 'id2word': id2word, + 'config': { + 'vocab_size': actual_vocab, + 'dim': DIM, + 'num_layers': NUM_LAYERS, + 'num_heads': NUM_HEADS, + 'seq_len': SEQ_LEN, + 'params': num_params, + 'corpus': 'v4', + 'corpus_size': len(text), + 'trained': time.strftime('%Y-%m-%dT%H:%M:%S'), + } +}, MODEL_PATH) + +print(f"Saved to {MODEL_PATH}") +size_mb = os.path.getsize(MODEL_PATH) / (1024 * 1024) +print(f"Model size: {size_mb:.1f}MB") + +# ============================================================================ +# QUICK TEST — generate a few tokens +# ============================================================================ + +print("\nTest generation:") +model.eval() +prompts = ["blackroad", "the mesh network", "agents collaborate"] +for prompt in prompts: + tokens = [word2id.get(w, 1) for w in prompt.lower().split()] + x = torch.tensor([tokens + [0] * (SEQ_LEN - len(tokens))], dtype=torch.long).to(DEVICE) + + with torch.no_grad(): + for _ in range(20): + logits = model(x) + next_token = logits[0, len(tokens) - 1].argmax().item() + tokens.append(next_token) + x = torch.tensor([tokens + [0] * (SEQ_LEN - len(tokens))], dtype=torch.long).to(DEVICE) + + output = ' '.join(id2word.get(t, '') for t in tokens if t > 2) + print(f" '{prompt}' → {output[:100]}") + +print("\nBlackRoad LLM v4 ready.")