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.
3.4 KiB
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.