[object Object]

← back to AbramsEgo

feat(dungeon): Ultron orchestrator core (sandy4ka pattern) at map center wired to every chamber + live data-flow packets (Hermes neurovision pattern) — directives Ultron→busiest chamber (blue), heartbeats chamber→Ultron (green/red on alert), edges flash red on alert

c4e1c38afa6fb9777017d0f3c3f566f0f42ab38a · 2026-07-02 08:17:22 -0700 · Steve

Files touched

Diff

commit c4e1c38afa6fb9777017d0f3c3f566f0f42ab38a
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 2 08:17:22 2026 -0700

    feat(dungeon): Ultron orchestrator core (sandy4ka pattern) at map center wired to every chamber + live data-flow packets (Hermes neurovision pattern) — directives Ultron→busiest chamber (blue), heartbeats chamber→Ultron (green/red on alert), edges flash red on alert
---
 data/local-fleet.json |  2 +-
 public/dungeon.html   | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/data/local-fleet.json b/data/local-fleet.json
index 977fca5..7b03ec5 100644
--- a/data/local-fleet.json
+++ b/data/local-fleet.json
@@ -1 +1 @@
-{"fetchedAt":"2026-07-02T15:16:23.228Z","procs":[{"name":"pm2-logrotate","status":"online","cpu":0.1,"memMB":27,"restarts":0,"uptimeMs":3654131,"startedAt":"2026-07-02T14:15:29.097Z"},{"name":"abramsego","status":"online","cpu":0.5,"memMB":67,"restarts":12,"uptimeMs":630505,"startedAt":"2026-07-02T15:05:52.723Z"},{"name":"api-token-dashboard","status":"online","cpu":0.1,"memMB":24,"restarts":0,"uptimeMs":3532517,"startedAt":"2026-07-02T14:17:30.711Z"},{"name":"pattern-vault","status":"online","cpu":0.1,"memMB":50,"restarts":3,"uptimeMs":549977,"startedAt":"2026-07-02T15:07:13.251Z"},{"name":"agent-cabinet","status":"online","cpu":0.1,"memMB":25,"restarts":0,"uptimeMs":3529793,"startedAt":"2026-07-02T14:17:33.435Z"},{"name":"astek-landing","status":"online","cpu":0.1,"memMB":36,"restarts":0,"uptimeMs":2027031,"startedAt":"2026-07-02T14:42:36.197Z"}]}
\ No newline at end of file
+{"fetchedAt":"2026-07-02T15:16:59.970Z","procs":[{"name":"pm2-logrotate","status":"online","cpu":0,"memMB":30,"restarts":0,"uptimeMs":3690873,"startedAt":"2026-07-02T14:15:29.097Z"},{"name":"abramsego","status":"online","cpu":0,"memMB":76,"restarts":13,"uptimeMs":821,"startedAt":"2026-07-02T15:16:59.149Z"},{"name":"api-token-dashboard","status":"online","cpu":0,"memMB":24,"restarts":0,"uptimeMs":3569259,"startedAt":"2026-07-02T14:17:30.711Z"},{"name":"pattern-vault","status":"online","cpu":0,"memMB":49,"restarts":3,"uptimeMs":586719,"startedAt":"2026-07-02T15:07:13.251Z"},{"name":"agent-cabinet","status":"online","cpu":0,"memMB":25,"restarts":0,"uptimeMs":3566535,"startedAt":"2026-07-02T14:17:33.435Z"},{"name":"astek-landing","status":"online","cpu":0,"memMB":38,"restarts":0,"uptimeMs":2063773,"startedAt":"2026-07-02T14:42:36.197Z"}]}
\ No newline at end of file
diff --git a/public/dungeon.html b/public/dungeon.html
index 61d0907..3aa8a28 100644
--- a/public/dungeon.html
+++ b/public/dungeon.html
@@ -258,6 +258,8 @@ function build(d){
   S('sWork',agents.filter(a=>statusOf(a)==='work').length);
   S('sBad',agents.filter(a=>statusOf(a)==='bad').length);
   S('sClock',new Date().toLocaleTimeString([],{hour:'numeric',minute:'2-digit'}));
+  // Ultron sits at the center of the whole map, wired to every chamber
+  const b=worldBounds();ultron.x=(b.x0+b.x1)/2;ultron.y=(b.y0+b.y1)/2;
   if(!chambers._fit){resetView();chambers._fit=1;}
 }
 const S=(id,v)=>document.getElementById(id).textContent=v;
