mirror of
https://github.com/ruvnet/RuView
synced 2026-08-01 19:01:42 +00:00
9cd1b8ce2a
R12 (tick 5) was a NEGATIVE result: naive SVD-spectrum cosine distance detected structure changes at 0.69x the natural drift floor (= undetectable). R12 explicitly identified the revision: 'PABS over Fresnel basis'. R6.1 (tick 18) shipped the multi-scatterer Fresnel forward operator. This tick implements PABS on top of it. PABS = ||y_observed - y_predicted||^2 / ||y_observed||^2 Benchmark (5 m link, 2.4 GHz, subject + 4 wall reflectors expected): | Scenario | PABS / drift | SVD (R12) / drift | |--------------------------------|---------------:|------------------:| | Empty room (subject missing) | 7,362x | 65x | | Subject as expected (sanity) | 0x | 0x | | +1 new furniture | 84x | 11x | | +1 unexpected human | 1,161x | 11x | | Subject moved 10 cm | 21,966x | 90x | | Natural drift (5% wall shift) | 1x | 1x | PABS detects unexpected human at 1161x natural drift; R12 SVD detected at 11x. ~100x lift purely from physics-grounded prediction vs naive statistical eigenshift. R12 NEGATIVE -> POSITIVE. The meta-lesson: a research loop that catalogues NEGATIVE results creates a backlog of revisitable work that pays off when later tools become available. R12 -> R12 PABS is the worked example. R13 cannot be similarly revisited -- its 5 dB shortfall is a hard physics floor, not a missing model. The subject-moved-10cm caveat: PABS detects ANY mismatch between expected and observed scene. Real production PABS needs a pose-aware forward model that updates from pose_tracker.rs in real-time. The actual detection signal is PABS-after-pose-update. ~50-100 LOC Rust glue, catalogued as R12.1 follow-up. Composes: - R6.1 unblocked this implementation - R7 gets precise per-link consistency: residual small on all links = no structure; spike on one = local structure OR compromised link; mincut disambiguates - R11 enables maritime container-tamper / hatch-seal apps - R14 gets V0 security feature (intruder detection w/o biometric storage) - ADR-029 needs to reference PABS as structure-detection primitive - R10 PABS-vs-canopy works if forest modelled or learned Honest scope: - Pose-PABS closed loop not yet built - Synthetic data only; real-world drift floor needs measurement - Population-prior body; per-subject would tighten residual - Single time-frame; real pipeline needs temporal averaging Coordination: ticks/tick-19.md, no PROGRESS.md edit.
69 lines
3.4 KiB
Markdown
69 lines
3.4 KiB
Markdown
# Tick 19 — 2026-05-22 07:44 UTC
|
||
|
||
**Thread:** R12 PABS implementation
|
||
**Verdict:** **R12 NEGATIVE → POSITIVE.** PABS detects unexpected occupants at **1,161× natural drift floor** vs R12 naive SVD's 11× — a **~100× lift** purely from using physics-grounded prediction.
|
||
|
||
## What shipped
|
||
|
||
- `examples/research-sota/r12_pabs_implementation.py` — pure-numpy PABS over R6.1's multi-scatterer forward operator.
|
||
- `examples/research-sota/r12_pabs_results.json` — full 6-scenario benchmark.
|
||
- `docs/research/sota-2026-05-22/R12-pabs-implementation.md` — research note documenting the NEGATIVE → POSITIVE conversion.
|
||
|
||
## Headline benchmark
|
||
|
||
| Scenario | PABS / drift | SVD (R12 baseline) / drift |
|
||
|---|---:|---:|
|
||
| Empty room (subject missing) | **7,362×** | 65× |
|
||
| Subject as expected (sanity check) | 0× | 0× |
|
||
| +1 new furniture | **84×** | 11× |
|
||
| +1 unexpected human | **1,161×** | 11× |
|
||
| Subject moved 10 cm | 21,966× | 90× |
|
||
| Natural drift floor (5% wall) | 1× | 1× |
|
||
|
||
## Why this is the meta-positive result
|
||
|
||
Two negative results in this loop (R12, R13). R12 has now been **revisited and turned positive** by using a tool (R6.1's multi-scatterer forward operator) that didn't exist when R12 was first run. This is the meta-lesson:
|
||
|
||
> A research loop that catalogues NEGATIVE results creates a backlog of revisitable work that pays off when later tools become available. R12 → R12 PABS is a worked example.
|
||
|
||
R13 cannot be similarly revisited — its 5 dB shortfall is a hard physics floor, not a missing model.
|
||
|
||
## The subject-moved-10cm caveat
|
||
|
||
Scenario F gives PABS=22,000×, which looks like a bug but is correct behaviour. PABS detects **any** structural mismatch between expected and observed. Real production PABS needs a **pose-aware forward model** that updates the expected scene from `pose_tracker.rs` in real-time. The actual structure-detection signal is **PABS-after-pose-update**.
|
||
|
||
This is ~50-100 LOC of Rust glue. Catalogued as R12.1 follow-up.
|
||
|
||
## Composes with everything
|
||
|
||
- **R6.1** unblocked this implementation
|
||
- **R7** gets precise per-link consistency definition (residual norm small on all links → no structure; spike on one → either local structure OR compromised link; mincut disambiguates)
|
||
- **R11** (maritime) enables container-tamper / hatch-seal applications
|
||
- **R12 NEGATIVE** → POSITIVE
|
||
- **R14** (V0 security feature) intruder detection without biometric storage
|
||
- **ADR-029** needs to reference PABS as the structure-detection primitive
|
||
- **R10** (foliage) PABS-vs-forest works if canopy modelled or learned
|
||
|
||
## Honest scope
|
||
|
||
- Pose-PABS closed loop not yet built (every subject move = false alarm)
|
||
- Synthetic data only; real-world drift floor needs measurement
|
||
- Population-prior body; per-subject body would tighten residual
|
||
- Single time-frame (real pipeline needs temporal averaging)
|
||
|
||
## Coordination
|
||
|
||
`ticks/tick-19.md`. No PROGRESS.md edit. Branch `research/sota-r12-pabs-implementation`.
|
||
|
||
## Remaining work
|
||
|
||
- **R12.1**: pose-PABS closed loop
|
||
- **R12.2**: localised residual decomposition (where is the structural change)
|
||
- **R12.3**: real-world validation on bench ESP32 captures
|
||
- **R3 follow-up**: physics-informed env_sig prediction
|
||
- **R6.2.1**: 3D ceiling/floor placement
|
||
- **R6.2.3**: chest-centric / pose-trajectory zones
|
||
- **ADR-107**: cross-installation federation w/ secure aggregation
|
||
|
||
~4.3h to cron stop. **19 ticks landed. 1 NEGATIVE result revisited and turned POSITIVE.**
|