Question
c-csi-layout-drift measured how fast a CSI occupancy estimator drifts under furniture rearrangement and produced the fixed-cadence prior (T^{*}, \epsilon). c-csi-ble-fusion showed the right fusion is a staleness-switch — but its staleness weight is a clock (w = e^{-t/\tau}), blind to whether the environment actually changed. recalibration-trigger-from-drift asserts the missing piece: an observable, online drift statistic that tracks the (unobservable) CSI count error, so recalibration fires on events rather than a schedule. Does such a statistic exist in the co-registered CSI+BLE channel — and does it stay quiet when rearrangement happens outside the sensing geometry?
The previous session's key finding makes this a real detection problem, not a formality: drift is geometry-dependent (in-path furniture drives error 0.29→0.66 persons; corner furniture does nothing). A pure clock recalibrates for both; a good detector fires only for the first. And the obvious anchor — the BLE channel — is itself drifted by the same furniture, so whether cross-modal disagreement tracks CSI error is a physics question the ray tracer can answer, not a tautology.
Design evolution (recorded before the trigger evaluation ran)
The initial corpus had two arms (los random in-path directions, corner control). The
first drift curves showed the los arm's random displacement produces large feature
shift but almost no count-error growth — the analytic estimator's slope is so shallow
(≈ −0.005..−0.03 persons/dB) that only extreme excursions into deep blockage (the −180 dB
regime session 1 hit by chance) move the error. Two deterministic arms were added before
drift_trigger.py was ever run on a signal arm: losperp (boxes exit the LOS
perpendicular — error-irrelevant feature shift, the false-alarm trap) and losin (boxes
slide along the LOS toward the Tx into deep blockage — the error-relevant regime). The
detectability criteria below apply verbatim with losin as the in-path signal arm; the
sharpened question is discrimination: a good trigger fires on losin, not on
losperp/corner, i.e. it tracks model degradation, not mere environment change.
Cross-campaign inputs
- Corpus: this campaign analyses the multi-seed drift+BLE corpus produced by the
c-csi-layout-drift follow-on session (same corridor floor, same two furniture arms
extended to 7 states × 3 seeds,
ble.enabled). Runs are attached to both sessions (analysis-session precedent: the flat-day matched re-analyses). - Estimator + protocol: the state-0-calibrated linear
mean_amp_dbestimator fromcsi_layout_drift.py(16 placements at fixed 6-agent occupancy, placement seed shared across states so the only thing that changes between states is the furniture). - Detection framing: candidate statistics ladder from cheapest to strongest premise — CSI self-monitoring (no extra hardware) → physical BLE-RSSI anchor (co-registered, itself drifting) → idealized BLE device-counter (the ble-ground-truth-sufficiency premise, reported as ceiling only).
What the supervisor does
- Corpus check: confirm the 42-run corpus (2 arms × 7 states × 3 seeds) gate-passed with both parquet artefacts; attach the runs to this session.
- Run
drift_trigger.py(runnerpython, IP-087, dual-mode): per (arm, seed) calibrate on state 0, compute true error + the four statistics per state, bootstrap-null thresholds from calibration data, the detectability table, and the matched-budget policy simulation. - Synthesise with the in-silico framing; state which statistic (if any) earns the trigger role and what that means for the IP-106 real capture design.
Figure render request
drift_trigger — (a) true error vs displacement with the candidate statistics overlaid
(normalized, per arm); (b) statistic-vs-error scatter with Spearman + detection/false-alarm
bars per statistic; (c) policy bars: mean error and recals used, fixed vs triggered vs oracle.
Out of scope
- Temporal/occupancy-pattern drift — furniture-displacement drift only, inherited from c-csi-layout-drift; the time-varying-crowd analogue composes later with the c-csi-ble-fusion switch.
- Answering RQ4 / real drift — the statistic's field ROC needs the IP-106 capture; this campaign designs which statistic that capture should log.
- Learned drift detectors — analytic statistics only (KS, disagreement); a learned detector is a data-scaling follow-on.
Expected interpretation
- A non-oracle statistic passes both detectability halves → the trigger mechanism exists in the physics: an event-driven recalibration policy is constructible from observables. recalibration-trigger-from-drift moves candidate → chosen (strength stays plausible); the IP-106 capture should log that statistic.
- Only the oracle counter tracks error → drift detection requires the BLE device-counting premise, not the RSSI channel — sharpens the hypothesis onto ble-ground-truth-sufficiency and lowers expectations for RSSI-only monitoring.
- Statistics fire on the off-path arm too → false-alarm-prone triggering; a fixed T^{*}(\epsilon) cadence stays the honest recommendation (clean negative).
- Corpus/chain failure → platform finding on the BLE+furniture composition.