docs/research/sota-2026-05-22/ticks/tick-29.md
Thread: R12.1 (pose-PABS closed loop) Verdict: Synthetic validation of R12 PABS's deferred closure. Pose-updated pipeline gives 9.36× intruder detection lift vs fixed-expected's 1.29×. False-alarm problem from R12 PABS resolved. R12 thread fully closed.
examples/research-sota/r12_1_pose_pabs_loop.py — pure-numpy 50-frame walking-subject + intruder-at-T=25 simulation.examples/research-sota/r12_1_pose_pabs_results.jsondocs/research/sota-2026-05-22/R12_1-pose-pabs-closed-loop.md| Phase | Fixed-expected (R12 naive) | Pose-updated (R12.1 loop) |
|---|---|---|
| Pre-intruder (subject walking) | 6.02 | 0.30 |
| Post-intruder | 7.76 | 2.84 |
| Intruder detection lift | 1.29× | 9.36× |
Pose updates suppress subject-motion noise by 20× (6.02 → 0.30), leaving the intruder as a clean 9.36× spike.
R12 PABS gave 1,161× lift in static scenes but had false alarms when subjects moved. R12.1 closes this gap: the forward model is updated each frame from a simulated pose tracker (5 cm noise, matching ADR-079's 95% PCK@20). Subject motion gets absorbed into the prediction; only the intruder remains as unexplained residual.
| Tick | State | Headline |
|---|---|---|
| R12 (tick 5) | NEGATIVE | SVD eigenshift fails: 0.69× signal/drift |
| R12 PABS (tick 19) | POSITIVE | 1,161× intruder detection (static) |
| R12.1 (this) | CLOSED LOOP | 9.36× intruder detection (dynamic) |
Failure → success with caveat → success without caveat. The multi-tick arc that justifies a long research loop.
R12 PABS catalogued ~50-100 LOC. Concretely:
let pose = pose_tracker.estimate(csi_window)?;
let expected_scene = body_model.from_pose(pose) + room_walls;
let y_predicted = fresnel_forward.simulate(expected_scene);
let pabs = (csi_window - y_predicted).norm_sq() / csi_window.norm_sq();
if pabs > threshold { emit_structure_event(); }
~80 LOC + ~30 LOC plumbing. Slot into existing vital_signs cog per-frame inference path.
ticks/tick-29.md. No PROGRESS.md edit. Branch research/sota-r12.1-pose-pabs-loop.
After this tick, the loop has:
~2.1h to cron stop. Next tick is either: