Specter hunt · 2026-08-24 host loop · Axis · IMU · people parked · Hub compile

S1 / S2 Axis cover, host loop, Hub compile

Today is hop plus SSH only. No canvas. No camera web UI. oakctl stays off. S1/S2 COTA MET stays unflipped. Do not start over on S2 firmware. Specter stays the only glass.

What this sitting was

Loop recording, encoding, security, and streaming on hop :8788 plus SSH. Exit condition is a live LAN grade from python3 scripts/axis-hardening-probe.py plus a host test. No oakctl. No encoder POST. No second soak.

true

host_production_ready (Track B soak 6615s + unique JPEG)

30/30

S1 hold 18:40–19:10Z · fail_streak 0

16/16

host-mcp 13 + name-alias 3

#85

hop recording SSH stub · S2 frozen

Live grades after hop reload

DomainS1 · 192.168.86.40S2 · 192.168.86.22
Streaming MET unique JPEG + ABCDE MET now After reconcile SSH ended: ABCDE 1787592857 plus unique hop JPEGs 2091626093c5ecdf / be03b106cbde122e. Mid-sitting :9876 was refused. Do not kill runc again.
Encoding MET SSH profile 1280×720@5 v6_5fps_rf1_720p MET SSH profile 1920×1080@15 thermal_test_rf5. Live core env was 1280×720@5 after revive.
Recording MET 40 chunks, 14–15 MB. Status source host_mcp_cache (not the new SSH fallthrough). MET 40 chunks, SSH status
Security PARTIAL :8554 go2rtc still listens. 80/443/554/8765/8777 closed. PARTIAL :9876 now listens with ABCDE. :8554 still open after revive. Baseline had 8554 closed.

What changed and shipped on the Mac

Recording honesty

POST /tools/call with tool already used SSH inventory. get_recording_status still returned MQTT WARNING / total_chunks 0 while inventory had live files.

isRecordingCacheStub now treats UNKNOWN or ≤1 chunk without df as a stub and falls through to SSH. toolFromBody accepts MCP name.

Files: services/proxy/vms-proxy/host-mcp-resolver.js, routes/tools.js, tests. LaunchAgent runs them from cwd. Worktree commit 4c53644 on feat/hop-recording-ssh-honesty. PR #85 is open, not draft. Not mixed into PR #81.

Lever

scripts/axis-hardening-probe.py grades streaming, encoding, recording, security. Self-test passes. A reviewer reruns that instead of another HTML tab.

Track B soak already PASS 6615s. LAN probe host_production_ready true. Overlay 84% warn. --once kept 30 pre_event files. df did not drop.

S2 Sight this sitting (parked)

Start of loop. Class A. Encode writing. :9876 listen, 0 ABCDE. ghost_core had no PREVIEW_* after the COUNT_NN watchdog restart.

Overlay _start_ghost_core now sources preview_lite.env. A host kill of the core PID then stopped runc. Revive was bash scripts/reconcile-edge-desired-state.sh S2 (runc create+start, no oakctl). Entrypoint log says PREVIEW=640x360@12.

Later live. CID running. Overlay 80%. Chunks ~10 MB still writing. Core env has PREVIEW 640×360@12 and RF_DETR_MODEL_PATH=/app/models/ghost_protocol_transit.dlc. Hop MQTT still says nn_kind=yolo_count (leftover COUNT_NN_ARCHIVE lie). Hop unique JPEGs 4bc7780f654dc69f then 852c84e39ca15217 while oak-tcp was refused.

After the attached runc start SSH session exited (~33 min). Host still shows ghost_core + ghost_agent_v2. :9876 returned ABCDE. Hop unique JPEGs 2091626093c5ecdf / be03b106cbde122e. runc state.json may say stopped. Trust procs plus ABCDE, not that file. Do not start reconcile again.

Wrong Class A move. Overlay patch first. Then runc exec inside a running container. Never a host kill of the core PID. Reconcile runc start attaches. Do not SIGTERM that SSH session.

Attention (trail review)

reviewed by grok-4.5 (ran as grok-4.6 on this host)

Hop leftover (commit, not live grades)

Do not start over on S2 firmware

