Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
fc905c5
deploy(esp32s3): fix DSP, OTA, discovery, mobile WS for room01/room02
arsenhandzan442-bot May 14, 2026
b292c7d
deploy: tp-link wisp ap + rssi-Δ presence detector + live calibration ui
arsenhandzan442-bot May 15, 2026
8aef820
deploy(esp32s3): PHY gain-lock for baseline-stable CSI + raw signals UI
arsenhandzan442-bot May 16, 2026
6604ada
feat(sensing-server): raw-amplitude presence/motion classifier (ADR-101)
arsenhandzan442-bot May 16, 2026
c3126c3
feat(raw.html): per-node classification badges (ADR-101)
arsenhandzan442-bot May 16, 2026
3393c1e
fix(rssi): correct parse_esp32_frame offsets + carry RSSI through fea…
arsenhandzan442-bot May 16, 2026
03b123b
feat(esp32 dsp): NBVI sliding-window per-subcarrier variance (deactiv…
arsenhandzan442-bot May 16, 2026
72047a4
feat(ops): one-command OTA deploy + mobile-first operator UI
arsenhandzan442-bot May 16, 2026
c22dfcd
fix(raw.html): guard zero RSSI + correct per-node fps counter
arsenhandzan442-bot May 16, 2026
2f12a22
feat(sensing-server): NBVI subcarrier selection (ADR-102)
arsenhandzan442-bot May 16, 2026
7535dff
fix(sensing-server): feature_state path keeps last raw amplitudes
arsenhandzan442-bot May 16, 2026
7185ead
chore(sensing-server/static): keep only raw.html, drop duplicates
arsenhandzan442-bot May 16, 2026
764388c
docs+fix: ESPectre technique reference + revert stale-amp UI fill
arsenhandzan442-bot May 17, 2026
f411992
feat(adr-103 v2): stable persistent baseline + NBVI quiet-window finder
arsenhandzan442-bot May 17, 2026
2f4b2d5
feat(adr-103 v2): universal threshold via baseline-CV normalization
arsenhandzan442-bot May 17, 2026
4d3ca49
docs: ADR-101 / ADR-102 / ADR-103 — full session record
arsenhandzan442-bot May 17, 2026
d28a183
docs(refs): espectre-gap-analysis.md — full Part-2 gap structured by …
arsenhandzan442-bot May 17, 2026
9aa027e
feat(adr-105): kill synthetic pose + hard-coded confidence — only rea…
arsenhandzan442-bot May 17, 2026
30244d2
feat(adr-105): kill synthetic signal_field — only real ESP32 data left
arsenhandzan442-bot May 17, 2026
45c759d
docs: ADR-105 — no synthetic data in production runtime
arsenhandzan442-bot May 17, 2026
4daa2c9
feat(adr-106): expose full complex CSI in WS NodeInfo (amp+phase+meta)
arsenhandzan442-bot May 17, 2026
8489efe
feat(adr-106): built-in CSI keepalive via managed ping processes
arsenhandzan442-bot May 17, 2026
c620862
docs: ADR-106 — full complex CSI in WS + managed-ping keepalive
arsenhandzan442-bot May 17, 2026
68068d7
feat(adr-106): server-side µs timestamp on raw-CSI ingest
arsenhandzan442-bot May 17, 2026
0f37346
feat(adr-107): REST /api/v1/baseline/* + auto-recalibrate in background
arsenhandzan442-bot May 17, 2026
45c1464
feat(adr-107): raw.html calibrate button + ADR
arsenhandzan442-bot May 17, 2026
274984d
docs(refs): ota-pipeline.md — verbatim OTA reproduction recipe
arsenhandzan442-bot May 17, 2026
b787f40
feat(adr-106): real sensor µs timestamp (rx_ctrl.timestamp) — flashed…
arsenhandzan442-bot May 17, 2026
6212b17
feat(adr-102/104): NBVI FP-rate validation + per-subcarrier drift pre…
arsenhandzan442-bot May 17, 2026
3779bb7
feat(adr-108): NVS persistence of gain-lock — reboot ready in 0.5s
arsenhandzan442-bot May 17, 2026
d7189d9
docs: ADR-104 (per-subcarrier drift) + ADR-108 (FW NVS persistence)
arsenhandzan442-bot May 17, 2026
e420459
docs: actualization sweep — close items shipped this session
arsenhandzan442-bot May 17, 2026
8431674
docs: CHECKLIST.md at repo root — discoverable single-source-of-truth
arsenhandzan442-bot May 17, 2026
598a4b2
feat(adr-105): n_aps_used in enhanced_motion/enhanced_breathing
arsenhandzan442-bot May 17, 2026
eec3ca6
feat(adr-104): per-sub drift in WS + raw.html sparkline + staleness w…
arsenhandzan442-bot May 17, 2026
197457a
docs: close ADR-104/105 open items shipped in 598a4b2f/eec3ca6c
arsenhandzan442-bot May 17, 2026
f0a5f80
docs: rename our ADR-099 (tplink-wisp) → ADR-110 to free ADR-099 for …
arsenhandzan442-bot May 17, 2026
4b58e54
Merge remote-tracking branch 'origin/main' into feat/ota-rssi-mobile
arsenhandzan442-bot May 17, 2026
f92807c
feat(adr-109): /ota/recalibrate + NVS AP-MAC binding for gain-lock
arsenhandzan442-bot May 17, 2026
169a589
docs(adr-109): new ADR + close ADR-108 open items
arsenhandzan442-bot May 17, 2026
c8ac60f
feat(adr-112): multi-AP signal_field via MultistaticFuser
arsenhandzan442-bot May 17, 2026
2dcb30a
feat(adr-105): hide pose canvas in Docker SPA when no model is loaded
arsenhandzan442-bot May 17, 2026
432753e
feat(adr-107): progress bar in raw.html calibrate button
arsenhandzan442-bot May 17, 2026
5a79127
docs(adr-112): ADR-112 + close ADR-105 + CHECKLIST sweep
arsenhandzan442-bot May 17, 2026
47dafab
feat(adr-104): phase-domain drift channel (script + server)
arsenhandzan442-bot May 17, 2026
a1e0952
feat(adr-113): day/night baseline profiles with hot-reload
arsenhandzan442-bot May 17, 2026
d9b73a2
docs(adr-113): ADR for day/night baseline profiles
arsenhandzan442-bot May 17, 2026
96225e2
feat(adr-114): 2000-packet replay regression suite
arsenhandzan442-bot May 17, 2026
c827cde
docs(adr-114): ADR for replay regression suite
arsenhandzan442-bot May 17, 2026
54adc48
docs: CHECKLIST sweep — 43 Done / 0 Open in-scope
arsenhandzan442-bot May 17, 2026
7d3e0c2
feat(adr-115): POST /ota/set-target — set CSI target IP/port via WiFi
arsenhandzan442-bot May 17, 2026
7cdd8f6
feat(adr-116): WiFlow-v1 supervised pose loader (Rust)
arsenhandzan442-bot May 17, 2026
0ec1e4b
fix(adr-116): surface WiFlow-v1 in Model Control dropdown
arsenhandzan442-bot May 17, 2026
6ce25ce
feat(adr-117): process hygiene + pose path honesty + audit sweep
arsenhandzan442-bot May 17, 2026
e86f650
feat(adr-118): feature decorrelation + multi-node extractor
arsenhandzan442-bot May 17, 2026
9433070
feat(adr-119): MLP classifier (22→32→6) replaces LogReg fallback
arsenhandzan442-bot May 17, 2026
da4c123
feat(adr-120): windowed temporal classifier (W-MLP) — 53.53% → 90.40%
arsenhandzan442-bot May 17, 2026
442c03d
fix(adr-120): hybrid priority — adaptive owns waving/transition
arsenhandzan442-bot May 17, 2026
3e12686
fix(adr-120): 7-tick majority smoothing — stops UI label flicker
arsenhandzan442-bot May 17, 2026
c3f00f3
tune(adr-120): adaptive smoothing window 7 → 15 ticks (~1.5s)
arsenhandzan442-bot May 17, 2026
77d404d
fix(adr-120): two-layer label smoothing — Layer1 30-tick mode + Layer…
arsenhandzan442-bot May 17, 2026
2956414
fix(adr-120): centralised motion-label smoothing — 0 flips in 30s
arsenhandzan442-bot May 17, 2026
12e1cf9
feat(adr-120): /api/v1/adaptive/debug + softer smoothing (15/2)
arsenhandzan442-bot May 17, 2026
e2c6819
docs: CHECKLIST sweep + .gitignore session artifacts + UI CSS catchup
arsenhandzan442-bot May 18, 2026
4075b60
docs: enforce ≤200-line cap on README/CLAUDE/CHECKLIST and 3 ADRs
arsenhandzan442-bot May 18, 2026
2538fa2
docs: import hardware photos + sensor inventory
arsenhandzan442-bot May 18, 2026
831602b
docs(sensors): correct hardware mapping — nodes 1/2 are camera boards
arsenhandzan442-bot May 18, 2026
cb6e24e
feat(adr-121): HLK-LD2402 mmWave radar live readout in UI
arsenhandzan442-bot May 18, 2026
a36af57
fix(docs): repair internal links broken by README/CLAUDE doc-slim
arsenhandzan442-bot May 18, 2026
b74ffd9
chore(ui): serve raw.html from ui/ so the calibration console is reac…
arsenhandzan442-bot May 18, 2026
e53a2e1
feat(adr-121): mmWave radar pill in raw.html top bar
arsenhandzan442-bot May 18, 2026
f6adcb2
ui(raw): surface WiFi-CSI breathing + heart rate pills
arsenhandzan442-bot May 18, 2026
26d47a9
ui(raw): show adult-at-rest norms next to vital pills
arsenhandzan442-bot May 18, 2026
b9d1f63
feat(mmwave): dual-source vital signs (WiFi-CSI 📶 vs mmWave 📡)
arsenhandzan442-bot May 18, 2026
81e848e
feat(mmwave): ADR-122 — HLK-LD2402 Engineering Mode + heart rate
arsenhandzan442-bot May 18, 2026
ee6d9df
fix(mmwave): presence-gate vitals so empty beam doesn't show a number
arsenhandzan442-bot May 18, 2026
5eac273
fix(mmwave): override distance to "<70 cm" in radar near-field
arsenhandzan442-bot May 18, 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
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -258,3 +258,12 @@ v2/crates/rvcsi-node/*.node
v2/crates/rvcsi-node/binding.js
v2/crates/rvcsi-node/binding.d.ts
v2/crates/rvcsi-node/npm/

# ADR-117/118/119/120: deployment-specific training artifacts.
# - recordings/ are large (175 MB each) and room/operator-specific
# - adaptive_model.json is regenerated by `POST /api/v1/adaptive/train`
# - baseline.json is regenerated by `POST /api/v1/baseline/calibrate`
v2/data/recordings/
v2/data/adaptive_model.json
v2/data/baseline.json
.claude/launch.json
199 changes: 199 additions & 0 deletions CHECKLIST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
# RuView · Implementation Checklist

Single source of truth for what's shipped and what's open. Updated
at the end of every session. Pair with
[`docs/references/espectre-gap-analysis.md`](docs/references/espectre-gap-analysis.md)
for the technical detail behind each line.

Last sweep: **2026-05-18**, branch `feat/ota-rssi-mobile`, head `12e1cf9d`.
Status: **50 Done / 0 Open in-scope**. Deferred listed at the bottom.

ADR-100..114 carry-in from the prior agent; ADR-115..120 are this
session. ADR-111 intentionally absent (folded into ADR-109).

Adaptive classifier accuracy trajectory this session — full detail in
ADR-118/119/120:

| Stage | Acc |
|---|---|
| 2-node, 15-feat LogReg (baseline) | 40.4% |
| 6-node, 15-feat LogReg | 44.4% |
| 6-node, 22-feat LogReg (ADR-118) | 49.58% |
| 6-node, 22-feat MLP (ADR-119) | 53.53% |
| 6-node, 22-feat W-MLP (ADR-120) | **90.40%** (training-set) |

W-MLP 90.40% is training-set accuracy; held-out test + cleaner
per-class re-records are the recommended next step.

---

## ✅ Done

### Server (`v2/crates/wifi-densepose-sensing-server`)

- [x] **ADR-100** PHY gain-lock (AGC + FFT freeze, ESPectre port) — FW
- [x] **ADR-101** Raw-amplitude classifier (CV + baseline drop, hysteresis)
- [x] **ADR-101** Per-node classification badges in WS payload
- [x] **ADR-102** NBVI subcarrier selection (formula α=0.5, top-12)
- [x] **ADR-102** NBVI Step 1 quiet-window finder
- [x] **ADR-103** Persistent baseline at `data/baseline.json` (FULL broadband)
- [x] **ADR-103** Universal threshold via baseline-CV normalization
- [x] **ADR-104** Per-subcarrier drift channel (off-axis presence)
- [x] **ADR-104** NBVI Step 3 FP-rate validation (K ∈ {6,8,10,12,16,20})
- [x] **ADR-104** Per-sub drift exposed in WS `node_features[].drift_score`
+ raw.html sparkline per node (commit eec3ca6c)
- [x] **ADR-104** Baseline staleness watch — warn when on-disk baseline
> 4 h old AND drift consistently fires during `absent` periods
(commit eec3ca6c)
- [x] **ADR-105** Drop all synthetic data from runtime
([signal_field, pose_keypoints, persons, fake confidence — all gated)
- [x] **ADR-105** `n_aps_used: u8` uniform field on `enhanced_motion` +
`enhanced_breathing` (commit 598a4b2f)
- [x] **ADR-106** Full complex CSI in WS (`amplitude` + `phases` + meta)
- [x] **ADR-106** Built-in CSI keepalive (managed `ping` per sensor)
- [x] **ADR-106** Server-side µs `timestamp_us`
- [x] **ADR-107** `POST /api/v1/baseline/calibrate` + UI button
- [x] **ADR-107** Auto-recalibrate on long-quiet periods (30 min default)
- [x] **ADR-107** `GET /api/v1/baseline` (status + cooldown)
- [x] **ADR-107** Progress bar in raw.html calibrate button
(commit 432753e1)
- [x] **ADR-112** Multi-AP `signal_field` via `MultistaticFuser` —
coverage × activity heatmap, non-zero only with ≥2 nodes +
positions; preserves ADR-105 zero-grid otherwise (commit c8ac60f6)
- [x] **ADR-105** Hide pose canvas in Docker SPA when
`model_loaded == false` + "no trained model" overlay
(commit 2dcb30a6)
- [x] **ADR-104** Phase-domain drift channel — script + server both
compute per-subcarrier circular mean/var; `phase_drift_score`
surfaced on `PerNodeFeatureInfo` (commit 47dafab4)
- [x] **ADR-113** Day/night baseline profiles with hot-reload
(`--baseline-profile {single,auto,day,night}`) (commit a1e09525)
- [x] **ADR-114** 2000-packet replay regression suite (1000 idle +
1000 motion synthetic-but-parameter-matched, F1 ≥ 0.85
threshold) (commit 96225e27)

### Firmware (`firmware/esp32-csi-node`)

- [x] **ADR-100** Gain-lock (300-packet median, MIN_SAFE_AGC=30 safety)
- [x] **ADR-106** Sensor µs timestamp in CSI trailer (`rx_ctrl.timestamp`)
- [x] **ADR-108** NVS persistence of gain-lock — reboot ready in ~0.5 s
- [x] **ADR-109** `POST /ota/recalibrate` — clear gain-lock NVS via REST,
no USB needed (commit f92807cd)
- [x] **ADR-109** Track AP MAC in `gl_ap_mac` NVS — auto-invalidate
stale gain-lock on AP swap (commit f92807cd)
- [x] **ADR-115** `POST /ota/set-target` — repoint CSI aggregator
(`csi_cfg/target_ip` + `target_port`) without USB; recovered
both nodes after Mac IP move TP-Link → .103

### Pose model

- [x] **ADR-116** WiFlow-v1 supervised pose loader (Rust) — `--wiflow-model
data/models/ruview/wiflow-v1/wiflow-v1.json` flips
`pose_estimation: true`; per-tick TCN forward yields 17 COCO
keypoints on `/api/v1/pose/current` and WS `pose_data`. Output
quality requires per-deployment fine-tune (LoRA adapters or
re-train, see Pack E).
- [x] **ADR-117** Process hygiene + audit follow-ups — UDP loopback
filter prevents `cargo test` cross-talk from spawning ping
zombies (250→2 children); keepalive pre-reaps orphans at startup;
`/` redirects to SPA; wiflow zero-pad replaces silent
subcarrier-0 duplication; keypoint confidence stamped from
runtime classifier; sensing tab container restored; multi-node
test guards external :5005; docs/typo/range sweep.

### Adaptive Classifier (data pipeline + model)

- [x] **ADR-118** Feature decorrelation + multi-node extractor (22 feats
= 4 global + 6 nodes × 3 with z-score). Accuracy 44.4% → 49.58%
(`e86f6506`).
- [x] **ADR-119** Frame-level MLP (22→32→6 ReLU+softmax), manual
backprop, ~3k weights. Accuracy 49.58% → 53.53% (`94330708`).
- [x] **ADR-120** Windowed temporal W-MLP (440→64→6, 20×22 stack) —
captures walking / sit-stand / gesture cadence. Accuracy 53.53%
→ 90.40% training; held-out TBD. Hybrid priority (rule-based owns
4 base, W-MLP owns waving/transition) + two-layer label smoothing
+ `/api/v1/adaptive/debug` (`da4c123d`..`12e1cf9d`, 7 commits).

### Tests / fixtures

- [x] **ADR-114** `tests/fixtures/replay_idle.jsonl` +
`replay_motion.jsonl` (1000 frames each, JSONL schema:
`{node_id, amplitude[]}`) (commit 96225e27)
- [x] **ADR-114** `scripts/generate-replay-fixtures.py` —
seeded deterministic generator for the two fixtures
(commit 96225e27)
- [x] (parallel agent) RSSI carry-through via feature_state header fix
- [x] (parallel agent) OTA: `OTA_SIZE_UNKNOWN`, httpd stack_size=8192,
reset-reason log — all three FW prerequisites for working OTA

### Ops / tooling

- [x] `scripts/ota-deploy.sh` — WiFi OTA flash + auto-discovery + verify
- [x] `scripts/record-baseline.py` — headless baseline capture (CLI)
- [x] `data/baseline.json` v2 schema
- [x] `docs/references/ota-pipeline.md` — verbatim OTA recipe (port 8032)

### Documentation

- [x] **ADR-100..120** all written (ADR-111 intentionally absent), each ≤ 200 lines
- [x] `docs/references/espectre-techniques.md` — Pace technique catalogue
- [x] `docs/references/espectre-gap-analysis.md` — section-by-section gap
- [x] Documentation actualization sweep — every Open Items section
cross-checked against actual implementation state

---

## ⏳ Open, priority-sorted

### High value, low effort

(all closed this session — see Done above. Tailscale-target item
moved to Deferred below per session brief.)

### High value, medium effort

(all closed this session — see Done above)

### Bigger, lower urgency (still active)

(all closed this session — multiple baseline profiles shipped via
ADR-113, see Done above)

### One-time hygiene

- [x] **Re-record `data/baseline.json`** — current file already carries
`per_subcarrier_mean` so amplitude drift (ADR-104) is active.
Verified the recorder writes the new
`per_subcarrier_phase_mean` / `per_subcarrier_phase_var` schema
end-to-end (this session). `data/baseline.json` is untracked,
so no repo commit needed; operator re-records via UI when they
step out for a true empty-room sample (currently the file
reflects an operator-present recording — fine for the amp
channel, needs re-record for the phase channel to populate
≥ 16 usable subcarriers).

### Deferred — out of session scope

Each line carries an explicit reason; revisit if scope changes.

* New integrations (excluded by session brief): HA/MQTT, ESPHome,
Web Serial game, DensePose train, AETHER pretrain, MERIDIAN.
* FW changes excluded: boot-time NBVI freeze, per-channel NVS cache
for gain-lock, channel hopping (ADR-029), multi-antenna support
(`n_antennas > 1`).
* **Tailscale-target in NVS** — Mac stable on TP-Link this session;
low ROI. ADR-100 follow-up if Mac network swap becomes routine.

---

## Reference

| Doc | Purpose |
|---|---|
| [`docs/adr/`](docs/adr) | All ADRs 001-120 (111 absent); 100-120 are this session |
| [`docs/references/espectre-techniques.md`](docs/references/espectre-techniques.md) | Pace technique catalogue + RuView adoption |
| [`docs/references/espectre-gap-analysis.md`](docs/references/espectre-gap-analysis.md) | Section-by-section gap with priority table |
| [`docs/references/ota-pipeline.md`](docs/references/ota-pipeline.md) | OTA recipe — port 8032, three FW prereqs |

To mark an item done: tick the box, add `(ADR-XXX, commit-sha)` after
the line, move it from the priority section to the top "Done" section.
Loading