Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
9c95bfa
feat(nvsim): scaffold + scene + frame [nvsim:pass1]
ruvnet Apr 26, 2026
a6ac08c
feat(nvsim): source.rs Biot–Savart synthesis [nvsim:pass2]
ruvnet Apr 26, 2026
8c062fb
feat(nvsim): propagation.rs material attenuation [nvsim:pass3]
ruvnet Apr 26, 2026
1776241
feat(nvsim): sensor.rs NV ensemble [nvsim:pass4]
ruvnet Apr 26, 2026
2dddd45
docs(nvsim): plain-language README — intro, capabilities, comparison,…
ruvnet Apr 26, 2026
436d383
feat(nvsim): digitiser + pipeline end-to-end [nvsim:pass5]
ruvnet Apr 26, 2026
5faeddc
docs(adr): ADR-089 (nvsim simulator, Accepted) + ADR-090 (Lindblad, P…
ruvnet Apr 26, 2026
49d1867
feat(nvsim): proof bundle + criterion bench + WASM-ready [nvsim:pass6]
ruvnet Apr 26, 2026
d285ba6
docs(nvsim): CLAUDE.md crate table + CHANGELOG entry [nvsim:plan-1.5]
ruvnet Apr 26, 2026
b2dd585
docs(research): Ghost Murmur RuView spec [quantum-sensing 16/—]
ruvnet Apr 26, 2026
508e2c6
docs(adr): ADR-091 stand-off radar tier research [proposed]
ruvnet Apr 26, 2026
db1ccbf
docs(adr): ADR-092 nvsim dashboard implementation [proposed]
ruvnet Apr 26, 2026
39ec05e
feat(dashboard): nvsim Vite+Lit dashboard with WASM transport + App S…
ruvnet Apr 26, 2026
5846c3d
feat(nvsim): server + onboarding + PWA + GH Pages workflow [ADR-092]
ruvnet Apr 27, 2026
79826b9
fix(dashboard): pass Vite BASE_URL to worker for GH-Pages base resolu…
ruvnet Apr 27, 2026
4483a88
feat(dashboard): wire all rail buttons + add Ghost Murmur view
ruvnet Apr 27, 2026
1c922ed
feat(dashboard): live Ghost Murmur WASM demo + ADR-093 gap analysis
ruvnet Apr 27, 2026
c9fbda1
feat(dashboard): iter B+C+D+E+F — sim controls, scene toolbar, seed m…
ruvnet Apr 27, 2026
18c09d3
feat(dashboard): iter G+H+I + P0.10 — modal forms, a11y pass, drag pe…
ruvnet Apr 27, 2026
eed5fee
feat(dashboard): full-screen Inspector + Witness views (P1.13)
ruvnet Apr 27, 2026
21ad10e
feat(dashboard): UX usability pass — help center, 10-step welcome tou…
ruvnet Apr 27, 2026
6fe405a
fix(wasm-edge): gate ghost_hunter bin behind standalone-bin feature
ruvnet Apr 27, 2026
cedb28d
feat(dashboard): App Store runtime — 6 simulated apps emit real event…
ruvnet Apr 27, 2026
f25b82d
feat(dashboard): always-visible Tour button — replay welcome modal an…
ruvnet Apr 27, 2026
b34e5ee
feat(dashboard): Home view as default landing
ruvnet Apr 27, 2026
779cb83
feat(dashboard): Home view hides support panels for focused first imp…
ruvnet Apr 27, 2026
dfe1ce8
feat(dashboard): WsClient transport + ADR-092/093 status updates
ruvnet Apr 27, 2026
01f7209
feat(dashboard): close ADR-093 P2.4 + P2.6 — light-theme AA + keyboar…
ruvnet Apr 27, 2026
f5ec749
infra: nvsim-server Docker + axe-core cross-browser CI
ruvnet Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/dashboard-a11y.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Dashboard a11y + cross-browser

# Runs axe-core a11y assertions on the built dashboard across
# Chromium, Firefox, and WebKit. Closes ADR-092 §11.5 (axe-core)
# and §11.8 (cross-browser).

on:
push:
branches: [main]
paths: ['dashboard/**', 'v2/crates/nvsim/**']
pull_request:
paths: ['dashboard/**']
workflow_dispatch:

permissions:
contents: read

jobs:
a11y:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.
with: { targets: wasm32-unknown-unknown }

- run: cargo install wasm-pack --locked --version 0.13.x || true

- name: Build nvsim WASM
working-directory: v2
run: |
wasm-pack build crates/nvsim --target web \
--out-dir ../../dashboard/public/nvsim-pkg \
--release -- --no-default-features --features wasm
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm, cache-dependency-path: dashboard/package-lock.json }

- working-directory: dashboard
run: |
npm ci
npm install --save-dev @playwright/test @axe-core/playwright
npx playwright install --with-deps
npm run build
npx playwright test
85 changes: 85 additions & 0 deletions .github/workflows/dashboard-pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: nvsim Dashboard → GitHub Pages

# Deploys the nvsim Vite/Lit dashboard to gh-pages/nvsim/ — preserving
# the existing observatory/, pose-fusion/, and root index.html demos
# already published from gh-pages. ADR-092 §9.

on:
push:
branches: [main]
paths:
- 'v2/crates/nvsim/**'
- 'dashboard/**'
- '.github/workflows/dashboard-pages.yml'
workflow_dispatch:

permissions:
contents: write

concurrency:
group: dashboard-pages
cancel-in-progress: true

jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout main
uses: actions/checkout@v4