@@ -337,6 +339,34 @@ function draw(){
     ctx.fillStyle=vg;ctx.fillRect(0,0,W,H);}
   document.getElementById('sClock').textContent=(day>0.15?'☀ ':'🌙 ')+now.toLocaleTimeString([],{hour:'numeric',minute:'2-digit'});
   ctx.setTransform(cam.z*DPR,0,0,cam.z*DPR,-cam.x*cam.z*DPR,-cam.y*cam.z*DPR);
+  // ---- Ultron orchestrator: edges to every chamber + directive/heartbeat packets ----
+  if(chambers.length){
+    ultron.ph+=0.04;
+    // edges (drawn under everything)
+    chambers.forEach(ch=>{const cx=ch.x+ch.w/2,cy=ch.y+ch.h/2;
+      const hot=chamberScore(ch)>3, alert=agents.some(a=>a.chamber===ch&&statusOf(a)==='bad');
+      ctx.strokeStyle=alert?'#e5484d40':hot?'#d4af6a55':'#3a305033';ctx.lineWidth=alert?2:1;
+      ctx.beginPath();ctx.moveTo(ultron.x,ultron.y);ctx.lineTo(cx,cy);ctx.stroke();});
+    // spawn packets: Ultron → busiest chamber (directive), chambers → Ultron (heartbeat)
+    if(t%22===0){const busy=chambers.reduce((a,c)=>chamberScore(c)>chamberScore(a)?c:a,chambers[0]);
+      packet(ultron.x,ultron.y,busy.x+busy.w/2,busy.y+busy.h/2,'#5b8cff');}
+    if(t%14===0){const c=chambers[(Math.random()*chambers.length)|0];
+      packet(c.x+c.w/2,c.y+c.h/2,ultron.x,ultron.y, agents.some(a=>a.chamber===c&&statusOf(a)==='bad')?'#e5484d':'#37d67a');}
+    // draw packets
+    packets.forEach(p=>{const e=p.tt<.5?2*p.tt*p.tt:1-Math.pow(-2*p.tt+2,2)/2; // ease
+      const x=p.ax+(p.bx-p.ax)*p.tt,y=p.ay+(p.by-p.ay)*p.tt;
+      ctx.fillStyle=p.color;ctx.globalAlpha=.9;ctx.beginPath();ctx.arc(x,y,3,0,6.28);ctx.fill();
+      ctx.globalAlpha=.3;ctx.beginPath();ctx.arc(x,y,6,0,6.28);ctx.fill();ctx.globalAlpha=1;});
+    updatePackets();
+    // Ultron core node
+    const pr=26+Math.sin(ultron.ph)*3;
+    ctx.beginPath();ctx.arc(ultron.x,ultron.y,pr+14,0,6.28);ctx.fillStyle='#d4af6a18';ctx.fill();
+    ctx.beginPath();ctx.arc(ultron.x,ultron.y,pr,0,6.28);ctx.fillStyle='#120d1e';ctx.fill();
+    ctx.lineWidth=3;ctx.strokeStyle='#d4af6a';ctx.stroke();
+    ctx.font='26px sans-serif';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('🧠',ultron.x,ultron.y+1);
+    ctx.fillStyle='#d4af6a';ctx.font='700 12px Avenir Next,sans-serif';ctx.fillText('ULTRON',ultron.x,ultron.y+pr+12);
+    ctx.fillStyle='#8a7fa8';ctx.font='10px Avenir Next,sans-serif';ctx.fillText('orchestrator · keeps the fleet busy',ultron.x,ultron.y+pr+26);ctx.textAlign='left';
+  }
   // chambers
   chambers.forEach(ch=>{
     ctx.fillStyle='#14101e';ctx.strokeStyle='#2a2038';ctx.lineWidth=2;

← e162439 auto-save: 2026-07-02T08:16:24 (2 files) — data/local-fleet.  ·  back to AbramsEgo  ·  feat(loop): Ng loop-engineering verification gate — smoke-te c904326 →