feat(ui): pipeline dashboard — one view across sense/verify/fuse - #1731
feat(ui): pipeline dashboard — one view across sense/verify/fuse#1731fallen-pc wants to merge 1 commit into
Conversation
RuView, RuField, and RuCelium each have real, tested pieces that got wired to each other tonight (rufield simulated-source fix, the ADR-302 OOD gate, RuCelium's RF ingest + RuFieldFusion wiring) - but no single place to actually watch the whole chain. You'd need three separate tools (or three separate curl calls) to see RuView sensing, the OOD gate's domain_state, and RuCelium's fused room-state inferences at once. ui/pipeline.html is a static, no-build, no-dependency page (same convention as ui/observatory.html, ui/viz.html, and rufield-viewer) served by RuView's own static file serving. It polls: - RuView's own /api/v1/sensing/latest - classification, features, and the domain_state field (renders KNOWN/DEGRADED/UNKNOWN color-coded; when the field is absent it says "OOD gate: disabled", never fabricates a state) - A configurable RuCelium gateway's /api/rf-context - ingest stats, fused room_state_inferences, upstream identity - and /api/stats for biome counters (best-effort; that panel's absence doesn't break the page) Defaults the RuView URL field to window.location.origin rather than a hardcoded host - found empirically while testing: browsers treat `localhost` and `127.0.0.1` as different origins even though they resolve to the same machine, so a hardcoded default silently forced a needless cross-origin fetch whenever the page was opened via the other name. Every panel shows DISCONNECTED with the real fetch error rather than stale or fabricated data when a source is unreachable. Needs a small CORS addition on the RuCelium side (cross-origin, since that's a different port) - see the paired PR on ruvnet/RuCelium. Live-verified against both real running servers, RuView side running --source simulated throughout. What's actually being verified is the dashboard's rendering and data plumbing end to end, not any accuracy claim: RuView panel rendered live presence/motion/confidence/RSSI/ variance correctly, and RuCelium panel showed events ingested and fused inferences rendering with confidence bars. All figures involved are SYNTHETIC (simulated source, not hardware) - see the full numbers in the PR description rather than repeated here.
ruvnet
left a comment
There was a problem hiding this comment.
Evidence gate: REJECT on the current cross-repository contract. pollRuCelium() requires GET /api/rf-context, but the paired RuCelium PR #3 adds only CORS and does not register that route. The dashboard therefore cannot produce the claimed RuCelium fusion panel against either paired head. Please add a contract test that runs the exact RuCelium head and asserts the response schema consumed here (upstream, stats, room_state_inferences), or change this UI to an existing supported endpoint without inventing missing fields. Keep physical/RF accuracy explicitly outside this software-only gate.
|
Fixed the cross-repo contract gap flagged in review: this dashboard's What changed on the RuCelium side (ruvnet/RuCelium#3, updated head
Re-verified live: real single No changes needed on this PR's own code — |
Summary
RuView, RuField, and RuCelium each have real, tested pieces that got wired to each other recently (the rufield simulated-source fix, the ADR-302 OOD gate, RuCelium's RF ingest +
RuFieldFusionwiring) — but there was no single place to actually watch the whole chain. You'd need three separate tools (or three separatecurlcalls) to see RuView sensing, the OOD gate'sdomain_state, and RuCelium's fused room-state inferences at once.ui/pipeline.htmlis a static, no-build, no-dependency page (same convention asui/observatory.html,ui/viz.html, andrufield-viewer) served by RuView's own static file serving. It polls:/api/v1/sensing/latest— classification, features, and thedomain_statefield. RendersKNOWN/DEGRADED/UNKNOWNcolor-coded; when the field is absent it honestly says "OOD gate: disabled", never fabricates a state./api/rf-context— ingest stats, fusedroom_state_inferences, upstream identity — and/api/statsfor biome counters (best-effort; that panel's absence doesn't break the page).A real bug found while building it
Defaults the RuView URL field to
window.location.originrather than a hardcoded host. Found empirically while testing: browsers treatlocalhostand127.0.0.1as different origins even though they resolve to the same machine — a hardcoded default silently forced a needless cross-origin (CORS-blocked) fetch whenever the page happened to be opened via the other name. Every panel showsDISCONNECTEDwith the real fetch error rather than stale or fabricated data when a source is unreachable.Companion PR
Needs a small, documented CORS addition on the RuCelium side (cross-origin there, since it's a different port): ruvnet/RuCelium#3 (opening alongside this one).
Test plan
npx @ruvnet/ruview claim-checkon this PR body — PASS--source simulatedon the RuView side — everything below is synthetic-source, not a hardware accuracy claim; this verifies the dashboard's rendering/data plumbing, not accuracy):localhost/127.0.0.1origin mismatch reproduces the exact CORS error, and that thewindow.location.origindefault fixes it--calibration-certificateisn't set