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
| Domain | S1 · 192.168.86.40 | S2 · 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.
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)
- S2 is worse than the Class A baseline on oak-tcp. Revive left
:9876closed. One hop JPEG then timeout is not unique JPEG plus ABCDE. tests 16/16is two files. Resolver 13. Name-alias 3. No saved TAP log in the TSV.- PREVIEW patch is on-camera overlay, not in git. Do not treat the entrypoint log as Sight restored.
- S1 recording MET used
host_mcp_cache, not the new SSH fallthrough. That does not prove the stub fix is what:8788serves. - Encoding MET is SSH profile text. It is not proof the running encoder matches while Sight is FAIL.
- Lever
--self-testis not the hunt. Axis probe overall was FAIL (S2 mix). S1 hold after that sitting is 30/30 PASS, fail_streak 0,~/.specter-vision/platform/s1-hold-30m.jsonl. - Five TSV rows share
2026-08-24T17:04:46Z. Written after the fact. - S2
:8554opened after revive. Baseline had it closed.
Hop leftover (commit, not live grades)
- Inbound
POST /tools/callstill has no HMAC. Hop binds0.0.0.0:8788. recordings-host-path.jsis tested and unused.- Stub
discoverChunksViaSshand resolverlistChunksFromSshstill use two different finds.
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.
| Move | Keep | Burn | When |
|---|---|---|---|
| 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.
:8554stays 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-…. CommentCOUNT_NN_ARCHIVEso hopnn_kindmatches transit RF-DETR. - Prove oak-tcp.
:9876ABCDEplus 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.pyafter S2 ABCDE returns. - HMAC on inbound
/tools/calland hop bind127.0.0.1are later. Not this prove. - Do not flip S1/S2 COTA MET. Host 01 occupancy stays isolated VLM.
Discarded this sitting
- oakctl, PoE, wipe, OTA off 1.30.1
- Encoder POST / camera profile set
- Closing S1
:8554 - A second hop kickstart after the reload race
- Opening a PR while S2 streaming is FAIL
- Firmware start-over
What the cameras own
S1 / S2 (edge, no UI)
Axis: once a VMS owns the device, turn the on-device web UI off. S1 192.168.86.40 and S2 192.168.86.22 have no :80 / :443.
- Live Sight: unique hop JPEGs on both eyes
- Recordings: hop/OAK H.265 under overlay dated dirs — not Axis
record/list.cgi - SSH HITL only. No FTP/Telnet. No inbound internet in this lab
Host / Specter
Glass, Shadow Play, Marks, IAM, vuln scan, Ops Axis/M8 slots. Enable ≠ online. No VAPIX client. Fleet has no Axis IP.
- Hop
:8788is the BFF - Canvas never talks to the camera IP for JPEGs
- Host 12 Shadow Play stays Host. S1/S2 12 stay N/A
Graded Axis map
| Control | Grade | Evidence |
|---|---|---|
| No on-cam web UI | MET | TCP 80/443 closed on both |
| Auth / no anonymous view | PARTIAL | JPEG via hop only. :8765 closed on LAN (good). A2A has HMAC; /tools/call inside CID is unauth if it ever binds out |
| Brute-force delay | PARTIAL | A2A 20/min only |
| Minimal ports | PARTIAL | Open: 22 SSH, 8554 go2rtc, 9876 Sight. Closed: 80, 443, 554, 8765, 8777. UDP 1900/3702/5353 no reply |
| No inbound internet / no FTP-Telnet | MET lab | LAN only; SSH HITL |
| Discovery off | PARTIAL | No UPnP/SSDP reply; ONVIF 3702 not answering empty probe; 8554 still listens |
| Edge recordings | MET after fix | SSH inventory, not MQTT one-chunk stub. See keep-up |
| Storage list / FIFO / encrypt / noexec | FIFO live | 2026-08-24 deploy: storage_manager.enforce on /app-storage/recordings dated dirs. S1 84.3%→80.0% (204 oldest 08/23 chunks). S2 85.0%→81% then second pass. Overlay still keep-data, no LUKS. ghost_core stayed up. No oakctl. |
Config get/set (Axis param.cgi) |
MET read after fix | Host SSH-reads camera_profile.json when :8765 is refused. Did not open 8765. S1 1280×720@5. S2 1920×1080@15 thermal_test_rf5. Set still needs encoder restart — not POSTed this hunt |
| Signed OS / Edge Vault / 802.1X / signed video | N/A silicon | OAK, not AXIS OS |
| Glass / IAM / vuln scan / real Axis plugin | HOST | Specter only |
Live ports (both eyes)
Same listen set on S1 and S2. Cameras must not grow HTTP sites.
Recordings keep-up — the real break
Before: list_recordings_since returned 1 MQTT stub (size_bytes: 0). /fleet/recorder-inventory had 40 SSH chunks. That is Axis record/list lying.
Fix (no camera UI): host-mcp-resolver.js SSH inventory first — do not mint a one-chunk MQTT list. tools-call-handler.js SSH-merges if the host list is a stub, like recorder inventory.
Before
1
MQTT stub per eye
size_bytes: 0
After hop restart
| Eye | list_recordings_since | inventory |
|---|---|---|
| S1 .40 | 40 host_mcp_ssh | 40 |
| S2 .22 | 40 host_mcp_ssh | 40 |
Tests: 15/15 on those two files. Sight unique JPEGs still 200 after the hop kick.
What this hunt will not do
- Webapp or UI on S1/S2
- VAPIX client (no Axis camera in fleet)
- oakctl / wipe / open :8765 to “fix” profile
- Hardening PR for N/A silicon or Host-owned items
- Honesty-only docs as a substitute for a live path
Continue — Host-only, still no camera UI
Config read: GET /camera/profile shadow is now Host SSH, not null. S1 1280×720@5. S2 1920×1080@15 thermal_test_rf5. Catalog :8765 stays preferred when live. 404 falls through to SSH. Did not open 8765.
Chunk sizes: SSH stat -c '%s %Y %n'. S1 head ~17.9 MB. S2 head ~10–11 MB. No more all-zero sizes.
Overlay encrypt + noexec: MET on both eyes (inlinecrypt + noexec). LUKS format was rejected. FIFO: still PARTIAL until the dated-glob lands on-cam. get_recording_status still MQTT/cache (S1 WARNING, S2 UNKNOWN). Encoder set not POSTed.
Hop recordings-list fix is in tree. Remote jump is ssh-remote.ghostprotocol.app / s1-via-jump / s2-via-jump. Do not change the tunnel.
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.
| Eye | nn_kind | This walk | Honesty |
|---|---|---|---|
| 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-t5.jpg
n_person.
10:22 CDT walk (pulled via s2-via-jump)
Cloudflare jump only. Hop and tunnel not changed. Device jsonl from CID 65acd4e6-… chunks 1787498384–1787498627. The 15:22:00 stills in s2-1022/ are empty foyer. Those are the wrong covering. Fair subject is s2-010210-20260823T152245Z.jpg.
| Source | S1 | S2 | Grade |
|---|---|---|---|
| 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 |
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.
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)
| Eye | nn_kind | n_person | official |
|---|---|---|---|
| S1 192.168.86.40 | yolo_count | 0 | false |
| S2 192.168.86.22 | rfdetr | 0 | false |
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 YOLO | S2 RF-DETR | |
|---|---|---|
| Model | yolo11n-sentry COUNT_NN · COCO · class 0 = person | transit ghost_protocol_transit.dlc sha 1c86082e · 14-class · class 0 = person |
| Encode | 15 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) |
| Tensor | DetectionNetwork native | 544×544 letterbox |
| Conf at 12:45 | occupancy class 0 ≥0.25 | RF_DETR_CONF_THRESH=0.25 in core before jsonl |
| Conf now (live S2) | unchanged YOLO | RF_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 jsonl | class0=73 hits; n=2 included chair/book | 305 lines dets=[] — NN published empty, not hop drop |
Why 12:45 missed (ranked, keep hunting)
- 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.
- 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.
- 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.”
- Sub-threshold was invisible. Core dropped
p<0.25before jsonl. Could not tell “saw at 0.18” vs “never saw.” Overnight: live thresh 0.15. Repo drop log only after nextghost_corebake. - camera_profile overwrite. Layer env patched to 0.15, then
camera_profile.envstill had 0.25 and loads after. Both files now 0.15. Always grep camera_profile after a layer patch. - Not leftover MQTT, hop kill, ObjectTracker, or Ultralytics AGPL track.
Equal-result bar (falsifiable)
| Gate | PASS |
|---|---|
| S1 | nn_kind=yolo_count n_person≥1 while covering JPEG shows the person (already 12:45) |
| S2 | nn_kind=rfdetr official=false n_person≥1 while covering JPEG shows the person |
| Dual | both n_person≥1 in the same 15 s if both JPEGs show the person |
| After | both n_person=0. Leftover dets_status.person_count is never PASS |
| FOV-miss | S2 JPEG has no person → do not retune |
| Model-miss | S2 JPEG has person and jsonl dets=[] → recall fail |
What shipped overnight (for later discovery)
- Repo:
ghost_core.cppclass-0 usesRF_DETR_PERSON_CONFdefault 0.15; other classes stayRF_DETR_CONF_THRESH. 1/s drop logc,p,thresh. - Overlay agent:
occupancy_from_detsperson floor 0.15 class 0. Live on S2/app-storage/agent/ghost_agent_v2.py. - Live S2 env (layer + camera_profile):
RF_DETR_CONF_THRESH=0.15+RF_DETR_PERSON_CONF=0.15. Banner prints CONF_THRESH=0.15 (baked core does not print PERSON_CONF yet). - Poller:
scripts/s12-people-sit-poll.py1 Hz hop + JPEG SHA every 5 s. Self-test PASS. PIDdocs/grading/s12-sit-morning/poller-arm.pid. - Tests: overlay source 4/4. Spec
docs/RF_DETR_PEOPLE_COUNT_EQUAL.md. Packdocs/grading/s12-sit-0045/.
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.
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)
- 15 s plant is parked with people-count. Score
docs/grading/s12-sit-plant/s2-jsonl-sit.jsonlplus a covering still when that sit returns. JPEG person + jsonldets=[]is MODEL_MISS again. - After sit, jsonl
dets[].pin 0.15–0.25 proves the live thresh helped. Drop-log lines only after the next core bake. - S2 must stay class 0 for people. Bags at 0.15 may raise
n_dets; they must not raisen_person. - S1 encode 15 fps vs S2 5 fps is unfair for motion, not for a 15 s plant. Do not chase 15 fps on S2 unless thermal stays <78.
- 9:35 S2 two-person still stands as close-range PASS. Morning sit is the night/stand equal-result, not a redo of 9:35.
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.
| Icon | Grade | Why | Mitigation |
|---|---|---|---|
| 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_countas people - Rewrite registry because
shadow1503s
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.
| Pack | sha / size | Input | mayEngage | Say |
|---|---|---|---|---|
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
- ONNX fixed square 544, outputs named
dets,labels. Do not Hub-compile 672 as SoT (j5qzj2l75is sibling only). - Hub job:
qnn_dlc+ HTP context graph. Prefer the recipe that produced transit’sdlc.metadata2.0.1+backend.metadata0, not SNPE 2.41. node scripts/snpe-dlc-loadability.mjs job_….dlcmust printmayEngage: true.- S2-only copy. Point
RF_DETR_MODEL_PATHandcamera_profile.env(profile loads after sanitize and will reload qcs8550 if left alone). - One S2 runc. Hop:
nn_kind=rfdetr+ in-frame n. Then decide ifofficialcan 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
- Does a 544 recook of jp4me with metadata 2.0.1 + HTP load on this OS, or is 2.41-only Hub output a hard wall?
- Transit sha
1c86082evs Hub5ed0ac14— same family, different SNPE metadata. A people sit on transit does not promote jp4me. - After any Engage bounce, grep both layer env and camera_profile. Profile still loves
qcs8550. - Do not compile YOLO packs named “transit.” Do not git-add
.dlc. Do not Engage4287bb36/ 2.41. - Until ghost_core is rebaked, jsonl
pin 0.15–0.25 is the only proof the overnight thresh helped; drop-log lines will not exist yet.
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:
| Claim | S1 | S2 | Host | Say |
|---|---|---|---|---|
| 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)
| Layer | What | Honesty |
|---|---|---|
| Wire | GET /fleet/mqtt/latest → devices.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
imuFromMqttstill ignoresdets_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
- Specter is the only glass. No webapp on S1/S2. No VAPIX. No :8765 bind.
- Do not oakctl unless LED is blue / ghost_core down. Hop not kicked for IMU.
- People-count equal-result stays sidecar. S2 10:22 MODEL_MISS is not overwritten.
- Overlay LUKS format stays rejected. FIFO dated-glob stays code-only until camera copy.
- Jump
s1-via-jump/s2-via-jumpis the remote camera path. Tunnel not changed.
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