S2 is not a dead oakapp. Firmware redo would throw away a working RF-DETR lab lane to chase a preview socket. OS stays 1.30.1. Hub SNPE 2.41 stays do-not-Engage.

MoveKeepBurnWhen
Keep this CID, finish Class A RF-DETR transit, dated chunks, 1.30.1, thermal history Time on preview FIFO / :9876 Now. Procs up, encode writing, hop JPEG moving
reconcile-edge-desired-state.sh S2 again Same bundle Another runc attach hang Only if ghost_* die and runc is stopped
Firmware start-over (oakctl, wipe, OTA) Clean overlay Lab RF-DETR proof, recordings, COUNT_NN negative result, OS pin Hollow CID, overlay 100% and bundle gone, or operator reopens 1.37.0

Next plans

S1

  • Leave nn_kind=yolo_count. Do not migrate RF-DETR until S2 sits are done.
  • Sight is MET. Unique hop JPEG plus ABCDE. Do not oakctl.
  • :8554 stays PARTIAL on purpose. Do not close go2rtc this hunt.
  • COTA 05 stays PARTIAL bags-only. 07 PARTIAL class-only. 13 PARTIAL. Do not flip MET.

S2

  • Keep CID 65acd4e6-…. Comment COUNT_NN_ARCHIVE so hop nn_kind matches transit RF-DETR.
  • Prove oak-tcp. :9876 ABCDE plus two hop SHAs 2 s apart. Class A. Preview FIFO / agent drain. Not runc-from-empty.
  • Do not oakctl. Do not OTA. Do not Engage Hub weapons to “fix” Sight.
  • COTA 05/07/13 stay FAIL until a live bags, weapon, vehicle sit. People-count stays sidecar.

Host

  • Add the untracked services/proxy/vms-proxy/ hop modules in a focused commit. Not mixed into PR #81. Not the proxy dump of runtime JSON.
  • Rerun python3 scripts/axis-hardening-probe.py after S2 ABCDE returns.
  • HMAC on inbound /tools/call and hop bind 127.0.0.1 are later. Not this prove.
  • Do not flip S1/S2 COTA MET. Host 01 occupancy stays isolated VLM.

Discarded this sitting

People sit parked · 12:45 AM CT · 10:22 AM CT MODEL_MISS · sidecar until IMU glass lands

People-count equal-result sit (12:45 AM)

Same ~30s walk. Host 01 occupancy stays isolated VLM — N/A here. Leftover dets_status.person_count is not PASS.

Eyenn_kindThis walkHonesty
S1 yolo_count PASS lab n=1 person=1 at 05:45:05Z; n=2 person=1 at 05:45:10Z. After: hop n_person=0 leftover-dies.
S2 rfdetr MISS this walk No RF-DETR n>0 after 9:35pm sit. Chunks 05:44–05:50 max_n=0. Prior PASS 21:35 n_person=2 is leftover, not this walk.
S1 walk t+5s
S1 YOLO lab occupancy · t+5s · s1-walk-t5.jpg
S2 walk t+2s
S2 RF-DETR this walk MISS · t+2s · leftover 21:35 is not this sit
S1 close-up 12:45
S1 close-up same walk. Extra YOLO classes 56/9/73 must not inflate n_person.
S2 after-walk hop JPEG
S2 hop JPEG after walk. Health n=0 hides leftover dets_status.

10:22 CDT walk (pulled via s2-via-jump)

Cloudflare jump only. Hop and tunnel not changed. Device jsonl from CID 65acd4e6-… chunks 17874983841787498627. The 15:22:00 stills in s2-1022/ are empty foyer. Those are the wrong covering. Fair subject is s2-010210-20260823T152245Z.jpg.

SourceS1S2Grade
Wrong covering 15:22:00Z empty foyer empty foyer not the sit
Fair covering 15:22:45Z not this eye close person, white shirt, right of frame MODEL_MISS
Hop poller n_person max 0 (n_dets max 1, clutter) max 0 (n_dets max 0 in 10761 rows) n_dets is not people
Device jsonl 1519 lines Closest row 15:22:45.628Z dets=[] (54 ms after JPEG). One later sliver 15:22:48.460Z class-0 p=0.20 box [0,0.9,0.1,0.1], person_count 0. recall fail, not health lag
S2 15:22:00 empty foyer
Wrong covering 15:22:00Z. Empty foyer. First score.json called this FOV-miss.
S2 10:22 close person
Fair covering 15:22:45Z. Close subject. jsonl 54 ms later is empty. MODEL_MISS.

