ROS 2 Repository Layout Decision

Decision

Keep the first-party ROS 2 beta inside this repository under integrations/ros2/, rather than creating a separate companion repository.

The planned shape is an optional colcon workspace rooted at integrations/ros2/:

integrations/ros2/
├── README.md
├── src/
│   ├── zeroproofml_ros/
│   └── zeroproofml_msgs/
├── launch/
└── test/

zeroproofml_ros should be the first ament_python package so the existing Python inference wrappers, bundle validators, and ONNX Runtime helpers can be reused directly. zeroproofml_msgs remains a ROS-only package inside the same workspace.

The bootstrap scaffold now lives under integrations/ros2/src/zeroproofml_ros/ with the standard ament_python metadata files plus a thin zeroproofml_ros Python package that re-exports the stable strict-inference and ONNX runtime helpers from the root library. The companion workspace now also includes integrations/ros2/src/zeroproofml_msgs/ with msg/StrictInferenceResult.msg for decoded payloads, merged masks, bundle and schema metadata, threshold metadata, and optional stable provenance fields.

Why This Layout

  • The M2 target is a first-party beta companion integration, not a second product line. Keeping the ROS 2 work in-repo keeps docs, changelog, CI, and benchmark fixtures versioned together with the inference contract it wraps.
  • The current deployment surface is already Python-first (strict_inference, bundle export/validation, and ONNX Runtime loading). An in-repo ament_python package minimizes glue code and avoids an early split across repositories before the first node, launch file, and rosbag test exist.
  • A separate repository would add release, issue-tracking, and compatibility overhead before the beta package has stabilized. That split can be revisited at the ROS 2 beta/GA gate if the integration grows an independent cadence.

Boundaries

  • The root Python package stays ROS-free. pyproject.toml continues to ship only the zeroproof* packages; ROS-specific package.xml, launch files, and colcon metadata live only under integrations/ros2/.
  • Core library APIs remain under zeroproof / zeroproofml. The ROS workspace consumes those APIs; it does not become the place where the stable inference contract is defined.
  • Large replay assets stay out of git unless they are tiny deterministic test fixtures. Rosbags, distro-specific images, and generated workspaces should be treated as test/release artifacts, not source-tree defaults.

Revisit Trigger

Reconsider the monorepo layout only if the ROS 2 integration reaches a point where it needs a separate release cadence, separate maintainer set, or distro support matrix that materially exceeds the core library's workflow.