Repository navigation
The ROS distribution is one switch: jazzy/lyrical features, distro-free packages, runtime in every bag, Lyrical CI rehearsal - #8
Conversation
…ee packages, runtime in every bag, Lyrical CI rehearsal Workspace: `[feature.jazzy]` (default, what the rigs run) and `[feature.lyrical]` (opt-in) each carry the RoboStack channel (appended behind conda-forge), the ros2-distro-mutex pin, the Python pin and that distro's ROS package names; `[workspace.build-variants]` pins the source packages' host solve with ONE disjunctive value (`0.19.*|0.22.*`) that each channel narrows to its set. Packages name no distro: pixi-build-ros reads the `robostack-<distro>` channel and maps package.xml itself (rig_interfaces comes out cp312 + mutex >=0.19,<0.20 on Jazzy, cp314 + >=0.22,<0.23 on Lyrical from one manifest); rig_nodes depends on RoboStack's distro-neutral `ros2-*` names and, being noarch, names the mutex bare and follows the consumer's set. Code: `rig_nodes.runtime.runtime_info()` (ROS distro, rmw + version, RoboStack set, Python, package-set versions) goes into every bag as rosbag2 custom_data via Recorder.open(); the recorder passes the two stamps by keyword where rosbag2_py names them — on Lyrical the positional 4-argument write bound the producer stamp to the new `sequence_number` and publish_time silently equaled log_time. `zenoh.config_dir()` selects `config/<ROS_DISTRO>/` when present; the stock rmw_zenoh files at 0.2.11 and 0.10.6 are byte-identical, so one pair ships. CI: the release path stays Jazzy (distro/mutex/python spelled once per matrix); a new allowed-to-fail `lyrical` job installs the lyrical environment on the three platforms and runs the four simulator-only suites. PIXI_VERSION → 0.83.0 (the rigs' floor; writes pixi.lock). Docs: docs/ros-distro-switch.md (the switch, Lyrical availability per platform, what blocks a migration, rehearsal results), README, SETUP, CONTRACT rule 5, channel/README. Mac results: Jazzy pure 50/50, host 52/52, sim 39/39, device-node 42/42; Lyrical the same four (device-node 41/42 before the rosbag2_py fix). LAB-338 follow-up. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ot the hash build string Run 42058302847 built both packages with the right pins on osx-arm64 and linux-64 (`ros2-distro-mutex >=0.19.0,<0.20.0a0`) and failed only on the new inspect check, which looked for `py312` in a build string that is a bare hash. The compiled-against Python is the package's `python_abi 3.12.* *_cp312` dependency. Also: a consumer workspace that builds the source packages must carry the mutex build-variant (doc §2). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
CI so far (2026-11-05) Run 42058302847 on b5283e2: the three Jazzy builds produced packages with the right pins ( Run 42058992937 on 60b9ee1: build osx-arm64 ✓, linux-64 ✓, win-64 running; channel + accept follow. Lyrical rehearsal linux-64 ✓ again; osx-arm64 ✗ on one host-sampler check — Local (Mac, osx-arm64): Jazzy 50/52/39/42, Lyrical 50/52/39/42 (device-node 41/42 before the rosbag2_py keyword fix). webDisplayTools#294's |
Follow-up to the rig-nodes extraction (LAB-338): the ROS 2 distribution becomes one switch, and CI rehearses the next one. Nothing a rig runs changes: every workspace environment the rigs install stays Jazzy (RoboStack mutex 0.19, Python 3.12) and resolves to the same packages; the channel keeps publishing Jazzy only. Record:
docs/ros-distro-switch.md.What changes
pixi.toml:[feature.jazzy](default) and[feature.lyrical](opt-in,pixi install -e lyrical) each carry the RoboStack channel (appended behind conda-forge), theros2-distro-mutexpin, the Python pin and that distro's spelling of the ROS packages the workspace installs.[workspace.build-variants] ros2-distro-mutex = ["0.19.*|0.22.*"]pins the source packages' host solve with ONE disjunctive value that each channel narrows to its set (a two-element list fails: pixi solves every variant value in every environment, and0.22.*has no Jazzy candidate).src/rig_interfaces/pixi.tomldropsdistro = "jazzy"and theros-jazzy-*host/run lines: pixi-build-ros reads therobostack-<distro>channel and maps package.xml itself; the ROS packages' run_exports pin the result (ros2-distro-mutex >=0.19.0,<0.20.0a0+python_abi 3.12.* *_cp312on Jazzy,>=0.22.0,<0.23.0a0+cp314on Lyrical — both in the lock, from one manifest).src/rig_nodes/pixi.tomldepends on RoboStack's distro-neutralros2-rclpy/ros2-std-msgs/ros2-rosbag2-py/ros2-rosbag2-storage-mcap/ros2-rosidl-runtime-py(theros-<distro>-*names are 2 KiB shims onto them in both channels); pixi-build-python carries no run_exports, so the noarch package names the mutex bare and follows the consumer's set. CI's inspect step checks theros2-*dependencies forrig_nodesand the pin forrig_interfaces.rig_nodes/runtime.py(runtime_info(): ROS distro, rmw + version, rclpy/rosbag2 versions, the RoboStack set as<version> <build>from conda-meta, Python, platform, package-set versions;pixi run runtimeprints it).Recorder.open()hands it to rosbag2 ascustom_data; rosbag2 writes it with its ownros_distrointo the MCAP metadata record namedrosbag2at close,mcap_index.reindexkeeps it,close()returns it asruntime. Checked by the device-node test on both distros.writeoverload an optionalsequence_number, so our positional 4-argument write bound the producer stamp to it and publish_time silently equaled log_time. The recorder now passes the stamps by keyword where the binding names them (Jazzy's binding does not).zenoh.config_dir()selectsconfig/<ROS_DISTRO>/when a complete pair is checked in there, else the shared pair, andapply_env_defaultsuses it. Deriving a Lyrical pair found the stock rmw_zenoh files at 0.2.11 (Jazzy) and 0.10.6 (the version RoboStack packages for Lyrical) byte-identical, so one pair ships; upstream'slyricalbranch (0.10.8) does change the schema, and the doc says how to add the pair that day._common.py/bias_cmd.py: the two "Jazzy" mentions are comments (rclpy shutdown races, the Windows clock), left as they are.package-set.yml): the release path (build → channel → clean-directory accept) stays Jazzy, withdistro/mutex/pythonspelled once per job matrix. New allowed-to-fail joblyrical rehearsal:pixi install -e lyricalon win-64 / osx-arm64 / linux-64 (builds both packages for that set in place), thenbuild_interfaces --check,test-pure,test-host,test-sim,test(device-node conformance, simulators only). No channel payload.PIXI_VERSION0.80.0 → 0.83.0 (the rigs' floor since 2026-10-28; the pixi that writespixi.lock, which the new job installs).docs/ros-distro-switch.md(what differs between sets, where the switch lives, Lyrical availability per platform, what blocks a migration, rehearsal results), README, SETUP (recipe now declares ros-base + the rmw explicitly), CONTRACT rule 5 (the distro switch; which package carries the pin),channel/README.md.RoboStack Lyrical availability (2026-11-05)
ros-lyrical-rosbag2-storage-mcap0.33.4,ros-lyrical-rmw-zenoh-cpp0.10.6 andros-lyrical-foxglove-bridge3.6.0 exist for win-64, osx-arm64 and linux-64, as does everything else the two workspaces need (ros-base, rosbag2-py, rclpy, rosidl toolchain, ros-environment, rqt, demo-nodes-py). Mutex is 0.22 (lyrical_30; 0.21lyrical_28exists too), Python 3.14 only. Nothing missing on any platform.Results on this Mac (osx-arm64, pixi 0.83.0)
test-pure/test-host/test-simtest(device-node conformance)build_interfaces --checkpixi install(warm)CI results on the three platforms: see the checks on this PR (summary to follow in a comment).
What blocks a real migration (detail in the doc, §7)
Python 3.14 for the lab's own scripts (nothing of ours has run on it besides this package set); RoboStack Lyrical's channel is weeks old and still being rebuilt; rmw_zenoh 0.10.6 is behind upstream's Lyrical branch (0.10.8, new config schema); one distro per host (a Jazzy node and a Lyrical node do not talk); nothing has run on hardware under Lyrical; the channel is Jazzy-only; binding drift like the
rosbag2_pyoverload above. And staying on Jazzy is not standing still: RoboStack's current Jazzy rebuild is mutex 0.20 on Python 3.14, so the next re-pin brings 3.14 either way.Companion: reiserlab/webDisplayTools#294 mirrors the features in
rig/pixi.toml(rigs' environments byte-identical in the lock; itslyricalenvironment builds this branch from git, and the arena harness passed 63/63 on it — Python 3.14, rosbag2 0.33). Not a package-set release;mainstays 0.4.0.🤖 Generated with Claude Code