========= Why Frame ========= CHILL, rings, cages, Steinhardt, and SOAP are per-snapshot. The handle is one configuration: neighbours, a bonded graph, and labels on that cloud. One configuration ================= ``Frame`` is that handle. Multi-frame work is explicit: ``read(path, frame=n)`` (1-indexed) or ``frame.load_frame(n)`` on a path-backed ``Frame``. Arrays-only and ASE-built frames have no path and cannot ``load_frame``. ``Trajectory`` is an alias ========================== ``Trajectory`` is a compatibility alias of ``Frame`` (``src/pydseams/__init__.py``). It does not iterate a movie and does not own a campaign. The engine CLI that walks trajectories and writes ``output/`` lives in seams-core. This package does not grow a second movie object.