Overnight prep (what Grok sent / what is live)

Hop is live. iMessage already went to the phone. S2 is up after a runc revive — the overlay restart had left ghost_core/agent down (runc create “container already exists” until $ROOT/$CID was not pre-mkdir’d; leftover also lived under /tmp/runc-root). S1 was never bounced.

Live lever: RF_DETR_CONF_THRESH=0.15 on S2 (all classes). Baked ghost_core cannot split person vs other classes until the next binary. Occupancy still counts class 0 only. S1 stays YOLO COUNT_NN. Mac ByteTrack parked. Host 01 is not this sit.

Hop at arm (~1:11 AM CT / 06:11Z)

Eyenn_kindn_personofficial
S1 192.168.86.40yolo_count0false
S2 192.168.86.22rfdetr0false

Prove GET http://127.0.0.1:8788/fleet/mqtt/latest.devices.shadow{1,2}.topics.health.payload.rfdetr. Not leftover dets_status.person_count.

Morning sit bar (equal-result)

Stand still in S2 mid 15 seconds (same close path as 9:35pm two-person PASS), then S1 door 15 seconds. Do not walk past. JPEG must show the person on that eye or it is a FOV-miss, not a model-miss.

1 Hz poller scripts/s12-people-sit-poll.py armed ~7:31 AM CT, 3 h, writes docs/grading/s12-sit-morning/. S2_PERSON_HIT = RF-DETR matched YOLO.

Live knobs vs 12:45 knobs

RF-DETR is not slower than YOLO here. Both infer at ~5 Hz. Roboflow’s Pareto vs YOLO11 still stands on paper. The 12:45 miss was recall + sit split + night doorway.

S1 YOLOS2 RF-DETR
Modelyolo11n-sentry COUNT_NN · COCO · class 0 = persontransit ghost_protocol_transit.dlc sha 1c86082e · 14-class · class 0 = person
Encode15 fps 1280×720 (banner; env file still says 5)5 fps 1280×720 thermal-safe
NN rate~5 Hz (stride 5, every 3 video frames)5 Hz (stride 5, every 1 video frame)
TensorDetectionNetwork native544×544 letterbox
Conf at 12:45occupancy class 0 ≥0.25RF_DETR_CONF_THRESH=0.25 in core before jsonl
Conf now (live S2)unchanged YOLORF_DETR_CONF_THRESH=0.15 all classes (baked core). Overlay agent person floor 0.15 class 0. RF_DETR_PERSON_CONF=0.15 in env for the next bake.
12:45 jsonlclass0=73 hits; n=2 included chair/book305 lines dets=[] — NN published empty, not hop drop

Why 12:45 missed (ranked, keep hunting)

  1. Sit split. 30 s across two cameras. S1 got the close door. S2 clip after 12:45:16 is empty foyer. Equal-result needs 15 s planted in S2, then S1.
  2. Night silhouette + 544 letterbox. Fewer pixels on a dark person than YOLO sentry on 15 fps encode. Not latency. Next sit: covering S2 JPEG must show the person at T0 or score FOV-miss.
  3. Weapons-finetune transit ≠ sentry YOLO. S2 pack already counts large/close people (9:35). It did not fire on this night walk. Domain gap, not “RF-DETR slower.”
  4. Sub-threshold was invisible. Core dropped p<0.25 before jsonl. Could not tell “saw at 0.18” vs “never saw.” Overnight: live thresh 0.15. Repo drop log only after next ghost_core bake.
  5. camera_profile overwrite. Layer env patched to 0.15, then camera_profile.env still had 0.25 and loads after. Both files now 0.15. Always grep camera_profile after a layer patch.
  6. Not leftover MQTT, hop kill, ObjectTracker, or Ultralytics AGPL track.

