PRETTY_NAME="Ubuntu 24.04.5 LTS" NAME="Ubuntu" VERSION_ID="24.04" VERSION="24.04.5 LTS (Noble Numbat)" VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=noble LOGO=ubuntu-logo aarch64 Python 3.12.3 ros-jazzy-geometry-msgs 5.3.8-1noble.20260902.122255 ros-jazzy-rclpy 7.1.12-1noble.20260902.143245 ros-jazzy-rmw-fastrtps-cpp 8.4.4-1noble.20260902.140744 ros-jazzy-ros2bag 0.26.11-1noble.20260903.023509 ros-jazzy-rosbag2 0.26.11-1noble.20260903.023557 ros-jazzy-rosbag2-py 0.26.11-1noble.20260902.232852 ros-jazzy-rosbag2-storage-mcap 0.26.11-1noble.20260903.022942 ros-jazzy-rosbag2-transport 0.26.11-1noble.20260902.231544 ros-jazzy-rosgraph-msgs 2.0.4-1noble.20260902.131519 Validation date: 2026-10-12 Image: docker.io/library/ros:jazzy-ros-base Pinned image: ros:jazzy-ros-base@sha256:066420e07f60aa18262f2479981def87ebcfcec42eefb0c0c57c4a46098348ca Image OS/architecture: linux/arm64 Host: macOS ARM64, Docker Desktop Network: none (source, recorder, player, and consumer inside one disposable container) Read-only mount: exercise directory -> /lesson Optional writable mount: separate artifact directory -> /output ROS_DOMAIN_ID=73 RMW_IMPLEMENTATION=rmw_fastrtps_cpp Two final-script end-to-end runs passed: one with retained artifacts and one with default temporary cleanup. sample-output.txt is the captured stdout of the default run. Both recordings contained exactly six PointStamped messages with header and recording timestamps 100 through 105 seconds. In each run, both replays delivered all six original payloads, frames, and headers. The consumer clock was zero without /clock and initialized to 100 seconds before advancing with the player's --clock 20 option. An independent host-side check read the retained report.json and compared all 18 stored/replayed payloads with separately calculated fixture values. It also checked recorded timestamps and the contrasting consumer clock behavior. A second --output invocation on the same path exited with FileExistsError; all existing artifact hashes were unchanged. The README's separate ros2 bag info command also succeeded on the retained recording. Periodic replay clock callbacks are not synchronized to point callbacks. An earlier draft's strict upper clock bound of 105 seconds failed during a run because consumer time can advance slightly past the final message stamp. The final checks require initialization at 100 seconds, nondecreasing callback time, and positive progress; they do not impose that incorrect upper bound or require callback time to equal header time. Raw values are retained in report.json and replay-with-clock.json when --output is used. All subprocesses use finite wall-clock waits. Those waits are stall guards, not latency measurements. The fixture does not estimate motion, run SLAM, measure hardware behavior, or claim a general recording completeness result. No dependencies were installed; all packages were present in the pinned image. Docker --rm removed each completed verification container.