Summary
Found during #323's gating: when every rank passes the SAME global coordinate array to add_particles_with_global_coordinates() — the natural reading of its docstring — the particles are added once per rank: observed 64 particles from a 32-point array at np2. The docstring implies global/deduplicated semantics.
Impact
read_timestep()-style restoration patterns that pass identical global arrays on all ranks are at duplication risk in parallel. Silent (no error), affects mass/statistics.
Suggested direction
Either claim ownership by locality (each rank adds only the points it owns — kd-tree / cell test — making identical-array calls safe), or document rank-partitioned input semantics loudly and add a guard/assert against full-duplication. Regression test at np2/np4 either way.
Related: 2026-07 audit SWARM findings family; discovered while validating PR #323.
Underworld development team with AI support from Claude Code
Summary
Found during #323's gating: when every rank passes the SAME global coordinate array to
add_particles_with_global_coordinates()— the natural reading of its docstring — the particles are added once per rank: observed 64 particles from a 32-point array at np2. The docstring implies global/deduplicated semantics.Impact
read_timestep()-style restoration patterns that pass identical global arrays on all ranks are at duplication risk in parallel. Silent (no error), affects mass/statistics.Suggested direction
Either claim ownership by locality (each rank adds only the points it owns — kd-tree / cell test — making identical-array calls safe), or document rank-partitioned input semantics loudly and add a guard/assert against full-duplication. Regression test at np2/np4 either way.
Related: 2026-07 audit SWARM findings family; discovered while validating PR #323.
Underworld development team with AI support from Claude Code