Equal-result bar (falsifiable)

GatePASS
S1nn_kind=yolo_count n_person≥1 while covering JPEG shows the person (already 12:45)
S2nn_kind=rfdetr official=false n_person≥1 while covering JPEG shows the person
Dualboth n_person≥1 in the same 15 s if both JPEGs show the person
Afterboth n_person=0. Leftover dets_status.person_count is never PASS
FOV-missS2 JPEG has no person → do not retune
Model-missS2 JPEG has person and jsonl dets=[] → recall fail

What shipped overnight (for later discovery)

10:22 AM daylight walk (poller scored after the fact)

The 3 h poller was not empty-aisle. At 15:22:35Z S2 JPEG shows a person in the left opening. At 15:22:45Z the same person is close, large, right of frame. Hop at those seconds stayed S2 rfdetr n_person=0 n_dets=0. A fresh health tick at 15:23:00Z is still 0. That tick can miss a 10 s walk on its own. It did not cause this miss. On-device occupancy never left 0.

On-device jsonl (jump SSH, scorer rerun): closest row to the fair JPEG is 15:22:45.628Z frame_seq 166496, dets=[], person_count=0, 54 ms later. Window ±1 s has 10 rows, 0 class-0 people. The only box in 1519 lines is 15:22:48.460Z class 0, p=0.20, box [0.0, 0.9, 0.1, 0.1] (area 0.01 sliver, jsonl person_count still 0). That is not the large person. Verdict: MODEL_MISS. Not FOV. Not HEALTH_LAG. Lowering 0.15 further would not have boxed the covering subject.

S2 10:22 doorway person
S2 15:22:35Z overlay. Person in the left opening. Hop n_person=0.
S2 10:22 close person
S2 15:22:45Z overlay. Close subject, fair box. Hop still n_person=0.

S1 n_dets hit 1 on 5634 rows with n_person still 0. Other-class clutter. Do not read YOLO n_dets as people. S2 n_dets never left 0 in 10761 samples. Health publish is 30 s. A 10 s walk can miss a hop tick even if NN boxed. Next sit must plant 15 s and check on-device dets jsonl, not hop health alone.

Discovery still open on the morning sit (parked)

Overnight hunt finished at 6:03 AM CDT

Sight held. Host COTA soak still does not pass. Hop untouched — no oakctl, PoE, firmware, or kickstart.

281/281

S1 unique JPEG · 0× 503

281/281

S2 unique JPEG · 0× 503

65.4 / 63.7

S1 / S2 peak °C · never 78/85

0

LOOK pages

Both eyes moving every minute. S1 .40 and S2 .22 unique JPEG. Canvas :8081 200. PIDs stable. No live EADDRINUSE. S1 stayed yolo_count. S2 hop stayed rfdetr. Thermals peaked 65.4°C / 63.7°C and came back.

Every tick is honesty target_mdns: target=shadow1 is 503 while the LAN IP is 200 unique. Glass must keep using cam.lanIp. Do not rewrite the registry.

host_production_ready stays false. Preflight aborted free_plus_spec_low (61–488 MB all night). The PID watcher also never wrote host-soak.json because the orchestrator SIGTERM’d it at 6am — that is a harness bug, not a dead hop.

Rail walk (once at 1:13 AM)

Failed 7 icons. Four of those (live-s1/s2, Shadow Play, Marks) were the harness demanding edge=live before Watcher had ticked — that check is already fixed. Still real: Watcher click did not spawn a Watcher agent; Dual DET toast lost to Library; Playlist MCP showed LOOK suppressed · watcher fail · edge_s2 · backoff-circuit.

IconGradeWhyMitigation
live-s1 / live-s2 / shadow-play / events harness fixed media/panel opened; harness demanded edge=live while edge=? Hop JPEG is Sight truth. Unset edge is not demo.
Watcher FAIL click did not spawn a Watcher agent (only the two Sight tiles) Pulse may still run. Do not spam Patch. Escalate if circuit opens.
Dual DET FAIL toast raced (Library · 0 hits) Longer toast wait shipped. Dual DET toast must not lose to intel.
Playlist FAIL MCP LOOK suppressed · watcher fail · edge_s2 · backoff-circuit Watcher circuit on S2 is a real LOOK. Soft repair-stream loop is forbidden.
Patch S1, Faces, Agents, Library, Pulls, Ops, Map, Fleet Sight, Scout, Classify, Shadow Play S2, Switch-Phantom, Hermes CLI, Grok CLI PASS clicked; expected panel / media / toast landed