- name: Install Rust + wasm32 target
uses: dtolnay/rust-toolchain@stable

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.
with:
targets: wasm32-unknown-unknown

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
v2/target
key: ${{ runner.os }}-cargo-nvsim-${{ hashFiles('v2/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-nvsim-

- name: Install wasm-pack
run: cargo install wasm-pack --locked --version 0.13.x || true

- name: Build nvsim WASM
working-directory: v2
run: |
wasm-pack build crates/nvsim \
--target web \
--out-dir ../../dashboard/public/nvsim-pkg \
--release \
-- --no-default-features --features wasm

- name: Setup Node 20
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: dashboard/package-lock.json

- name: Install dashboard deps
working-directory: dashboard
run: npm ci

- name: Build dashboard
working-directory: dashboard
env:
NVSIM_BASE: /RuView/nvsim/
run: npm run build

- name: Deploy to gh-pages/nvsim/
uses: peaceiris/actions-gh-pages@v4

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dashboard/dist
destination_dir: nvsim
# CRITICAL: preserves observatory/, pose-fusion/, root index.html
# and any other RuView demos already on gh-pages.
keep_files: true
commit_message: 'deploy(nvsim): ${{ github.sha }}'
user_name: 'github-actions[bot]'
user_email: 'github-actions[bot]@users.noreply.github.com'
69 changes: 69 additions & 0 deletions .github/workflows/nvsim-server-docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: nvsim-server → ghcr.io

# Builds and publishes the nvsim-server Docker image to ghcr.io on:
# - push to main affecting nvsim-server or nvsim
# - tag push matching nvsim-server-v*
# - manual workflow_dispatch
#
# ADR-092 §6.2 + §9.4.

on:
push:
branches: [main]
paths:
- 'v2/crates/nvsim-server/**'
- 'v2/crates/nvsim/**'
- '.github/workflows/nvsim-server-docker.yml'
tags: ['nvsim-server-v*']
workflow_dispatch:

permissions:
contents: read
packages: write

jobs:
build-and-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: docker/setup-buildx-action@v3

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.

- uses: docker/login-action@v3

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@v5

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.
with:
images: ghcr.io/ruvnet/nvsim-server
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha,format=short
type=raw,value=latest,enable={{is_default_branch}}

- name: Build + push
uses: docker/build-push-action@v5

Check notice

Code scanning / KICS

Unpinned Actions Full Length Commit SHA Note

Action is not pinned to a full length commit SHA.
with:
context: v2
file: v2/crates/nvsim-server/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64

- name: Smoke-test the image
run: |
docker pull ghcr.io/ruvnet/nvsim-server:sha-${GITHUB_SHA::7} || \
docker pull ghcr.io/ruvnet/nvsim-server:latest
docker run --rm -d --name nvsim-test -p 7878:7878 \
ghcr.io/ruvnet/nvsim-server:latest
sleep 4
curl -fsS http://localhost:7878/api/health
docker stop nvsim-test
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added
- **`nvsim` crate — deterministic NV-diamond magnetometer pipeline simulator** (ADR-089) —
New standalone leaf crate at `v2/crates/nvsim` modeling a forward-only
magnetic sensing path: scene → source synthesis (Biot–Savart, dipole,
current loop, ferrous induced moment) → material attenuation
(Air/Drywall/Brick/Concrete/Reinforced/SteelSheet) → NV ensemble
(4 〈111〉 axes, ODMR linear-readout proxy, shot-noise floor per
Wolf 2015 / Barry 2020) → 16-bit ADC + lock-in demodulation →
fixed-layout `MagFrame` records → SHA-256 witness. Six-pass build
per `docs/research/quantum-sensing/15-nvsim-implementation-plan.md`.
50 tests, ~4.5 M samples/s on x86_64 (4500× the Cortex-A53 1 kHz
acceptance gate), pinned reference witness
`cc8de9b01b0ff5bd97a6c17848a3f156c174ea7589d0888164a441584ec593b4`
for byte-equivalence regression. WASM-ready by construction
(zero `std::time/fs/env/process/thread`); builds cleanly for
`wasm32-unknown-unknown`. ADR-090 (Proposed, conditional) tracks the
optional Lindblad/Hamiltonian extension if AC magnetometry, MW power
saturation, hyperfine spectroscopy, or pulsed protocols become required.

### Fixed
- **Ghost skeletons in live UI with multi-node ESP32 setups** (#420, ADR-082) —
`tracker_bridge::tracker_to_person_detections` documented itself as filtering
Expand Down
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Dual codebase: Python v1 (`v1/`) and Rust port (`v2/`).
| `wifi-densepose-sensing-server` | Lightweight Axum server for WiFi sensing UI |
| `wifi-densepose-wifiscan` | Multi-BSSID WiFi scanning (ADR-022) |
| `wifi-densepose-vitals` | ESP32 CSI-grade vital sign extraction (ADR-021) |
| `nvsim` | Deterministic NV-diamond magnetometer pipeline simulator (ADR-089) — standalone leaf, WASM-ready |

### RuvSense Modules (`signal/src/ruvsense/`)
| Module | Purpose |
Expand Down
Binary file added assets/NVsim Dashboard.zip
Binary file not shown.
5 changes: 5 additions & 0 deletions dashboard/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules
dist
.vite
*.log
public/nvsim-pkg
18 changes: 18 additions & 0 deletions dashboard/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!doctype html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>RuView · nvsim — NV-Diamond Magnetometer Simulator</title>
<meta name="description" content="Deterministic forward simulator for NV-diamond magnetometry. WASM-backed CW-ODMR pipeline with witness-grade SHA-256 proofs." />
<meta name="theme-color" content="#0d1117" />
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='6' fill='%23e6a86b'/><text x='16' y='22' text-anchor='middle' font-family='monospace' font-weight='700' font-size='14' fill='%231a0f00'>NV</text></svg>" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
</head>
<body>
<nv-app></nv-app>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
Loading
Loading