AX210 Fleet Deployment: FIIT Library Reading Hall
Current assessment (2026-09-15)
The July 28 installation is a historical build record. Subsequent experiments contain recordings from monad01–monad10, so the original six-node provisioning table is not a current inventory. The predicted 99% coverage and count-information advantage remain unverified at the as-built positions.
The deployment supports the measurement instrument chapter. A working fleet does not establish a coverage percentage or the placement ranking. Later survey-based work uses fiit-ground-0; the original scan-native coordinates below must retain their own frame and date. Claims of continuous reachability since July were not verified in this review.
Next evidence needed: Use the dated survey and acquisition configuration of the intended comparison. Validate the spatial prediction through EXP-F4 before claiming the placement model predicts the deployed floor.
Basis: Thesis Narrative, the September 10 synthesis, and the September 15 register review. See the review record for evidence sources and outstanding checks.
Earlier protocol and dated results
The methods and observations below retain their original scope. Read their readiness statements and proposed next steps as historical. The current assessment above records what has changed; frozen thresholds have not been retrospectively revised.
Ten Pi5+AX210 nodes installed 2026-07-28 on the scan-native floor
fiit-library-lidar-floor-0 (envelope, walls, 4 doors, window, 35 furniture
obstacles and 68 chair-seats all derived from the single RoomPlan OBJ — no
scan→CAD registration; converter notebooks/gis/converters/06_polycam_native_floor.py).
The previous CAD-polygonized floor (453 wall fragments, no doors, twice
mis-registered furniture) was deleted.
Results
The installation succeeded; the experiment on this card has not been run. That
is why status: planned rather than analysed — the status tracks the
hypothesis, and the coverage claim below has never met a measurement.
| planned | actual | |
|---|---|---|
| nodes | 10 (1 Tx + 9 Rx) | 6 (monad01–06); monad07–10 never provisioned |
| installed | 2026-07-28 | 2026-07-28, continuously reachable since |
| deployment-day captures | d1-validate, d1-empty-reference, d1-illuminated |
none produced a durable session |
| coverage ≥99 % walkable | from the ray-traced oracle | not measured at the installed positions |
What the deployment did deliver is the thing everything since rests on: every capture campaign from 2026-08-10 onward — EXP-011 Paired-Band Delivery and Pacing Contrast, EXP-LIB-01 Overnight CSI Drift Baseline, the rate ladder in EXP-007 Packet-Rate Floor for Motion Sensing — ran on this installation. The fleet is the instrument; this card is its build record.
This card deliberately claims no capture data. Its d1-* arms produced none,
and the fleet's continuous console capture is infrastructure — it runs on every
node regardless of experiment and belongs to no card, so claiming it here would
attribute roughly 900 node-hours of ambient recording to a deployment note.
To close the hypothesis, the coverage and count-informativeness claim needs a measurement at the as-built positions — which first needs the as-built survey that EXP-LIB-01 Overnight CSI Drift Baseline also records as missing. That is a separate experiment, not a follow-up edit to this card.
Limits
- The Pareto-knee claim is unverified. The topology was chosen from a ray-traced placement oracle; nothing has measured coverage or count informativeness at the installed positions, so the ≥99 % walkable-coverage figure in the hypothesis is a simulation output, not a deployment result.
- As-built positions were never surveyed. The coordinates below are the planned frame. EXP-LIB-01 Overnight CSI Drift Baseline records the same gap, and it is why that run makes no spatial claims.
- The D1 session plan below never produced a capture. Verified against the
whole S3 archive on 2026-08-16: exactly one
d1-*session exists,monad02_d1-illuminated_20260727-141232— 0 records, 6 s, on the office pair the day before this deployment, and it belongs to EXP-P2 Illuminator Bring-Up and First Controlled Link as a tune-fix check.d1-validateandd1-empty-referencehave never run at all. This card therefore owns no measurement data; the fleet's continuousconsolecapture is infrastructure and belongs to no experiment. - Ten nodes planned, six built. monad07–10 are commented out in
infra/ansible/inventory/hosts.ymland have never appeared in fleet telemetry — they were not provisioned, rather than provisioned and silent. Every statement about the 1-Tx + 9-Rx topology describes the design, and the installation is 6 nodes.
Method
Positions come from the c-placement-oracle generative-evaluation pipeline run locally on the new floor: a staggered library-day agenda crowd (count varies 1–10) drives a coupled walk→Sionna-RT run at 5.18 GHz against a 30-candidate mountable grid. Wall mounting is not permitted in the library, so the candidate classes are floor stands along the wall lines (z 0.25 m), shelf tops (≈2.0 m) and table tops (≈0.85–0.9 m) — mixed heights within what furniture and floor allow. Per-candidate count-informativeness I(C;Φ) is estimated from ray-traced links (3 seeds, averaged), coverage from the LOS proxy over the walkable area. Grounding: wang2025_2c42 (IoT-J) supplies the Fresnel/RSQ placement rules (proximity to occupied regions, balanced topology, height as a first-class variable); the oracle adds the generative ray-traced evaluation the RSQ geometric baseline cannot (cross-floor surrogate ρ≈0.02 here — geometry alone does not predict measured MI).
- Runs:
01KYFPCRE245WW4RSCEWGV4JJT,01KYFPESCYG6KVHCTVJ9FZST13,01KYFPG9M7GFVXDRNPPTNF8R75(an earlier wall-bracket variant — runs 01KYFKDR…/01KYFKN6…/01KYFKSW…,fiit-ax210/rec.json— was superseded when wall mounting was ruled out) - Reduction:
_attachments/placement-oracle/fiit-ax210-v2/rec.json(seed-rank ρ = 0.943) - Pareto knee (k=9): identical set for λ ∈ [0.25, 0.75] — footfall coverage 1.000, I(C;Φ) 1.087 nats (pure-coverage set: 1.000 / 0.784)
- k=7 fallback (two devices upstairs): drop monad04 + monad08 — the remaining seven are the k=7 knee (coverage 1.000, I(C;Φ) 0.989 nats)
- GIS: experiment
ax210-fiit-deployment, candidate gridcsi-oracle-grid-fiit-library-lidar
Node positions (SRID-900010 cm frame; origin = scan min corner)
| node | role | mount | x (m) | y (m) | z (m) |
|---|---|---|---|---|---|
| monad01 | Tx injector | freestanding shelf/partition | 16.94 | 12.42 | 1.80 |
| monad02 | Rx | floor stand (W wall, by door_8) | 0.50 | 6.32 | 0.25 |
| monad03 | Rx | floor stand (W wall, mid) | 0.50 | 9.95 | 0.25 |
| monad04 | Rx | floor stand (NW corner) ↑ | 0.50 | 18.89 | 0.25 |
| monad05 | Rx | floor stand (N wall, centre) | 8.24 | 19.03 | 0.25 |
| monad06 | Rx | floor stand (S wall, mid) | 9.42 | 3.23 | 0.25 |
| monad07 | Rx | desk (central table) | 9.80 | 12.49 | 0.87 |
| monad08 | Rx | desk (centre-west island) ↑ | 5.19 | 9.72 | 0.85 |
| monad09 | Rx | desk (centre-east island) | 15.16 | 6.42 | 0.87 |
| monad10 | Rx | desk (far-east, open wing) | 20.51 | 16.70 | 0.92 |
↑ = the two nodes to relocate if the upstairs room is included (the remaining
seven stay k=7-optimal). If relocated: Polycam-scan the upstairs room (5 min),
run 06_polycam_native_floor.py --building fiit-library --floor fiit-library-lidar-floor-1, and re-run the oracle for the pair.
Printable install sheet (A4 landscape, map + table):
_attachments/figures/fig-ax210-deploy-sheet.pdf (source _attachments/figures/src/fig-ax210-deploy-sheet.py) ·
Map: _attachments/floorplans/fiit-library/ax210_deployment_map.png ·
candidates: _attachments/floorplans/fiit-library/ax210_candidates.json ·
floor QA: _attachments/floorplans/fiit-library/native_floor_db.png
Topology rationale
monad01 injects (controlled rate + known position — the calibration anchor for EXP-008 Active Injection vs Passive Sniffing and the BLE-calibration thesis line); monad02–monad10 capture CSI on the injector's channel. The room's three unmanaged eduroam 5 GHz APs are opportunistic secondary sources (csid can sniff their traffic per-channel) but are deliberately not optimization anchors — their traffic, channels and positions are outside our control. Desk-height nodes sit in the antenna plane where furniture is CSI-invisible but bodies are not; floor stands look under the furniture plane (legs/gait dominate) — the height split is a deliberate probe of the antenna-plane effect found in c-furniture-csi-observatory, now spanning below-furniture, in-furniture and above-furniture strata.
Install checklist (2026-07-28)
- Mount per the table (floor stands ~0.45 m off the wall line, antenna at 0.25 m; desk nodes on table centrelines; monad01 on the freestanding shelf).
- Photograph each node in place; measure actual x/y/z with laser meter where
they deviate >10 cm and update
experiment_devicesaccordingly. - Note the 3 eduroam AP ceiling positions on the printed map → register as context devices.
node-validate.ymleach node over eth0 before leaving (seedocs/FLEET-WIFI.md).- Run the first-capture session plan below.
First capture — csid session plan (D1, 2026-07-28)
Profiles d1-validate / d1-empty-reference / d1-illuminated ship via
ansible-playbook playbooks/fleet.yml --tags csid (declared in
group_vars/csi_nodes.yml; parameter rationale in docs/CSI-CAPTURE-PARAMETERS.md).
csid is passive-only — the controlled source is monad01's mgmt wlan0
(separate radio from its AX210, so monad01 captures during illumination too).
One radio per node: stop the console feed before any research session
(systemctl stop csid@console), restart it when done.
D1.0 — channel truth (5 min, before shipping configs)
The channel: 36 in all three profiles is a placeholder. On monad01:
iw dev wlan0 link → note the eduroam AP BSSID + channel + width it is
associated to; csid bench smoke --channels <UNII-1,UNII-3 set> for the other
two APs' channels and ambient rates. Write BSSID(s), channels, and monad01's
wlan0 MAC on the printed sheet. Set the real channel in
group_vars/csi_nodes.yml, re-run --tags csid.
D1.1 — per-node validation sweep (d1-validate, ~25 min for 10 nodes)
Per node: systemctl start csid@d1-validate, open http://monadNN:8088
(csiscope, tailnet) and gate on: 4 chains present (2×2), record rate > 0 on
the target channel, RSSI in −18…−89 dBm (−127 = unmeasured-chain sentinel),
no interleaved-class surprises (note the dominant (ntone, modulation) class).
A node that fails at 0.25 m gets nudged up onto low furniture — note new z.
D1.2 — empty-hall reference (d1-empty-reference, 10 min, all nodes)
While the hall is empty (during install, before students settle): start on all 10 nodes in parallel — this is the empty-room CFR anchor every drift and calibration analysis compares against (EXP-002 CSI Model Drift Measurement Over Time). Log start/stop time and the (near-zero) occupant count.
D1.3 — illuminated capture (d1-illuminated, 15 min, all nodes)
On monad01: ping -i 0.01 -s 1200 <eduroam-gw> (≈100 Hz uniform uplink from a
known position). All 10 nodes capture. This is the controlled-source arm
(EXP-008 Active Injection vs Passive Sniffing proxy) and the first real
test of the placement ranking: per-node record rate + amplitude variance vs
the oracle's predicted per-candidate MI ordering.
D1.4 — ambient occupancy baseline (exp-c1-occupancy, 30 min, all nodes)
The standing occupancy profile (5 GHz, 80 MHz, ~100 Hz cap) with the hall in normal use. Ground truth is manual: headcount every 5 min + a door-event tally (pen on the printed sheet, or phone timer); note anything anomalous (cleaning cart, window opened). This seeds EXP-001 BLE-Assisted CSI Ground Truth Collection until the BLE anchor protocol runs.
D1.5 — close-out (10 min)
- Restart console feeds:
systemctl start csid@consoleper node. - Verify sync: sessions appear under
s3://monad-knowledge/datasets/ax210-csi-captures/<host>/<session_id>/with.syncedmarkers (15-min timer; force with the sync unit if leaving sooner). - Back home:
csi_sources/csi_overviewon one session per node class (floor vs desk vs shelf) — amplitude-grid + waterfall sanity via thecsi-visualizationskill; file actual-vs-planned positions intoexperiment_devices.
Session bookkeeping: session IDs embed the experiment slug
(<host>_<experiment>_<timestamp>); the sidecar carries node identity — the
GIS position joins via devices.name = monadNN in ax210-fiit-deployment.
Volume note: 10 nodes × uncapped 80 MHz can reach ~1.5 GB/h/node
(608 Hz benchmark); D1 sessions are short by design — watch
budget.s3_bytes before extending durations.