Do not

  • oakctl, PoE, or firmware from this night
  • Flip any S1/S2 capability MET
  • Treat leftover person_count as people
  • Rewrite registry because shadow1 503s

If you want the COTA numeric soak gate next, free RAM (soak:clean / extra Chrome) then a dedicated 60m cota-host-soak.py.

Full grade: docs/grading/rail-soak-2026-08-23.md. Ticks: ~/.specter-vision/platform/rail-soaks/2026-08-23T06-10-55-759Z/.

Hub compile / DLC · then compiled hunt picture · 2026-08-23

Compile / DLC — official vs live vs refuse

Hop and fleet score the operator Qualcomm AI Hub compile — not leftover dets_status person. Overnight S2 hop nn_kind=rfdetr is the lab transit lane, not jp4me 544 weapons MET. S1 stays COUNT_NN / yolo_count. Do not Engage from this page.

Packsha / sizeInputmayEngageSay
Hub jp4me448p rf-detr-weapons-fine-tuned 5ed0ac14… · 108845628 float32[1,3,544,544] false Official SoT. dlc.metadata2.1.0 no HTP. Mac download only. Do not git-add.
Sibling Hub j5qzj2l75 672×672 not SoT Later compile. Do not treat 672 as official tensor.
Live transit /app/models/ghost_protocol_transit.dlc 1c86082e · ~129 MB not jp4me 544 2.0.1 + HTP Same-bytes loadable recipe. Did not Engage. Overnight S2 hop rfdetr is this lane.
Hub SNPE 2.41 rewrite 4287bb36 never dlc.metadata2.1.0. Refuse.
rf_detr_qcs8550.dlc a2cabf71 false camera_profile overwrite refuse path. Not transit.
YOLO packs (v2-3 / yolo11n sentry) ~12 MB 640×640 not RF-DETR S1 COUNT_NN. Not Hub weapons. Not live 129 MB transit.

Classifier: node scripts/snpe-dlc-loadability.mjs. Head+tail scan: mayEngage = dlc.metadata2.0.1 && backend.metadata0. SNPE 2.41 already failed Could not load the container. Letterbox 1280×720 encode → square 544 if jp4me ever loads. Overnight soak did not Engage. S1 never RF-DETR.

Two compile tracks (do not mix)

A · DLC (weights)

ONNX → Hub qnn_dlc.dlc on S2 RF_DETR_MODEL_PATH. Official job jp4me448p rf-detr-weapons-fine-tuned from inference_model.onnx (mq32kvx6m), float32[1,3,544,544], --output_names dets,labels --qnn_options context_enable_graphs=rf_detr_qcs8550 --compute_unit npu, target mmr7ydg2q QCS8550 Android 12, submitted 2026-06-26.

Mac file job_jp4me448p_optimized_dlc_mmr7ydg2q.dlc is SoT on paper and unloadable on this OS (2.1.0, no HTP). Live S2 is transit lab, official=false.

B · ghost_core (parser)

C++ oakapp binary parses SNPE dets/labels. Overnight we patched source for class-0 RF_DETR_PERSON_CONF 0.15 + 1/s drop log. Live device still runs the baked binary — that is why live S2 uses a single RF_DETR_CONF_THRESH=0.15 for all classes.

Next bake: rebuild/copy ghost_core so PERSON_CONF splits person vs weapons. Keep 544 letterbox. Do not Engage a new DLC just to get the parser. Do not enable ObjectTracker.

