c-ble-drift-trigger — session 1 (trigger evaluation over the session-2 drift corpus)
Verdict
The trigger mechanism exists in the physics — and the payoff is budget, not accuracy. On an 84-run layout-drift corpus with co-registered BLE (4 arms × 7 states × 3 seeds; 63 runs attached to c-csi-layout-drift session 01KWHXSZKAC8M8T5D9TKX112D8, the 21 signal-arm losin runs attached here), the cross-modal disagreement statistic xmodal — the gap between independently calibrated CSI→count and BLE-RSSI→count maps, computable online without ground truth — passes both detectability halves: Spearman ρ = 0.93 [CI 0.72–1.0] against true occupancy error on the in-path arm, and quiet on 100% of control cells and 94.4% of error-irrelevant-shift cells. recalibration-trigger-from-drift moves candidate → chosen; strength stays plausible (in-silico).
The discrimination result
The corpus deliberately separates environment change from model degradation: the losperp arm shifts per-link mean amplitude ~27 dB with flat count error, while losin (displacement into deep LOS blockage) grows error with spread across placement seeds — never-recalibrate sequence means 0.66 / 0.39 / 0.66 persons by seed (seed 1's placements happen to be drift-robust; the 0.29→0.93 excursion is the seed-0 case, not typical).
csi-ks(CSI self-monitoring, no BLE hardware): ρ = 0.61 [0.15, 0.94], but false-fires on 17% of error-irrelevant shifts — a raw distribution-shift detector confuses "the room changed" with "the model broke".ble-ks(BLE channel shift): ρ = 0.62, 0% onlosperp.xmodal: ρ = 0.93, 5.6% onlosperp— the BLE channel's value here is not as a people-counter (both maps are weak) but as a second, differently-drifting physical reference whose disagreement with CSI isolates prediction-relevant drift.oracle-counter(idealized BLE device-counter, the ble-ground-truth-sufficiency premise): ρ = 0.97 [0.87, 0.99]. The deployablexmodalis statistically indistinguishable from this ceiling at n=18 cells/arm (CIs overlap heavily). Pooled-arm AUCs (0.94–0.997) are reported in the metrics but inflated by the easy no-error arms; the per-arm pair above is the honest test.
Policy at matched budget — the honest negative
Over the 6 drifted states of the signal arm (budget 2 recals), mean error / recals spent:
| policy | losin error | losin recals | estate-wide recals (4 arms) |
|---|---|---|---|
| never recalibrate | 0.566 | 0 | 0 |
| fixed evenly-spaced | 0.399 | 2.0 | 8.0 |
| trigger[xmodal] | 0.407 | 1.33 | 2.0 |
| oracle-error (perfect knowledge) | 0.421 | 1.0 | 2.0 |
Criterion 4's strict inequality fails (0.407 > 0.399, per-seed: ties on 2/3, +0.019 on one). More telling: even the perfect-knowledge trigger does not beat fixed cadence on error at this budget — recalibrating on schedule also helps below-threshold drift the trigger deliberately ignores. The event-driven payoff is therefore parity at one-quarter of the calibration spend (2.0 vs 8.0 recals across an estate where 3 of 4 zones never drift), not error reduction. Footnote: the policy loop fires slightly more often than the open-loop detectability table (e.g. losperp 0.67 recals/sequence vs 5.6% cell fire-rate) because after each recalibration statistics and thresholds are recomputed against the new calibration state; policy-side false-fires are the deployment-relevant number.
Honest scope
In-silico mechanism test on one synthetic corridor with the analytic, deliberately weak estimator (slope −0.005..−0.03 persons/dB); the displacement arms are self-authored extremes bracketing best/worst case — the discrimination result shows the mechanism is constructible, not that it fires correctly on realistic furniture moves. BLE noise is the σ=2 dB Gaussian stand-in; the oracle σ=0.5 persons is hand-set; recalibration is an idealized refit on labelled state data. The IP-106 hardware capture should log the xmodal statistic alongside its BLE calibration campaigns; the policy claim (event-driven beats fixed) is not earned even in-silico and must not travel into the IP-106 brief.
Artefacts
trigger_eval.parquet, policy_eval.parquet, drift_trigger.metrics.json, fig_drift_trigger_{curves,detect,policy}.png under this session's artefacts/; corpus provenance in c-csi-layout-drift session 01KWHXSZKAC8M8T5D9TKX112D8.