Add ADR-199: Sky Monitor and SkyGraph Appliance (Phases 1–4)#549
Open
ruvnet wants to merge 8 commits into
Open
Add ADR-199: Sky Monitor and SkyGraph Appliance (Phases 1–4)#549ruvnet wants to merge 8 commits into
ruvnet wants to merge 8 commits into
Conversation
Architecture decision record for the RuView SkyGraph appliance: a local sky monitoring system that treats the sky as a continuously changing spatial graph. Covers ADS-B ingestion (dump1090 + OpenSky fallback), MSC GeoMet weather, observer-frame coordinate model, canonical observation schema, SkyGraph node/edge model, RuVector embedding and novelty usage, rule layer, composite anomaly scoring, privacy and security governance, storage tiers, phased build plan, and acceptance tests. Companion implementation lands in examples/sky-monitor/. https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
New workspace example crate implementing the RuView SkyGraph appliance pipeline on synthetic ADS-B data: - WGS-84 -> ECEF -> ENU observer-frame projection (az/el/range/bearing) - canonical observation schema (ADR-199 s11) with serde - deterministic synthetic ADS-B scenario + dump1090 JSON parser - track stitching with circular-stats summaries and overhead rule - SkyGraph on ruvector-graph GraphDB (s12 node/edge vocabulary, time-window queries, citeable explain()) - 32-dim track embeddings indexed in ruvector-core VectorDB with similarity search and calibrated novelty scoring - composite anomaly score per ADR-199 s15 with mandatory reasons - daily sky brief, end-to-end pipeline, demo binary - 27 tests (19 unit + 8 ADR acceptance), criterion benchmarks https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
… perf tuning Presentation plane for the ADR-199 SkyGraph appliance (dashboard-first decision) plus measured hot-path optimizations: - feature-gate sky-monitor: default 'appliance' feature carries ruvector-core/ruvector-graph; --no-default-features yields a wasm32-compatible subset (coords, observation, adsb, track, weather, embedding, anomaly, brief) - new sky-monitor-wasm crate (wasm-bindgen): SkyProjector with single and Float64Array batch projection, polar all-sky screen mapping, AnomalyScorer sharing the exact native scorer via new TrackSummary adapter, dump1090 JSON parser binding; 5 native unit tests - canvas dashboard (ui/dashboard): polar sky plot with elevation rings, fading trails, overhead highlights, band-colored anomaly badges, track table with reasons, replay scrubber; JS projection fallback with automatic wasm-pack pkg detection; demo data generated via new --emit-json flag on the demo binary - perf: observer_frame inlined to single sin_cos per angle; track_embedding single-pass accumulation; anomaly baseline reuse Validation: 27/27 sky-monitor tests, 5/5 sky-monitor-wasm tests, wasm32-unknown-unknown builds clean for both, clippy clean, node --check on dashboard JS. https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
…apping Criterion results (baseline vs tuned): observer-frame projection -12% single / -10% batch (p<0.05), single-pass embedding -4%; anomaly/pipeline deltas attributed to the TrackSummary adapter that gives native/WASM scorer parity. Includes 1 Hz real-time headroom analysis (~129 ns/projection, ~6k tracks/s anomaly scoring, full synthetic day in ~7 ms) and the mapping of all 8 acceptance tests to ADR-199 s31/s22 criteria. 32/32 tests green across both crates. https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
…unctional verification Disable wasm-opt in wasm-pack metadata so the dashboard pkg builds in air-gapped/appliance environments where the binaryen download is unavailable (size optimization only; documented in Cargo.toml). Verified the built module end-to-end in Node: projection geometry matches native coords (10 km north -> az 0.00, el 5.10, range 10029 m), zenith->center screen mapping, Float64Array batch projection, anomaly scorer parity through the shared TrackSummary path (night track 0.900 strong anomaly vs corridor 0.055 normal), and dump1090 JSON parsing. Recorded in BENCHMARKS.md. https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
Fixes the Rustfmt CI failure on PR #549; no functional changes (32/32 tests still pass, wasm32 release build clean). https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
…scoring, and SOTA pack - Dashboard rewritten realtime-only (synthetic-day replay removed): live ADS-B (airplanes.live/adsb.lol) + Open-Meteo, smoothed dead reckoning, ⚙ drawer - wasm: SatPropagator (SGP4 + pass prediction), embed_track/novelty (§13/§15), AnomalyScorer wired to live tracks with IndexedDB vector-novelty store - Sun/moon + naked-eye satellite visibility, behavior badges, CPA conflict alerts, adsbdb routes, NOAA SWPC Kp, WebGPU sat layer (fallback-safe), recorded-replay ring buffer - 13 wasm-crate tests, 10 node detector tests, Playwright-verified incl. offline Co-Authored-By: claude-flow <ruv@ruv.net>
…rediction Enumerate the precomputed per-step sun samples instead of indexing them with the loop counter; fixes the deny-warnings Clippy CI failure on PR #549. No behavior change (13/13 wasm crate tests pass, wasm32 release build clean). https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements ADR-199: a local sky-monitoring appliance that observes, projects, records, and explains activity above a fixed physical location. The appliance treats the sky as a continuously changing spatial graph, ingesting ADS-B aircraft tracking, weather overlays, and other sensor data into a unified intelligence substrate.
This is a complete reference implementation of Phases 1–4 (with deterministic synthetic ADS-B data) built on
ruvector-coreandruvector-graph, including a browser-based dashboard and acceptance test suite.Key Changes
Core Appliance (
examples/sky-monitor/)ADR-199 Architecture Document (
docs/adr/ADR-199-sky-monitor-skygraph-appliance.md): 639-line decision record covering context, goals, architecture, deployment, and governance (§1–31)Coordinate System (
src/coords.rs): WGS-84 → ECEF → ENU → azimuth/elevation/range/bearing projection with observer-relative spherical frame (ObserverFrame)Observation Schema (
src/observation.rs): Canonical normalized observation format (uuid, UTC time, entity type, location, observer frame, motion, confidence) that all sensors conform toADS-B Sources (
src/adsb.rs):dump1090aircraft.json parser for real RTL-SDR dataTrack Stitching (
src/track.rs): Gap-based track stitching (60-second gap threshold), summary statistics, overhead candidate detection (range < 10 km AND elevation > 5°)SkyGraph (
src/skygraph.rs): Graph-based sky model built onruvector_graph::GraphDBwith node types (Observer, Aircraft, Track, Observation, WeatherCell, TimeWindow, Anomaly) and edge vocabulary (part_of_track, observed_by, during, near, correlated_with, similar_to, anomalous_relative_to)Embeddings (
src/embedding.rs): Engineered 32-dimensional track embeddings (altitude, speed, heading, time-of-day, range, elevation, duration, vertical rate, azimuth buckets, signal, variability, overhead flag) normalized to[0, 1]for interpretable Euclidean distanceAnomaly Scoring (
src/anomaly.rs): Composite 6-component scoring (route deviation, altitude deviation, time-of-day rarity, signal unusualness, cross-sensor confirmation, novelty) with human-readable explanations per ADR governance rule 2RuVector Indexer (
src/indexer.rs): Wrapsruvector_core::VectorDBfor similarity search and novelty scoring (calibrated to distinguish corridor repeats from off-corridor anomalies)Weather (
src/weather.rs): Synthetic hourly weather windows (clear/cloudy/rain/thunderstorm/snow/fog) aligned to ADS-B timelineDaily Brief (
src/brief.rs): Human-readable summary (aircraft count, overhead candidates, unusual tracks, weather events, most unusual event with confidence)Pipeline Orchestration (
src/pipeline.rs): End-to-end Phase 1–4 runner: scenario → observations → tracks → baseline split → RuVector index → anomaly scores → SkyGraph → daily briefConfiguration (
src/config.rs): Observer and anomaly configuration (Oakville node defaults: 43.4675 N / −79.6877 E / 100 m; ADR §15 weights; 0.76 alert threshold)Demo Binary (
src/main.rs): Runs full pipeline and optionally exports JSON/JS for dashboardBrowser Dashboard (
examples/sky-monitor/ui/dashboard/)index.html,sky.js):https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7