How a loadable recook is supposed to look

  1. ONNX fixed square 544, outputs named dets, labels. Do not Hub-compile 672 as SoT (j5qzj2l75 is sibling only).
  2. Hub job: qnn_dlc + HTP context graph. Prefer the recipe that produced transit’s dlc.metadata2.0.1 + backend.metadata0, not SNPE 2.41.
  3. node scripts/snpe-dlc-loadability.mjs job_….dlc must print mayEngage: true.
  4. S2-only copy. Point RF_DETR_MODEL_PATH and camera_profile.env (profile loads after sanitize and will reload qcs8550 if left alone).
  5. One S2 runc. Hop: nn_kind=rfdetr + in-frame n. Then decide if official can flip — not before.

People-count equal-result does not require a new Hub compile. Transit lab pack + 0.15 conf + 15 s plant is the morning bar. New compile is the weapons-SoT lane.

Compile discovery still open

Cite: docs/RF_DETR_OFFICIAL_S1_S2.md · docs/HANDOFF_S2_RFDETR_2026-08-22.md · docs/HANDOFF_RFDETR_WEAPONS_FINETUNE_2026-08-22.md · docs/RF_DETR_PEOPLE_COUNT_EQUAL.md.

Compiled hunts — one page

Specter is still the only glass. S1 and S2 have no camera webapp. Overnight they kept unique Sight for 4h 53m. Host COTA is still not production-ready. Compiling Axis + people sit + soak + Hub:

ClaimS1S2HostSay
On-cam UI / Axis VAPIX none none Specter only No :80/:443. No Axis IP in fleet.
Live Sight (hop JPEG unique) LAN now 3/3 LAN now 3/3 :8788 ready 2026-08-24 this Mac. S1 shas 921b8e1d/a9662c72/2e0f0fd8. S2 43ef2739/94d2d58e/eea3ed63. target=shadow1 still 503. Overnight 281/281 still stands.
Hop get_9axis_imu dets_status dets_status Host MCP imuFromMqtt now reads topics.dets_status.payload.imu. Unit 12/12. No SSH when mqtt has accel. Glass HUD still polls mqtt/latest.
NN lane (overnight) yolo_count rfdetr hop N/A soak Do not Engage RF-DETR on S1. S2 hop rfdetr is lab transit, not jp4me MET.
People sit 12:45 AM PASS lab MISS N/A Host 01 S1 YOLO n in walk. S2 no n>0 this walk. 21:35 leftover is not this sit.
People sit 10:22 AM n_dets clutter MODEL_MISS N/A Host 01 Fair JPEG s2-010210-20260823T152245Z.jpg. jsonl 54 ms later dets=[]. Not FOV. Not 30 s health lag. YOLO n_dets is not people.
People sit overnight prep yolo n=0 empty conf 0.15 live 01 N/A Sidecar. S2 runc revived. Baked core: all-class 0.15. PERSON_CONF split waits next bake. Do not plant until IMU glass is the live sensor work.
People-count equal-result parked Host 01 isolated Operator sidecar. S2 10:22 remains MODEL_MISS. Not a Host 01 flip. Not leftover person_count.
IMU / accelerometer on glass live mqtt live mqtt MotionHud RDF accel from GET /fleet/mqtt/latest dets_status.payload.imu. Isolated :18080 still fixture. PR #82.
Hub compile jp4me 544 not Engaged mayEngage false Official SoT 544. SNPE 2.41 / qcs8550 refuse. Transit 2.0.1+HTP is the live loadable recipe.
Thermal overnight max 65.4 max 63.7 Spikes recovered. Never 78/85. Do not PoE.
Recordings list SSH 40 SSH 40 hop BFF Not Axis record/list.cgi. Not MQTT one-chunk stub.
Config / overlay / FIFO FIFO 80% FIFO 80% SSH deploy S1 84.3%→80.0% (204 chunks 08/23). S2 85.0%→80.0% (475 chunks 08/19–08/21). fifo_loop.py every 60s. ghost_core stayed up. No oakctl. No LUKS.
Remote jump s1/s2-via-jump Cloudflare Access ssh-remote.ghostprotocol.app. Tunnel up. Mac hop snapshot can 503 while cameras still answer jump. Do not retune tunnel or hop.
Rail walk (operator icons) PARTIAL walk FAIL 7 edge=? harness fixed. Watcher spawn, Dual DET toast, Playlist circuit still real.
COTA host soak gate false free_plus_spec_low 61–488 MB. host-soak.json not written (harness SIGTERM). Free RAM, then 60m cota-host-soak.py.

