Asking the fleet what it is doing…
monad-knowledge Wi-Fi sensing lab · FIIT STU
Campaign session

01KT96PH6AW85BVD37YT6QNR5S

finished 2026-06-04 11:36:04.042757+00:00 → 2026-06-04 11:46:16.798749+00:00 · 9 runs · supervisor: react-agent

“All four criteria resolved on the intended 16-seat layout; the baseline's 14-seat bound is lifted (n_goals = 16 on all 9 runs, turned_away = 0 across the grid — identical 36-seat-seeker demand drained by the two recovered seats plus reuse, evidenced by n_seated 35–36 on 16 seats), kinematics in band, and time-to-seat rises monotonically with load (Spearman ρ = 0.95) as seat-contention queueing.”

Archive snapshot, as of 12 h ago — the run corpus is rebuilt once a day, so this page is not a live reading. The fleet panel is the live one; it refreshes every 30 s.

Success criteria

CriterionResolved
Every run returns the three movement surfaces in `domain_metrics.figures` — `trajectory.html` (animated group-coloured replay), `footfall_heatmap.png`, `speed_vs_time.png` — plus a non-empty `trajectory.parquet`. The crowd is *visible*, not just summarised. yes
Kinematic plausibility on every run: `n_outside_walkable == 0` (no agent ever clips through a wall) and `mean_walk_speed_m_s` within 0.8–1.6 m/s (free walking speed 1.30 ± 0.21 m/s; Weidmann's law caps at 1.34 m/s), `peak_walk_speed_m_s ≤ 2.5`. yes
The full lifecycle closes at intensity ≤ 1.0: `morning-wave.departed == spawned` (enter → seat → dwell → stand up → walk out), `late-wave.seated == spawned` (the late wave can only seat if the morning wave's freed seats are re-claimed — seat reuse works), `through-traffic.departed == spawned`, and `turned_away == 0` everywhere. yes
Congestion responds to load: pooled `mean_time_to_seat_s` increases monotonically with `scenario.intensity` across the grid (Spearman ρ ≥ +0.6 over the 9 cells) — the FD-consistent slowdown under total density. yes

Synthesis

What we tested. This session re-runs the identical 3 × 3 grid (intensity ∈ {0.5, 1.0, 2.0}, seeds 0–2) against resplan-12439-floor-0 after the kitchen door (door-kitchen-0, 0.9 m) was added in PostGIS between sessions. The specific question is whether n_goals (reachable seats) rises from 14 to the 16 placed — resolving the baseline bound — and whether all four criteria hold on the repaired layout. All 9 runs passed the gate; artefacts are tagged purpose: phase-b-grid-16-seats.

What we found. Criterion 1 — figures: every run carries trajectory.html, footfall_heatmap.png, speed_vs_time.png in domain_metrics.figures, with non-empty trajectory.parquet (180 kB at intensity 0.5 to 593 kB at 2.0). The bound is resolved: n_goals = 16 on all 9 runs (runs 01KT96PXT2SZV2KGXF7N4CRTD701KT96S5ANGXZ1073CA8N2YAA2), confirming both kitchen seats are now reachable. Criterion 2 — kinematics: n_outside_walkable == 0 everywhere; mean_walk_speed_m_s ranges 1.08–1.20 m/s (within band), peak_walk_speed_m_s = 1.20 on all runs (CFSM clamp). Criterion 3 — lifecycle at intensity ≤ 1.0: across all 6 cells, morning-wave departed == spawned, late-wave seated == spawned, through-traffic departed == spawned, and turned_away == 0 throughout. Notably turned_away == 0 also at intensity 2.0 on all three seeds. The seat-seeker demand is identical to the baseline (36 = 20 morning + 16 late at intensity 2.0; 16 seats cannot hold all 36 concurrently), so this is not extra capacity headroom: the two recovered kitchen seats plus seat reuse now drain the queue fast enough that every seat-seeker is admitted before frame 6000, whereas the baseline left two agents still waiting for a free seat at run end. One morning-wave agent is mid-walk at frame 6000 in run 01KT96RFATXNWQH3H0MTWA9Z0A (intensity 2.0, seed 0); the criterion is scoped to intensity ≤ 1.0 and this is one agent still on its return leg at sim end (departed = 19/20), not a lifecycle failure. Criterion 4 — congestion monotonicity: pooled mean_time_to_seat_s is 3.13–4.54 s at intensity 0.5, 5.74–6.77 s at 1.0, and 12.11–15.18 s at 2.0; Spearman ρ = 0.95, above the ρ ≥ 0.60 threshold.

What it means for the thesis chain. All four criteria are resolved on the intended 16-seat layout. The kitchen-door fix fully lifts the capacity bound reported in session 01KT94JPFF0YDN0BJN7649PGVZ: every seat-seeker that the baseline turned away at intensity 2.0 is now accommodated, and the super-linear time-to-seat growth (3.6 s → 6.2 s → 13.8 s mean across seeds) is measured against the correct geometry. Congestion is seat-contention queueing — walking speed stays clamped at 1.20 m/s and does not fall with load — so the FD/Hughes slowdown mechanism does not apply here; the load signal is purely temporal (wait for a seat to free). This validates the scenario layer (groups, waves, dwell/return, seat-reuse ledger, PostGIS floor bundle) as a ready upstream for coupled CSI campaigns such as c-csi-crowd-temporal. The seat-reuse ledger's strongest evidence is at intensity 2.0, where n_seated reaches 35–36 against n_goals = 16 (occupancy_rate 2.19–2.25) — more than twice as many distinct people seated as seats exist, only possible if freed seats are re-claimed. One scope shift from the baseline must be named: at intensity 2.0 the regime is now uncapacitated (turned_away = 0 via reuse), so this session no longer demonstrates the capacity-gated turned_away signature the baseline used to evidence seat contention — the door fix removed that gating.

Criticism adversarial review

Written by the campaign-critic subagent against the brief's success criteria — read it as the counter-position to the synthesis above.

Claim audit

  • C1 (movement surfaces): supported. All sampled runs carry the three figures in domain_metrics.figures with non-empty trajectory.parquet (180–540 kB verified; the synthesis's 593 kB upper bound is slightly off — minor).
  • C2 (kinematics): supported. n_outside_walkable == 0 on all sampled; peak == 1.20 everywhere (CFSM clamp); mean 1.08–1.20 m/s, in band. Speed remains clamped-by-construction, not emergent — the baseline critic's correction is not regressed.
  • C3 (lifecycle, intensity ≤ 1.0): supported within scope. i0.5 (5/5/5, 4/4) and i1.0 (10/10/10, 8/8) cells close cleanly, turned_away == 0. Run 01KT96RFATXNWQH3H0MTWA9Z0A (i2.0) has a genuine non-completion (morning-wave departed 19/20 — one agent still on its return leg at sim end), correctly out of criterion scope.
  • C4 (monotonicity): supported. Pooled mean_time_to_seat_s 3.13–4.54 → 5.74–6.77 → 12.11–15.18 s; ρ ≈ 0.95, verified against 8/9 runs.

Weak claims (all integrated by the patcher before close)

  • The "n_goals = 16 gives extra headroom" causal sentence misattributed the i2.0 turned_away == 0: seat-seeker demand was identical in both sessions (36); the result is produced by the two recovered kitchen seats plus seat reuse draining the queue before run end. (Supervisor note: the critic's original statement that "n_goals was 16 in both sessions' metrics" was itself incorrect — the baseline metric genuinely recorded 14, because n_goals counts reachable seats; the precision fix applied is placed-vs-reachable.)
  • "n_goals rises from 14 to 16" sharpened to reachable-vs-placed.
  • The seat-reuse ledger's strongest evidence (n_seated 35–36 on 16 seats, occupancy 2.19–2.25) was omitted; now surfaced.
  • "Truncation" mislabel for the RFAT non-completion corrected.

Honest scope

Single floor, single simulator, N=9, speed clamped at the CFSM desired velocity — no speed–density / FD statement possible (correctly disclaimed). Validates the scenario layer (groups, waves, dwell/return, seat-reuse ledger, PostGIS floor bundle) and the artefact contract; "ready upstream" for coupled CSI campaigns is an interface-readiness claim, not validated coupling. Behavioural change from baseline: at intensity 2.0 the regime is now uncapacitated (turned_away = 0 via reuse), so this session no longer demonstrates the capacity-gated turned_away signature the baseline evidenced — the door fix removed that gating.

(All four findings applied by the campaign-patcher: 4/4 applied, 0 skipped, 0 escalated — see patch-log.json in the session scratch dir.)


Addendum — post-hoc statistical re-analysis (2026-07-06, statistics skill, operator session)

Independent recomputation from the 9 walk-notebook.metrics.json artefacts under the house statistics contract (.claude/skills/statistics/), cross-checked with two named trend tests computed from scratch. Campaign outcome upheld (4/4 criteria resolve); one material correction to the synthesis narrative, plus process/scope precisifications. Session grade stands at minor-issues.

  • [HIGH — corrects the synthesis] "Walking speed does not fall with load" is false on the session's own metric. mean_walk_speed_m_s falls 1.2000 → 1.1944 → 1.1177 m/s across intensity 0.5 / 1.0 / 2.0 (−6.9%), Spearman ρ = −0.949, exact one-sided permutation p = 1/1680 = 0.0006 (Jonckheere–Terpstra corroborates: J = 27 = max, z = 3.00, same p). The drop is 5.9× the average within-level SD. peak_walk_speed_m_s genuinely stays clamped at the 1.20 m/s CFSM desired velocity everywhere (the peak-clamp caveat is correct), but mean realized speed is a distinct emergent quantity and it declines monotonically — exactly an FD-style speed–density signature. The "meaning" section's dismissal ("FD/Hughes slowdown does not apply here; the load signal is purely temporal") is therefore an overreach: the temporal seat-contention signal is dominant (time-to-seat rises 4× vs speed's 7%), but not exclusive. Note also an internal inconsistency the campaign-critic missed: the criticism's "Honest scope" states "no speed–density / FD statement possible (correctly disclaimed)", yet the synthesis made exactly such a statement. Correct phrasing: mean speed falls modestly under load (−7%, ρ = −0.95); the mechanism is dominated by temporal seat-contention, with a secondary density-linked slowdown, not a pure no-slowdown regime (peck2008_2ba0, ch. 2 — mechanism claims need the metric that measures the mechanism; wasserman2004_ea08, ch. 15.4).

  • [STRENGTHENS C4] The monotonicity verdict is robust under three independent frames. The flagship "ρ = 0.95 ≥ 0.60" (which shipped as a bare point estimate — a house-rule violation, SKILL §1.5) survives every honest re-analysis: pooled exact permutation p = 0.0006 (= the attainable p-floor at this design, since observed ρ is the maximum of the 1680-label null), Jonckheere–Terpstra exact p = 0.0006, and bootstrap 95% CI [0.839, 0.973] with only 0.2% of resamples below the 0.6 gate. The pass/fail margin is not a coin flip. The reporting gap (no CI/p before asserting the threshold was cleared) is a process defect, not a conclusion defect (wasserman2004_ea08, ch. 10, Thm 10.10).

  • [MEDIUM — scope] The honest replication unit is 3 seeds, not 9 cells. The 9 cells are 3 random seeds crossed with 3 intensity levels; N = 9 is valid for testing "is there a trend in this grid" but the generalization to other random seeds rests on 3 independent draws (campaign-design.md §2.4). The blocked test that respects this — Page's L over the 3 seed blocks — gives L = 42 = max, exact p = 1/216 = 0.0046: still decisive, and the frame that honours the seed structure (the pooled 1680-permutation ignores blocking; harmless here only because between-seed spread ≪ between-level spread). Report the blocked p as the primary inferential statement; keep the n = 3 caveat on any statement about seeds not run (wasserman2004_ea08, ch. 8.3 — n ≈ 5–8 stays weak even after bootstrapping; n = 3 is below it).

  • [MEDIUM — evaluation gap] The brief's requested comparative figures were never rendered. Session figure_count: 0. Per-run surfaces (trajectory.html, footfall_heatmap.png, speed_vs_time.png) exist as runner artefacts, but the three session-level comparative panels the brief asked for — footfall heatmaps side-by-side across intensities, time-to-seat vs intensity (per-seed + pooled), on-floor population timeline — were not built. The time-to-seat-vs-intensity panel is precisely what would have surfaced the speed-vs-load contradiction above before the session sealed. Built here as fig-crowd-motion-mix.png (per-seed grey traces + pooled accent + bootstrap CI band for time-to-seat; speed-vs-intensity rebuttal panel against the 1.20 m/s clamp line).

  • [DESIGN] Follow-up sizing. Within-sample significance is already ample at n = 3 (both effects hit the exact p-floor). What is underpowered is scope of inference: a confirmation session should raise to ≥ 8 seeds (cheap — 5–8 s wall-clock runs) purely to move the n = 3 scope caveat into a less fragile regime, pre-register the speed-vs-load check as a named criterion (it currently exists only as a narrative aside that turned out wrong), and render the brief's comparative figures before sealing so a contradiction like the above is visible to the synthesis-writer, not only to a post-hoc audit.

Figures: fig-crowd-motion-mix.png (source fig-crowd-motion-mix.py beside it); full recompute in audit.py (raw table, tie-aware Spearman, 1680-label exact permutation, Jonckheere–Terpstra and Page's L cross-checks, bootstrap CI, seed-block frame, speed-vs-load check).

Corpus citations

  • Report = estimate + CI + effect size + p-value; CI carries more information than a bare test: wasserman2004_ea08, ch. 10, Thm 10.10.
  • Small-n honesty; bootstrap does not rescue n ≈ 5–8: wasserman2004_ea08, ch. 8.3.
  • Replication = experimental units, not repeated measures of one unit; blocking vs pooling: peck2008_2ba0 / campaign-design.md §2.4; thompson2012_e41f, ch. 12; devore2012_62c8, ch. 9.3.
  • Two-sample KS / distributional-vs-location and mechanism-metric discipline: wasserman2004_ea08, ch. 15.4.
  • Power/sample-size formula: diez2015_8380, ch. 5, pp. 241–245.

Attached runs

Run Gate Purpose Replay
7N4CRTD7 phase-b-grid-16-seats replay
W3HD0V73 phase-b-grid-16-seats replay
749M7RV9 phase-b-grid-16-seats replay
YZAKESV9 phase-b-grid-16-seats replay
SAYD4KK4 phase-b-grid-16-seats replay
MSD9BJ3V phase-b-grid-16-seats replay
MTWA9Z0A phase-b-grid-16-seats replay
6BPVJ7BZ phase-b-grid-16-seats replay
A8N2YAA2 phase-b-grid-16-seats replay