mirror of
https://github.com/ruvnet/RuView
synced 2026-06-16 11:23:19 +00:00
Compare commits
base: frank/ruvnet--RuView:v1201
frank/ruvnet--RuView:main
frank/ruvnet--RuView:chore/update-submodules-20260616-080731
frank/ruvnet--RuView:chore/update-submodules-20260616-011336
frank/ruvnet--RuView:docs/adr-180-through-wall
frank/ruvnet--RuView:chore/update-submodules-20260615-192532
frank/ruvnet--RuView:fix/issue-1049-configurable-guard
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep
frank/ruvnet--RuView:gh-pages
frank/ruvnet--RuView:homecore-ui-review-fixed
frank/ruvnet--RuView:chore/update-submodules-20260615-141606
frank/ruvnet--RuView:chore/update-submodules-20260615-081339
frank/ruvnet--RuView:chore/update-submodules-20260615-011044
frank/ruvnet--RuView:chore/update-submodules-20260614-183700
frank/ruvnet--RuView:feat/rufield-viewer-live
frank/ruvnet--RuView:dependabot/github_actions/actions/checkout-6
frank/ruvnet--RuView:dependabot/github_actions/docker/setup-buildx-action-4
frank/ruvnet--RuView:docs/adr-262-rufield-integration
frank/ruvnet--RuView:feat/rufield-csi-adapter
frank/ruvnet--RuView:feat/rufield-viewer-submodule
frank/ruvnet--RuView:chore/update-submodules-20260614-124739
frank/ruvnet--RuView:chore/update-submodules-20260614-074427
frank/ruvnet--RuView:feat/adr-260-rufield-submodule
frank/ruvnet--RuView:fix/vitals-998-996
frank/ruvnet--RuView:chore/update-submodules-20260614-010751
frank/ruvnet--RuView:chore/update-submodules-20260613-183623
frank/ruvnet--RuView:fix/issues-1031-894-fusion-guard-model-load
frank/ruvnet--RuView:chore/update-submodules-20260613-124456
frank/ruvnet--RuView:chore/update-submodules-20260613-072722
frank/ruvnet--RuView:feat/edge-skills-synthetic-validation
frank/ruvnet--RuView:docs/adr-gap-remediation-1
frank/ruvnet--RuView:docs/adr-164-gap-analysis
frank/ruvnet--RuView:chore/update-submodules-20260613-010634
frank/ruvnet--RuView:release/patch-1009-1004
frank/ruvnet--RuView:fix/issues-1009-1004-real-csi-ingest
frank/ruvnet--RuView:chore/update-submodules-20260612-184732
frank/ruvnet--RuView:chore/update-submodules-20260612-131939
frank/ruvnet--RuView:feat/v2-zero-warnings-hygiene
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m9
frank/ruvnet--RuView:chore/update-submodules-20260612-074708
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m8
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m7
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m5
frank/ruvnet--RuView:chore/update-submodules-20260612-010814
frank/ruvnet--RuView:chore/ruv-neural-submodule
frank/ruvnet--RuView:feat/adr-152-wiflow-std-benchmark
frank/ruvnet--RuView:feat/beyond-sota-public
frank/ruvnet--RuView:claude/ruview-beyond-sota-xgv8aq
frank/ruvnet--RuView:chore/update-submodules-20260611-190648
frank/ruvnet--RuView:fix/issue-1005-c6-idf55-guard
frank/ruvnet--RuView:chore/update-submodules-20260611-132944
frank/ruvnet--RuView:chore/update-submodules-20260611-075115
frank/ruvnet--RuView:chore/update-submodules-20260611-010509
frank/ruvnet--RuView:feat/adr-151-calibration-api
frank/ruvnet--RuView:chore/update-submodules-20260610-190039
frank/ruvnet--RuView:chore/update-submodules-20260610-132034
frank/ruvnet--RuView:chore/update-submodules-20260610-073858
frank/ruvnet--RuView:chore/update-submodules-20260610-010503
frank/ruvnet--RuView:chore/update-submodules-20260609-185148
frank/ruvnet--RuView:chore/update-submodules-20260609-130851
frank/ruvnet--RuView:chore/update-submodules-20260609-072351
frank/ruvnet--RuView:chore/update-submodules-20260609-005822
frank/ruvnet--RuView:chore/update-submodules-20260608-185900
frank/ruvnet--RuView:chore/update-submodules-20260608-133647
frank/ruvnet--RuView:chore/update-submodules-20260608-075419
frank/ruvnet--RuView:chore/update-submodules-20260608-010619
frank/ruvnet--RuView:chore/update-submodules-20260607-183423
frank/ruvnet--RuView:chore/update-submodules-20260607-124051
frank/ruvnet--RuView:chore/update-submodules-20260607-073226
frank/ruvnet--RuView:chore/update-submodules-20260607-010544
frank/ruvnet--RuView:chore/update-submodules-20260606-183349
frank/ruvnet--RuView:chore/update-submodules-20260606-123547
frank/ruvnet--RuView:chore/update-submodules-20260606-071223
frank/ruvnet--RuView:chore/update-submodules-20260606-005931
frank/ruvnet--RuView:chore/update-submodules-20260605-184617
frank/ruvnet--RuView:chore/update-submodules-20260605-131132
frank/ruvnet--RuView:chore/update-submodules-20260605-073901
frank/ruvnet--RuView:chore/update-submodules-20260605-010335
frank/ruvnet--RuView:chore/update-submodules-20260604-185639
frank/ruvnet--RuView:chore/update-submodules-20260604-131551
frank/ruvnet--RuView:chore/update-submodules-20260604-074713
frank/ruvnet--RuView:chore/update-submodules-20260604-011200
frank/ruvnet--RuView:chore/update-submodules-20260603-192756
frank/ruvnet--RuView:chore/update-submodules-20260603-134837
frank/ruvnet--RuView:chore/update-submodules-20260603-075218
frank/ruvnet--RuView:chore/update-submodules-20260603-011158
frank/ruvnet--RuView:chore/update-submodules-20260602-192256
frank/ruvnet--RuView:dependabot/github_actions/actions/upload-artifact-7
frank/ruvnet--RuView:fix/ci-v1-api-perms-locust
frank/ruvnet--RuView:chore/update-submodules-20260602-132705
frank/ruvnet--RuView:fix/ci-v1-api-mock-mode
frank/ruvnet--RuView:fix/v1-pose-service-densepose-config
frank/ruvnet--RuView:fix/893-release-bins-refresh
frank/ruvnet--RuView:fix/894-occupancy-cap
frank/ruvnet--RuView:fix/898-mqtt-per-node-devices
frank/ruvnet--RuView:fix/893-csi-data-frame-capture
frank/ruvnet--RuView:chore/update-submodules-20260602-074832
frank/ruvnet--RuView:chore/update-submodules-20260602-010542
frank/ruvnet--RuView:chore/update-submodules-20260601-194356
frank/ruvnet--RuView:chore/update-submodules-20260601-141135
frank/ruvnet--RuView:chore/update-submodules-20260601-075806
frank/ruvnet--RuView:chore/update-submodules-20260601-010631
frank/ruvnet--RuView:chore/update-submodules-20260531-183125
frank/ruvnet--RuView:fix/proof-determinism-numpy-lock
frank/ruvnet--RuView:feat/adr-149-aether-arena
frank/ruvnet--RuView:chore/update-submodules-20260531-123739
frank/ruvnet--RuView:chore/update-submodules-20260531-072644
frank/ruvnet--RuView:chore/update-submodules-20260531-010327
frank/ruvnet--RuView:chore/update-submodules-20260530-182953
frank/ruvnet--RuView:fix/864-866-docker-auth-csi-yield
frank/ruvnet--RuView:chore/update-submodules-20260530-123315
frank/ruvnet--RuView:chore/update-submodules-20260530-070842
frank/ruvnet--RuView:chore/update-submodules-20260530-005806
frank/ruvnet--RuView:feat/adr-135-nvidia-cosmos-integration
frank/ruvnet--RuView:chore/update-submodules-20260529-185909
frank/ruvnet--RuView:feat/adr-136-146-streaming-engine
frank/ruvnet--RuView:chore/update-submodules-20260529-131551
frank/ruvnet--RuView:chore/update-submodules-20260529-072959
frank/ruvnet--RuView:feat/adr-135-empty-room-calibration
frank/ruvnet--RuView:chore/update-submodules-20260529-010249
frank/ruvnet--RuView:chore/update-submodules-20260528-185929
frank/ruvnet--RuView:chore/update-submodules-20260528-132435
frank/ruvnet--RuView:chore/update-submodules-20260528-073055
frank/ruvnet--RuView:chore/update-submodules-20260528-005436
frank/ruvnet--RuView:chore/update-submodules-20260527-185436
frank/ruvnet--RuView:chore/update-submodules-20260527-132146
frank/ruvnet--RuView:chore/update-submodules-20260527-073558
frank/ruvnet--RuView:chore/update-submodules-20260527-010007
frank/ruvnet--RuView:dependabot/pip/pytest-mock-gte-3.15.1
frank/ruvnet--RuView:dependabot/pip/bandit-gte-1.8.6
frank/ruvnet--RuView:dependabot/pip/pytest-cov-gte-7.1.0
frank/ruvnet--RuView:dependabot/pip/mypy-gte-1.19.1
frank/ruvnet--RuView:dependabot/pip/psycopg2-binary-gte-2.9.12
frank/ruvnet--RuView:dependabot/pip/safety-gte-3.8.0
frank/ruvnet--RuView:dependabot/pip/myst-parser-gte-3.0.1
frank/ruvnet--RuView:dependabot/pip/responses-gte-0.26.1
frank/ruvnet--RuView:dependabot/pip/pytest-bdd-gte-8.1.0
frank/ruvnet--RuView:dependabot/pip/structlog-gte-25.5.0
frank/ruvnet--RuView:chore/update-submodules-20260526-185505
frank/ruvnet--RuView:chore/update-submodules-20260526-131009
frank/ruvnet--RuView:chore/update-submodules-20260526-072215
frank/ruvnet--RuView:chore/update-submodules-20260526-005740
frank/ruvnet--RuView:chore/update-submodules-20260525-184024
frank/ruvnet--RuView:chore/update-submodules-20260525-131836
frank/ruvnet--RuView:chore/update-submodules-20260525-074445
frank/ruvnet--RuView:chore/update-submodules-20260525-010041
frank/ruvnet--RuView:chore/update-submodules-20260524-182842
frank/ruvnet--RuView:feat/adr-117-pip-modernization
frank/ruvnet--RuView:chore/update-submodules-20260524-123106
frank/ruvnet--RuView:chore/update-submodules-20260524-071413
frank/ruvnet--RuView:chore/update-submodules-20260524-005928
frank/ruvnet--RuView:feat/adr-115-ha-mqtt-matter
frank/ruvnet--RuView:adr-110-esp32c6
frank/ruvnet--RuView:fix/issue-760-sensing-ui-bugs
frank/ruvnet--RuView:chore/update-submodules-20260523-122815
frank/ruvnet--RuView:chore/update-submodules-20260523-070317
frank/ruvnet--RuView:chore/update-submodules-20260523-005630
frank/ruvnet--RuView:chore/update-submodules-20260522-184308
frank/ruvnet--RuView:chore/update-submodules-20260522-135706
frank/ruvnet--RuView:chore/update-submodules-20260522-125008
frank/ruvnet--RuView:research/sota-r10-foliage-wildlife
frank/ruvnet--RuView:feat/ruview-mcp-m3
frank/ruvnet--RuView:research/sota-r9-rssi-fingerprint
frank/ruvnet--RuView:chore/update-submodules-20260522-005846
frank/ruvnet--RuView:chore/update-submodules-20260521-184447
frank/ruvnet--RuView:chore/update-submodules-20260521-131745
frank/ruvnet--RuView:chore/update-submodules-20260521-072647
frank/ruvnet--RuView:fix/ci-regressions-679-guard
frank/ruvnet--RuView:chore/update-submodules-20260521-010021
frank/ruvnet--RuView:chore/update-submodules-20260520-185458
frank/ruvnet--RuView:fix/679-release-bins-node-id
frank/ruvnet--RuView:chore/update-submodules-20260520-130231
frank/ruvnet--RuView:chore/update-submodules-20260520-072312
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-worklets-0.8.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-gesture-handler-2.31.2
frank/ruvnet--RuView:dependabot/github_actions/bridgecrewio/checkov-action-12.3102.0
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-navigation/bottom-tabs-7.16.1
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/victory-native-41.20.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-navigation/native-7.2.4
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/vitejs/plugin-react-6.0.2
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/jest-expo-55.0.18
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/babel-preset-expo-55.0.22
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/tauri-apps/api-2.11.0
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-screens-4.25.1
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/vite-8.0.13
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-async-storage/async-storage-3.0.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/tauri-apps/plugin-dialog-2.7.1
frank/ruvnet--RuView:dependabot/github_actions/actions/github-script-9
frank/ruvnet--RuView:chore/update-submodules-20260520-010037
frank/ruvnet--RuView:chore/update-submodules-20260519-184424
frank/ruvnet--RuView:docs/hf-model-truth-up
frank/ruvnet--RuView:integrate/pr-491-adaptive-person-count
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/typescript-6.0.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/multi-0193e73c84
frank/ruvnet--RuView:dependabot/cargo/v2/dirs-6.0.0
frank/ruvnet--RuView:fix/issue-559-560-verify-paths-portable-hash
frank/ruvnet--RuView:docs/issue-568-tier2-caveats
frank/ruvnet--RuView:fix/issues-559-561
frank/ruvnet--RuView:feat/midstream-introspection
frank/ruvnet--RuView:chore/rvcsi-via-submodule
frank/ruvnet--RuView:chore/vendor-rvcsi-submodule
frank/ruvnet--RuView:claude/design-rvcsi-platform-X7yJR
frank/ruvnet--RuView:feat/meridian-csi-mae-prototype
frank/ruvnet--RuView:feat/ruvllm-sparse-attention-edge
frank/ruvnet--RuView:fix/ci-preexisting-failures
frank/ruvnet--RuView:fix/version-string-nosignal-ui
frank/ruvnet--RuView:fix/firmware-pr397-rebased
frank/ruvnet--RuView:fix/ci-wasm-pack-and-docker
frank/ruvnet--RuView:feat/nvsim-pipeline-simulator
frank/ruvnet--RuView:feat/adr-084-pass-1-sketch-module
frank/ruvnet--RuView:feat/realtime-dense-pointcloud
frank/ruvnet--RuView:claude/connectome-embodied-brain-COE3I
frank/ruvnet--RuView:chore/update-submodules-20260421-182956
frank/ruvnet--RuView:chore/update-submodules-20260421-123116
frank/ruvnet--RuView:chore/update-submodules-20260421-064624
frank/ruvnet--RuView:chore/update-submodules-20260421-004619
frank/ruvnet--RuView:chore/update-submodules-20260420-182725
frank/ruvnet--RuView:claude/adaptive-csi-mesh-firmware-f6EwD
frank/ruvnet--RuView:chore/update-submodules-20260420-123412
frank/ruvnet--RuView:chore/update-submodules-20260420-065443
frank/ruvnet--RuView:chore/update-submodules-20260420-004631
frank/ruvnet--RuView:chore/update-submodules-20260419-181843
frank/ruvnet--RuView:chore/update-submodules-20260419-121856
frank/ruvnet--RuView:chore/update-submodules-20260419-064124
frank/ruvnet--RuView:chore/update-submodules-20260419-004655
frank/ruvnet--RuView:chore/update-submodules-20260418-181903
frank/ruvnet--RuView:chore/update-submodules-20260418-121838
frank/ruvnet--RuView:chore/update-submodules-20260418-063330
frank/ruvnet--RuView:chore/update-submodules-20260418-004214
frank/ruvnet--RuView:chore/update-submodules-20260417-182701
frank/ruvnet--RuView:chore/update-submodules-20260417-122843
frank/ruvnet--RuView:chore/update-submodules-20260417-064557
frank/ruvnet--RuView:chore/update-submodules-20260417-004619
frank/ruvnet--RuView:chore/update-submodules-20260416-183151
frank/ruvnet--RuView:chore/update-submodules-20260416-123140
frank/ruvnet--RuView:chore/update-submodules-20260416-064616
frank/ruvnet--RuView:chore/update-submodules-20260416-004807
frank/ruvnet--RuView:chore/update-submodules-20260415-183118
frank/ruvnet--RuView:fix/esp32-node-id-clobber
frank/ruvnet--RuView:chore/update-submodules-20260415-123017
frank/ruvnet--RuView:chore/update-submodules-20260415-064506
frank/ruvnet--RuView:chore/update-submodules-20260415-004640
frank/ruvnet--RuView:chore/update-submodules-20260414-183225
frank/ruvnet--RuView:chore/update-submodules-20260414-122949
frank/ruvnet--RuView:chore/update-submodules-20260414-064438
frank/ruvnet--RuView:chore/update-submodules-20260414-004657
frank/ruvnet--RuView:chore/update-submodules-20260413-183728
frank/ruvnet--RuView:chore/update-submodules-20260413-123135
frank/ruvnet--RuView:chore/update-submodules-20260413-065331
frank/ruvnet--RuView:chore/update-submodules-20260413-004616
frank/ruvnet--RuView:chore/update-submodules-20260412-181840
frank/ruvnet--RuView:chore/update-submodules-20260412-121908
frank/ruvnet--RuView:chore/update-submodules-20260412-063931
frank/ruvnet--RuView:chore/update-submodules-20260412-004537
frank/ruvnet--RuView:chore/update-submodules-20260411-181556
frank/ruvnet--RuView:chore/update-submodules-20260411-121710
frank/ruvnet--RuView:chore/update-submodules-20260411-062905
frank/ruvnet--RuView:chore/update-submodules-20260411-004008
frank/ruvnet--RuView:chore/update-submodules-20260410-182347
frank/ruvnet--RuView:chore/update-submodules-20260410-122639
frank/ruvnet--RuView:chore/update-submodules-20260410-064440
frank/ruvnet--RuView:chore/update-submodules-20260410-004131
frank/ruvnet--RuView:chore/update-submodules-20260409-182718
frank/ruvnet--RuView:chore/update-submodules-20260409-123017
frank/ruvnet--RuView:chore/update-submodules-20260409-064019
frank/ruvnet--RuView:chore/update-submodules-20260409-003834
frank/ruvnet--RuView:chore/update-submodules-20260408-183348
frank/ruvnet--RuView:chore/update-submodules-20260408-122650
frank/ruvnet--RuView:chore/update-submodules-20260408-063950
frank/ruvnet--RuView:chore/update-submodules-20260408-004231
frank/ruvnet--RuView:chore/update-submodules-20260407-182524
frank/ruvnet--RuView:feat/adr-080-gesture-visualization
frank/ruvnet--RuView:chore/update-submodules-20260407-122720
frank/ruvnet--RuView:chore/update-submodules-20260407-063830
frank/ruvnet--RuView:chore/update-submodules-20260407-004214
frank/ruvnet--RuView:feat/adr-080-qe-remediation
frank/ruvnet--RuView:chore/update-submodules-20260406-182536
frank/ruvnet--RuView:chore/update-submodules-20260406-122513
frank/ruvnet--RuView:chore/update-submodules-20260406-064607
frank/ruvnet--RuView:chore/update-submodules-20260406-004315
frank/ruvnet--RuView:chore/update-submodules-20260405-181522
frank/ruvnet--RuView:chore/update-submodules-20260405-121716
frank/ruvnet--RuView:chore/update-submodules-20260405-063257
frank/ruvnet--RuView:chore/update-submodules-20260405-004341
frank/ruvnet--RuView:chore/update-submodules-20260404-181447
frank/ruvnet--RuView:chore/update-submodules-20260404-121648
frank/ruvnet--RuView:chore/update-submodules-20260404-062831
frank/ruvnet--RuView:chore/update-submodules-20260404-003823
frank/ruvnet--RuView:docs/hf-links-update
frank/ruvnet--RuView:chore/update-submodules-20260403-181804
frank/ruvnet--RuView:feat/deep-scan
frank/ruvnet--RuView:docs/v0.6.0-models-guide
frank/ruvnet--RuView:fix/large-dataset-training
frank/ruvnet--RuView:fix/windows-bind-addr
frank/ruvnet--RuView:merge/accuracy-sprint-001
frank/ruvnet--RuView:feat/accuracy-sprint-001
frank/ruvnet--RuView:chore/update-submodules-20260403-122047
frank/ruvnet--RuView:chore/update-submodules-20260403-063323
frank/ruvnet--RuView:feat/ruvector-advanced-sensing
frank/ruvnet--RuView:chore/update-submodules-20260403-004049
frank/ruvnet--RuView:feat/arena-physica-esp32-research
frank/ruvnet--RuView:chore/update-submodules-20260402-182417
frank/ruvnet--RuView:chore/update-submodules-20260402-122637
frank/ruvnet--RuView:chore/update-submodules-20260402-063350
frank/ruvnet--RuView:chore/update-submodules-20260402-003849
frank/ruvnet--RuView:chore/update-submodules-20260401-182528
frank/ruvnet--RuView:chore/update-submodules-20260401-122729
frank/ruvnet--RuView:chore/update-submodules-20260401-064148
frank/ruvnet--RuView:chore/update-submodules-20260401-004519
frank/ruvnet--RuView:feat/cross-node-fusion
frank/ruvnet--RuView:feat/ruvector-all-phases
frank/ruvnet--RuView:feat/ruvector-phase1-subcarrier-coherence
frank/ruvnet--RuView:fix/issue-332-rssi-offset
frank/ruvnet--RuView:chore/update-submodules-20260330-122639
frank/ruvnet--RuView:chore/update-submodules-20260330-064537
frank/ruvnet--RuView:chore/update-submodules-20260330-004247
frank/ruvnet--RuView:chore/update-submodules-20260329-181443
frank/ruvnet--RuView:chore/update-submodules-20260329-121645
frank/ruvnet--RuView:chore/update-submodules-20260329-063110
frank/ruvnet--RuView:chore/update-submodules-20260329-004252
frank/ruvnet--RuView:chore/update-submodules-20260328-181334
frank/ruvnet--RuView:chore/update-submodules-20260328-121621
frank/ruvnet--RuView:chore/update-submodules-20260328-062713
frank/ruvnet--RuView:chore/update-submodules-20260328-003746
frank/ruvnet--RuView:fix/issue-249-multi-node-state
frank/ruvnet--RuView:fix/critical-bugs-321-323
frank/ruvnet--RuView:fix/issue-314-module-import
frank/ruvnet--RuView:chore/update-submodules-20260327-182422
frank/ruvnet--RuView:chore/update-submodules-20260327-122106
frank/ruvnet--RuView:chore/update-submodules-20260327-063353
frank/ruvnet--RuView:chore/update-submodules-20260327-004057
frank/ruvnet--RuView:chore/update-submodules-20260326-182756
frank/ruvnet--RuView:chore/update-submodules-20260326-122639
frank/ruvnet--RuView:chore/update-submodules-20260326-063245
frank/ruvnet--RuView:chore/update-submodules-20260326-004038
frank/ruvnet--RuView:chore/update-submodules-20260325-182518
frank/ruvnet--RuView:chore/update-submodules-20260325-122305
frank/ruvnet--RuView:chore/update-submodules-20260325-062936
frank/ruvnet--RuView:chore/update-submodules-20260325-003810
frank/ruvnet--RuView:chore/update-submodules-20260324-182603
frank/ruvnet--RuView:chore/update-submodules-20260324-122406
frank/ruvnet--RuView:chore/update-submodules-20260324-063018
frank/ruvnet--RuView:chore/update-submodules-20260324-003329
frank/ruvnet--RuView:chore/update-submodules-20260323-182250
frank/ruvnet--RuView:chore/update-submodules-20260323-122304
frank/ruvnet--RuView:chore/update-submodules-20260323-063351
frank/ruvnet--RuView:chore/update-submodules-20260323-004010
frank/ruvnet--RuView:chore/update-submodules-20260322-181250
frank/ruvnet--RuView:chore/update-submodules-20260322-121427
frank/ruvnet--RuView:chore/update-submodules-20260322-062324
frank/ruvnet--RuView:chore/update-submodules-20260322-003853
frank/ruvnet--RuView:chore/update-submodules-20260321-181210
frank/ruvnet--RuView:chore/update-submodules-20260321-121328
frank/ruvnet--RuView:chore/update-submodules-20260321-061839
frank/ruvnet--RuView:chore/update-submodules-20260321-003447
frank/ruvnet--RuView:feat/adr-065-happiness-seed-bridge
frank/ruvnet--RuView:chore/update-submodules-20260320-181818
frank/ruvnet--RuView:chore/update-submodules-20260320-121740
frank/ruvnet--RuView:chore/update-submodules-20260320-062450
frank/ruvnet--RuView:chore/update-submodules-20260320-003655
frank/ruvnet--RuView:chore/update-submodules-20260319-182322
frank/ruvnet--RuView:chore/update-submodules-20260319-121857
frank/ruvnet--RuView:chore/update-submodules-20260319-062736
frank/ruvnet--RuView:chore/update-submodules-20260319-003926
frank/ruvnet--RuView:chore/update-submodules-20260318-183443
frank/ruvnet--RuView:chore/update-submodules-20260318-122445
frank/ruvnet--RuView:chore/update-submodules-20260318-063020
frank/ruvnet--RuView:chore/update-submodules-20260318-003818
frank/ruvnet--RuView:chore/update-submodules-20260317-182617
frank/ruvnet--RuView:chore/update-submodules-20260317-122324
frank/ruvnet--RuView:chore/update-submodules-20260317-062959
frank/ruvnet--RuView:chore/update-submodules-20260317-003530
frank/ruvnet--RuView:chore/update-submodules-20260316-182626
frank/ruvnet--RuView:chore/update-submodules-20260316-122436
frank/ruvnet--RuView:chore/update-submodules-20260316-063935
frank/ruvnet--RuView:chore/update-submodules-20260316-004147
frank/ruvnet--RuView:feat/adr-063-mmwave-sensor-fusion
frank/ruvnet--RuView:chore/update-submodules-20260315-181329
frank/ruvnet--RuView:fix/issue-263-265-fall-thresh-4mb-flash
frank/ruvnet--RuView:chore/update-submodules-20260315-121539
frank/ruvnet--RuView:chore/update-submodules-20260315-062733
frank/ruvnet--RuView:chore/update-submodules-20260315-004148
frank/ruvnet--RuView:chore/update-submodules-20260314-181315
frank/ruvnet--RuView:feat/qemu-esp32s3-testing
frank/ruvnet--RuView:chore/update-submodules-20260314-121421
frank/ruvnet--RuView:chore/update-submodules-20260314-062119
frank/ruvnet--RuView:chore/update-submodules-20260314-003426
frank/ruvnet--RuView:chore/update-submodules-20260313-181616
frank/ruvnet--RuView:chore/update-submodules-20260313-121747
frank/ruvnet--RuView:chore/update-submodules-20260313-062316
frank/ruvnet--RuView:fix/provision-channel-mac-filter
frank/ruvnet--RuView:feat/ruvector-6stage-wasm-pipeline
frank/ruvnet--RuView:chore/update-submodules-20260313-003602
frank/ruvnet--RuView:feat/ruvector-wasm-browser-example
frank/ruvnet--RuView:chore/update-submodules-20260312-182247
frank/ruvnet--RuView:chore/update-submodules-20260312-121749
frank/ruvnet--RuView:chore/update-submodules-20260312-062400
frank/ruvnet--RuView:chore/update-submodules-20260312-003106
frank/ruvnet--RuView:chore/update-submodules-20260311-182406
frank/ruvnet--RuView:chore/update-submodules-20260311-121844
frank/ruvnet--RuView:chore/update-submodules-20260311-062253
frank/ruvnet--RuView:chore/update-submodules-20260311-003404
frank/ruvnet--RuView:chore/update-submodules-20260310-182149
frank/ruvnet--RuView:feat/desktop-training-ruvector
frank/ruvnet--RuView:chore/update-submodules-20260310-121849
frank/ruvnet--RuView:chore/update-submodules-20260310-062137
frank/ruvnet--RuView:chore/update-submodules-20260310-003324
frank/ruvnet--RuView:fix/206-save-settings-command
frank/ruvnet--RuView:chore/update-submodules-20260309-182220
frank/ruvnet--RuView:claude/rf-mincut-sensing-uHnQX
frank/ruvnet--RuView:chore/update-submodules-20260309-121830
frank/ruvnet--RuView:chore/update-submodules-20260309-062836
frank/ruvnet--RuView:feat/tauri-desktop-frontend
frank/ruvnet--RuView:chore/update-submodules-20260309-003648
frank/ruvnet--RuView:chore/update-submodules-20260308-181102
frank/ruvnet--RuView:chore/update-submodules-20260308-121328
frank/ruvnet--RuView:chore/update-submodules-20260308-061849
frank/ruvnet--RuView:chore/update-submodules-20260308-003703
frank/ruvnet--RuView:chore/update-submodules-20260307-181025
frank/ruvnet--RuView:chore/update-submodules-20260307-121304
frank/ruvnet--RuView:chore/update-submodules-20260307-061536
frank/ruvnet--RuView:chore/update-submodules-20260307-003454
frank/ruvnet--RuView:refactor/sprint2-code-quality
frank/ruvnet--RuView:fix/adr-049-cross-platform-wifi
frank/ruvnet--RuView:chore/update-submodules-20260306-181720
frank/ruvnet--RuView:fix/quality-engineering-170
frank/ruvnet--RuView:fix/observatory-mobile-responsive
frank/ruvnet--RuView:refactor/vendor-submodules
frank/ruvnet--RuView:fix/csi-sendto-enomem-crash
frank/ruvnet--RuView:fix/provision-tdm-edge-support
frank/ruvnet--RuView:docs/update-changelog-userguide-readme
frank/ruvnet--RuView:fix/ui-404-errors-and-mobile-ws
frank/ruvnet--RuView:feat/complete-vendor-and-edge-intel
frank/ruvnet--RuView:feat/add-vendor-deps
frank/ruvnet--RuView:feat/adr-039-edge-intelligence
frank/ruvnet--RuView:fix/issue-98-csi-mac-filtering
frank/ruvnet--RuView:fix/issue-86-live-demo-real-data
frank/ruvnet--RuView:ruvsense-full-implementation
frank/ruvnet--RuView:claude/use-cases-implementation-plan-tT4s9
frank/ruvnet--RuView:claude/wifi-densepose-ruvector-Gj3O9
frank/ruvnet--RuView:adr-028-esp32-capability-audit
frank/ruvnet--RuView:adr-027-cross-environment-domain-generalization
frank/ruvnet--RuView:claude/analyze-repo-structure-aOtgs
frank/ruvnet--RuView:feat/adr-024-contrastive-csi-embedding
frank/ruvnet--RuView:feat/windows-wifi-enhanced-fidelity
frank/ruvnet--RuView:feat/rust-ruvector-sensing-ui
frank/ruvnet--RuView:security/fix-critical-vulnerabilities
frank/ruvnet--RuView:claude/validate-code-quality-WNrNw
frank/ruvnet--RuView:claude/integrate-ruvector-rvf-mF1Hp
frank/ruvnet--RuView:claude/test-rust-update-python-Q2NLq
frank/ruvnet--RuView:claude/wifi-mat-disaster-detection-MxxnQ
frank/ruvnet--RuView:claude/rust-agent-swarm-port-UxwTT
frank/ruvnet--RuView:v1770
frank/ruvnet--RuView:v1767
frank/ruvnet--RuView:v1765
frank/ruvnet--RuView:v1762
frank/ruvnet--RuView:v1759
frank/ruvnet--RuView:v1753
frank/ruvnet--RuView:v1749
frank/ruvnet--RuView:v1746
frank/ruvnet--RuView:v1744
frank/ruvnet--RuView:v1740
frank/ruvnet--RuView:v1737
frank/ruvnet--RuView:v1734
frank/ruvnet--RuView:v1731
frank/ruvnet--RuView:v1728
frank/ruvnet--RuView:v1724
frank/ruvnet--RuView:v1721
frank/ruvnet--RuView:v1717
frank/ruvnet--RuView:v1714
frank/ruvnet--RuView:v1712
frank/ruvnet--RuView:v1709
frank/ruvnet--RuView:v1707
frank/ruvnet--RuView:v1701
frank/ruvnet--RuView:v1696
frank/ruvnet--RuView:v1692
frank/ruvnet--RuView:v1689
frank/ruvnet--RuView:v1686
frank/ruvnet--RuView:v0.9.0-beyond-sota
frank/ruvnet--RuView:v1681
frank/ruvnet--RuView:v1677
frank/ruvnet--RuView:v1675
frank/ruvnet--RuView:v1674
frank/ruvnet--RuView:v1669
frank/ruvnet--RuView:v1659
frank/ruvnet--RuView:v0.8.0-esp32
frank/ruvnet--RuView:v1647
frank/ruvnet--RuView:v0.7.1-esp32
frank/ruvnet--RuView:v1613
frank/ruvnet--RuView:v1611
frank/ruvnet--RuView:v1609
frank/ruvnet--RuView:v1606
frank/ruvnet--RuView:v1596
frank/ruvnet--RuView:v1590
frank/ruvnet--RuView:v1591
frank/ruvnet--RuView:v1588
frank/ruvnet--RuView:v1585
frank/ruvnet--RuView:v1583
frank/ruvnet--RuView:v1581
frank/ruvnet--RuView:v1579
frank/ruvnet--RuView:v1576
frank/ruvnet--RuView:v1574
frank/ruvnet--RuView:v1572
frank/ruvnet--RuView:v1570
frank/ruvnet--RuView:v1568
frank/ruvnet--RuView:v1566
frank/ruvnet--RuView:v1562
frank/ruvnet--RuView:v1560
frank/ruvnet--RuView:v1557
frank/ruvnet--RuView:v1555
frank/ruvnet--RuView:v1551
frank/ruvnet--RuView:v1553
frank/ruvnet--RuView:v1548
frank/ruvnet--RuView:v1544
frank/ruvnet--RuView:v1528
frank/ruvnet--RuView:v1506
frank/ruvnet--RuView:v1484
frank/ruvnet--RuView:v1451
frank/ruvnet--RuView:v1449
frank/ruvnet--RuView:v1450
frank/ruvnet--RuView:v1447
frank/ruvnet--RuView:v1448
frank/ruvnet--RuView:v1444
frank/ruvnet--RuView:v0.3.0-streaming-engine
frank/ruvnet--RuView:v1428
frank/ruvnet--RuView:v1421
frank/ruvnet--RuView:v1409
frank/ruvnet--RuView:v1408
frank/ruvnet--RuView:v1407
frank/ruvnet--RuView:v1406
frank/ruvnet--RuView:v1405
frank/ruvnet--RuView:v1404
frank/ruvnet--RuView:v1403
frank/ruvnet--RuView:v1402
frank/ruvnet--RuView:v0.12.0
frank/ruvnet--RuView:v1397
frank/ruvnet--RuView:v1388
frank/ruvnet--RuView:v0.11.0
frank/ruvnet--RuView:v1387
frank/ruvnet--RuView:v0.10.0
frank/ruvnet--RuView:v1365
frank/ruvnet--RuView:v0.9.0
frank/ruvnet--RuView:v1362
frank/ruvnet--RuView:v1339
frank/ruvnet--RuView:v1338
frank/ruvnet--RuView:v1336
frank/ruvnet--RuView:v1337
frank/ruvnet--RuView:v1335
frank/ruvnet--RuView:v1333
frank/ruvnet--RuView:v1330
frank/ruvnet--RuView:v1329
frank/ruvnet--RuView:v1328
frank/ruvnet--RuView:v1327
frank/ruvnet--RuView:v1326
frank/ruvnet--RuView:v1313
frank/ruvnet--RuView:v1316
frank/ruvnet--RuView:v1259
frank/ruvnet--RuView:v1261
frank/ruvnet--RuView:v1260
frank/ruvnet--RuView:v1258
frank/ruvnet--RuView:v1256
frank/ruvnet--RuView:v1251
frank/ruvnet--RuView:v1248
frank/ruvnet--RuView:v1.99.0-pip
frank/ruvnet--RuView:v1234
frank/ruvnet--RuView:v1235
frank/ruvnet--RuView:v1233
frank/ruvnet--RuView:v1231
frank/ruvnet--RuView:v1230
frank/ruvnet--RuView:v1229
frank/ruvnet--RuView:v1228
frank/ruvnet--RuView:v1225
frank/ruvnet--RuView:v1227
frank/ruvnet--RuView:v1226
frank/ruvnet--RuView:v1223
frank/ruvnet--RuView:v1224
frank/ruvnet--RuView:v1222
frank/ruvnet--RuView:v1221
frank/ruvnet--RuView:v1220
frank/ruvnet--RuView:v1219
frank/ruvnet--RuView:v1218
frank/ruvnet--RuView:v1217
frank/ruvnet--RuView:v1216
frank/ruvnet--RuView:v1201
frank/ruvnet--RuView:v0.7.0-esp32
frank/ruvnet--RuView:v0.6.9-esp32
frank/ruvnet--RuView:v0.6.8-esp32
frank/ruvnet--RuView:v0.6.7-esp32
frank/ruvnet--RuView:v1160
frank/ruvnet--RuView:v1155
frank/ruvnet--RuView:v1153
frank/ruvnet--RuView:v1152
frank/ruvnet--RuView:v1136
frank/ruvnet--RuView:v1057
frank/ruvnet--RuView:v1059
frank/ruvnet--RuView:v1061
frank/ruvnet--RuView:v1063
frank/ruvnet--RuView:v1065
frank/ruvnet--RuView:v1067
frank/ruvnet--RuView:v1069
frank/ruvnet--RuView:v1071
frank/ruvnet--RuView:v1073
frank/ruvnet--RuView:v1075
frank/ruvnet--RuView:v1077
frank/ruvnet--RuView:v1079
frank/ruvnet--RuView:v1081
frank/ruvnet--RuView:v1083
frank/ruvnet--RuView:v1085
frank/ruvnet--RuView:v1087
frank/ruvnet--RuView:v1089
frank/ruvnet--RuView:v1091
frank/ruvnet--RuView:v1093
frank/ruvnet--RuView:v1095
frank/ruvnet--RuView:v1097
frank/ruvnet--RuView:v1099
frank/ruvnet--RuView:v1101
frank/ruvnet--RuView:v1103
frank/ruvnet--RuView:v1105
frank/ruvnet--RuView:v1107
frank/ruvnet--RuView:v1109
frank/ruvnet--RuView:v1111
frank/ruvnet--RuView:v1113
frank/ruvnet--RuView:v1115
frank/ruvnet--RuView:v1117
frank/ruvnet--RuView:v1119
frank/ruvnet--RuView:v1121
frank/ruvnet--RuView:v1123
frank/ruvnet--RuView:v1127
frank/ruvnet--RuView:v1129
frank/ruvnet--RuView:v1131
frank/ruvnet--RuView:v1133
frank/ruvnet--RuView:v1125
frank/ruvnet--RuView:v1055
frank/ruvnet--RuView:v1056
frank/ruvnet--RuView:v1052
frank/ruvnet--RuView:v1049
frank/ruvnet--RuView:v1043
frank/ruvnet--RuView:v1046
frank/ruvnet--RuView:v1041
frank/ruvnet--RuView:v1039
frank/ruvnet--RuView:v1036
frank/ruvnet--RuView:v1037
frank/ruvnet--RuView:v1030
frank/ruvnet--RuView:v1032
frank/ruvnet--RuView:v1024
frank/ruvnet--RuView:v1027
frank/ruvnet--RuView:v1021
frank/ruvnet--RuView:v1018
frank/ruvnet--RuView:v0.6.6-esp32
frank/ruvnet--RuView:v1015
frank/ruvnet--RuView:v1013
frank/ruvnet--RuView:v1012
frank/ruvnet--RuView:v1011
frank/ruvnet--RuView:v1010
frank/ruvnet--RuView:v0.6.5-esp32
frank/ruvnet--RuView:v0.8.0
frank/ruvnet--RuView:v0.6.4-esp32
frank/ruvnet--RuView:v0.6.3-esp32
frank/ruvnet--RuView:v0.6.2-esp32
frank/ruvnet--RuView:v0.6.1-esp32
frank/ruvnet--RuView:v0.7.0
frank/ruvnet--RuView:v0.6.0-esp32
frank/ruvnet--RuView:v0.5.5-esp32
frank/ruvnet--RuView:v0.5.4-esp32
frank/ruvnet--RuView:v0.5.3-esp32
frank/ruvnet--RuView:v0.5.2-esp32
frank/ruvnet--RuView:v0.5.1-esp32
frank/ruvnet--RuView:v0.5.0-esp32
frank/ruvnet--RuView:v0.4.3.1-esp32
frank/ruvnet--RuView:v0.4.3-esp32
frank/ruvnet--RuView:v0.4.2-esp32
frank/ruvnet--RuView:v0.4.1-esp32
frank/ruvnet--RuView:datasets-v1.0.0
frank/ruvnet--RuView:desktop-v0.4.0
frank/ruvnet--RuView:v0.4.4
frank/ruvnet--RuView:v0.4.3
frank/ruvnet--RuView:desktop-v0.4.1
frank/ruvnet--RuView:v0.4.0-desktop
frank/ruvnet--RuView:desktop-v0.3.0
frank/ruvnet--RuView:v0.3.0-desktop-alpha
frank/ruvnet--RuView:v0.4.0-alpha-esp32
frank/ruvnet--RuView:v0.3.0-alpha-esp32
frank/ruvnet--RuView:v0.2.0-esp32
frank/ruvnet--RuView:v0.1.0-esp32
..
compare: frank/ruvnet--RuView:adr-110-esp32c6
frank/ruvnet--RuView:chore/update-submodules-20260616-080731
frank/ruvnet--RuView:chore/update-submodules-20260616-011336
frank/ruvnet--RuView:docs/adr-180-through-wall
frank/ruvnet--RuView:chore/update-submodules-20260615-192532
frank/ruvnet--RuView:fix/issue-1049-configurable-guard
frank/ruvnet--RuView:main
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep
frank/ruvnet--RuView:gh-pages
frank/ruvnet--RuView:homecore-ui-review-fixed
frank/ruvnet--RuView:chore/update-submodules-20260615-141606
frank/ruvnet--RuView:chore/update-submodules-20260615-081339
frank/ruvnet--RuView:chore/update-submodules-20260615-011044
frank/ruvnet--RuView:chore/update-submodules-20260614-183700
frank/ruvnet--RuView:feat/rufield-viewer-live
frank/ruvnet--RuView:dependabot/github_actions/actions/checkout-6
frank/ruvnet--RuView:dependabot/github_actions/docker/setup-buildx-action-4
frank/ruvnet--RuView:docs/adr-262-rufield-integration
frank/ruvnet--RuView:feat/rufield-csi-adapter
frank/ruvnet--RuView:feat/rufield-viewer-submodule
frank/ruvnet--RuView:chore/update-submodules-20260614-124739
frank/ruvnet--RuView:chore/update-submodules-20260614-074427
frank/ruvnet--RuView:feat/adr-260-rufield-submodule
frank/ruvnet--RuView:fix/vitals-998-996
frank/ruvnet--RuView:chore/update-submodules-20260614-010751
frank/ruvnet--RuView:chore/update-submodules-20260613-183623
frank/ruvnet--RuView:fix/issues-1031-894-fusion-guard-model-load
frank/ruvnet--RuView:chore/update-submodules-20260613-124456
frank/ruvnet--RuView:chore/update-submodules-20260613-072722
frank/ruvnet--RuView:feat/edge-skills-synthetic-validation
frank/ruvnet--RuView:docs/adr-gap-remediation-1
frank/ruvnet--RuView:docs/adr-164-gap-analysis
frank/ruvnet--RuView:chore/update-submodules-20260613-010634
frank/ruvnet--RuView:release/patch-1009-1004
frank/ruvnet--RuView:fix/issues-1009-1004-real-csi-ingest
frank/ruvnet--RuView:chore/update-submodules-20260612-184732
frank/ruvnet--RuView:chore/update-submodules-20260612-131939
frank/ruvnet--RuView:feat/v2-zero-warnings-hygiene
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m9
frank/ruvnet--RuView:chore/update-submodules-20260612-074708
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m8
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m7
frank/ruvnet--RuView:feat/v2-beyond-sota-sweep-m5
frank/ruvnet--RuView:chore/update-submodules-20260612-010814
frank/ruvnet--RuView:chore/ruv-neural-submodule
frank/ruvnet--RuView:feat/adr-152-wiflow-std-benchmark
frank/ruvnet--RuView:feat/beyond-sota-public
frank/ruvnet--RuView:claude/ruview-beyond-sota-xgv8aq
frank/ruvnet--RuView:chore/update-submodules-20260611-190648
frank/ruvnet--RuView:fix/issue-1005-c6-idf55-guard
frank/ruvnet--RuView:chore/update-submodules-20260611-132944
frank/ruvnet--RuView:chore/update-submodules-20260611-075115
frank/ruvnet--RuView:chore/update-submodules-20260611-010509
frank/ruvnet--RuView:feat/adr-151-calibration-api
frank/ruvnet--RuView:chore/update-submodules-20260610-190039
frank/ruvnet--RuView:chore/update-submodules-20260610-132034
frank/ruvnet--RuView:chore/update-submodules-20260610-073858
frank/ruvnet--RuView:chore/update-submodules-20260610-010503
frank/ruvnet--RuView:chore/update-submodules-20260609-185148
frank/ruvnet--RuView:chore/update-submodules-20260609-130851
frank/ruvnet--RuView:chore/update-submodules-20260609-072351
frank/ruvnet--RuView:chore/update-submodules-20260609-005822
frank/ruvnet--RuView:chore/update-submodules-20260608-185900
frank/ruvnet--RuView:chore/update-submodules-20260608-133647
frank/ruvnet--RuView:chore/update-submodules-20260608-075419
frank/ruvnet--RuView:chore/update-submodules-20260608-010619
frank/ruvnet--RuView:chore/update-submodules-20260607-183423
frank/ruvnet--RuView:chore/update-submodules-20260607-124051
frank/ruvnet--RuView:chore/update-submodules-20260607-073226
frank/ruvnet--RuView:chore/update-submodules-20260607-010544
frank/ruvnet--RuView:chore/update-submodules-20260606-183349
frank/ruvnet--RuView:chore/update-submodules-20260606-123547
frank/ruvnet--RuView:chore/update-submodules-20260606-071223
frank/ruvnet--RuView:chore/update-submodules-20260606-005931
frank/ruvnet--RuView:chore/update-submodules-20260605-184617
frank/ruvnet--RuView:chore/update-submodules-20260605-131132
frank/ruvnet--RuView:chore/update-submodules-20260605-073901
frank/ruvnet--RuView:chore/update-submodules-20260605-010335
frank/ruvnet--RuView:chore/update-submodules-20260604-185639
frank/ruvnet--RuView:chore/update-submodules-20260604-131551
frank/ruvnet--RuView:chore/update-submodules-20260604-074713
frank/ruvnet--RuView:chore/update-submodules-20260604-011200
frank/ruvnet--RuView:chore/update-submodules-20260603-192756
frank/ruvnet--RuView:chore/update-submodules-20260603-134837
frank/ruvnet--RuView:chore/update-submodules-20260603-075218
frank/ruvnet--RuView:chore/update-submodules-20260603-011158
frank/ruvnet--RuView:chore/update-submodules-20260602-192256
frank/ruvnet--RuView:dependabot/github_actions/actions/upload-artifact-7
frank/ruvnet--RuView:fix/ci-v1-api-perms-locust
frank/ruvnet--RuView:chore/update-submodules-20260602-132705
frank/ruvnet--RuView:fix/ci-v1-api-mock-mode
frank/ruvnet--RuView:fix/v1-pose-service-densepose-config
frank/ruvnet--RuView:fix/893-release-bins-refresh
frank/ruvnet--RuView:fix/894-occupancy-cap
frank/ruvnet--RuView:fix/898-mqtt-per-node-devices
frank/ruvnet--RuView:fix/893-csi-data-frame-capture
frank/ruvnet--RuView:chore/update-submodules-20260602-074832
frank/ruvnet--RuView:chore/update-submodules-20260602-010542
frank/ruvnet--RuView:chore/update-submodules-20260601-194356
frank/ruvnet--RuView:chore/update-submodules-20260601-141135
frank/ruvnet--RuView:chore/update-submodules-20260601-075806
frank/ruvnet--RuView:chore/update-submodules-20260601-010631
frank/ruvnet--RuView:chore/update-submodules-20260531-183125
frank/ruvnet--RuView:fix/proof-determinism-numpy-lock
frank/ruvnet--RuView:feat/adr-149-aether-arena
frank/ruvnet--RuView:chore/update-submodules-20260531-123739
frank/ruvnet--RuView:chore/update-submodules-20260531-072644
frank/ruvnet--RuView:chore/update-submodules-20260531-010327
frank/ruvnet--RuView:chore/update-submodules-20260530-182953
frank/ruvnet--RuView:fix/864-866-docker-auth-csi-yield
frank/ruvnet--RuView:chore/update-submodules-20260530-123315
frank/ruvnet--RuView:chore/update-submodules-20260530-070842
frank/ruvnet--RuView:chore/update-submodules-20260530-005806
frank/ruvnet--RuView:feat/adr-135-nvidia-cosmos-integration
frank/ruvnet--RuView:chore/update-submodules-20260529-185909
frank/ruvnet--RuView:feat/adr-136-146-streaming-engine
frank/ruvnet--RuView:chore/update-submodules-20260529-131551
frank/ruvnet--RuView:chore/update-submodules-20260529-072959
frank/ruvnet--RuView:feat/adr-135-empty-room-calibration
frank/ruvnet--RuView:chore/update-submodules-20260529-010249
frank/ruvnet--RuView:chore/update-submodules-20260528-185929
frank/ruvnet--RuView:chore/update-submodules-20260528-132435
frank/ruvnet--RuView:chore/update-submodules-20260528-073055
frank/ruvnet--RuView:chore/update-submodules-20260528-005436
frank/ruvnet--RuView:chore/update-submodules-20260527-185436
frank/ruvnet--RuView:chore/update-submodules-20260527-132146
frank/ruvnet--RuView:chore/update-submodules-20260527-073558
frank/ruvnet--RuView:chore/update-submodules-20260527-010007
frank/ruvnet--RuView:dependabot/pip/pytest-mock-gte-3.15.1
frank/ruvnet--RuView:dependabot/pip/bandit-gte-1.8.6
frank/ruvnet--RuView:dependabot/pip/pytest-cov-gte-7.1.0
frank/ruvnet--RuView:dependabot/pip/mypy-gte-1.19.1
frank/ruvnet--RuView:dependabot/pip/psycopg2-binary-gte-2.9.12
frank/ruvnet--RuView:dependabot/pip/safety-gte-3.8.0
frank/ruvnet--RuView:dependabot/pip/myst-parser-gte-3.0.1
frank/ruvnet--RuView:dependabot/pip/responses-gte-0.26.1
frank/ruvnet--RuView:dependabot/pip/pytest-bdd-gte-8.1.0
frank/ruvnet--RuView:dependabot/pip/structlog-gte-25.5.0
frank/ruvnet--RuView:chore/update-submodules-20260526-185505
frank/ruvnet--RuView:chore/update-submodules-20260526-131009
frank/ruvnet--RuView:chore/update-submodules-20260526-072215
frank/ruvnet--RuView:chore/update-submodules-20260526-005740
frank/ruvnet--RuView:chore/update-submodules-20260525-184024
frank/ruvnet--RuView:chore/update-submodules-20260525-131836
frank/ruvnet--RuView:chore/update-submodules-20260525-074445
frank/ruvnet--RuView:chore/update-submodules-20260525-010041
frank/ruvnet--RuView:chore/update-submodules-20260524-182842
frank/ruvnet--RuView:feat/adr-117-pip-modernization
frank/ruvnet--RuView:chore/update-submodules-20260524-123106
frank/ruvnet--RuView:chore/update-submodules-20260524-071413
frank/ruvnet--RuView:chore/update-submodules-20260524-005928
frank/ruvnet--RuView:feat/adr-115-ha-mqtt-matter
frank/ruvnet--RuView:adr-110-esp32c6
frank/ruvnet--RuView:fix/issue-760-sensing-ui-bugs
frank/ruvnet--RuView:chore/update-submodules-20260523-122815
frank/ruvnet--RuView:chore/update-submodules-20260523-070317
frank/ruvnet--RuView:chore/update-submodules-20260523-005630
frank/ruvnet--RuView:chore/update-submodules-20260522-184308
frank/ruvnet--RuView:chore/update-submodules-20260522-135706
frank/ruvnet--RuView:chore/update-submodules-20260522-125008
frank/ruvnet--RuView:research/sota-r10-foliage-wildlife
frank/ruvnet--RuView:feat/ruview-mcp-m3
frank/ruvnet--RuView:research/sota-r9-rssi-fingerprint
frank/ruvnet--RuView:chore/update-submodules-20260522-005846
frank/ruvnet--RuView:chore/update-submodules-20260521-184447
frank/ruvnet--RuView:chore/update-submodules-20260521-131745
frank/ruvnet--RuView:chore/update-submodules-20260521-072647
frank/ruvnet--RuView:fix/ci-regressions-679-guard
frank/ruvnet--RuView:chore/update-submodules-20260521-010021
frank/ruvnet--RuView:chore/update-submodules-20260520-185458
frank/ruvnet--RuView:fix/679-release-bins-node-id
frank/ruvnet--RuView:chore/update-submodules-20260520-130231
frank/ruvnet--RuView:chore/update-submodules-20260520-072312
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-worklets-0.8.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-gesture-handler-2.31.2
frank/ruvnet--RuView:dependabot/github_actions/bridgecrewio/checkov-action-12.3102.0
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-navigation/bottom-tabs-7.16.1
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/victory-native-41.20.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-navigation/native-7.2.4
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/vitejs/plugin-react-6.0.2
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/jest-expo-55.0.18
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/babel-preset-expo-55.0.22
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/tauri-apps/api-2.11.0
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-screens-4.25.1
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/vite-8.0.13
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/react-native-async-storage/async-storage-3.0.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/tauri-apps/plugin-dialog-2.7.1
frank/ruvnet--RuView:dependabot/github_actions/actions/github-script-9
frank/ruvnet--RuView:chore/update-submodules-20260520-010037
frank/ruvnet--RuView:chore/update-submodules-20260519-184424
frank/ruvnet--RuView:docs/hf-model-truth-up
frank/ruvnet--RuView:integrate/pr-491-adaptive-person-count
frank/ruvnet--RuView:dependabot/npm_and_yarn/ui/mobile/typescript-6.0.3
frank/ruvnet--RuView:dependabot/npm_and_yarn/v2/crates/wifi-densepose-desktop/ui/multi-0193e73c84
frank/ruvnet--RuView:dependabot/cargo/v2/dirs-6.0.0
frank/ruvnet--RuView:fix/issue-559-560-verify-paths-portable-hash
frank/ruvnet--RuView:docs/issue-568-tier2-caveats
frank/ruvnet--RuView:fix/issues-559-561
frank/ruvnet--RuView:feat/midstream-introspection
frank/ruvnet--RuView:chore/rvcsi-via-submodule
frank/ruvnet--RuView:chore/vendor-rvcsi-submodule
frank/ruvnet--RuView:claude/design-rvcsi-platform-X7yJR
frank/ruvnet--RuView:feat/meridian-csi-mae-prototype
frank/ruvnet--RuView:feat/ruvllm-sparse-attention-edge
frank/ruvnet--RuView:fix/ci-preexisting-failures
frank/ruvnet--RuView:fix/version-string-nosignal-ui
frank/ruvnet--RuView:fix/firmware-pr397-rebased
frank/ruvnet--RuView:fix/ci-wasm-pack-and-docker
frank/ruvnet--RuView:feat/nvsim-pipeline-simulator
frank/ruvnet--RuView:feat/adr-084-pass-1-sketch-module
frank/ruvnet--RuView:feat/realtime-dense-pointcloud
frank/ruvnet--RuView:claude/connectome-embodied-brain-COE3I
frank/ruvnet--RuView:chore/update-submodules-20260421-182956
frank/ruvnet--RuView:chore/update-submodules-20260421-123116
frank/ruvnet--RuView:chore/update-submodules-20260421-064624
frank/ruvnet--RuView:chore/update-submodules-20260421-004619
frank/ruvnet--RuView:chore/update-submodules-20260420-182725
frank/ruvnet--RuView:claude/adaptive-csi-mesh-firmware-f6EwD
frank/ruvnet--RuView:chore/update-submodules-20260420-123412
frank/ruvnet--RuView:chore/update-submodules-20260420-065443
frank/ruvnet--RuView:chore/update-submodules-20260420-004631
frank/ruvnet--RuView:chore/update-submodules-20260419-181843
frank/ruvnet--RuView:chore/update-submodules-20260419-121856
frank/ruvnet--RuView:chore/update-submodules-20260419-064124
frank/ruvnet--RuView:chore/update-submodules-20260419-004655
frank/ruvnet--RuView:chore/update-submodules-20260418-181903
frank/ruvnet--RuView:chore/update-submodules-20260418-121838
frank/ruvnet--RuView:chore/update-submodules-20260418-063330
frank/ruvnet--RuView:chore/update-submodules-20260418-004214
frank/ruvnet--RuView:chore/update-submodules-20260417-182701
frank/ruvnet--RuView:chore/update-submodules-20260417-122843
frank/ruvnet--RuView:chore/update-submodules-20260417-064557
frank/ruvnet--RuView:chore/update-submodules-20260417-004619
frank/ruvnet--RuView:chore/update-submodules-20260416-183151
frank/ruvnet--RuView:chore/update-submodules-20260416-123140
frank/ruvnet--RuView:chore/update-submodules-20260416-064616
frank/ruvnet--RuView:chore/update-submodules-20260416-004807
frank/ruvnet--RuView:chore/update-submodules-20260415-183118
frank/ruvnet--RuView:fix/esp32-node-id-clobber
frank/ruvnet--RuView:chore/update-submodules-20260415-123017
frank/ruvnet--RuView:chore/update-submodules-20260415-064506
frank/ruvnet--RuView:chore/update-submodules-20260415-004640
frank/ruvnet--RuView:chore/update-submodules-20260414-183225
frank/ruvnet--RuView:chore/update-submodules-20260414-122949
frank/ruvnet--RuView:chore/update-submodules-20260414-064438
frank/ruvnet--RuView:chore/update-submodules-20260414-004657
frank/ruvnet--RuView:chore/update-submodules-20260413-183728
frank/ruvnet--RuView:chore/update-submodules-20260413-123135
frank/ruvnet--RuView:chore/update-submodules-20260413-065331
frank/ruvnet--RuView:chore/update-submodules-20260413-004616
frank/ruvnet--RuView:chore/update-submodules-20260412-181840
frank/ruvnet--RuView:chore/update-submodules-20260412-121908
frank/ruvnet--RuView:chore/update-submodules-20260412-063931
frank/ruvnet--RuView:chore/update-submodules-20260412-004537
frank/ruvnet--RuView:chore/update-submodules-20260411-181556
frank/ruvnet--RuView:chore/update-submodules-20260411-121710
frank/ruvnet--RuView:chore/update-submodules-20260411-062905
frank/ruvnet--RuView:chore/update-submodules-20260411-004008
frank/ruvnet--RuView:chore/update-submodules-20260410-182347
frank/ruvnet--RuView:chore/update-submodules-20260410-122639
frank/ruvnet--RuView:chore/update-submodules-20260410-064440
frank/ruvnet--RuView:chore/update-submodules-20260410-004131
frank/ruvnet--RuView:chore/update-submodules-20260409-182718
frank/ruvnet--RuView:chore/update-submodules-20260409-123017
frank/ruvnet--RuView:chore/update-submodules-20260409-064019
frank/ruvnet--RuView:chore/update-submodules-20260409-003834
frank/ruvnet--RuView:chore/update-submodules-20260408-183348
frank/ruvnet--RuView:chore/update-submodules-20260408-122650
frank/ruvnet--RuView:chore/update-submodules-20260408-063950
frank/ruvnet--RuView:chore/update-submodules-20260408-004231
frank/ruvnet--RuView:chore/update-submodules-20260407-182524
frank/ruvnet--RuView:feat/adr-080-gesture-visualization
frank/ruvnet--RuView:chore/update-submodules-20260407-122720
frank/ruvnet--RuView:chore/update-submodules-20260407-063830
frank/ruvnet--RuView:chore/update-submodules-20260407-004214
frank/ruvnet--RuView:feat/adr-080-qe-remediation
frank/ruvnet--RuView:chore/update-submodules-20260406-182536
frank/ruvnet--RuView:chore/update-submodules-20260406-122513
frank/ruvnet--RuView:chore/update-submodules-20260406-064607
frank/ruvnet--RuView:chore/update-submodules-20260406-004315
frank/ruvnet--RuView:chore/update-submodules-20260405-181522
frank/ruvnet--RuView:chore/update-submodules-20260405-121716
frank/ruvnet--RuView:chore/update-submodules-20260405-063257
frank/ruvnet--RuView:chore/update-submodules-20260405-004341
frank/ruvnet--RuView:chore/update-submodules-20260404-181447
frank/ruvnet--RuView:chore/update-submodules-20260404-121648
frank/ruvnet--RuView:chore/update-submodules-20260404-062831
frank/ruvnet--RuView:chore/update-submodules-20260404-003823
frank/ruvnet--RuView:docs/hf-links-update
frank/ruvnet--RuView:chore/update-submodules-20260403-181804
frank/ruvnet--RuView:feat/deep-scan
frank/ruvnet--RuView:docs/v0.6.0-models-guide
frank/ruvnet--RuView:fix/large-dataset-training
frank/ruvnet--RuView:fix/windows-bind-addr
frank/ruvnet--RuView:merge/accuracy-sprint-001
frank/ruvnet--RuView:feat/accuracy-sprint-001
frank/ruvnet--RuView:chore/update-submodules-20260403-122047
frank/ruvnet--RuView:chore/update-submodules-20260403-063323
frank/ruvnet--RuView:feat/ruvector-advanced-sensing
frank/ruvnet--RuView:chore/update-submodules-20260403-004049
frank/ruvnet--RuView:feat/arena-physica-esp32-research
frank/ruvnet--RuView:chore/update-submodules-20260402-182417
frank/ruvnet--RuView:chore/update-submodules-20260402-122637
frank/ruvnet--RuView:chore/update-submodules-20260402-063350
frank/ruvnet--RuView:chore/update-submodules-20260402-003849
frank/ruvnet--RuView:chore/update-submodules-20260401-182528
frank/ruvnet--RuView:chore/update-submodules-20260401-122729
frank/ruvnet--RuView:chore/update-submodules-20260401-064148
frank/ruvnet--RuView:chore/update-submodules-20260401-004519
frank/ruvnet--RuView:feat/cross-node-fusion
frank/ruvnet--RuView:feat/ruvector-all-phases
frank/ruvnet--RuView:feat/ruvector-phase1-subcarrier-coherence
frank/ruvnet--RuView:fix/issue-332-rssi-offset
frank/ruvnet--RuView:chore/update-submodules-20260330-122639
frank/ruvnet--RuView:chore/update-submodules-20260330-064537
frank/ruvnet--RuView:chore/update-submodules-20260330-004247
frank/ruvnet--RuView:chore/update-submodules-20260329-181443
frank/ruvnet--RuView:chore/update-submodules-20260329-121645
frank/ruvnet--RuView:chore/update-submodules-20260329-063110
frank/ruvnet--RuView:chore/update-submodules-20260329-004252
frank/ruvnet--RuView:chore/update-submodules-20260328-181334
frank/ruvnet--RuView:chore/update-submodules-20260328-121621
frank/ruvnet--RuView:chore/update-submodules-20260328-062713
frank/ruvnet--RuView:chore/update-submodules-20260328-003746
frank/ruvnet--RuView:fix/issue-249-multi-node-state
frank/ruvnet--RuView:fix/critical-bugs-321-323
frank/ruvnet--RuView:fix/issue-314-module-import
frank/ruvnet--RuView:chore/update-submodules-20260327-182422
frank/ruvnet--RuView:chore/update-submodules-20260327-122106
frank/ruvnet--RuView:chore/update-submodules-20260327-063353
frank/ruvnet--RuView:chore/update-submodules-20260327-004057
frank/ruvnet--RuView:chore/update-submodules-20260326-182756
frank/ruvnet--RuView:chore/update-submodules-20260326-122639
frank/ruvnet--RuView:chore/update-submodules-20260326-063245
frank/ruvnet--RuView:chore/update-submodules-20260326-004038
frank/ruvnet--RuView:chore/update-submodules-20260325-182518
frank/ruvnet--RuView:chore/update-submodules-20260325-122305
frank/ruvnet--RuView:chore/update-submodules-20260325-062936
frank/ruvnet--RuView:chore/update-submodules-20260325-003810
frank/ruvnet--RuView:chore/update-submodules-20260324-182603
frank/ruvnet--RuView:chore/update-submodules-20260324-122406
frank/ruvnet--RuView:chore/update-submodules-20260324-063018
frank/ruvnet--RuView:chore/update-submodules-20260324-003329
frank/ruvnet--RuView:chore/update-submodules-20260323-182250
frank/ruvnet--RuView:chore/update-submodules-20260323-122304
frank/ruvnet--RuView:chore/update-submodules-20260323-063351
frank/ruvnet--RuView:chore/update-submodules-20260323-004010
frank/ruvnet--RuView:chore/update-submodules-20260322-181250
frank/ruvnet--RuView:chore/update-submodules-20260322-121427
frank/ruvnet--RuView:chore/update-submodules-20260322-062324
frank/ruvnet--RuView:chore/update-submodules-20260322-003853
frank/ruvnet--RuView:chore/update-submodules-20260321-181210
frank/ruvnet--RuView:chore/update-submodules-20260321-121328
frank/ruvnet--RuView:chore/update-submodules-20260321-061839
frank/ruvnet--RuView:chore/update-submodules-20260321-003447
frank/ruvnet--RuView:feat/adr-065-happiness-seed-bridge
frank/ruvnet--RuView:chore/update-submodules-20260320-181818
frank/ruvnet--RuView:chore/update-submodules-20260320-121740
frank/ruvnet--RuView:chore/update-submodules-20260320-062450
frank/ruvnet--RuView:chore/update-submodules-20260320-003655
frank/ruvnet--RuView:chore/update-submodules-20260319-182322
frank/ruvnet--RuView:chore/update-submodules-20260319-121857
frank/ruvnet--RuView:chore/update-submodules-20260319-062736
frank/ruvnet--RuView:chore/update-submodules-20260319-003926
frank/ruvnet--RuView:chore/update-submodules-20260318-183443
frank/ruvnet--RuView:chore/update-submodules-20260318-122445
frank/ruvnet--RuView:chore/update-submodules-20260318-063020
frank/ruvnet--RuView:chore/update-submodules-20260318-003818
frank/ruvnet--RuView:chore/update-submodules-20260317-182617
frank/ruvnet--RuView:chore/update-submodules-20260317-122324
frank/ruvnet--RuView:chore/update-submodules-20260317-062959
frank/ruvnet--RuView:chore/update-submodules-20260317-003530
frank/ruvnet--RuView:chore/update-submodules-20260316-182626
frank/ruvnet--RuView:chore/update-submodules-20260316-122436
frank/ruvnet--RuView:chore/update-submodules-20260316-063935
frank/ruvnet--RuView:chore/update-submodules-20260316-004147
frank/ruvnet--RuView:feat/adr-063-mmwave-sensor-fusion
frank/ruvnet--RuView:chore/update-submodules-20260315-181329
frank/ruvnet--RuView:fix/issue-263-265-fall-thresh-4mb-flash
frank/ruvnet--RuView:chore/update-submodules-20260315-121539
frank/ruvnet--RuView:chore/update-submodules-20260315-062733
frank/ruvnet--RuView:chore/update-submodules-20260315-004148
frank/ruvnet--RuView:chore/update-submodules-20260314-181315
frank/ruvnet--RuView:feat/qemu-esp32s3-testing
frank/ruvnet--RuView:chore/update-submodules-20260314-121421
frank/ruvnet--RuView:chore/update-submodules-20260314-062119
frank/ruvnet--RuView:chore/update-submodules-20260314-003426
frank/ruvnet--RuView:chore/update-submodules-20260313-181616
frank/ruvnet--RuView:chore/update-submodules-20260313-121747
frank/ruvnet--RuView:chore/update-submodules-20260313-062316
frank/ruvnet--RuView:fix/provision-channel-mac-filter
frank/ruvnet--RuView:feat/ruvector-6stage-wasm-pipeline
frank/ruvnet--RuView:chore/update-submodules-20260313-003602
frank/ruvnet--RuView:feat/ruvector-wasm-browser-example
frank/ruvnet--RuView:chore/update-submodules-20260312-182247
frank/ruvnet--RuView:chore/update-submodules-20260312-121749
frank/ruvnet--RuView:chore/update-submodules-20260312-062400
frank/ruvnet--RuView:chore/update-submodules-20260312-003106
frank/ruvnet--RuView:chore/update-submodules-20260311-182406
frank/ruvnet--RuView:chore/update-submodules-20260311-121844
frank/ruvnet--RuView:chore/update-submodules-20260311-062253
frank/ruvnet--RuView:chore/update-submodules-20260311-003404
frank/ruvnet--RuView:chore/update-submodules-20260310-182149
frank/ruvnet--RuView:feat/desktop-training-ruvector
frank/ruvnet--RuView:chore/update-submodules-20260310-121849
frank/ruvnet--RuView:chore/update-submodules-20260310-062137
frank/ruvnet--RuView:chore/update-submodules-20260310-003324
frank/ruvnet--RuView:fix/206-save-settings-command
frank/ruvnet--RuView:chore/update-submodules-20260309-182220
frank/ruvnet--RuView:claude/rf-mincut-sensing-uHnQX
frank/ruvnet--RuView:chore/update-submodules-20260309-121830
frank/ruvnet--RuView:chore/update-submodules-20260309-062836
frank/ruvnet--RuView:feat/tauri-desktop-frontend
frank/ruvnet--RuView:chore/update-submodules-20260309-003648
frank/ruvnet--RuView:chore/update-submodules-20260308-181102
frank/ruvnet--RuView:chore/update-submodules-20260308-121328
frank/ruvnet--RuView:chore/update-submodules-20260308-061849
frank/ruvnet--RuView:chore/update-submodules-20260308-003703
frank/ruvnet--RuView:chore/update-submodules-20260307-181025
frank/ruvnet--RuView:chore/update-submodules-20260307-121304
frank/ruvnet--RuView:chore/update-submodules-20260307-061536
frank/ruvnet--RuView:chore/update-submodules-20260307-003454
frank/ruvnet--RuView:refactor/sprint2-code-quality
frank/ruvnet--RuView:fix/adr-049-cross-platform-wifi
frank/ruvnet--RuView:chore/update-submodules-20260306-181720
frank/ruvnet--RuView:fix/quality-engineering-170
frank/ruvnet--RuView:fix/observatory-mobile-responsive
frank/ruvnet--RuView:refactor/vendor-submodules
frank/ruvnet--RuView:fix/csi-sendto-enomem-crash
frank/ruvnet--RuView:fix/provision-tdm-edge-support
frank/ruvnet--RuView:docs/update-changelog-userguide-readme
frank/ruvnet--RuView:fix/ui-404-errors-and-mobile-ws
frank/ruvnet--RuView:feat/complete-vendor-and-edge-intel
frank/ruvnet--RuView:feat/add-vendor-deps
frank/ruvnet--RuView:feat/adr-039-edge-intelligence
frank/ruvnet--RuView:fix/issue-98-csi-mac-filtering
frank/ruvnet--RuView:fix/issue-86-live-demo-real-data
frank/ruvnet--RuView:ruvsense-full-implementation
frank/ruvnet--RuView:claude/use-cases-implementation-plan-tT4s9
frank/ruvnet--RuView:claude/wifi-densepose-ruvector-Gj3O9
frank/ruvnet--RuView:adr-028-esp32-capability-audit
frank/ruvnet--RuView:adr-027-cross-environment-domain-generalization
frank/ruvnet--RuView:claude/analyze-repo-structure-aOtgs
frank/ruvnet--RuView:feat/adr-024-contrastive-csi-embedding
frank/ruvnet--RuView:feat/windows-wifi-enhanced-fidelity
frank/ruvnet--RuView:feat/rust-ruvector-sensing-ui
frank/ruvnet--RuView:security/fix-critical-vulnerabilities
frank/ruvnet--RuView:claude/validate-code-quality-WNrNw
frank/ruvnet--RuView:claude/integrate-ruvector-rvf-mF1Hp
frank/ruvnet--RuView:claude/test-rust-update-python-Q2NLq
frank/ruvnet--RuView:claude/wifi-mat-disaster-detection-MxxnQ
frank/ruvnet--RuView:claude/rust-agent-swarm-port-UxwTT
frank/ruvnet--RuView:v1770
frank/ruvnet--RuView:v1767
frank/ruvnet--RuView:v1765
frank/ruvnet--RuView:v1762
frank/ruvnet--RuView:v1759
frank/ruvnet--RuView:v1753
frank/ruvnet--RuView:v1749
frank/ruvnet--RuView:v1746
frank/ruvnet--RuView:v1744
frank/ruvnet--RuView:v1740
frank/ruvnet--RuView:v1737
frank/ruvnet--RuView:v1734
frank/ruvnet--RuView:v1731
frank/ruvnet--RuView:v1728
frank/ruvnet--RuView:v1724
frank/ruvnet--RuView:v1721
frank/ruvnet--RuView:v1717
frank/ruvnet--RuView:v1714
frank/ruvnet--RuView:v1712
frank/ruvnet--RuView:v1709
frank/ruvnet--RuView:v1707
frank/ruvnet--RuView:v1701
frank/ruvnet--RuView:v1696
frank/ruvnet--RuView:v1692
frank/ruvnet--RuView:v1689
frank/ruvnet--RuView:v1686
frank/ruvnet--RuView:v0.9.0-beyond-sota
frank/ruvnet--RuView:v1681
frank/ruvnet--RuView:v1677
frank/ruvnet--RuView:v1675
frank/ruvnet--RuView:v1674
frank/ruvnet--RuView:v1669
frank/ruvnet--RuView:v1659
frank/ruvnet--RuView:v0.8.0-esp32
frank/ruvnet--RuView:v1647
frank/ruvnet--RuView:v0.7.1-esp32
frank/ruvnet--RuView:v1613
frank/ruvnet--RuView:v1611
frank/ruvnet--RuView:v1609
frank/ruvnet--RuView:v1606
frank/ruvnet--RuView:v1596
frank/ruvnet--RuView:v1590
frank/ruvnet--RuView:v1591
frank/ruvnet--RuView:v1588
frank/ruvnet--RuView:v1585
frank/ruvnet--RuView:v1583
frank/ruvnet--RuView:v1581
frank/ruvnet--RuView:v1579
frank/ruvnet--RuView:v1576
frank/ruvnet--RuView:v1574
frank/ruvnet--RuView:v1572
frank/ruvnet--RuView:v1570
frank/ruvnet--RuView:v1568
frank/ruvnet--RuView:v1566
frank/ruvnet--RuView:v1562
frank/ruvnet--RuView:v1560
frank/ruvnet--RuView:v1557
frank/ruvnet--RuView:v1555
frank/ruvnet--RuView:v1551
frank/ruvnet--RuView:v1553
frank/ruvnet--RuView:v1548
frank/ruvnet--RuView:v1544
frank/ruvnet--RuView:v1528
frank/ruvnet--RuView:v1506
frank/ruvnet--RuView:v1484
frank/ruvnet--RuView:v1451
frank/ruvnet--RuView:v1449
frank/ruvnet--RuView:v1450
frank/ruvnet--RuView:v1447
frank/ruvnet--RuView:v1448
frank/ruvnet--RuView:v1444
frank/ruvnet--RuView:v0.3.0-streaming-engine
frank/ruvnet--RuView:v1428
frank/ruvnet--RuView:v1421
frank/ruvnet--RuView:v1409
frank/ruvnet--RuView:v1408
frank/ruvnet--RuView:v1407
frank/ruvnet--RuView:v1406
frank/ruvnet--RuView:v1405
frank/ruvnet--RuView:v1404
frank/ruvnet--RuView:v1403
frank/ruvnet--RuView:v1402
frank/ruvnet--RuView:v0.12.0
frank/ruvnet--RuView:v1397
frank/ruvnet--RuView:v1388
frank/ruvnet--RuView:v0.11.0
frank/ruvnet--RuView:v1387
frank/ruvnet--RuView:v0.10.0
frank/ruvnet--RuView:v1365
frank/ruvnet--RuView:v0.9.0
frank/ruvnet--RuView:v1362
frank/ruvnet--RuView:v1339
frank/ruvnet--RuView:v1338
frank/ruvnet--RuView:v1336
frank/ruvnet--RuView:v1337
frank/ruvnet--RuView:v1335
frank/ruvnet--RuView:v1333
frank/ruvnet--RuView:v1330
frank/ruvnet--RuView:v1329
frank/ruvnet--RuView:v1328
frank/ruvnet--RuView:v1327
frank/ruvnet--RuView:v1326
frank/ruvnet--RuView:v1313
frank/ruvnet--RuView:v1316
frank/ruvnet--RuView:v1259
frank/ruvnet--RuView:v1261
frank/ruvnet--RuView:v1260
frank/ruvnet--RuView:v1258
frank/ruvnet--RuView:v1256
frank/ruvnet--RuView:v1251
frank/ruvnet--RuView:v1248
frank/ruvnet--RuView:v1.99.0-pip
frank/ruvnet--RuView:v1234
frank/ruvnet--RuView:v1235
frank/ruvnet--RuView:v1233
frank/ruvnet--RuView:v1231
frank/ruvnet--RuView:v1230
frank/ruvnet--RuView:v1229
frank/ruvnet--RuView:v1228
frank/ruvnet--RuView:v1225
frank/ruvnet--RuView:v1227
frank/ruvnet--RuView:v1226
frank/ruvnet--RuView:v1223
frank/ruvnet--RuView:v1224
frank/ruvnet--RuView:v1222
frank/ruvnet--RuView:v1221
frank/ruvnet--RuView:v1220
frank/ruvnet--RuView:v1219
frank/ruvnet--RuView:v1218
frank/ruvnet--RuView:v1217
frank/ruvnet--RuView:v1216
frank/ruvnet--RuView:v1201
frank/ruvnet--RuView:v0.7.0-esp32
frank/ruvnet--RuView:v0.6.9-esp32
frank/ruvnet--RuView:v0.6.8-esp32
frank/ruvnet--RuView:v0.6.7-esp32
frank/ruvnet--RuView:v1160
frank/ruvnet--RuView:v1155
frank/ruvnet--RuView:v1153
frank/ruvnet--RuView:v1152
frank/ruvnet--RuView:v1136
frank/ruvnet--RuView:v1057
frank/ruvnet--RuView:v1059
frank/ruvnet--RuView:v1061
frank/ruvnet--RuView:v1063
frank/ruvnet--RuView:v1065
frank/ruvnet--RuView:v1067
frank/ruvnet--RuView:v1069
frank/ruvnet--RuView:v1071
frank/ruvnet--RuView:v1073
frank/ruvnet--RuView:v1075
frank/ruvnet--RuView:v1077
frank/ruvnet--RuView:v1079
frank/ruvnet--RuView:v1081
frank/ruvnet--RuView:v1083
frank/ruvnet--RuView:v1085
frank/ruvnet--RuView:v1087
frank/ruvnet--RuView:v1089
frank/ruvnet--RuView:v1091
frank/ruvnet--RuView:v1093
frank/ruvnet--RuView:v1095
frank/ruvnet--RuView:v1097
frank/ruvnet--RuView:v1099
frank/ruvnet--RuView:v1101
frank/ruvnet--RuView:v1103
frank/ruvnet--RuView:v1105
frank/ruvnet--RuView:v1107
frank/ruvnet--RuView:v1109
frank/ruvnet--RuView:v1111
frank/ruvnet--RuView:v1113
frank/ruvnet--RuView:v1115
frank/ruvnet--RuView:v1117
frank/ruvnet--RuView:v1119
frank/ruvnet--RuView:v1121
frank/ruvnet--RuView:v1123
frank/ruvnet--RuView:v1127
frank/ruvnet--RuView:v1129
frank/ruvnet--RuView:v1131
frank/ruvnet--RuView:v1133
frank/ruvnet--RuView:v1125
frank/ruvnet--RuView:v1055
frank/ruvnet--RuView:v1056
frank/ruvnet--RuView:v1052
frank/ruvnet--RuView:v1049
frank/ruvnet--RuView:v1043
frank/ruvnet--RuView:v1046
frank/ruvnet--RuView:v1041
frank/ruvnet--RuView:v1039
frank/ruvnet--RuView:v1036
frank/ruvnet--RuView:v1037
frank/ruvnet--RuView:v1030
frank/ruvnet--RuView:v1032
frank/ruvnet--RuView:v1024
frank/ruvnet--RuView:v1027
frank/ruvnet--RuView:v1021
frank/ruvnet--RuView:v1018
frank/ruvnet--RuView:v0.6.6-esp32
frank/ruvnet--RuView:v1015
frank/ruvnet--RuView:v1013
frank/ruvnet--RuView:v1012
frank/ruvnet--RuView:v1011
frank/ruvnet--RuView:v1010
frank/ruvnet--RuView:v0.6.5-esp32
frank/ruvnet--RuView:v0.8.0
frank/ruvnet--RuView:v0.6.4-esp32
frank/ruvnet--RuView:v0.6.3-esp32
frank/ruvnet--RuView:v0.6.2-esp32
frank/ruvnet--RuView:v0.6.1-esp32
frank/ruvnet--RuView:v0.7.0
frank/ruvnet--RuView:v0.6.0-esp32
frank/ruvnet--RuView:v0.5.5-esp32
frank/ruvnet--RuView:v0.5.4-esp32
frank/ruvnet--RuView:v0.5.3-esp32
frank/ruvnet--RuView:v0.5.2-esp32
frank/ruvnet--RuView:v0.5.1-esp32
frank/ruvnet--RuView:v0.5.0-esp32
frank/ruvnet--RuView:v0.4.3.1-esp32
frank/ruvnet--RuView:v0.4.3-esp32
frank/ruvnet--RuView:v0.4.2-esp32
frank/ruvnet--RuView:v0.4.1-esp32
frank/ruvnet--RuView:datasets-v1.0.0
frank/ruvnet--RuView:desktop-v0.4.0
frank/ruvnet--RuView:v0.4.4
frank/ruvnet--RuView:v0.4.3
frank/ruvnet--RuView:desktop-v0.4.1
frank/ruvnet--RuView:v0.4.0-desktop
frank/ruvnet--RuView:desktop-v0.3.0
frank/ruvnet--RuView:v0.3.0-desktop-alpha
frank/ruvnet--RuView:v0.4.0-alpha-esp32
frank/ruvnet--RuView:v0.3.0-alpha-esp32
frank/ruvnet--RuView:v0.2.0-esp32
frank/ruvnet--RuView:v0.1.0-esp32
62 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ab1c90c106 |
merge: main into adr-110-esp32c6 — resolve lib.rs / esp32_parser / tracker_bridge conflicts
3 conflict points, all clean resolutions:
v2/crates/wifi-densepose-hardware/src/lib.rs
Conflict 1: mod declarations.
HEAD added `pub mod sync_packet;` (iter 14).
main re-ordered the existing mods alphabetically.
Resolution: take main's ordering + append sync_packet at the end.
Conflict 2: re-exports.
HEAD added `pub use sync_packet::{SyncPacket, …}` block (iter 14).
main moved bridge::CsiData earlier.
Resolution: keep main's CsiData position; add my sync_packet
re-export immediately before the radio_ops re-export.
v2/crates/wifi-densepose-hardware/src/esp32_parser.rs
HEAD has ADR-110 byte 18-19 PpduType + Adr018Flags parsing (iter 14).
main still has the pre-ADR-110 "Reserved (offset 18, 2 bytes)" skip.
Resolution: take HEAD — main hasn't pulled in ADR-110 work yet,
that's exactly why this PR exists.
v2/crates/wifi-densepose-sensing-server/src/tracker_bridge.rs
HEAD has my iter-35 import cleanup (use { TrackLifecycleState, TrackId,
NUM_KEYPOINTS }).
main has the equivalent cleanup with a different import ordering
(use { TrackId, TrackLifecycleState, NUM_KEYPOINTS }) + the
pose_tracker::PoseTracker import on the line above.
Resolution: take main's version — same end state, no behavioral
difference, less diff churn.
Verification:
cargo check -p wifi-densepose-hardware -p wifi-densepose-sensing-server
--no-default-features → green
cargo test -p wifi-densepose-hardware --no-default-features --lib sync_packet
→ 15/15 passed (122 filtered)
The 38-iter ADR-110 work is intact post-merge.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
a11537c00c |
docs(branch-state): /loop + /loop-worker lessons from the 38-iter ADR-110 sprint
Iter 39 — captures the 8 concrete lessons the SOTA /loop sprint learned
the hard way (cross-branch checkout incidents in iter 17-19, silent
absorption of foreign-branch Cargo.toml work in iter 18 → revert in
|
||
|
|
a036d6c27d |
fix(fuzz): stub c6_sync_espnow_is_valid for the fuzz-harness link path
Iter 38 — CI guard fix. The Firmware QEMU Tests (ADR-061) Fuzz Testing Layer 6 job was failing on PR #764 with: /usr/bin/ld: csi_collector.c:229: undefined reference to `c6_sync_espnow_is_valid' clang: error: linker command failed with exit code 1 Iter 11's csi_collector.c byte 19 bit 4 wire-fix added the OR'd call to c6_sync_espnow_is_valid(), but the fuzz target only links csi_collector.c against test/stubs/esp_stubs.c — not the real c6_sync_espnow.c implementation. The fuzz harness needed a stub. Fix: append a 1-line stub to esp_stubs.c that returns false. This matches the c6_timesync.h inline-fallback pattern: under non-ESP-NOW fuzz inputs the bit-4 sync-valid flag stays 0, which is the natural fuzz semantic. GHCI run that surfaced the bug: 26338405979 — Fuzz Testing (ADR-061 Layer 6) step. Next push will exercise the fix. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
9c49ff1a38 |
feat(adr-110): fleet cardinality gauge wifi_densepose_mesh_node_total
Iter 37 — adds a fleet-summary gauge to the iter-36 Prometheus
exposition. Ops dashboards now answer "how many leaders / followers
/ no-sync nodes are there right now" in one scrape, without having
to scrape every per-node series and aggregate client-side.
# HELP wifi_densepose_mesh_node_total Per-state node count across the fleet
# TYPE wifi_densepose_mesh_node_total gauge
wifi_densepose_mesh_node_total{state="leader"} 1
wifi_densepose_mesh_node_total{state="follower"} 2
wifi_densepose_mesh_node_total{state="no_sync"} 0
- leader / follower split derived from snapshot.is_leader
- no_sync = total_nodes_in_state - nodes_with_snapshot
(so a node that has sent CSI frames but never a sync packet
shows up here, which is what an operator wants to alert on)
Implementation factored as a free function `fleet_role_counts` so the
math is testable without spinning up the axum handler. Same pattern
iter 18 (update_csi_fps_ema) and iter 30 (sync_snapshot) used.
Test added (9/9 sync_snapshot_helper_tests now green):
fleet_role_counts_classifies_correctly
Three cases:
- empty fleet → (0, 0)
- 1 leader + 2 followers → (1, 2)
- all-leaders edge case → (2, 0) (election prevents this in
practice but the gauge math must still be consistent)
Useful Grafana queries this unlocks:
- sum(wifi_densepose_mesh_node_total{state="follower"})
→ total reachable follower count
- wifi_densepose_mesh_node_total{state="no_sync"} > 0
→ alert when any node has dropped off the mesh
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
74eb09f604 |
feat(adr-110): Prometheus exposition endpoint /api/v1/mesh/metrics
Iter 36 — Grafana / Home Assistant Prometheus integration / Cognitum
Seed observability stack can now scrape mesh state directly with no
JSON-to-metric translation layer.
Endpoint: GET /api/v1/mesh/metrics → text/plain (Prometheus exposition
format v0.0.4). Eight gauges, one per NodeSyncSnapshot field, labeled
by node:
wifi_densepose_mesh_offset_us{node="N"} <signed-int>
wifi_densepose_mesh_is_leader{node="N"} 0|1
wifi_densepose_mesh_is_valid{node="N"} 0|1
wifi_densepose_mesh_smoothed{node="N"} 0|1
wifi_densepose_mesh_sequence{node="N"} <u32>
wifi_densepose_mesh_csi_fps{node="N"} <float>
wifi_densepose_mesh_csi_fps_samples{node="N"} <u32>
wifi_densepose_mesh_staleness_ms{node="N"} <u64>
Each metric carries the standard `# HELP` + `# TYPE` headers before
its series block, exactly the format Prometheus + most scrape-format
implementations expect.
Implementation reuses iter-30's `NodeState::sync_snapshot()` as the
single source of truth — same data the JSON endpoints emit, just
text-formatted with `{node=...}` labels. Nodes without a fresh sync
are absent (Prometheus handles missing series natively).
Test added (8/8 sync_snapshot_helper_tests now green):
bool_metric_returns_zero_or_one_as_text
Pins the Prometheus convention that boolean gauges emit "0" or "1"
literally, never "false"/"true" — if anyone refactors the helper
to format!("{b}"), Prometheus would 400-reject the scrape; this
test catches that drift before production.
User-guide REST table updated with the new endpoint.
Grafana / HA scrape config:
- job_name: wifi-densepose-mesh
scrape_interval: 5s
metrics_path: /api/v1/mesh/metrics
static_configs:
- targets: ['localhost:3000']
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
883765150c |
chore(sensing-server): drop unused tracker_bridge imports
Iter 35 — every cargo check / cargo test since iter 15 has emitted the
same warning:
warning: unused imports: `KeypointState`, `PoseTrack`, and `self`
--> crates/wifi-densepose-sensing-server/src/tracker_bridge.rs:10
The three unused names date from before the bridge was refactored
to use the `pose_tracker::PoseTracker` direct import on line 12.
Removing them clears the noise without changing any behavior — the
file's actual uses (`TrackLifecycleState`, `TrackId`, `NUM_KEYPOINTS`)
stay imported via the narrowed `use { ... }` list.
After this commit `cargo check -p wifi-densepose-sensing-server` shows
only the pre-existing `rvf_container.rs:128 associated function 'new'
is never used` warning, which is unrelated to ADR-110 and out of scope
for this loop.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
f6a85fe7db |
feat(adr-110): NodeSyncSnapshot.staleness_ms — sync age in milliseconds
Iter 34 — adds an optional `staleness_ms` field to the iter-23
NodeSyncSnapshot that exposes (Instant::now() - latest_sync_at).
Dashboards / Prometheus exporters / UI badges can now decay sync
freshness without re-deriving it from latest_sync_at on the host.
Wire compatibility: new field is `#[serde(skip_serializing_if =
"Option::is_none")]` so pre-iter-34 clients that strict-parse via
serde + deny_unknown_fields are unaffected (default serde_json
strategy is to ignore unknown fields anyway).
Sensing-server changes:
+ NodeSyncSnapshot.staleness_ms: Option<u64>
+ sync_snapshot() populates it via latest_sync_at.elapsed().as_millis()
+ iter-24 serialization tests now check 8 contract fields, not 7
+ new test `snapshot_staleness_ms_tracks_apply_time` pins
latest_sync_at to a past Instant and asserts the snapshot reports
~750 ms staleness with ±500 ms tolerance for scheduler delay
User-guide updates:
+ REST/WebSocket field table grows a `staleness_ms` row with the
UI-rendering thresholds (fade at 5 s, drop at 9 s to match the
firmware's VALID_WINDOW_MS-derived gate).
Tests passing:
sync_snapshot_helper_tests: 7/7
node_sync_snapshot_serialization_tests: 3/3 (8-field assertion green)
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
bea7edee1f |
test(adr-110): lock the 9-second staleness gate on mesh_aligned_us_for_csi_frame
Iter 33 — closes a real test-coverage gap. The iter 17 staleness gate (returns None when latest_sync_at is older than 9 s = 3 × the firmware's VALID_WINDOW_MS) was shipped but never directly tested. A future careless edit changing `from_secs(9)` to e.g. `from_secs(90)` would silently break ADR-029/030 multistatic fusion freshness guarantees. Test (3 assertions, no sleep — uses `Instant::checked_sub` to set latest_sync_at to past values directly): * 1 s old → Some (fresh) * 8 s old → Some (just inside the gate) * 10 s old → None (just outside the gate) If anyone widens or narrows the gate, exactly one of these assertions fires and points at the off-by-one. Total time for the test < 1 ms. sync_snapshot_helper_tests: 6/6 green. Branch-coord clean — main.rs only. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
8805c8ec0b |
test+refactor(adr-110): NodeState::apply_sync_packet + 2 tests for the receive-side dispatch
Iter 32 — completes the helper-extraction discipline started in iter 30.
The iter 15 inline `ns.latest_sync = Some(sync); ns.latest_sync_at = ...`
was the LAST untested receive-side mutation; now it's a named method
with 2 tests covering its full state-transition surface.
Refactor:
Add `NodeState::apply_sync_packet(pkt, now)` taking an Instant so
the test can pass deterministic timing.
udp_receiver_task now calls the method instead of touching the
fields inline — one less place to break the staleness gate.
Tests (2 new — sync_snapshot_helper_tests module now at 5 tests):
apply_sync_packet_populates_a_fresh_node
Mirrors udp_receiver_task's first-packet-from-unknown-node path:
asserts latest_sync goes from None → Some, latest_sync_at matches
the passed Instant exactly (no clock skew from real Instant::now()),
and sync_snapshot() now returns Some (REST 200 OK path lit up).
apply_sync_packet_overwrites_older_data
Subsequent packets must replace, not accumulate. Asserts sequence,
local_us advance, and the staleness clock resets. This is what
keeps the §A0.10-smoothed offset tracking the latest beacon rather
than drifting with stale state.
cargo test sync_snapshot_helper → 5/5 green.
Branch-coord clean — no Cargo.toml / cli.rs touched.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
473c5d11db |
docs(adr-110): user-guide REST docs for /api/v1/mesh and /api/v1/nodes/:id/sync
Iter 31 — parallels the iter 25 WebSocket sync docs with the matching
HTTP surface. Adds 2 rows to the REST API table + a worked "Get fleet
mesh state" example showing the sample JSON for two C6 boards (leader
+ follower) so operators see the leader's near-zero offset alongside
the follower's §A0.10-measured 1.16 s delta in the same response.
Also covers the 404 paths the iter 29 handlers actually emit:
- {"error": "unknown_node", "node_id": N}
- {"error": "no_sync", "node_id": N, "hint": "..."}
The "hint" field is verbatim so operators searching docs for the
string they see in curl output land here.
Links back to the existing "Per-node mesh sync (ADR-110)" section
for field meanings instead of duplicating them — one source of truth.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
a07deb9180 |
test+refactor(adr-110): NodeState::sync_snapshot + 3 helper tests, dedupe 4 call sites
Iter 30 — defends the iter 29 REST endpoints + iter 23 WebSocket
broadcast with tests, AND deduplicates the four call sites that all
built the same NodeSyncSnapshot inline.
Refactor:
Add `NodeState::sync_snapshot() -> Option<NodeSyncSnapshot>` as the
single source of truth. All four call sites simplified:
1. node_sync_endpoint (REST /api/v1/nodes/:id/sync) — 12 → 5 lines
2. mesh_endpoint (REST /api/v1/mesh) — 11 → 3 lines
3. WebSocket vitals-only NodeInfo (line 4284) — 9 → 1 line
4. WebSocket CSI-frame NodeInfo (line 4617) — 9 → 1 line
Net: -35 lines, single point of contact for any future schema change.
Tests (3 new, all green; brings binary suite to 95+):
fresh_node_with_no_sync_returns_none
Mirrors REST 404 "no_sync" + WebSocket sync omission paths.
node_with_latest_sync_produces_correct_snapshot
Mirrors REST 200 OK + WebSocket sync field paths.
Asserts §A0.10's measured 1_163_565 µs offset survives the helper.
snapshot_reflects_leader_state
Leader-case shape: is_leader=true, offset≈0 (–7 µs call-stack).
These tests cover BOTH REST routes and BOTH WebSocket NodeInfo sites
through the shared helper — one test per behavioral path, no axum
state plumbing required. cargo check -p ...sensing-server → green.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
c6a0d5dbf5 |
feat(adr-110): REST endpoints /api/v1/nodes/:id/sync and /api/v1/mesh
Iter 29 — extends the iter 23 WebSocket NodeSyncSnapshot publication
with an HTTP surface so non-streaming clients (curl scripts, Home
Assistant REST sensors, Prometheus exporters, automation rule probes)
can poll mesh state without holding a WebSocket connection.
GET /api/v1/nodes/:id/sync
200 → Json(NodeSyncSnapshot) when latest_sync is present
404 → {"error": "unknown_node" | "no_sync", "node_id": N}
— "no_sync" includes a `hint` pointing operators at the
"no mesh peer or not v0.6.9+" diagnostic.
GET /api/v1/mesh
200 → { "nodes": { "<id>": NodeSyncSnapshot, ... }, "total": N }
Nodes without a recent sync are omitted; an empty `nodes` object
means no mesh peers reachable.
Both handlers reuse the iter 23 NodeSyncSnapshot struct (same JSON
shape as the WebSocket broadcast — clients get one schema, two
delivery modes). The Path<u8> extractor returns 404 on overflow
automatically (axum), so /api/v1/nodes/256/sync gives a clean error.
cargo check -p wifi-densepose-sensing-server --no-default-features → green.
Curl quick-start (added to operator playbook material in a follow-up):
curl http://localhost:3000/api/v1/mesh # full fleet
curl http://localhost:3000/api/v1/nodes/9/sync # one node
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
7eeb265ebc |
docs(adr-index): surface ADR-110 review/witness/branch-state docs
Iter 28 — the ADR-110 row in the index used to mention only the witness log. Expand it to also link the review guide and branch-state map, plus headline the v0.7.0 firmware release and the §A0.10 measured numbers (99.56% cross-board RX, 104.1 µs smoothed sync stdev) so reviewers see the empirical evidence at glance. Adds the host-decoder summary inline (Python 10 tests + Rust 15 tests + cross-language hex pin) so the test surface is visible without clicking through. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
9f75ea4092 |
docs(changelog): Wave 5 entry for iter 13-26 host-side ADR-110 work
Iter 27 — captures everything that landed since the Wave 4 v0.6.8 entry: v0.6.9 sync packet emission, v0.7.0 byte-19 bit-4 wire-fix, full Python + Rust decoder API parity (25 unit tests), sensing-server consumes sync packets + applies measured-fps EMA, NodeSyncSnapshot in WebSocket sensing_update JSON (3 serialization tests), user-guide "Per-node mesh sync (ADR-110)" section, branch-coordination docs, 1437-test workspace verification baseline. The CHANGELOG entry references every test count and witness section so reviewers can trace any claim back to a concrete test or §A0.x log entry. No more "see commits" — the changelog states the substantive changes and their evidence. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
dbcbac1d43 |
feat(adr-110): Python SyncPacket API parity with Rust (apply_to_local + interpolation)
Iter 26 — closes the ABI gap between the Python and Rust SyncPacket
decoders. Before this, Python could decode the wire but had no helpers
to apply offsets or recover per-frame mesh time; any Python-side tooling
(host scripts, replay analysers, notebooks) would have to re-implement
the math from scratch and could drift from Rust silently.
New methods on the Python SyncPacket dataclass:
local_minus_epoch_us() -> int
Signed local-vs-mesh offset. Matches Rust byte-for-byte.
apply_to_local(local_at_frame_us: int) -> int
offset = epoch_us - local_us
return local_at_frame_us + offset
Identity at local_at_frame_us == self.local_us returns epoch_us.
mesh_aligned_us_for_sequence(frame_seq: int, fps_hz: float) -> int
Sequence-based interpolation matching Rust's identical method.
Includes u32 wraparound handling via masked-subtract — verified
against Rust's iter 17 `mesh_aligned_for_sequence_handles_seq_wraparound`.
3 new Python tests (10 total in TestSyncPacketParser, all green in 0.24s):
test_apply_to_local_recovers_epoch_at_sync_point
Identity at the sync point. Also verifies local_minus_epoch_us()
matches §A0.10's measured 1,163,565 µs bench number.
test_apply_to_local_preserves_inter_frame_delta
Frame arriving 5 s after the sync on the follower's local clock
produces mesh time exactly 5 s after sync.epoch_us.
test_mesh_aligned_us_for_sequence_matches_rust
Cross-language parity with Rust's
`end_to_end_sync_decode_then_frame_mesh_recovery` (iter 20):
100 frames after sync.sequence at 20 fps = sync.epoch_us + 5 s.
Cross-checks via apply_to_local — both paths must agree.
Test count after iter 26:
Python TestSyncPacketParser: 10/10 (was 7/7)
Rust sync_packet::tests: 15/15
Combined: 25 unit tests defending the SyncPacket contract across
the two host language stacks.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
9924db1c7b |
docs(adr-110): document the WebSocket sync field in user-guide
Iter 25 — converts iter 23's NodeSyncSnapshot from "exists in the JSON" to "documented for UI integrators". Adds a new subsection 'Per-node mesh sync (ADR-110)' under WebSocket Streaming with: - Full sample sensing_update payload showing the optional `sync` object - Field-by-field table (offset_us / is_leader / is_valid / smoothed / sequence / csi_fps_ema / csi_fps_samples) with type, bench-derived reference values, and links back to §A0.10 - Explicit "when sync is omitted" rules — backwards compat for pre-iter-23 UI clients - Rendering recommendations for UI authors (Leader badge / Sync lost / Calibrating / jitter histogram) - Step-by-step recipe for recovering a mesh-aligned timestamp for any CSI frame from its sequence number + the sync snapshot, so ADR-029/030 multistatic consumers have a quick reference The sample JSON values match iter 24's serialization tests byte-for-byte, so the docs and tests can't drift independently. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
e764504dc5 |
test(adr-110): lock NodeSyncSnapshot JSON wire contract (iter 24)
Iter 24 — ultra-opt for public-API stability. Iter 23 added a new JSON
field that UI clients (viz.html, future Tauri desktop, automation) now
depend on; this iter locks its exact shape so any future rename /
removal fails a named test instead of silently breaking consumers.
New module `node_sync_snapshot_serialization_tests` (3 tests, all green):
* sync_present_serializes_all_seven_fields
Builds NodeInfo with Some(sample_sync), serializes to serde_json::Value,
asserts all 7 documented field names exist (offset_us, is_leader,
is_valid, smoothed, sequence, csi_fps_ema, csi_fps_samples) and
spot-checks numeric values.
* sync_absent_omits_the_key_entirely
Builds NodeInfo with sync = None, asserts the `sync` JSON key is
DROPPED entirely (not emitted as `"sync": null`). This is the
backwards-compat contract that lets pre-iter-23 UI clients ignore
mesh-aware nodes silently.
* sync_round_trips_through_serde
to_string / from_str round-trip on a populated NodeInfo recovers
every field of the sync sub-object byte-for-byte (modulo float tol).
Test infrastructure: pure pure serde_json — no network, no fixtures,
no I/O. Adds 92 lines, 0 runtime allocs in the steady path.
Branch-coord clean (no Cargo.toml or cli.rs touched).
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
41f28ae85e |
feat(adr-110): surface NodeSyncSnapshot in WebSocket sensing_update JSON
Iter 23 — converts the iter 1-21 firmware-side mesh substrate from
"works internally" to "visible to UI clients". WebSocket sensing_update
broadcasts now carry a per-node optional `sync` object exposing the
mesh state the iter 15-22 wire and storage capture:
{
"type": "sensing_update",
...
"nodes": [
{
"node_id": 9,
...
"sync": {
"offset_us": 1163565, // §A0.10's measured 1.16 s
"is_leader": false,
"is_valid": true,
"smoothed": true, // EMA seeded
"sequence": 20, // §A0.12 pairing key
"csi_fps_ema": 10.0, // iter 18 measured rate
"csi_fps_samples": 47 // ≥5 means trust csi_fps_ema
}
}
],
...
}
`sync` is `Option<NodeSyncSnapshot>` with `#[serde(skip_serializing_if =
"Option::is_none")]` so non-mesh paths (multi-BSSID scan / synthetic RSSI
/ simulation) emit no `sync` key — preserves backwards compatibility
with existing UI clients.
Plumbed into all four NodeInfo construction sites:
1. multi-BSSID scan path → sync: None
2. synthetic-RSSI fallback → sync: None
3. simulated frame path → sync: None
4. real ESP32 CSI path (line 4528) → sync: snapshot from NodeState
5. ADR-039 vitals-only path (line 4207) → sync: snapshot from NodeState
cargo check -p wifi-densepose-sensing-server --no-default-features → green.
UI clients (viz.html, future Tauri desktop, downstream automation) can
now render leader/follower badges, jitter histograms, and the §A0.10
clock-skew trajectory without any further firmware or aggregator work.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
dc20c87a68 |
docs(adr-110): branch-state map for ADR-110 ↔ ADR-115 coordination
Iter 22 — defensive ultra-opt after iter 17-19 burned ~30 minutes
recovering from cross-branch checkouts. Reference card so the next
collaborator (or the next /loop) doesn't have to re-derive the layout
from git log.
Captures:
* Branch ownership table (who owns adr-110-esp32c6 vs
feat/adr-115-ha-mqtt-matter, what each carries, what to NOT merge)
* File-level region map for the two shared files
(Cargo.toml + sensing-server/src/main.rs) — the regions are
DISJOINT so merges should be clean line-merge with no conflicts
* Quick verification commands for either branch
* Recovery procedure pointer to iter 18 commit
|
||
|
|
82be960de5 |
test(adr-110): cross-language wire-format conformance gate
Iter 21 — ultra-opt for protocol correctness across the two production decoders. Pin the same 32-byte canonical hex in both Python and Rust tests; if either decoder drifts from the wire, ONE of the tests starts failing — and it's clear which side moved. Canonical packet: COM9 sync-pkt #1 from §A0.12 live capture, expressed as exact little-endian bytes: 10a111c5 09 01 06 00 magic + node + ver + flags + rsvd f26db70100000000 local_us = 28_798_450 c5aca50100000000 epoch_us = 27_634_885 1400000000000000 sequence = 20 + reserved Python test: archive/v1/tests/unit/test_esp32_binary_parser.py::TestSyncPacketParser ::test_canonical_wire_bytes_match_rust_decoder — decodes the pinned hex, asserts every field including the §A0.10 1,163,565 µs offset. Rust test: v2/crates/wifi-densepose-hardware/src/sync_packet.rs::tests ::canonical_wire_bytes_match_python_decoder — decodes the same bytes, asserts the same fields, then re-encodes via to_bytes() and asserts the round-trip produces the EXACT same 32 bytes. So this also catches drift in the Rust encoder. Test counts after this iter: Rust sync_packet: 15/15 green (was 14) Python SyncPacketParser: 7/7 green (was 6) Branch contract: if a future PR changes the firmware wire format, BOTH tests must be updated atomically with the new canonical hex. CI will gate this naturally. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
40bd6b81b8 |
test(adr-110): end-to-end sync decode → frame mesh recovery integration test
Iter 20 — defensive ultra-opt: one test that exercises the entire iter 14→17 chain in a single assertion, so any future refactor that breaks the contract surfaces as a single, named regression instead of 14 unit-test diffs to triangulate. 1. firmware emits sync packet (bytes built here as a stand-in) 2. host decodes via SyncPacket::from_bytes — assert round-trip 3. a CSI frame arrives 100 sequences later (≈ 5 s @ 20 fps) 4. mesh_aligned_us_for_sequence recovers the mesh timestamp 5. cross-check: same value via raw apply_to_local Asserts mesh_us == sync.epoch_us + 5_000_000 µs exactly, plus both paths (sequence-interpolation + direct local→mesh) agree byte-for-byte. Result: 14/14 sync_packet tests pass, full wifi-densepose-hardware crate at 136/136 (no regression from iter 1-19). Contract for any ADR-029/030 multistatic fusion consumer is now defended by a test that fails loud if either piece of the chain drifts. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
898a2d7d9f |
feat(adr-110): wire observe_csi_frame_arrival into CSI receive path
Iter 19 — without this call, iter 18's EMA fps tracking was dead code because csi_fps_samples stayed 0 forever and mesh_aligned_us_for_csi_frame always fell back to the 20 Hz constant. In udp_receiver_task's parse_esp32_frame branch, replace the bare last_frame_time assignment with NodeState::observe_csi_frame_arrival, which computes dt vs last_frame_time, feeds update_csi_fps_ema (α=1/8), bumps csi_fps_samples, and sets last_frame_time as a side effect (same value the bare assignment did). Effect: after ~5 CSI frames arrive from any node, mesh_aligned_us_for_csi_frame returns interpolated timestamps using the node's actually-observed frame rate instead of the 20 Hz default. Real bench rate was ~10 fps, so this halves the per-frame timestamp error in §A0.12-style multistatic alignment. cargo check -p wifi-densepose-sensing-server --no-default-features → green. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
0dfa3d46aa |
feat(adr-115): P1 — Cargo features + CLI flags for MQTT/Matter/Semantic
Adds `mqtt` and `matter` Cargo features (default off) plus 20+ new CLI
flags wired through cli.rs per ADR-115 §3.8 / §3.10 / §3.11 / §3.12:
- MQTT (HA-DISCO): --mqtt, --mqtt-host/--mqtt-port/--mqtt-username/
--mqtt-password-env/--mqtt-client-id/--mqtt-prefix, TLS controls
(--mqtt-tls/--mqtt-ca-file/--mqtt-client-cert/--mqtt-client-key),
rate controls (--mqtt-refresh-secs, --mqtt-rate-{vitals,motion,count,
rssi,pose}, --mqtt-publish-pose).
- Privacy (ADR-106): --privacy-mode strips HR/BR/pose pre-publish.
- Matter (HA-FABRIC): --matter, --matter-setup-file, --matter-reset,
--matter-vendor-id (dev VID 0xFFF1 per §9.9), --matter-product-id.
- Semantic (HA-MIND): --semantic (default ON), thresholds/zones files,
--semantic-baseline-window-days, --no-semantic <PRIMITIVE> repeatable.
rumqttc 0.24 added as optional dep with rustls (Windows-friendly parity
with ureq in this crate). matter-rs deferred to P7 spike per §9.10.
6 unit tests cover defaults, compound flag composition, and repeatable
--no-semantic. Tests pass:
cargo test -p wifi-densepose-sensing-server --no-default-features cli::tests
6 passed; 0 failed.
Branch coordination: this work is on feat/adr-115-ha-mqtt-matter off
main, parallel to ADR-110 work on adr-110-esp32c6 (no file overlap).
Refs #776 (ADR-115 implementation tracking issue).
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
4705fb5ae8 |
feat(adr-115): ADR + P1 — MQTT/Matter/Semantic CLI plumbing (refs #776)
ADR-115 lands the dual-protocol HA integration design:
- MQTT auto-discovery (HA-DISCO) carrying full RuView telemetry
- Matter Bridge (HA-FABRIC) carrying the standardised subset across
Apple Home / Google Home / Alexa / SmartThings / HA
- Semantic Automation Primitives (HA-MIND) — 10 v1 inferred states
(someone-sleeping, possible-distress, room-active, elderly-anomaly,
meeting-in-progress, bathroom-occupied, fall-risk-elevated, bed-exit,
no-movement, multi-room-transition) that turn raw signals into HA
entities, Matter events, and Apple Home scene triggers — the inference
layer that moves RuView from "RF sensing" to "ambient intelligence
infrastructure". All 13 §9 open questions ACK'd by maintainer.
P1 (this commit) — `mqtt` and `matter` Cargo features (default off) +
20+ new CLI flags wired through cli.rs:
- --mqtt / --mqtt-host / --mqtt-port / --mqtt-username /
--mqtt-password-env / --mqtt-client-id / --mqtt-prefix /
--mqtt-tls / --mqtt-ca-file / --mqtt-client-cert / --mqtt-client-key
- --mqtt-refresh-secs / --mqtt-rate-{vitals,motion,count,rssi,pose} /
--mqtt-publish-pose
- --privacy-mode (ADR-106 primitive-isolation contract)
- --matter / --matter-setup-file / --matter-reset /
--matter-vendor-id (dev VID 0xFFF1 per §9.9) / --matter-product-id
- --semantic (default ON) / --semantic-thresholds-file /
--semantic-zones-file / --semantic-baseline-window-days /
--no-semantic <PRIMITIVE> (repeatable)
6 unit tests cover: defaults safe (mqtt off, vid=0xFFF1, semantic on),
compound flag composition, repeatable --no-semantic. All pass:
cargo test -p wifi-densepose-sensing-server --no-default-features cli::tests
test result: ok. 6 passed; 0 failed.
rumqttc 0.24 added as optional dep (gated behind `mqtt` feature) with
rustls instead of openssl for Windows parity with the rest of the
workspace. matter-rs intentionally absent until P7 spike validates the
SDK choice (§9.10).
Coordinates with ADR-110 work (different branch, different files).
This branch is feat/adr-115-ha-mqtt-matter off main. ADR-110 work
continues on adr-110-esp32c6.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
ca2059b07f |
fix(branch-coord): revert ADR-115 Cargo.toml/cli.rs that slipped into iter 18
Iter 18's commit
|
||
|
|
2997165bc1 |
feat(adr-110): per-node measured CSI fps + EMA for mesh-time interpolation
Iter 18 (after recovery from a cross-branch slip — see commit-history
context below). Replaces the hardcoded 20 Hz CSI_FPS_HZ constant in
mesh_aligned_us_for_csi_frame with a per-node EMA of observed
inter-frame intervals, falling back to 20 Hz until ≥5 samples land.
Real bench data (§A0.12 captures) showed the actual CSI rate at ~10 fps
because the firmware's CSI_MIN_SEND_INTERVAL_US gate combined with
ruv.net's traffic level paces it to that. Using 20 Hz against actual
10 fps inflates Δus 2× and shifts the recovered mesh timestamp by up
to the inter-sync interval / 2 = ~1 s. Measured fps fixes that.
State on NodeState:
csi_fps_ema: f64 — EMA (seeded at 20.0)
csi_fps_samples: u32 — counts inter-frame deltas observed
API:
NodeState::observe_csi_frame_arrival(now) — call once per CSI frame
from udp_receiver_task
update_csi_fps_ema(prev_fps, dt_sec) -> Option<f64> — free fn,
testable
mesh_aligned_us_for_csi_frame now uses the measured fps when samples ≥ 5,
falls back to 20 Hz otherwise.
4 unit tests (fps_ema_tests module, all passing on the binary):
* steady_10hz_converges_toward_10 — 40 samples at 100 ms converge to ±0.1 Hz
* steady_20hz_stays_near_20 — 20 samples at 50 ms stay within 0.05 Hz
* nonpositive_dt_rejected — dt ≤ 0 returns None
* long_gap_rejected_as_implausible — dt > 1 s rejected (likely a dropout)
Branch-coordination note: this iter's working tree was briefly applied
to feat/adr-115-ha-mqtt-matter by a `git checkout` between iter 17 and
iter 18. Stashed the ADR-115 agent's MQTT/Matter Cargo.toml work
(`stash@adr115-pending-work`) before switching back here. No code lost.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
0c311a202b |
feat(adr-110): SyncPacket::mesh_aligned_us_for_sequence (interpolation) + NodeState hook
Iter 17 — closes the per-frame mesh-time loop for ADR-018 CSI frames
that carry no per-frame local_us field (the v1 wire format reserves no
slot — see WITNESS-LOG-110 §A0.11).
Math: pair the frame's sequence number against the sync packet's
sequence high-water + an assumed CSI frame rate. Δframes × 1/fps
estimates the node-local delta from the sync, then apply_to_local
recovers the mesh epoch.
SyncPacket::mesh_aligned_us_for_sequence(frame_seq: u32, fps_hz: f64) -> u64
3 new unit tests (13 total in sync_packet::tests, all green):
* mesh_aligned_for_sequence_identity_at_sync_point — at sync.sequence
returns sync.epoch_us exactly
* mesh_aligned_for_sequence_extrapolates_forward — 20 frames @ 20 fps
extrapolates by exactly 1 s
* mesh_aligned_for_sequence_handles_seq_wraparound — u32 sequence
wrap doesn't jump backward by 2^32 (wrapping_sub guards it)
NodeState hook:
NodeState::mesh_aligned_us_for_csi_frame(frame_sequence: u32) -> Option<u64>
Wraps the SyncPacket method, defaults fps_hz=20.0 (matches the
firmware's CSI_MIN_SEND_INTERVAL_US-implied ceiling), enforces the
same 9 s staleness gate as mesh_aligned_us.
cargo check -p wifi-densepose-sensing-server --no-default-features → green.
cargo test -p wifi-densepose-hardware sync_packet → 13/13, 122 filtered.
Downstream ADR-029/030 multistatic fusion code can now do:
if frame.adr018_flags.ieee802154_sync_valid {
if let Some(mesh_us) = ns.mesh_aligned_us_for_csi_frame(frame.sequence) {
// pair this frame with frames from sibling nodes by mesh_us
}
}
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
df95360e52 |
feat(adr-110 P10): apply_to_local + NodeState::mesh_aligned_us + full ADR rewrite
Iter 16 closes the math loop and updates ADR-110 to reflect the full
P1-P10 sprint outcome (per user request).
Code (the math layer that converts the iter 15 stored sync into a
per-frame mesh-aligned timestamp):
wifi-densepose-hardware:
SyncPacket::apply_to_local(local_at_frame_us: u64) -> u64
Pure integer math: offset = epoch - local; mesh = local_at_frame + offset.
3 new unit tests (10 total, all green):
- apply_to_local_recovers_packet_epoch (identity at the packet's local_us)
- apply_to_local_preserves_inter_frame_delta (Δlocal == Δmesh)
- apply_to_local_on_leader_is_near_identity (leader offset ≈ 0)
wifi-densepose-sensing-server:
NodeState::mesh_aligned_us(local_at_frame_us: u64) -> Option<u64>
Returns the recovered mesh timestamp using the most-recent sync
packet, or None if no sync seen or last one older than 9 s
(3× firmware VALID_WINDOW_MS = 9 s staleness gate).
cargo check -p wifi-densepose-sensing-server --no-default-features
→ green
ADR-110 substantial rewrite (per user "update adr 110 with details"):
- Status line: P1-P10 complete, firmware-side substrate closed at v0.7.0.
- Front matter now lists all 4 firmware releases + witness link.
- Phase table grows a P10 row capturing the v0.6.8 / v0.6.9 / v0.7.0
arc (EMA smoother + sync packet + bit-4 wire-fix + host crates).
- New §4.1 — /loop 5m SOTA sprint summary table (iters 1-16, 4 releases,
17 commits, 13 unit tests, what shipped each iter).
- New §4.2 — measured numbers table with 99.56% RX, 104.1 µs smoothed
stdev, 3.95x suppression, 1.4 ppm crystal skew, etc — every cell
backed by a witness §A0.x entry and a preserved bench log.
- New §4.3 — host-side production surface listing (sync_packet.rs +
sensing-server NodeState + Python parser, with file paths).
- §5 open question on 802.15.4 channel resolved (Kconfig, default ch26
not ch15, with the witness §D1 rationale).
- New §6 — explicit scope of what's outside this ADR (multistatic fusion
math in ADR-029/030, hardware-gated measurements needing INA / 11ax AP,
IDF upstream fixes pending).
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
23fd8ac371 |
feat(sensing-server): consume ADR-110 §A0.12 sync packets, store per-node
Iter 15 — converts the iter 14 SyncPacket decoder from "shipped" to
"consumed" by wiring it into the sensing-server UDP receive loop.
Wiring:
- Cargo.toml gains wifi-densepose-hardware = path = "../wifi-densepose-hardware"
to pull in the SyncPacket decoder + SYNC_PACKET_MAGIC dispatch constant.
- NodeState gains two new fields:
latest_sync: Option<SyncPacket> — the parsed packet
latest_sync_at: Option<std::time::Instant> — staleness clock
- udp_receiver_task now magic-dispatches every incoming datagram against
SYNC_PACKET_MAGIC (0xC511A110) before falling through to the existing
ADR-039 vitals / ADR-040 WASM / ADR-018 CSI parsers. Same Option-returning
pattern as the other parsers, so future packet types slot in cleanly.
When a sync packet arrives:
* write-lock state, lookup-or-create NodeState by node_id
* stash the SyncPacket + Instant::now() on the node
* debug-log node, leader/valid/smoothed flags, sequence, offset_us
* continue (don't fall through — we know it's not a CSI frame)
Downstream multistatic CSI fusion now has a documented landing pad: any
CSI frame with byte 19 bit 4 set looks up the matching NodeState, applies
ns.latest_sync.epoch_us + (now_local - ns.latest_sync.local_us) to get a
mesh-aligned timestamp. Implementation of that fusion math is the next
ADR-029/030 layer (wifi-densepose-signal).
Verification:
- cargo check -p wifi-densepose-sensing-server --no-default-features → green
- cargo test -p wifi-densepose-hardware sync_packet → 7/7 pass, 122 filtered
- Zero behavioral change for nodes that don't emit sync packets — the
dispatch only fires on magic match.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
d72944f887 |
feat(hardware): Rust SyncPacket decoder + 7 unit tests (ADR-110 §A0.12)
Iter 14 — moves the v0.7.0 Python stub into the Rust production tree so the sensing-server can decode incoming UDP datagrams by leading magic and apply mesh-aligned timestamps to in-flight CSI frames. Module: v2/crates/wifi-densepose-hardware/src/sync_packet.rs Public surface (re-exported from the crate root): - SyncPacket — 32-byte decoded packet - SyncPacketFlags — bit0=leader, bit1=valid, bit2=smoothed - SYNC_PACKET_MAGIC = 0xC511A110, SYNC_PACKET_SIZE = 32 Tests (all 7 passing, plus 122 existing hardware-crate tests still pass): * follower_typical_packet_roundtrips — reproduces COM9 sync-pkt #1 from §A0.12, including the 1,163,565 µs offset §A0.10 measured * leader_packet_has_local_close_to_epoch — COM12 leader case (flags=0x03, epoch ≈ local, offset = -7 µs call-stack only) * magic_mismatch_is_typed_error * short_packet_is_typed_error * all_flag_combinations_roundtrip — every (leader,valid,smoothed) triple * sync_and_csi_magics_differ — host can dispatch by leading u32 * wire_size_constant_is_correct Uses the existing ParseError variants (InvalidMagic, InsufficientData) so the sensing-server's dispatch code can treat sync-packet decode failures the same way it treats CSI frame decode failures. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
3a6648c290 |
test+docs(adr-110): 6 SyncPacketParser tests + README/user-guide for v0.7.0
Iter 13 — solidifies v0.7.0 as a real, reviewable release.
Tests (archive/v1/tests/unit/test_esp32_binary_parser.py):
- TestSyncPacketParser (6 tests, all passing in 0.27s):
* test_follower_typical_packet_roundtrips — matches the COM9-witnessed
sync-pkt #1 byte-for-byte, including the 1,163,565 µs offset that
§A0.10 measured for the COM9-vs-COM12 boot-time delta
* test_leader_packet_has_local_close_to_epoch — COM12 leader case,
flags=0x03, epoch ≈ local
* test_magic_mismatch_raises — non-sync datagrams don't silently decode
* test_short_packet_raises — early error vs silent truncation
* test_all_flag_combinations — every (leader, valid, smoothed) triple
round-trips independently
* test_dispatch_distinguishes_csi_from_sync — CSI vs sync magics differ
so a host can dispatch by leading u32
Docs:
- README C6 hardware row now headlines v0.7.0 (was v0.6.7), names the
measured 99.56% match / 104 µs stdev / 3.95× suppression numbers, and
acknowledges the firmware-side ADR-110 substrate closure.
- docs/user-guide.md firmware release table now lists v0.7.0 / v0.6.9 /
v0.6.8 / v0.6.7 chain with one-liner highlights so 4MB-flash users +
multistatic operators know which release brings what.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
d199279caa |
release(firmware): v0.7.0-esp32 major — ADR-110 firmware-side substrate closed
Marks the end of the firmware-side ADR-110 push. Everything the firmware
can deliver toward §B multistatic alignment without hardware-blocked
dependencies is shipped, measured, and witnessed:
§A0.7–§A0.10 ESP-NOW mesh quantified: 99.43-99.56% cross-board match,
104.1 µs smoothed offset stdev, 1.4 ppm crystal-skew
tracking, ≤100 µs alignment target empirically met.
§A0.12 32-byte UDP sync packet emits with mesh-aligned epoch
+ sequence high-water; verified live both boards.
§A0.13 (new) bit-4 wire-fix: byte 19 bit 4 sourced from
c6_sync_espnow_is_valid() too. Mixed S3+C6 fleets now
correctly advertise mesh-sync.
Host-side enabler (Python):
archive/v1/src/hardware/csi_extractor.py grows SyncPacketParser +
SyncPacket dataclass. ESP32BinaryParser docstring acknowledges the
sibling sync packet. Sets up wifi-densepose-sensing-server to
consume the §A0.12 stream without inventing the parser.
Build artifacts (IDF v5.4, both RC=0):
S3 8 MB: 1094 KB, 47% partition slack
C6 4 MB: 1019 KB, 45% partition slack
Tag v0.7.0-esp32. Branch adr-110-esp32c6. PR #764.
What remains is outside the firmware: host-side parser wiring,
multistatic CSI fusion in wifi-densepose-signal, 11ax-cooperative AP
(or future IDF AP-HE API), INA226 for ≤5 µA LP-core.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
e69572ff99 |
fix(csi): ADR-018 byte 19 bit 4 now signals ESP-NOW sync too (not just broken 15.4)
WITNESS-LOG-110 prior state had byte 19 bit 4 (cross-node sync valid) only being set from c6_timesync_is_valid() — but c6_timesync is the 802.15.4 path that D1 documented as unfixable in IDF v5.4 (rx=0 across every soak we've run). The working transport is c6_sync_espnow (§A0.7, §A0.10: 99.43-99.56% RX cross-board, 104 µs smoothed-offset stdev), yet frames from sync'd nodes had bit 4 cleared because the ESP-NOW path didn't OR into the flag. Fix: also set bit 4 when c6_sync_espnow_is_valid() — the OR semantic means a node signals sync from whichever transport is healthy. Host sees bit 4 set, knows to pair the frame against the most recent sync packet (§A0.12) from this node_id. Side effect: this also enables S3 boards to set bit 4 (c6_sync_espnow works on both targets, c6_timesync is C6-only). So a multi-target mesh of S3+C6 boards now correctly signals cross-node alignment regardless of which chips are in the fleet. Build evidence: C6 image 1019 KB (+16 bytes for the new check), 45% slack unchanged. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
4e1b62ab4f |
release(firmware): v0.6.9-esp32 — sync-packet wired, CONFIG_C6_SYNC_EVERY_N_FRAMES tunable
Bundles the iter 8 + iter 9 sync-packet work (§A0.11 + §A0.12) into a shipped release. v0.6.8 didn't carry the sync emission; v0.6.9 closes the loop. What ships: - csi_collector emits a 32-byte UDP sync packet (magic 0xC511A110) every CONFIG_C6_SYNC_EVERY_N_FRAMES CSI callbacks (default 20). - New Kconfig knob lets operators tune cadence from ~0.1 Hz (N=1000) to ~10 Hz (N=1) without rebuilding — sensible defaults for mainstream multistatic at ~2 s sync interval. - Backwards-compatible at the wire level: old aggregators drop the new magic on existing parser mismatch path. Build artifacts (both green on IDF v5.4): - S3 8 MB: 1094 KB, 47% partition slack - C6 4 MB: 1019 KB, 45% partition slack The macro define was renamed from SYNC_EVERY_N_FRAMES to CONFIG_C6_SYNC_EVERY_N_FRAMES so the Kconfig generator wires through. Header guard preserves the default for builds without the kconfig applied. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
d2effcc6f6 |
witness(ADR-110 §A0.12): sync-packet wired + verified live on both boards
SOTA iter 9 — closes the §A0.11 wiring gap with empirical evidence. Added a diagnostic ESP_LOGI in the sync emit path; flashed both C6 boards; captured 45s parallel serial output. Sync packet generation confirmed live: COM12 (leader, ...00:84): sync-pkt #1 ... node=12 flags=0x03 local_us=28864932 epoch_us=28864939 flags=0x03 = leader+valid, epoch ≈ local (7 µs delta = call-stack elapsed only — leader has no offset by definition) COM9 (follower, ...05:3c): sync-pkt #1 ... node=9 flags=0x06 local_us=28798450 epoch_us=27634885 flags=0x06 = valid+smoothed_used, local-epoch = 1,163,565 µs Matches §A0.10's measured -1.16 s mesh-aligned offset within 285 µs (WiFi MAC TX jitter floor between samples). Cadence: 2.05 s between sync packets — 20 CSI frames at the bench's observed 10 fps rate = exactly the design intent. UDP send returns -1 (sr=-1) because the bench boards are intentionally not associated to a real AP (provisioned to dead SSIDs for the iter 2-8 mesh experiments). No crash, no resource leak in 45s. Once boards hit a routable network, sr becomes the byte count. Wiring gap §A0.11 now CLOSED. Multistatic CSI fusion downstream has a documented protocol to recover mesh-aligned timestamps for every CSI frame: host pairs (node_id, sequence) across the two packet streams. Host-side parser is the natural next layer (wifi-densepose-sensing-server). Build evidence: C6 image 1019 KB (+0.5 KB for the diag log line), 45% partition slack unchanged. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
6ff155a232 |
feat(csi): emit ADR-110 §A0.11 sync-packet every 20 CSI frames
Closes WITNESS-LOG-110 §A0.11 wiring gap. Adds a separate 32-byte UDP packet (magic 0xC511A110, distinct from the CSI frame magic 0xC5110001) carrying: [0..3] magic 0xC511A110 (LE u32) — CSI-ADR-110 sync packet [4] node_id [5] proto version (0x01) [6] flags: bit0=is_leader, bit1=is_valid, bit2=smoothed_used [7] reserved [8..15] local esp_timer_get_time() (LE u64) [16..23] mesh-aligned epoch (LE u64) = local + EMA-smoothed offset [24..27] high-water sequence number (LE u32) for pairing with CSI frames [28..31] reserved (room for leader_id low32 in a follow-up) Emitted once per 20 CSI frames (≈ 1 Hz at the 20 Hz send-rate gate). Same stream_sender UDP socket as CSI frames — host dispatches by first 4 bytes of each datagram. Backwards compatible: aggregators that don't know about the new magic ignore it (sync packets won't match the CSI parser's magic check, so they're dropped harmlessly by existing receivers). New aggregators pair (node_id, sequence) across the two packet streams to align CSI frames to mesh time. Sets us up for downstream ADR-029/030 multistatic CSI fusion: with the host now able to recover the mesh-aligned epoch from each frame's sequence number, frames from multiple boards can be ordered + fused on a common timeline. Build evidence: C6 image 1019 KB (+1 KB vs v0.6.8 no-sync), 45 % partition slack unchanged. Host-side parser update is a follow-up. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
503411a8d2 |
release(firmware): bump to v0.6.8-esp32 — ESP-NOW mesh EMA smoother
SOTA iter 7. Tags + ships the firmware that actually has the iter-5/6 EMA path so the GitHub release matches the witness measurements. v0.6.7 binaries on the release predate the EMA work — anyone downloading from the v0.6.7 release would not get the smoothing §A0.10 measured. Build evidence (IDF v5.4, both RC=0): - S3 8 MB: 1093 KB (47 % slack), SHA256 60e3ef907f... - C6 4 MB: 1019 KB (45 % slack), SHA256 feb88d60a0... - Soft-AP and 4 MB S3 variants ship unchanged from v0.6.7; not rebuilt. Wiring gap documented in WITNESS §A0.11: ADR-018 wire format has no timestamp field, so the synced clock value from get_epoch_us() doesn't yet reach CSI frames. Three options outlined (ADR-018 v2 / separate UDP sync packet / out-of-band HTTP probe). Likely landing place is the separate UDP sync packet — keeps the existing ADR-018 contract intact while ADR-029/030 multistatic fusion lights up the substrate. CHANGELOG Wave 4 entry summarises what v0.6.8 ships + the deferred gap so future maintainers don't lose the breadcrumb. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
e5c3b27daa |
witness(ADR-110 §A0.10): EMA suppression quantified — 3.95x, ≤100 µs alignment shipped
SOTA iter 6 — the long-soak iter 5 owed. 300 s parallel two-board capture
with the iter 5 EMA firmware, 46 converged follower-mode samples.
Over the 225 s steady-state window:
stdev range drift Q1->Q4
raw 411.5 µs 2245 µs +30.1 µs/min
smoothed 104.1 µs 478 µs +27.8 µs/min
suppression: 3.95x (stdev), 4.70x (range)
The ADR-110 §2.4 ≤100 µs alignment target is now empirically met by the
smoothed offset alone — no host-side filter required. Drift is preserved
(within 2 µs/min between raw and smoothed), so the EMA tracks real clock
skew, not lag behind it.
Drift sign + magnitude vary with thermal state across runs (-84 µs/min
in §A0.8 iter 4, +30 µs/min here in iter 6 with boards warmer — both
within ESP32 ±10 ppm crystal spec). The EMA tracks whichever value
applies at any given moment.
Throughput: tx=2701, rx=2689, match=2689 → 99.56% cross-board match,
zero TX failures.
ADR-110 §B sync-substrate status: ≤100 µs multistatic alignment is now
*measured and shipped*, not just designed. Downstream multistatic CSI
fusion (ADR-029/030) can treat c6_sync_espnow_get_epoch_us() as a
black-box bounded-jitter timestamp source.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
f41f5fc85b |
feat(c6_sync_espnow): EMA-smooth cross-board offset, expose via get_epoch_us
SOTA iter 5 — converted the iter 4 ADR-110 §A0.8 closing recommendation
("host-side Kalman / linear fit on the offset trajectory") into a
firmware-side, fixed-point EMA so every downstream consumer of
c6_sync_espnow_get_epoch_us() gets bounded-jitter timestamps for free.
Implementation:
* α = 1/8 (Q3.3 shift = 3), ≈8-sample effective window at the 10 Hz
beacon rate. Tracks the ≈1.4 ppm crystal drift §A0.8 measured while
averaging out per-beacon WiFi-MAC jitter spikes.
* y[n] = y[n-1] + (raw - y[n-1]) >> 3 — integer arithmetic, two cycles
on the RISC-V LP/HP cores, no float dependency.
* Seeded from the first follower-mode sample so we don't bias toward 0.
* New getter: int64_t c6_sync_espnow_get_offset_us_smoothed(void).
* c6_sync_espnow_get_offset_us() (raw) stays for diagnostics, unchanged.
* c6_sync_espnow_get_epoch_us() now prefers the smoothed offset once
s_smoothed_seeded — meaning every CSI frame timestamp ADR-029/030
consumes is already filtered, no host-side rework required.
Diag log line now prints both:
c6_espnow: tx#N ... offset_us=R smoothed=S
90 s bench verification (witness §A0.9 + iter5-COM9-ema-90s.log) shows
both values tracking. Methodology caveat in §A0.9: short windows don't
let the smoothing benefit emerge over the raw noise floor — the
suppression ratio measurement needs ≥5 min, deferred to a long-soak
iteration.
Binary size cost: ~32 bytes (one int64, one bool, one getter). C6 build
still 45% partition slack.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
676297c48f |
witness(ADR-110 §A0.8): 4-minute mesh soak — quantified stability + measured clock skew
SOTA iter 4 (cron c40dab4a tick 4). Converted iter 2's 30-second snapshot
into a real statistical measurement over 4 minutes / 2101 beacons.
Beacon throughput (both boards):
- Rate: 10.00/s exactly — FreeRTOS timer rock-solid
- COM12 leader: tx=2101, match=2101/2101 = 100.00%, 0 TX fail
- COM9 follower: tx=2101, match=2089/2101 = 99.43%, 0 TX fail
- 12 missed beacons / 210 s ≈ 1 miss / 17.5 s — inside the 3-second
VALID_WINDOW_MS freshness gate, sync remains valid
Sync offset (COM9, 37 follower-mode samples after warmup):
- mean: -1,163,123 µs (boot-time delta, not jitter)
- stdev: 540 µs
- range: 2994 µs over the soak
- drift Q1->Q4: -84.2 µs/min over 3 minutes
= 1.4 ppm relative clock skew between the two specific C6 crystals
(ESP32 spec: typical ±10 ppm — well within tolerance)
ADR-110 §2.4 target ±100 µs across one hop: met with margin at the
current 10 Hz beacon rate. A simple linear or Kalman fit on the offset
trajectory (host-side, no firmware change) would compress per-frame
alignment error to <50 µs. Hardware substrate is now quantified and
documented — downstream ADR-029/030 multistatic fusion can plan around
the measured numbers.
Also corrected §A0.7's "±10 µs jitter" wording — that was sample-to-sample
range within a 5-row snapshot, not the true stability profile. §A0.8
supersedes with the proper soak data.
Raw captures: dist/firmware-v0.6.7/iter4-{COM9,COM12}-soak240s.log
(7400+ lines each, full c6_espnow + c6_ts counter records).
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
d636604330 |
docs(user-guide): point 4MB-flash flow at the v0.6.7 S3 4MB binary
SOTA loop iter 3 added esp32-csi-node-s3-4mb.bin to the v0.6.7-esp32 release (882 KB binary built from sdkconfig.defaults.4mb, 52% partition slack on 4MB single-OTA — vs 47% for the 8MB build, +5pp). v0.6.6 shipped 8MB+4MB parity; v0.6.7 now matches. User-guide previously pointed SuperMini 4MB owners at v0.4.3 (which predates ADR-110 / fall-threshold fix / 4102-tx ESP-NOW soak). Point at v0.6.7 directly so 4MB users get the same firmware as 8MB users. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
572e09ad86 |
witness(ADR-110 §A0.7): ESP-NOW cross-board mesh — leader election + sync offset measured
SOTA iter 2 (cron c40dab4a tick 2). The §D-workaround that v0.6.6 left
on TX-only soak coverage is now empirically complete end-to-end.
Parallel 60 s capture with COM9 (206ef117053c) + COM12 (206ef1170084)
both on default v0.6.7, no WiFi associations needed:
* RX rate cross-board:
- COM12: tx=301 rx=297 match=297 (98.7 %)
- COM9: tx=301 rx=300 match=300 (99.7 %)
- 0 TX failures on either side over 30 s of beacons
* Leader election fired for the first time in ADR-110:
+27336 ms COM9: "stepping down: heard lower-id leader 206ef1170084
(we are 206ef117053c)" — the lowest-EUI-wins protocol the original
c6_timesync was designed to run, now actually working because the
transport is healthy.
* Cross-board sync offset converged and stable:
COM9 offset_us: -1462 -> -950 -> -954 -> -957 -> -948
±10 µs jitter once leader-following stabilises, hitting the ±100 µs
target named in ADR-110 §2.4.
802.15.4 c6_ts path stayed rx=0 across both 60 s captures — D1 still
broken in IDF v5.4, exactly as documented. ESP-NOW is confirmed as the
working multistatic time alignment transport.
Raw captures: dist/firmware-v0.6.7/iter2-{COM9,COM12}-espnow.log.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
f9aad75413 |
witness+opt: ADR-110 §A0.6 — IDF v5.4 soft-AP HE gap, swarm warnings
Iter 1 finding from /loop 5m SOTA sprint: two C6 boards now mesh through the c6_softap_he soft-AP (COM12 hosts ruview-c6-twt, COM9 associates), but COM9 lands at phymode(0x3, 11bgn), he:0 — the soft-AP doesn't advertise HE. Confirmed by full grep of components/esp_wifi/include/esp_wifi*.h: the public API exposes ONLY STA-side iTWT/bTWT. There is no esp_wifi_ap_set_he_config, no wifi_he_ap_config_t, no wifi_config_t.ap.he_* field — soft-AP HE/TWT-Responder advertise is not user-controllable on ESP32-C6 in IDF v5.4. Consequence: B1/B2 cannot be measured via the two-C6 path on this IDF release. The c6_softap_he module ships as the in-place hook for any future IDF release that exposes the API; until then a real 11ax router or phone hotspot remains the path. Sharpens the open question from "do we need an 11ax AP?" to "we need either a future IDF AP-side HE config API, or an external 11ax AP". WITNESS-LOG-110 §A0.6 records the parallel boot logs from both boards plus the IDF surface grep evidence. c6_softap_he.c gains an ESP_LOGW at AP-up time so operators understand exactly why STAs land at 11bgn (avoids confusion with the v0.6.6 §A8 graceful-TWT-NACK story). While here: cleared the three -Wunused-variable warnings in swarm_bridge.c that fired on every build (fw_ver, free_heap, presence in heartbeat block). fw_ver now feeds an ESP_LOGI so the boot log names the build; free_heap + heartbeat-presence were dead anyway. Pure ultra-opt: smaller .o files, zero warning noise. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
83f20f7c61 |
witness(ADR-110): v0.6.7 live silicon evidence — A0.4 + A0.5
Flashed v0.6.7 to two ESP32-C6 boards (COM9 + COM12, both matching the witness-log MACs from v0.6.6 session). A0.4 — regression check on COM9 (default config): - v0.6.7 boots in 446 ms, c6_ts up on ch 26, HAL_MAC_ESP32AX_761 loaded, ruv.net association at +5206 ms, iTWT graceful NACK, ESP-NOW init OK, CSI flowing at HT-LTF 64 subcarriers. Byte-for-byte same behavior as v0.6.6 confirms the new code paths (LP-core + soft-AP) are correctly default-off — zero behavioral regression for shipped fleets. A0.5 — soft-AP module live on COM12: - Built a CONFIG_C6_SOFTAP_HE_ENABLE=y variant locally, flashed COM12. - AP came up at +666 ms on channel 6 with WPA2-PSK, dual STA+AP iface visible (...00:84 STA / ...00:85 AP — standard +1 MAC offset). - Discovered live IDF constraint: when AP+STA both active and STA associates to an 11ax AP on a different bandwidth, the soft-AP gets demoted from HE to 11n by the radio scheduler. Documented in §A0.5 — the cleanest two-board iTWT bench needs the AP-role board's STA iface not to associate elsewhere (point it at a non-existent SSID). Release v0.6.7-esp32 now also carries: - esp32-csi-node-c6-4mb-softap.bin (the AP-variant binary) - COM9-v0.6.7-regression.log + COM12-v0.6.7-softap.log raw captures - SHA256SUMS.txt updated with the soft-AP variant hash Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
756bfc0a1a |
docs(readme,user-guide): record v0.6.7 LP-core + soft-AP HE/TWT additions
- README C6 hardware row now links the v0.6.7-esp32 release and notes the LP-core RISC-V program (B4 code path) + soft-AP TWT Responder (B1/B2 two-board unblock). - README Option-2b quick-start mentions the new opt-in toggles. - User-guide gets the v0.6.7 boot banner, expanded battery-seed instructions (real LP-core poll period + debounce knobs), and a fresh "Two-board iTWT bench" section covering the soft-AP role (CONFIG_C6_SOFTAP_HE_ENABLE) and the NVS overrides for SSID / PSK / channel. - User-guide firmware release table prepends v0.6.7-esp32 as Latest above v0.5.0 (still recommended for S3-mesh production). Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
948768bdda |
feat(firmware): v0.6.7-esp32 — real LP-core program + C6 soft-AP HE/TWT helper
ADR-110 P9 — software-only unblocks for the WITNESS-LOG-110 §B
hardware-blocked items. Two new modules, both default-off so v0.6.6 fleets
see no behavior change.
LP-core (B4 path):
- New firmware/esp32-csi-node/main/lp_core/main.c: real RISC-V LP-core
motion-gate program with debounce + monotonic motion_count counter.
- c6_lp_core.c rewritten to load + run the LP binary via ulp_lp_core_run
when CONFIG_C6_LP_CORE_ENABLE=y; falls back to the v0.6.6 ext1 GPIO-wake
path otherwise (keeps regression surface small).
- ulp_embed_binary() wired in main/CMakeLists.txt, gated on the Kconfig.
- New Kconfig knobs: C6_LP_POLL_PERIOD_US (default 10 ms),
C6_LP_DEBOUNCE_SAMPLES (default 3).
- Exposes c6_lp_core_motion_count() / c6_lp_core_poll_count() for the
witness harness — once an INA/Joulescope is on the bench, B4 is one
capture away from a measured number.
Soft-AP HE (B1/B2 unblock):
- New c6_softap_he.{h,c}: brings up the C6 in AP+STA mode with WPA2-PSK
+ HE advertisement, so a second C6 in STA mode can negotiate real
iTWT against a known-cooperative AP without buying an 11ax router.
- main.c calls c6_softap_he_start() right before esp_wifi_start() when
CONFIG_C6_SOFTAP_HE_ENABLE=y.
- New Kconfig knobs: C6_SOFTAP_HE_{SSID,PSK,CHANNEL} with NVS overrides
via softap_ssid / softap_psk / softap_chan in the ruview namespace.
Build artifacts (IDF v5.4, both green, RC=0):
- S3 8 MB: 1093 KB (47% partition slack)
- C6 4 MB: 1019 KB (45% partition slack)
- SHA-256 sums in dist/firmware-v0.6.7/SHA256SUMS.txt
Doc updates: CHANGELOG wave-3 entry, ADR-110 phase table gets P5
upgrade note + new P9 row, WITNESS-LOG-110 gets new A0 section
recording the v0.6.7 build evidence.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
561647b3af |
docs(readme): link new ADR-110 reviewer guide + update soak total
Two tiny updates to the ESP32-C6 row in the hardware-options table: - Add link to docs/ADR-110-REVIEW-GUIDE.md (the new one-page reviewer on-ramp added in |
||
|
|
3133be6d48 |
docs(adr-110): add reviewer one-page guide
The witness log is comprehensive but ~300 lines. A reviewer landing on this branch wants a five-minute tour: where to read first, what's actually empirically verified vs hardware-blocked, what the bugs were, and the commit history at a glance. docs/ADR-110-REVIEW-GUIDE.md provides that, with explicit links to the canonical witness + ADR. Doesn't duplicate content — points to where the canonical record lives. Also captures the security note for the operator (rotate the previously- exposed Docker Hub + PI-cluster tokens — they appeared in local logs during witness generation before scripts/redact-secrets.py was added). Ref: ruvnet/RuView#762, draft PR #764 Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
9a46fc8aa2 |
witness: ESP-NOW 300 s soak — 2951 tx 0 fail (2.5x sample)
Confirmation run vs the earlier 120 s soak. Same firmware, same board,
longer window:
Captured 67307 bytes over 300 s
ESP-NOW samples: 60
first: tx=1 fail=0 rx=0 match=0 leader=1 offset=0
last: tx=2951 fail=0 rx=0 match=0 leader=1 offset=0
TX rate: 9.83/s (target 10/s)
TX failure rate: 0.0000%
app_main calls (reset detector): 1 -> no crash
2.5x sample size, identical zero-failure rate, marginally higher
sustained rate (9.83 vs 9.60) — FreeRTOS timer settling. Adds a second
data point to WITNESS-LOG-110 §D-workaround.
Ref: ruvnet/RuView#762, draft PR #764
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
e255b7d43a |
docs(firmware): README acknowledges dual S3+C6 target (ADR-110)
After ADR-110 made this the same source tree for both esp32s3 (production) and esp32c6 (research / Wi-Fi-6 / 802.15.4 / LP-core seed nodes), the firmware README header should reflect that. Title, one-liner, and target badge updated; body sections still use S3 examples as the production default. The C6 build path is documented in docs/user-guide.md + sdkconfig.defaults.esp32c6 + Quick-Start Option 2b in the top-level README. Ref: ruvnet/RuView#762, draft PR #764 Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
553b07d04c |
docs(readme): tighten ESP32-C6 row to match empirical witness (ADR-110)
Original row said C6 *has* HE-LTF tagging + multi-node sync + 5µA hibernation as if they were active features. Reality per WITNESS-LOG-110: - Wire format VERIFIED (17 unit tests across firmware/Rust/Python) - ESP-NOW transport VERIFIED on 1 board (1151 tx, 0 fail in 120s soak) - TWT graceful NACK VERIFIED live (AP isn't 11ax → INVALID_ARG handled) - HE-LTF live capture: BLOCKED on 11ax AP availability - 5µA hibernation: datasheet number, not a measurement (no INA) - 802.15.4 RX: known broken in IDF v5.4, ESP-NOW is the workaround New row leads with 'wire format ready' + 'hardware-gated' to set honest expectations, and links to docs/WITNESS-LOG-110.md so readers can see the full empirical/claimed split themselves. Ref: ruvnet/RuView#762, draft PR #764 Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
9de34ba096 |
docs(adr): index ADR-110 in Hardware and firmware section
The ADR index README hadn't been updated past ADR-099. Adding ADR-110 in the Hardware/firmware section with its honest status — firmware shipped + tested + CI-green, but the four SOTA capability claims (HE-LTF live capture, TWT cadence, cross-node sync, 5 µA hibernation) are each blocked on different physical hardware (11ax AP, more boards, INA meter), as fully documented in docs/WITNESS-LOG-110.md. Ref: ruvnet/RuView#762 / draft PR #764 Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
fc75a8a5c8 |
test(fuzz): extend csi_serialize fuzz harness for ADR-110 byte 18-19
The libFuzzer harness was compiled without CONFIG_CSI_FRAME_HE_TAGGING,
so the new byte 18/19 path in csi_collector.c was zero-filled at compile
time and never fuzzed. Three changes to fix that:
1. test/stubs/esp_stubs.h: wifi_pkt_rx_ctrl_t gains both branch families
- HE branch (CONFIG_SOC_WIFI_HE_SUPPORT path): cur_bb_format, second
- Legacy branch (S3 / pre-HE chips): sig_mode, cwb, stbc
A single stub compiles for either branch; the Makefile picks which
one is active via -D flags. Both sets are declared so a build for
the unselected branch still compiles cleanly.
2. test/Makefile: CFLAGS now defines CONFIG_CSI_FRAME_HE_TAGGING=1 so
the new code path is reachable. CONFIG_SOC_WIFI_HE_SUPPORT stays
UNSET (default — exercises the legacy S3 branch). Add it to CFLAGS
for a parallel HE-stub run if you want coverage of the C6 branch.
3. test/fuzz_csi_serialize.c: parses 3 more control bytes from fuzz
input (he_inputs[2] + legacy_inputs) and writes them through
info.rx_ctrl.{cur_bb_format,second,sig_mode,cwb,stbc} so the
serializer's PpduType switch and Adr018Flags computation are
reached on every iteration.
Result: the existing libFuzzer corpus + ASAN/UBSAN now covers the
ADR-110 wire encoding paths on every run. No more zero-fill silent skip.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
89972c0917 |
docs(changelog): expand ADR-110 entry with wave 2-5 additions
The original CHANGELOG entry covered the initial firmware ship. Adding sub-bullets for everything that landed after: - D1 workaround: ESP-NOW cross-node sync (TX 0% failure rate over 1151 transmits in 120 s soak), 802.15.4 path documented as broken - Host-side dual-pipeline decoder for ADR-018 byte 18-19 (Rust 122/122, Python 11/11 — protocol path verified end-to-end without 11ax hardware) - Security fix for witness bundle secret leakage via Pydantic error dumps (redact-secrets.py filter) Witness link: docs/WITNESS-LOG-110.md Ref: ruvnet/RuView#762, draft PR #764 Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
b808a6380b |
witness: ESP-NOW 120s soak — 1151 tx 0 fail, 9.6/s, no crash
Real empirical evidence the ESP-NOW sync transport is long-term stable
on the C6 (D-workaround). Single-board capture on COM9, latest firmware
on branch (
|
||
|
|
8eaa92cf21 |
feat(python): host-side decode for ADR-018 byte 18-19 (ADR-110)
Python ESP32BinaryParser was using struct format '<IBBHIIBB2x' — the
'2x' skipped bytes 18-19 as reserved. After the Rust-side decoder was
extended to surface PPDU type + flags, the Python pipeline (which
archive/v1 still uses for testing + the proof verifier) needs the same
update so its consumers see the HE metadata too.
csi_extractor.py:
- HEADER_FMT now '<IBBHIIBBBB' (captures bytes 18-19)
- New metadata fields: ppdu_type ('ht_legacy'|'he_su'|'he_mu'|'he_tb'|'unknown'),
ppdu_type_raw, he_capable, bw40, stbc, ldpc, ieee802154_sync_valid,
adr018_flags_raw
- Class constants PPDU_HT_LEGACY..PPDU_UNKNOWN mirror the firmware
test_esp32_binary_parser.py:
- build_binary_frame() takes optional ppdu_byte + flags_byte (default 0)
- New TestAdr110ByteEncoding class with 5 tests:
- Pre-ADR-110 zeros decode as 'ht_legacy' + all-flags-false
- HE-SU / HE-MU / HE-TB decode correctly
- 0xFF decodes as 'unknown'
- All-flags-set round-trip (0x1D)
11/11 parser tests pass (6 existing + 5 new). Backwards compat verified.
Pairs with the Rust-side decoder in commit
|
||
|
|
3959fabf31 |
feat(rust): host-side decode for ADR-018 byte 18-19 (ADR-110 closure)
Parse the C6 firmware's HE PPDU type + bandwidth/flags from ADR-018 bytes 18-19 (previously discarded as _reserved). Adds two types to CsiMetadata: ppdu_type (HtLegacy/HeSu/HeMu/HeTb/Unknown) and adr018_flags (bw40/stbc/ldpc/ieee802154_sync_valid). Pre-ADR-110 firmware sends zeros which round-trip as HtLegacy + default flags — fully backwards compatible. 6 new deterministic unit tests: - Pre-ADR-110 backwards compat - HE-SU / HE-MU / HE-TB decode - Unknown PPDU byte -> Unknown - All-bits-set flags round-trip - PpduType byte round-trip Result: 122 wifi-densepose-hardware tests pass, 0 fail. Host decoder now matches the firmware encoder bit-for-bit — HE-LTF metadata path works end-to-end the moment an 11ax AP is in range. Ref: ruvnet/RuView#762 Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
88be283ab0 |
feat(c6): ESP-NOW cross-node sync — D1 workaround for broken 15.4 RX
After 5 systematic experiments confirmed the 802.15.4 RX path is
unfixable from user code in this IDF v5.4 + C6 combination (D1), add a
parallel sync transport over ESP-NOW. Same TS_BEACON protocol, same
public API (c6_sync_espnow_get_epoch_us / is_valid / is_leader), but
runs on the WiFi MAC layer that ESP-IDF fully supports across every
ESP32 family.
The 802.15.4 code stays in source for when the IDF driver is fixed.
ESP-NOW is the working primary today.
Empirical (single-board COM9 — other 3 boards dropped off USB during
the experiment):
- c6_sync_espnow_init() succeeds: "init done local_id=… leader=
yes(candidate) period=100ms"
- TX path 100% reliable: tx#101 fail=0 over ~15s at 100ms cadence
- RX awaiting cross-board test once USB-enumeration is restored
Trade vs. 802.15.4 design:
- Loses: "frees WiFi airtime for CSI" property
- Gains: known-working RX path, cross-target (S3 and C6 both)
- Same API surface — consumers swap transports without code change
Files:
- main/c6_sync_espnow.{h,c} — new module, ~210 lines
- main/CMakeLists.txt — add to SRCS (always built, used on any target)
- main/main.c — init after WiFi STA up, skip on QEMU mock
- test/capture-3board-experiment.py — surface c6_espnow log lines
- docs/WITNESS-LOG-110.md — new §D-workaround documenting the pivot
Ref: ruvnet/RuView#762 / D1 known-issue / draft PR #764
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
f8a2e36958 |
fix(witness): redact secrets from bundled verify.py output (SECURITY)
The Python proof verifier (archive/v1/data/proof/verify.py) imports the project settings, which read the user's .env file. When pydantic validation fails (e.g., extra fields not in the Settings schema), the error dump includes the offending input_value — which means real Docker tokens, GitHub PATs, API keys, etc. were being echoed to stdout and captured into the bundled verification-output.log. Confirmed on this branch's first bundle generation: dckr_pat_, tok_... cluster token, and other long opaque strings leaked into witness-bundle-ADR028-<commit>/proof/verification-output.log inside the .tar.gz. Bundle + tarball nuked from disk before any push. Added: - scripts/redact-secrets.py — stdin->stdout filter with patterns for common token prefixes (dckr_pat_, tok_, sk-, ghp_, gho_, github_pat_, AKIA, hf_, xoxb-, xoxp-, Bearer), `field=secret` assignments, long opaque alphanumeric strings (40+ chars), and long hex runs (20+ chars which catch token suffixes after `...` truncation). - generate-witness-bundle.sh now pipes verify.py stderr through that filter before tee-ing into the bundled log. - Also fixed pre-existing stale `v1/` paths in the witness script (correct path is `archive/v1/`). The user must rotate the leaked credentials regardless (the bundle was never pushed, but they appeared in this local Claude session log). Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
4c39e28bd0 |
fix(c6): PAN-ID match in 15.4 beacon + expanded D1 diagnostic record
Tried 4th hypothesis for the RX-path bug: maybe the IDF v5.4 receiver
strictly requires dst PAN to match the local set_panid() instead of
honoring the 0xFFFF broadcast PAN per 802.15.4 spec. Changed beacon
dst PAN to 0xCAFE (matching set_panid call) to test.
Result: still negative (tx#241 rx#0/1, magic_match=0). PAN was not the
root cause — but the change is technically more correct per the IDF
behavior and is kept.
Also expanded WITNESS-LOG-110 §D1 to record the 4-experiment matrix
that's now been run:
1. WiFi-on + ch15: tx#381 rx#1 magic_match=0
2. WiFi-on + ch26: identical negative
3. WiFi-off + ch26 + OT off + promiscuous true: tx#601 rx#0 — even
the earlier rx#1 was a noise frame, not protocol traffic
4. Dst PAN 0xCAFE: still negative
Hypothesis space narrowed; needs IDF maintainer trace or working
multi-board reference to fix.
Co-Authored-By: claude-flow <ruv@ruv.net>
|
||
|
|
66523843e6 |
fix(c6): TWT INVALID_ARG graceful + ch26 + diagnostic counters (ADR-110 D1)
After 3 systematic hypotheses tested + rejected (radio coex, OpenThread shadowing, manual RX re-arm), the 802.15.4 leader-election bug is narrowed to: TX path works perfectly (~10/s clean, 0 fail), but the RX path stops after exactly 1 frame. Manual esp_ieee802154_receive() from either callback bootloops the driver (verified across all 3 boards). The IDF reference example uses the same handle_done-only pattern as this code, implying the driver should auto-restart RX — but empirically doesn't here. Either a half-duplex radio state issue or an IDF v5.4 bug. Tracked as known issue D1 in WITNESS-LOG-110. Changes shipped: - c6_twt.c: ESP_ERR_INVALID_ARG added to graceful-fallback list (empirically: ruv.net AP advertises TWT Responder=0, IDF driver validates against AP HE capability and rejects with INVALID_ARG) - c6_timesync.c: diagnostic counters (s_tx_count, s_tx_fail, s_rx_count, s_rx_magic_match) + per-10-beacon log line preserved so future investigation has the diagnostic harness ready - sdkconfig.defaults.esp32c6: 15.4 channel default 15 → 26 (non-overlap with WiFi 2.4 GHz channels), OpenThread disabled (we use raw 15.4) - promiscuous=true on the radio (broadcast frames addressed to 0xFFFF) - WITNESS-LOG-110 §D1 expanded with the full diagnostic trace + 3-hypothesis investigation record Cross-node sync claim (B3) BLOCKED until either an IDF maintainer trace or a working multi-board reference is available. The other three SOTA dimensions (HE-LTF, TWT cadence, 5 µA hibernation) are also still unverified and need different hardware (11ax AP, INA meter) — honestly recorded in §B. Tracking: ruvnet/RuView#762, task #30 closed as known-issue. Co-Authored-By: claude-flow <ruv@ruv.net> |
||
|
|
f23e34ee5c |
feat(firmware): ESP32-C6 target — Wi-Fi 6 / 802.15.4 / TWT / LP-core (ADR-110)
`firmware/esp32-csi-node` now builds for both `esp32s3` (existing
production) and `esp32c6` (new research / battery-seed target) from
the same source tree. ESP-IDF auto-applies `sdkconfig.defaults.esp32c6`
when the target is set to esp32c6; every C6 module is gated on
CONFIG_IDF_TARGET_ESP32C6 (or the SOC_WIFI_HE_SUPPORT capability) so
the S3 build path is byte-identical to today.
New modules (all #ifdef-gated, no-op stubs on S3):
- c6_twt.{h,c} — iTWT wrapper, graceful AP-NACK fallback
- c6_timesync.{h,c} — 802.15.4 beacon-based mesh time-sync, EUI-64
leader election, c6_timesync_get_epoch_us()
- c6_lp_core.{h,c} — wake-on-motion deep-sleep helper (ext1 path
this cut; real LP-core polling deferred)
ADR-018 frame extension:
- byte 18: PPDU type (0=HT/legacy, 1=HE-SU, 2=HE-MU, 3=HE-TB)
- byte 19: bandwidth + STBC + 802.15.4-sync-valid flags
- Magic 0xC5110001 unchanged — backwards compatible
- Dual-branch encoding handles both struct variants of
wifi_pkt_rx_ctrl_t (legacy S3 / HE C6) per CONFIG_SOC_WIFI_HE_SUPPORT
Critical bug fixed during live witness collection (verified across 3
boards on COM6/COM9/COM12):
- c6_timesync.c read MAC into a 6-byte buffer and ran MAC-48->EUI-64
conversion. But esp_read_mac(ESP_MAC_IEEE802154) returns 8 bytes
already in EUI-64 form on C6 — code was double-inserting FFFE.
Boot log was 206ef1fffefffe17, fix yields 206ef1fffe17278c which
matches esptool's eFuse reading exactly.
Tooling:
- CI workflow (firmware-ci.yml) extended with c6-4mb matrix row +
ADR-110 host-unit-test step
- Host unit tests for pure functions (mac48_to_eui64,
eui64_bytes_to_u64, PPDU encoding both branches) — runs on Ubuntu CI
- Multi-board live-capture harness (test/capture-3board-experiment.py)
- Witness bundle script records SHA-256s for s3-adr110, c6-adr110, and
s3-fair-adr110 (apples-to-apples) binary archives
Honest empirical findings (full report in docs/WITNESS-LOG-110.md):
- Verified live on 3 C6 boards: boot, 802.15.4 init w/ correct EUIs,
WiFi STA reaching assoc->run on ruv.net, TWT setup attempted +
gracefully NACKed (AP is 11n-only, TWT Responder:0), HE-MAC firmware
loaded
- NOT verified (need 11ax AP / second-channel exp / INA meter):
HE-LTF subcarrier expansion, TWT cadence determinism, ±100 µs sync
alignment, 5 µA hibernation
- Bug found: leader election doesn't step down under live WiFi load —
likely 2.4 GHz radio coex preemption (WiFi ch 5 vs 15.4 ch 15);
follow-up task #30
- Apples-to-apples size: S3-no-display = 886 KB, C6 = 1003 KB
(C6 is 13% LARGER for equivalent CSI features; the extra is the
802.15.4 + OpenThread stack that S3 lacks)
Tracking: ruvnet/RuView#762
Co-Authored-By: claude-flow <ruv@ruv.net>
|