Compile — what is true this morning

Keep saying

  • Two OAK Shadows, Specter glass only
  • Sight moved all night on both LAN IPs
  • No camera webapp, no VAPIX
  • Recordings list is SSH inventory after the hop fix
  • Live IMU is on Specter MotionHud from mqtt/latest
  • Overlay already inlinecrypt + noexec
  • LAN 2026-08-24 unique hop JPEGs on S1 and S2 from this Mac
  • Per-task PR workflow #84

Do not say

  • Host production ready
  • S1/S2 COTA MET from this soak
  • Green LED / MQTT / alias shadow1 = live
  • GPIO 20ms, TrOCR, Gemma 4, Axis M-series
  • People-count equal-result MET (parked; S2 10:22 MODEL_MISS)
  • Need LUKS format of overlay (already encrypted)

Sources: this Axis hunt · docs/grading/rail-soak-2026-08-23.md · ticks 2026-08-23T06-10-55-759Z · IMU PR #82. Hop still LAN :8788. Jump s2-via-jump.

IMU / accelerometer on Specter glass · live mqtt · isolated fixture kept · 2026-08-23

What the operator sees

MotionHud already drew a 2D horizon and g-sensor from fixture roll_deg / forward_g. Live eyes publish RDF accel [x,y,z] m/s², not degrees. Glass now maps that packet at the telemetry boundary and paints the same HUD.

−1.9°

S1 live roll · mqtt now

−21°

S1 live pitch · still camera

−25°

S2 live pitch · RDF +Z forward

0.01g

risk ok · not HIGH-G at rest

Path (smallest that works)

LayerWhatHonesty
Wire GET /fleet/mqtt/latestdevices.shadowN.topics.dets_status.payload.imu.accel Observed this Mac. S1 [-0.3,-9,3.5] S2 [0,-8.8,4.1] m/s²
Parse rdfAccelToHud in apps/canvas/src/vms/edge-telemetry.ts Luxonis RDF +X right +Y down +Z forward. Rest [0,-G0,0] is level and ~0g
Fan-out One hop packet → kind: imu + kind: accel Playhead and MotionHud stay kind-strict. Fixture keys unchanged
Fetch fetchEdgeTelemetry polls mqtt/latest (pulse if empty) Does not poll ghost /fleet/telemetry. Does not POST /tools/call
Isolated drive-imu-accel on :18080 PASS source Specter fixture. Sight and play moved. Hop-free
PR github.com/dev-gp-1/specter-vision/pull/82 Cherry-picked onto main. Not mixed into #81 any-det

What we did not do

Rejected hop GET

Arena shape B wanted GET /fleet/imu with RDF math on hop. Live IMU is already on mqtt/latest. POST /tools/call get_9axis_imu timed out 8s with 0 bytes (SSH sidecar). Glass must not wait on that.

Still open

  • jsonl playback IMU parses. Player does not load those lines yet
  • Host MCP imuFromMqtt still ignores dets_status, so MCP IMU still SSHs
  • Hard-brake on a moving bus is single-sample gravity removal, not a complementary filter
  • Operator :8081 HUD was not driven in the browser. Live mapping is the hop JSON prove

Aligned with prior hunts

Tests: canvas IMU 21 pass. Hop resolver 12/12 including dets_status IMU without SSH.

LAN 2026-08-24 (this Mac owns :8788)

Operator back on LAN 2026-08-24 02:20 CDT. Hop /health ready, mqtt connected, snapshots 200 unique both eyes via LAN IP. Alias shadow1 503 stays honesty. Soak already PASS 6615 s. Probe lab_hil_ready true, host_production_ready true, blockers []. The 15:30–15:51 CDT plant window was NO_PLANT (hop mqtt 4 h stale, JPEGs 503). Night foyer stills now are empty. 3 h hop poller armed docs/grading/s12-sit-lan/. People-count stay sidecar. Do not oakctl. Do not a second soak.

true

host_production_ready

unique

S1 + S2 hop JPEG 2 s

84%

overlay both · warn not prune

39.5 / 45.2

S1 / S2 °C