Files
ruvnet--RuView/docs/research/sota-2026-05-22/ticks/tick-19.md
T
rUv 9cd1b8ce2a research(R12 PABS): NEGATIVE -> POSITIVE — 1161x detection lift via R6.1 forward model (#722)
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.
2026-05-22 03:49:41 -04:00

3.4 KiB
Raw Blame History

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.