Question
Does the multi-group walker reproduce a plausible day-in-the-life of a real multi-room floor — staggered arrival waves seeking seats across six rooms, dwelling, standing up and leaving, seats being reused by later arrivals, and through-traffic threading the same doorways — and can we watch all of it in the run artefacts?
This is the first campaign where the crowd simulator is exercised as a crowd simulator, not as a trajectory feeder: heterogeneous agent types, time-structured demand, a stateful seat ledger with reuse, and (since 2026-06-04) movement surfaces on every run — the animated group-coloured Plotly replay, the footfall heatmap, and per-agent speeds.
What we already know
- maury2018_d24a ↗ — free walking speed is Gaussian, 1.30 ± 0.21 m/s
(uncongested), Weidmann's density law
u = 1.34(1 − e^{−1.913(1/ρ − 1/5.4)}). This anchors the kinematic gate: a mean walking speed outside ≈0.8–1.6 m/s means the integrator (or our walkable derivation) is wrong, not the crowd. - hughes2002_57b4 ↗ — Hypothesis 1A: in multiple-type flow each type's speed is governed by the total density. The multi-group scenario is precisely this regime; the intensity sweep tests whether time-to-seat degrades with total load, not per-group load.
- jebrane2026_3e34 ↗ — the FD slowdown is monotonic; flow peaks near 2 ped/m² and congestion grows nonlinearly. At intensity 2.0 (48 people, doorway choke points) we expect a visible super-linear time-to-seat increase.
- zhong2022_7cb2 ↗ — FD comparison and in/out-flow counts are the standard validation instruments for simulated crowds; this campaign's criteria are exactly those instruments scaled to a furnished floor.
- The EXP-S1 fundamental-diagram session (
01KS7ZS50AQTVF9RTGH101FQNR, 37 runs) already validated the CFSM integrator against the published FD band on the parametric corridor — this campaign validates the scenario layer above the integrator (goals, ledger, waves), not the physics again. - 2026-06-04 coupled-chain findings baked into the base params:
agent_clearance_cm ≈ 0–5(larger seals door gaps), explicitagent_radius_m,spawn_bbox_cmfor genuine traversal, park-on-arrival so seated bodies persist (they must remain scatterers for any downstream channel sim).
Prerequisites
- The rebuilt
walk-notebookimage. Thegroupsscenario (kind: groups, arrival windows,after_dwell: return, seat reuse,scenario.intensity) and the movement surfaces ship with the 2026-06-04floor_walk.py; the GHCR:latestpredates it. Local:sim build walk-notebook; CI: merged to master →docker.ymlrebuild. - The structure artifact. Staged automatically: the launcher's
stage_floor_bundleexportsfloor: resplan-12439-floor-0from PostGIS toinputs/floor_geometry.jsonwhenever the chain containswalk-notebookand the config dispatchesgeometry: from_floor. The floor carries 16 analysis-placed seats across 6 rooms — the only furnished floor today. - Nothing else — all scenario state (ledger, occupancy, waves) is run-side; PostGIS is never touched by the container.
What the supervisor does
Phased fan-out (IP-081 supervisor; sim-runner subagents per cell):
- Phase A — gate run. One run at
intensity: 1.0, seed: 0. Verify the movement surfaces are present and the kinematic gate holds (criteria 1–2) before spending the grid: a missingtrajectory.htmlor a non-zeron_outside_walkableis a platform/image finding that fails fast. - Phase B — grid. Remaining 8 cells (3 intensities × 3 seeds minus the gate run), fanned out.
- Phase C — synthesis. Analysis-writer reads
domain_metrics.groupsper run (per-groupspawned / seated / departed / turned_away / mean_time_to_seat_s), checks the lifecycle criterion per intensity, computes the intensity→time-to-seat monotonicity, and cites run_ids + the replay artefacts. Campaign-critic reviews; weak claims get flagged before the session seals.
Figure render request
crowd_motion_mix — (a) the footfall heatmap at the three intensities side by side (doorway
hotspots emerging with load), (b) time-to-seat vs intensity (per seed + pooled), (c) a timeline of
on-floor population by group (entries/exits reconstructable from trajectory.parquet agent
first/last frames) — plus a pointer to the best trajectory.html replay as the headline artefact.
Out of scope
- CSI/BLE coupling. Once this scenario layer is validated, the natural follow-on is re-running
c-csi-crowd-temporal with
kind: groups— mixed seated/moving crowds are exactly the regime where temporal CSI variance and the BLE-anchored static regime separate. Not here. - FIIT library floor.
fiit-library-floor-0has no occupiable seats yet; when furnished, this campaign re-runs there unchanged (the brief is floor-agnostic via the staged bundle) — see c-fiit-find-a-seat. - FD calibration. The integrator physics are EXP-S1's concern (c-exps1-fundamental-diagram).
- Entrance/exit semantics from the DB. Spawn/goal regions are scenario-side bboxes until
transitionsubtypes (main_entry) are tagged in PostGIS.
Expected interpretation
- All criteria met → "The walker supports heterogeneous, time-structured crowd scenarios on a real multi-room floor with a working seat-reuse ledger, wall-tight kinematics in the published walking-speed band, and full visual replays." Unlocks scenario-grade upstreams for every coupled CSI campaign and the FIIT-library replication.
- Criteria 1–2 met, lifecycle gaps → a scenario-layer finding: name which leg breaks (late-wave starvation = reuse timing; turned_away at low intensity = ledger bug; departed < spawned = return-journey pathing, likely door congestion). The replay makes the failure visually diagnosable — cite the artefact.
- Kinematic gate fails (
n_outside_walkable > 0or speeds off-band) → a geometry/integrator finding on the walls-subtracted walkable derivation; freeze the grid and report.
Notes
- The scenario knobs (
groups,arrival_window_units,after_dwell,intensity) live infloor_walk.py::_normalise_groups— canonical atmonad_knowledge/notebooks/python-jupedsim/floor_walk.py, build-context mirror in the image. Legacykind: seek_and_occupyconfigs normalise to a single stay-wave, so c-fiit-find-a-seat and the c-csi-crowd-temporal chain are untouched. - A person keeps one stable
agent_idacross sit-down/stand-up (JuPedSim re-adds bodies under fresh internal ids; the walker aliases them back), sotrajectory.parquetstays per-person continuous for replays and downstream channel synthesis.