feat(aether-arena): ADR-149 Spatial-Intelligence Benchmark — scorer + CI harness gate#874
Merged
Conversation
… CI harness gate (M1-M4)
AetherArena ("AA") — the official, project-agnostic Spatial-Intelligence Benchmark
(ADR-149, Accepted). Iteration 1 of the long-horizon build:
- ADR-149 accepted: name locked (ruvnet/aether-arena), v0 metrics locked
(pose/presence/latency/determinism), dataset legality resolved (MM-Fi CC BY-NC
only; Wi-Pose excluded). Adds four-part framing, threat model, arena_score
formula, submission state machine, neutrality/governance, and the §7 acceptance test.
- aa_score_runner: deterministic scorer bin reusing the real ruview_metrics pose
harness on a fixed seed=42 fixture → RuViewTier-style verdict + cross-platform
SHA-256 proof hash. Builds --no-default-features (no torch/GPU). VERDICT: PASS.
- CI harness gate: .github/workflows/aether-arena-harness.yml runs the scorer on
every PR — the "PR that runs the harness as part of the build" requirement.
- Scaffold: aether-arena/{README,VERIFY,STATUS}.md + schema/aa-submission.toml.
- Horizon record persisted (.claude-flow/horizons/aether-arena-aa.json).
Infra = the deliverable; model SOTA (MM-Fi PCK@20) is a separate effort blocked on
ADR-079 data collection, tracked as a stretch goal, not an infra exit.
Co-Authored-By: claude-flow <ruv@ruv.net>
…ility (M2/M5/M7) Per direction "remove the initial number, optimize for benchmark first" + "include witness chain capabilities for proof and repeatability analysis": - Empty board, no seeded numbers: ledger seeds to genesis only. Every result is a real scoring-pipeline witness; RuView gets no hand-entered baseline. - Real model scoring: aa_score_runner now loads predictions + an eval split (--split/--pred) and scores them through the real ruview_metrics pose harness — not just a synthetic fixture. Committed public smoke split (fixtures/smoke_*.json). - Witness chain: each score emits a witness = inputs_sha256 (binds it to the exact inputs) + proof_sha256 (cross-platform-stable score hash) + harness_version. - Repeatability analysis: --repeat N runs the harness N× and fails if it ever yields >=2 distinct proof hashes (16/16 identical locally). - Witness ledger: ledger/ledger_tools.py — append-only, hash-chained, tamper- evident (seed/append/verify); editing any past row breaks the chain. - CI gate extended: determinism + repeatability(16) + real-scoring smoke + ledger chain verify on every PR. Co-Authored-By: claude-flow <ruv@ruv.net>
…arena (M6) Public face of the benchmark: empty-board leaderboard from the witness ledger, chain-integrity display, submit/verify/about tabs. Presentation layer per ADR-149 §2.2 (heavy scoring stays in the pinned RuView harness / CI). Live: https://huggingface.co/spaces/ruvnet/aether-arena Co-Authored-By: claude-flow <ruv@ruv.net>
…gate passing (M8)
…ndation Encoder - Ledger witness row (seq 1, Gold): RuView CSI-Transformer 81.63% torso-PCK@20 on MM-Fi random_split, exceeding MultiFormer 72.25% (CSI2Pose 68.41%) — protocol- and metric-matched, self-corrected from inflated 91.86% bbox. Hash-chained, verifiable. - HF Space updated with the controlled SOTA claim + caveat (cross-subject is the frontier). - Proof/replay/witness gist: gist.github.com/ruvnet/af2fbc1c7674dddf09c15509b3c7f785 - Tracking issue #876 (result + Generalization Track roadmap). - ADR-150: RuView RF Foundation Encoder — pose-preserving, subject/room/device-invariant SSL embedding (masked CSI + pose-contrast-across-subjects + coherence head); the principled attack on the cross-subject frontier. DANN failed; this is the corrected design. Co-Authored-By: claude-flow <ruv@ruv.net>
…-env 17.5 CORAL) Append best witness rows to ledger (seq 2-4) + update HF Space leaderboard banner. In-domain 83.59% torso-PCK@20 (graph+ensemble+TTA) supersedes the 81.63 single-model entry, +11.34 over MultiFormer 72.25. Cross-subject 64.04% (official split). Cross-environment 17.51% (CORAL domain alignment, the cross-room DG win). Gist + issue #876 updated with frontier map. Co-Authored-By: claude-flow <ruv@ruv.net>
Published ruvnet/wifi-densepose-mmfi-pose — beats MultiFormer (72.25%) and CSI2Pose (68.41%) on matched MM-Fi random_split torso-PCK@20. Tracking: #880 Co-Authored-By: claude-flow <ruv@ruv.net>
Head-to-head on the wire-compatible HA API surface: - Cold start 0.55s vs 9.7s (18x), idle RSS 10.1MB vs 359MB (35x), binary 4.7MB vs 610MB image (130x), throughput 1599 vs 716 rps. - Honest caveats: latency endpoints differ (auth /api/states vs unauth /manifest.json); HA wins integration breadth + UI maturity. - Repro harnesses in aether-arena/staging/. Co-Authored-By: claude-flow <ruv@ruv.net>
…ngle-class 100%) v1 '100% presence accuracy' was on a single-class overnight recording (6062/6063 'present'). Replaced with v2 encoder's honest label-free held-out temporal-triplet accuracy (66.4% raw -> 82.3% trained). Models published to HF; tracking #882. Co-Authored-By: claude-flow <ruv@ruv.net>
…etrain refuted Measured all near-term levers on the official MM-Fi cross-subject split: - mixup+TTA+ensemble = best at 64.92% (+0.9 over doc 64.04) - pose-contrastive foundation pretrain: estimated +5..+12, MEASURED -2.3 (SupCon loss pinned at ln(B) across K/BS/seeds -> same-pose CSI is not contrastively alignable across subjects) - instance-norm+SpecAugment -4.6; CORAL/DANN ~0 Conclusion: the 18-pt in-domain<->cross-subject gap is fundamental subject shift, not algorithmic. Promotes multi-subject data collection to the primary lever; recommends re-scoping ADR-150 phase 1 around capture. Co-Authored-By: claude-flow <ruv@ruv.net>
Swept model size on MM-Fi random_split: every config from micro (75,237 params, 0.22ms, 74.30%) up beats MultiFormer (72.25%); nano (40K, 0.13ms) within 0.5pt. Pareto-dominant (smaller AND more accurate than prior SOTA). Orthogonal to the data-bound accuracy frontier (ADR-150). Co-Authored-By: claude-flow <ruv@ruv.net>
micro (74.87%, beats MultiFormer 72.25%) = 36.7KB int4 / 73.5KB int8; nano (~72%) = 19.5KB int4. Distillation tested, no gain (direct training wins). A SOTA-beating pose model fits on the sensing node itself. Co-Authored-By: claude-flow <ruv@ruv.net>
int8 PTQ lossless (74.70%, 73.5KB); int4 naive PTQ drops below SOTA (70.21%) but QAT recovers to 74.46% (36.7KB) - still beats MultiFormer. A SOTA-beating WiFi-pose model genuinely runs in ~37KB int4 (QAT) / 73KB int8. Distillation negative noted. Co-Authored-By: claude-flow <ruv@ruv.net>
Published deployable int4-QAT micro (verified 74.08%, ~20KB) at ruvnet/wifi-densepose-mmfi-pose/edge. Runs 0.135ms single-thread x86 CPU (no GPU) - real-time pose without an accelerator. ARM on-device validation pending fleet availability. Co-Authored-By: claude-flow <ruv@ruv.net>
Measured cross-subject PCK vs N training subjects: 4->8 = +21pts, but 24->32 = +0.45pt. Saturates ~64%, ~19pt below in-domain. Correction to 'more data': subject-count returns vanish past ~16-20; the residual is device/room/protocol shift. Re-scope phase-1 capture around DIVERSITY (rooms/devices/protocols) + few-shot target adaptation, not headcount. Co-Authored-By: claude-flow <ruv@ruv.net>
Decisive result: 50 labeled frames/subject of in-room calibration -> 72.2% (reaches SOTA), 200 -> 76.1%, 1000 -> 78.3%. Few-shot target adaptation dominates source volume (+24 subjects bought +6pt; 200 target frames bought +12.4pt). Re-scopes the deployment story: ship a ~30s on-site calibration, not a mass corpus. Foundation encoder's role shifts to making that calibration cheaper. Supersedes the earlier data-bound pessimism. Co-Authored-By: claude-flow <ruv@ruv.net>
…on service Compared per-room calibration methods at K=200: LoRA rank-8 recovers 63.6->72.5% (SOTA-level) with just 11K params (~11KB), 0.5% the model size. Validates the ship-base-once + tiny-per-room-adapter mechanism for the RuView calibration service. Accuracy/size knob documented. Co-Authored-By: claude-flow <ruv@ruv.net>
…ion spec 11KB adapter needs ~100-200 labeled samples/room for ~72% (knee ~50->70%); below ~20 it hurts. Evidence-complete calibration-service spec: base + ~100-200 samples -> 11KB LoRA -> ~72% cross-subject. Encoder goal now precisely posed: cut the sample requirement / lift the per-budget ceiling. Co-Authored-By: claude-flow <ruv@ruv.net>
Decisive capstone: cross-environment (unseen room+people) zero-shot 10.6%, but 5 calibration samples/person -> 60%, 200 -> 73%. The hard frontier is calibration-soluble, MORE dramatically than cross-subject (+62.5 vs +12 at K=200). The unsolved-frontier framing was a zero-shot artifact. Reframes generalization: ship few-shot calibration, not zero-shot invariance. Recommend accepting ADR-150 re-scoped around the calibration mechanism. Co-Authored-By: claude-flow <ruv@ruv.net>
Operationalizes the campaign's central finding (ADR-150 §3.3-3.6): a frozen shared base + a ~11KB per-room LoRA adapter from ~100-200 labeled samples recovers SOTA-level pose in any new room/person. Verified end-to-end: source-only base zero-shot 3.09% on unseen room -> 74.29% after 200-sample calibration. Files: model.py (PoseNet+LoRA), calibrate.py, infer.py, README with measured calibration budget. Co-Authored-By: claude-flow <ruv@ruv.net>
…ce path Ports the calibration mechanism (ADR-150 §3.5-3.6, reference impl in aether-arena/calibration/) into the real product pose engine. The Candle InferenceEngine now loads an optional per-room adapter safetensors and applies low-rank deltas (y + (x.A).B) on the fc1/fc2 head at inference. Architecture-agnostic LoRA; base behaviour unchanged when no adapter. New API: with_weights_and_adapter(), is_calibrated(). Tested: adapter detection + output-change integration test (6/6 pass). Co-Authored-By: claude-flow <ruv@ruv.net>
Completes the end-to-end product path: cog-pose-estimation run --config <cfg> --adapter <room.safetensors> loads the shared base + a per-room LoRA adapter for calibrated inference. Adds InferenceEngine::with_adapter() (default weights + adapter) and logs when a calibration adapter is active. 6/6 tests pass. Co-Authored-By: claude-flow <ruv@ruv.net>
…service Document the beyond-SOTA efficiency frontier (75K params beats SOTA, int4 edge model 20KB@74%), few-shot calibration resolving generalization (cross-env 10->73%), and the calibration service (Python ref + Rust cog-pose --adapter integration). Co-Authored-By: claude-flow <ruv@ruv.net>
Verified on a 2nd MM-Fi task: 27-class action recognition (which MM-Fi never benchmarked for WiFi; only published baseline WiDistill 34%). In-domain 88% (leaky); cross-subject zero-shot collapses to ~10%; few-shot calibration rescues 10->76% (1000 samples). Same mechanism as pose -> few-shot in-room calibration is the universal WiFi-sensing generalization answer, not a pose quirk. Co-Authored-By: claude-flow <ruv@ruv.net>
…egative) Tested the cross-dataset frontier: MM-Fi-trained CSI representation does NOT transfer beneficially to NTU-Fi HAR (frozen probe 91.5% = random features 93%; full fine-tune 75% < probe). CSI reps are distribution-locked, same root cause as within-MM-Fi cross-subject/-env collapse. Caveat: NTU-Fi 6 coarse activities are an easy target (random->93%). Updates the study's cross-dataset limitation from 'untested' to this measured result. Co-Authored-By: claude-flow <ruv@ruv.net>
Re-ran transfer on 14-class person-ID (harder than 6-activity HAR): same null-transfer result (MM-Fi pretrain 91.7% = random 92.8%). Unified root cause: CSI in-domain classification lives in the target-trained readout (random projection already separable); learned reps don't transfer across subjects/rooms/datasets. WiFi-CSI is distribution-locked. Addresses the 'HAR too easy' caveat. Co-Authored-By: claude-flow <ruv@ruv.net>
Random frozen encoder + trained head matches a fully-trained encoder to within 2-4pts (cross-subject <2pts). WiFi-CSI sensing is largely a random-features + target-readout problem: barely a learned representation to transfer, which unifies the zero-shot collapse, no-transfer results, foundation-encoder failure, and why per-room calibration works. Practical: invest in readout + calibration, not encoder pretraining. Co-Authored-By: claude-flow <ruv@ruv.net>
bridge.rs imported tokio::net::UnixStream unconditionally, so the whole workspace failed to build on Windows (E0432) — blocking cargo test --workspace and the pre-merge gate there. The OccWorld Unix-socket bridge is a Linux-appliance feature (Python inference server on the GPU host), so gate it #[cfg(unix)] and add a #[cfg(not(unix))] send_recv that fails fast with a clear 'unsupported on this target' Protocol error. Workspace now builds on Windows; worldmodel 12 tests pass. Co-Authored-By: claude-flow <ruv@ruv.net>
readme_quickstart_uses_canonical_public_api checked a multi-line needle 'pipeline\n .process' against the include_str! README. On a CRLF checkout (Windows / core.autocrlf) the content is 'pipeline\r\n .process', so the LF needle never matched and the test failed deterministically (only surfaced once the worldmodel fix let cargo test --workspace run on Windows; the test is #[cfg(feature=std)]-gated, enabled via workspace feature unification). Normalize CRLF->LF before the check. Full workspace now green 3/3 runs on Windows. Co-Authored-By: claude-flow <ruv@ruv.net>
The committed calibration service (model.py/calibrate.py/infer.py) had no automated test — only ad-hoc verification. Adds a CPU-only, no-real-checkpoint test that exercises the CLI end-to-end on synthetic data: build base -> calibrate.py fits adapter -> infer.py runs base+adapter, asserting adapter size (<200KB), keypoint shape [N,17,2], finiteness, [0,1] range, and that the adapter actually changes the output. Passes on Windows CPU (torch 2.11). Co-Authored-By: claude-flow <ruv@ruv.net>
The --adapter docs claimed the adapter is produced by aether-arena/calibration/calibrate.py, but that reference tool targets the MM-Fi *transformer* model and emits .npz with proj/head LoRA keys, while this cog runs a *conv+MLP* model expecting safetensors with fc1.a/fc1.b/ fc2.a/fc2.b. Same LoRA mechanism, different model -> adapters are model-specific and NOT interchangeable. Clarify the expected key layout and that the Python tool is a mechanism reference, not a drop-in producer. 6/6 tests pass. Co-Authored-By: claude-flow <ruv@ruv.net>
… feature I'd shipped the Rust cog-pose --adapter *consumer* (+test) but there was no *producer* for cog-format adapters, leaving it a half-feature. cog_calibrate.py fits a rank-r LoRA on the cog conv+MLP head (pose_v1.safetensors, 56x20) from a labeled in-room capture and writes a safetensors with fc1.a/fc1.b/fc2.a/fc2.b (scale baked into b) — exactly what the Rust engine loads. Verified against the in-repo pose_v1.safetensors: correct keys/shapes, reduces fit error, active adapter, ~2.6KB. Adds test_cog_calibration.py (passes) + README documenting the two non-interchangeable producers (transformer .npz vs cog safetensors). Co-Authored-By: claude-flow <ruv@ruv.net>
…> Rust engine) Closes the last verification gap in the calibration feature: previously the Python producer and Rust consumer were proven compatible only by format matching. Now a real ~11KB adapter fitted by cog_calibrate.py on the in-repo pose_v1.safetensors is committed as a fixture, and a Rust test loads it via the engine and asserts is_calibrated() + that it changes inference output. The full Python->Rust calibration contract is verified with a real artifact. 7/7 cog-pose tests pass. Co-Authored-By: claude-flow <ruv@ruv.net>
…ixes Update the Unreleased entry: calibration service is now complete across both model paths (transformer .npz + cog safetensors via cog_calibrate.py) with cross-language Python->Rust integration test; add the Windows cross-platform build fixes (worldmodel cfg(unix), bfld CRLF) — 2682 workspace tests green/0 fail on Windows. Co-Authored-By: claude-flow <ruv@ruv.net>
…CIR tests
The CIR estimator's dominant_tap_ratio measured a single grid bin, but on the
3x super-resolved ISTA grid a single physical tap leaks across ~3 adjacent
bins — so the ratio under-counted the dominant tap and sat far below the
per-tier floors (HT20 0.158<0.30, HT40 0.133<0.35, HE20 0.102<0.40), forcing
the 3-tap recovery + 40MHz-ToF tests to be #[ignore]d.
Fix (data-backed via a lambda sweep): (1) compute dominant_tap_ratio over a
+/-1-bin window around the peak — the physical tap's true footprint; (2) tune
L1 lambda for sparse multipath (HT20 .05->.08, HT40 .03->.08, HE20 .03->.18).
Result: ratios 0.367/0.406/0.474, comfortably above floors with all 3 taps
preserved. Un-ignores should_recover_3tap_channel_{ht20,ht40,he20} and
should_return_tof_at_40mhz. signal crate: 470 pass / 0 fail; change isolated
to CIR (no external consumers). The rms-delay-spread test stays ignored with a
re-scoped note (far-tap robustness is separate remaining work).
Co-Authored-By: claude-flow <ruv@ruv.net>
…d failure Diagnosed the one still-ignored CIR test: ISTA emits a spurious ~15-20%-of- dominant tap at an implausible far delay (~bin 150 / ~3us) that inflates rms_delay_spread to ~390ns (vs ~53ns true). It sits too close to the real weakest tap (~30% of dominant) for a safe magnitude cutoff, so the proper fix is ISTA recovery-quality work (grid de-aliasing / far-tap suppression), not a band-aid threshold. Sharpened the #[ignore] note accordingly. signal+cir: 470 pass / 0 fail. Co-Authored-By: claude-flow <ruv@ruv.net>
…34 P2 cir test Found the principled fix for the rms-delay-spread inflation (superseding my prior 'needs ISTA work' note): the spurious ~15-20% tap at ~bin 150 is an ALIAS of the near-zero dominant tap — the ISTA delay grid is circular (Φ is DFT-like), so bins >= G/2 are non-causal negative delays. Computing the delay spread over only the causal half [0, G/2) drops rms from 389ns to 65ns (true value), cleanly and robustly (no fragile magnitude threshold). Un-ignores should_produce_positive_rms_delay_spread. ADR-134 P2 cir_synthetic now FULLY resolved: all 5 previously-ignored tests pass via two physics-justified fixes (windowed dominant-ratio for super- resolution leakage + causal-window rms for circular-grid aliasing). signal+cir: 471 pass / 0 fail / 0 ignored in cir_synthetic. Co-Authored-By: claude-flow <ruv@ruv.net>
…fully resolved The cir_pipeline end-to-end test was gated on the same dominant_tap_ratio floor; the windowed-ratio fix resolves it. All 6 ADR-134 P2 CIR tests (cir_synthetic 5 + cir_pipeline 1) now pass. signal+cir: 472 pass / 0 fail. Co-Authored-By: claude-flow <ruv@ruv.net>
#872 reported '--mqtt: unexpected argument' on the Docker image; prior attempts chased a Docker *rebuild*, but the real cause was disconnected *code*: the --mqtt* flags lived only in cli::Args (dead code — referenced nowhere), while the binary parses a separate main::Args with no mqtt fields, and main.rs never declared/started the mqtt:: publisher. So MQTT was fully unwired: flags didn't parse, and the publisher never ran. Fix: - Extract the mqtt + privacy flags into a shared (#[derive(clap::Args)]); retarget mqtt::config::{from_args,build_tls} to it. - #[command(flatten)] MqttArgs into the binary's main::Args (using the *lib* crate's type so it matches from_args), so --mqtt* now parse. - Spawn the publisher on --mqtt: build MqttConfig, validate, and bridge the existing JSON sensing broadcast into the typed VitalsSnapshot stream the publisher consumes (defensive serde_json::Value mapping — absent fields default, never wrong values). #[cfg(feature=mqtt)]-gated; without the feature --mqtt WARNs and no-ops (documented contract). Fix the mqtt_publisher example for the new signature. Verified end-to-end against local mosquitto: publisher connects and emits 20 HA auto-discovery entities + live state (presence ON, person_count, …). Tests: 577 pass default / 580 pass --features mqtt / 0 fail; both configs build. Co-Authored-By: claude-flow <ruv@ruv.net>
Co-Authored-By: claude-flow <ruv@ruv.net>
Person count was pinned to 1 because the aggregate was derived from `smoothed_person_score`, an EMA-smoothed *activity* score (amplitude variance / motion / spectral energy) that saturates near a single occupant and cannot discriminate count. The count-aware per-node estimates the ESP32 paths already compute (firmware n_persons, mincut corr_persons) were stored in NodeState::prev_person_count then discarded by the aggregator — the same dead-wiring class as #872. Add `aggregate_person_count(activity_count, node_states)` = max(activity, node_max) and use it at both ESP32 aggregation sites (edge-vitals + CSI loop, Some + fallback arms). It can only raise the count when a node positively reports more occupants, so the lone-occupant case is provably never inflated (regression-guarded). 5 new unit tests + full suite: 582 passed, 0 failed. Co-Authored-By: claude-flow <ruv@ruv.net>
The pure-CSI per-node path clamped its own occupancy estimate before the aggregator could read it. estimate_persons_from_correlation (DynamicMinCut) returns 0-3, but it was mapped to a score via `corr_persons / 3.0`, putting 2 people at 0.667 — just under the 0.70 up-threshold of score_to_person_count — so the per-node count never climbed past 1, leaving node_max stuck at 1 for CSI-only nodes even when the min-cut cleanly separated two people. Replace the lossy /3.0 mapping with a threshold-aligned corr_persons_to_score (1->0.40, 2->0.74, 3->0.96) whose steady state round-trips back to the same count through the EMA + hysteresis bands, while still gating transient noise. A convergence test replays the exact CSI-loop EMA and asserts min-cut=2 now reports 2 / 3 reports 3 / 1 reports 1, plus a regression test documenting that the old /3.0 mapping pinned two people to 1. Full suite: 586 passed, 0 failed. Co-Authored-By: claude-flow <ruv@ruv.net>
- README: replace retracted "100% presence" claim with honest 82.3% held-out temporal-triplet; correct stale "pose model not in this release" (now live at ruvnet/wifi-densepose-mmfi-pose, 82.69% torso-PCK@20 SOTA); add a Results & proof table (HF models, AetherArena, benchmark study, deterministic verify.py proof, witness). - user-guide: same 100%->82.3% correction in two places; add Results & proof pointers and the SOTA pose model + AetherArena links. - docs/proof-of-capabilities.md (new): evidence-first rebuttal to the "fake / misleading" claims. Concedes what was fair (over-stated early metrics, AI-doc tone), refutes the category errors (simulate-mode mistaken for fraud; missing weights mistaken for missing pipeline), and gives copy-paste "prove it yourself" steps (verify.py VERDICT: PASS + published SHA-256, cargo test, HF model pull, ESP32 CSI). Emphasizes built-in-public history (git, 96 ADRs, CHANGELOG, issues incl. #803/#872 bug->fix arcs) as the anti-facade evidence. - aether-arena/VERIFY.md: cross-link the whole-platform proof doc. Verified: python archive/v1/data/proof/verify.py -> VERDICT: PASS (hash ca58956c...9199 matches published expected_features.sha256). Co-Authored-By: claude-flow <ruv@ruv.net>
The MM-Fi benchmark environment archives (E01-E04.zip) are large data files fetched separately for evaluation — they must never be committed. Also keeps the existing aether-arena/staging/ private-staging exclusion. Co-Authored-By: claude-flow <ruv@ruv.net>
…rena # Conflicts: # CHANGELOG.md
CI `clippy (-D warnings, --no-deps)` failed on patterns.rs:131 — `row % 2 == 0` is flagged by clippy::manual_is_multiple_of. Use `row.is_multiple_of(2)` (identical even-row check). Both CI clippy variants (--no-default-features and --features full,train) now pass. Co-Authored-By: claude-flow <ruv@ruv.net>
CI `cargo test --no-default-features (baseline regression)` failed with `error: associated function compute is never used` under -D warnings. compute() is only reachable via PrivacyModeRegistry (#[cfg(feature = "std")]); without std there is no caller. Gate the impl to match its only callers. Verified clean under --no-default-features, default, and --features mqtt with RUSTFLAGS=-D warnings. Co-Authored-By: claude-flow <ruv@ruv.net>
The clippy job failed with "cargo-clippy is not installed for the toolchain '1.89'". v2/rust-toolchain.toml pins channel "1.89" (profile "minimal", no clippy); dtolnay@stable installed clippy on the floating "stable" toolchain, but the override makes cargo use the separate "1.89" toolchain in working-directory v2. Pin the toolchain input to "1.89" so clippy lands on the toolchain cargo actually runs. (The real clippy lint it then catches — manual_is_multiple_of — was fixed in 29e698a.) Co-Authored-By: claude-flow <ruv@ruv.net>
Rust Workspace Tests failed the CIR determinism guard: expected 120bd7b1… (from the original ADR-134, #837) vs actual 304d5469…. The later CIR fixes on this branch (windowed dominant-tap ratio, λ tuning, causal-delay-window rms — ADR-134 P2) intentionally changed the CirEstimator output but never regenerated the witness hash. The new output is bit-deterministic and cross-platform stable: the Rust cir_proof_runner produces 304d5469… on both Linux CI and local Windows. Regenerated via the sanctioned `--generate-hash` path; verify-cir-proof.sh now prints "VERDICT: PASS (CIR hash matches)". Co-Authored-By: claude-flow <ruv@ruv.net>
github-actions Bot
pushed a commit
to zhangjian94cn/RuView
that referenced
this pull request
Jun 2, 2026
…9-aether-arena feat(aether-arena): ADR-149 Spatial-Intelligence Benchmark — scorer + CI harness gate f850d46
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.
Implements ADR-149 (Accepted) — AetherArena ("AA"), the official, project-agnostic Spatial-Intelligence Benchmark. Iteration 1 of the long-horizon build (
.claude-flow/horizons/aether-arena-aa.json).What's here (M1–M4)
ruvnet/aether-arena), v0 metrics locked (pose/presence/latency/determinism), dataset legality resolved (MM-Fi CC BY-NC only; Wi-Pose excluded). Includes four-part framing, threat model,arena_scoreformula, submission state machine, neutrality/governance, §7 acceptance test.aa_score_runner— deterministic scorer bin reusing the realruview_metricspose harness on a fixed seed=42 fixture → RuViewTier verdict + cross-platform SHA-256 proof hash. Pure Rust,--no-default-features(no torch/GPU). Locally VERDICT: PASS..github/workflows/aether-arena-harness.ymlruns the scorer on every PR (the "a PR that runs the harness as part of the build" requirement). This PR triggers it.aether-arena/{README,VERIFY,STATUS}.md+schema/aa-submission.toml.Verify locally (the open scorer)
Scope honesty
Infrastructure is the deliverable. Model SOTA (MM-Fi PCK@20 ~72%) is a separate ML effort blocked on ADR-079 camera-ground-truth collection — tracked as a stretch goal, not an infra exit.
Remaining (tracked in STATUS.md)
ruvnet/aether-arenaSpace (noHF_TOKENin env)🤖 Generated with claude-flow