Skip to content

Add ADR-199: Sky Monitor and SkyGraph Appliance (Phases 1–4)#549

Open
ruvnet wants to merge 8 commits into
mainfrom
claude/skygraph-appliance-adr-o7tjhv
Open

Add ADR-199: Sky Monitor and SkyGraph Appliance (Phases 1–4)#549
ruvnet wants to merge 8 commits into
mainfrom
claude/skygraph-appliance-adr-o7tjhv

Conversation

@ruvnet

@ruvnet ruvnet commented Jun 9, 2026

Copy link
Copy Markdown
Owner

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-core and ruvector-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 to

  • ADS-B Sources (src/adsb.rs):

    • Deterministic seeded synthetic scenario generator (corridor flights, arrivals/departures, GA overhead pass, anomalous low/slow night track)
    • dump1090 aircraft.json parser for real RTL-SDR data
  • Track 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 on ruvector_graph::GraphDB with 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 distance

  • Anomaly 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 2

  • RuVector Indexer (src/indexer.rs): Wraps ruvector_core::VectorDB for 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 timeline

  • Daily 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 brief

  • Configuration (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 dashboard

Browser Dashboard (examples/sky-monitor/ui/dashboard/)

  • HTML + Canvas (index.html, sky.js):

https://claude.ai/code/session_013Nh9Naw8gim75DGY9LBvK7

claude and others added 8 commits June 9, 2026 21:09
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants