Sessions

No sessions yet — this campaign has a brief but no execution.

Brief

Question

On a real PostGIS floor, where does the mean-blockage signature (L4.6) cross the multipath-variance signature (L4.5) as occupancy rises, and how does that crossover move with carrier frequency?

This is the contribution gap 2026-06-03 - CSI amplitude under crowd occlusion identified: the two amplitude signatures are competing, geometry-dependent features and no vault source pins the crossover. The thesis/csi-sensing chain §3 states both (L4.5 csi-amplitude-variations, L4.6 los-blockage-mean-attenuation) with an explicit open-tension note. This campaign turns that note into a figure.

What we already know

  • The analytical sandbox (notebooks/experiments/csi-crowd/csi_crowd_model.py, pure NumPy) already reproduces the shapes: mean attenuation saturates, raw std is a trap, CV = std/mean climbs cleanly. It is the cheap reference, not a calibrated predictor.
  • sionna-csi-runner (IP-094) ray-traces the same scene with real wall materials (ITU-R P.2040) and bodies as dielectric cylinders, capturing multi-body shadowing the linear-additive analytical law cannot. Smoke + a real-floor scene-stage are validated.
  • The scene is staged host-side from csi-synth-corridor-link on test-lab-synth-floor-0 (1 Tx + 3 Rx; 25 walls). The container never touches PostGIS.

What I want the supervisor to do

A single occupancy sweep, then a deterministic reduction:

  1. Fan out exp-csi-static over the grid in sim_params (8 occupancy levels × 2 bands = 16 runs), local CPU first (feedback_sim_local_vs_remote). Each run is the primary single-image vehicle — reproducible, ~seconds/frame on the M1 LLVM backend.
  2. Run the notebook-backed reduction (csi_occupancy_crossover.py, runner python) over the resulting links.parquet set to pool placements per occupancy, compute mean |H| / CV / Rician-K vs N, locate the crossover N* per band, and emit figure F4.x
    • csi-occupancy-crossover.metrics.json.
  3. Synthesise against the analytical baseline — the analytical↔ray-traced divergence at high N is a deliverable, not an error.

Analysis-writer responsibilities

  1. Confirm the artefact surface per run (scalar floor + links.parquet + csi.hdf5).
  2. Read the scalar floor via sim_read_run; do not crack the HDF5 by hand.
  3. Report the crossover N* per band and whether the L4.5/L4.6 Spearman gates hold; cite per-run artefacts by sim://run/<run_id>/artefact/<path>.

Figure render request

One renderer slug: csi_occupancy_crossover — twin-axis mean |H| (dB) vs CV (+ Rician K), per-band series, crossover N* marked. This is candidate chapter figure F4.x.

Out of scope

  • Calibration against the real 80 MHz / Wi-CaL data. That is exp-csi-calibration (IP-094 Phase 4); this campaign characterises the synthetic crossover, not sim-to-real.
  • Body-model fidelity. Held fixed here (cylinder, loss 5 dB, r 0.20 m); swept in the sibling campaign c-csi-body-em-fidelity.
  • Temporal dynamics. Static placement only; the coupled exp-csi-crowd (jupedsim → sionna) trajectory variant is a follow-on.

Expected interpretation

  1. All criteria met → "Ray tracing locates the L4.5↔L4.6 crossover at N*≈… (2.4 GHz), shifting with band; the two-signature tension is resolved into a geometry-dependent crossover curve." Feeds figure F4.x + a reconciling paragraph in csi-sensing §3.
  2. Criteria 1–2 met, 3 weak (no clean CV rise) → "Blockage dominates this corridor geometry; variance is weak without motion — consistent with the static-crowd confound."
  3. Criterion 1 fails → a platform finding on the runner/scene-stage surface, not research.

Operator notes

  • Local CPU first; the full 16-run grid is minutes on the M1. Burst to :cuda only if a larger grid (more bands × placements) proves intractable (IP-094 Q4).
  • Bridge path: monad-knowledge sim sweep exp-csi-static --grid <grid.json> --where local, then sim campaign attach-run <session_id> <run_id> per run, then /campaign-curious c-csi-crowd-occlusion to drive synthesis.
  • The GHCR image is not yet pushed (where=remote-vm cannot resolve a digest until docker-simulators.yml publishes :latest); where=local builds from the Dockerfile.