docs/research/sota-2026-05-22/ticks/tick-19.md
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.
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.| 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× |
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.
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.
ticks/tick-19.md. No PROGRESS.md edit. Branch research/sota-r12-pabs-implementation.
~4.3h to cron stop. 19 ticks landed. 1 NEGATIVE result revisited and turned POSITIVE.