diff --git a/.github/workflows/diagnose-xeus-python-platform.yml b/.github/workflows/diagnose-xeus-python-platform.yml new file mode 100644 index 000000000..18981b9d6 --- /dev/null +++ b/.github/workflows/diagnose-xeus-python-platform.yml @@ -0,0 +1,134 @@ +name: Diagnose xeus-python cross-platform build (temporary) + +# Throwaway diagnostic workflow, manually triggered only. Investigates +# whether the "null function or function signature mismatch" +# indirect-call-table-corruption bug seen when locally recompiling +# xeus-python on a macOS ARM64 (osx-arm64) host is specific to that build +# platform -- as opposed to the currently-published, working stock +# xeus-python-0.19.0 package on the emscripten-forge-4x channel, which was +# almost certainly built on a Linux x86_64 CI runner. Builds the exact same +# scratch diagnostic recipe (zero xeus-python source patches, stock +# xeus/xeus-lite/pyjs-dev/python host deps -- the same "stockdeps-test" +# config already confirmed to crash when built locally on osx-arm64) on +# both ubuntu-latest (linux-64) and macos-15 (osx-arm64, matching the local +# dev machine) for direct comparison, and uploads the resulting +# xpython.js/xpython.wasm from each as build artifacts. +# +# See ~/robot/ros-rolling-emscripten-zenoh/AGENTS.md's "BREAKTHROUGH +# 2026-09-13" sections (search for "null function" and "toolchain +# non-determinism") for the full background on why this test exists. +# +# Safe to delete this file once the investigation concludes either way. + +on: + workflow_dispatch: + # workflow_dispatch alone can't be triggered via the API/CLI unless the + # workflow file also exists on the repo's default branch (a real GitHub + # restriction) -- this repo's default branch is a separate, regularly + # RoboStack-synced `main`, unrelated to this feature branch's work, so + # touching it just for this throwaway diagnostic isn't worth it. A push + # trigger scoped to just this branch works instead, without needing + # anything on `main`. + push: + branches: + - feature/emscripten-wasm32-zenoh-pico + paths: + - '.github/workflows/diagnose-xeus-python-platform.yml' + - 'scratch_test_recipes/xeus-python-stockdeps/**' + +jobs: + build-xeus-python-diagnostic: + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + platform: linux-64 + - os: macos-15 + platform: osx-arm64 + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout ros-rolling-emscripten-zenoh + uses: actions/checkout@v6 + with: + persist-credentials: false + fetch-depth: 1 + + - uses: prefix-dev/setup-pixi@v0.9.4 + with: + frozen: true + + - name: Checkout emscripten-forge/recipes (for cross-python/compiler/pytester toolchain packages) + uses: actions/checkout@v6 + with: + repository: emscripten-forge/recipes + path: emscripten_forge_recipes + persist-credentials: false + fetch-depth: 1 + + - name: Build emscripten toolchain packages (compiler, cross-python, pytester) + shell: bash -l {0} + working-directory: emscripten_forge_recipes + run: | + pixi run rattler-build build \ + --package-format tar-bz2 \ + -c https://repo.prefix.dev/emscripten-forge-4x \ + -c microsoft \ + -c conda-forge \ + --skip-existing all \ + -m variant.yaml \ + --recipe recipes/recipes/emscripten_emscripten-wasm32 + pixi run rattler-build build \ + --package-format tar-bz2 \ + -c https://repo.prefix.dev/emscripten-forge-4x \ + -c microsoft \ + -c conda-forge \ + --skip-existing all \ + -m variant.yaml \ + --recipe recipes/recipes/cross-python_emscripten-wasm32 + pixi run rattler-build build \ + --package-format tar-bz2 \ + -c https://repo.prefix.dev/emscripten-forge-4x \ + -c microsoft \ + -c conda-forge \ + --skip-existing all \ + -m variant.yaml \ + --recipe recipes/recipes/pytester + + - name: Build diagnostic xeus-python (zero patches, stock host deps) + shell: bash -l {0} + run: | + pixi run rattler-build build \ + --package-format tar-bz2 \ + -r ./scratch_test_recipes/xeus-python-stockdeps/recipe.yaml \ + -m ./conda_build_config.yaml \ + --output-dir ./ci_output \ + -c https://repo.prefix.dev/conda-forge \ + -c https://repo.prefix.dev/emscripten-forge-4x \ + -c "file://${{ github.workspace }}/emscripten_forge_recipes/output" \ + -c microsoft \ + -c robostack-staging \ + --target-platform emscripten-wasm32 \ + --test skip \ + --channel-priority disabled + + - name: Extract xpython.js/xpython.wasm for upload + shell: bash -l {0} + run: | + mkdir -p extracted_artifact + tar xjf ./ci_output/emscripten-wasm32/xeus-python-stockdeps-test-*.tar.bz2 -C extracted_artifact + # also record a sha256 of the wasm binary directly in the log, for + # a quick eyeball diff between the two matrix legs without needing + # to download both artifacts + shasum -a 256 extracted_artifact/bin/xpython.wasm extracted_artifact/bin/xpython.js + + - name: Upload xpython.js/xpython.wasm + uses: actions/upload-artifact@v4 + with: + name: xeus-python-diagnostic-${{ matrix.platform }} + path: | + extracted_artifact/bin/xpython.js + extracted_artifact/bin/xpython.wasm + retention-days: 7 diff --git a/.gitignore b/.gitignore index 453ebe04f..a747700e2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,35 @@ recipes_only_patch/ *.sh *.ps1 *.json +# The blanket *.sh above is meant for vinca-generated build scripts, but it +# also silently swallowed extra_recipes/*/build.sh -- hand-written source +# for the microcdr/zenoh-pico recipes, not generated output. Caught by a +# real CI run doing a genuinely fresh checkout: neither build.sh ever +# actually made it into a commit, so build-emscripten failed with +# "build.sh: command not found" once it reached either recipe. +!extra_recipes/**/*.sh +# Same deal: a genuine, hand-written, committed helper script, not +# generated output -- caught this one myself before it repeated the +# extra_recipes mistake above (2026-09-10). +!/sync_native_bootstrap_mirror.sh +# Same deal again: browser_demo/'s own hand-written build*.sh scripts are +# real, committed source (not generated output) too. +!browser_demo/*.sh .DS_Store # pixi environments .pixi *.egg-info output/ +# Throwaway local test/build artifacts -- large binaries, extracted +# packages, build logs, isolated test builds. Never committed; see +# AGENTS.md for what each holds and how to regenerate it. +scratch/ +scratch_test_recipes/ +browser_demo/out/ +# A hand-flattened local scratch extraction of a conda environment used +# for manual browser_demo testing (see its own README) -- a derived, +# regeneratable build artifact, not source; never committed. +demo_env/ +# Local zenohd router binary + plugins, downloaded/extracted for manual +# testing against a real router -- never committed. +zenoh_router/ diff --git a/AGENTS.md b/AGENTS.md index 7ce5cabd7..f546048c3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -222,6 +222,2586 @@ For full rebuilds also remember: - clear stale `pkg_additional_info.yaml` build-number overrides unless intentional - remember that in CI there is a build cache, if you fix a problem in an already built package you need to delete the cache for this package in the .github/workflows/testpr.yml under "Delete specific outdated cache entries" +## Emscripten-wasm32 Asyncify migration (superseded -- see "MAJOR PIVOT" below) + +**HISTORICAL as of the pivot documented later in this file**: the Asyncify +approach this section describes was itself abandoned in favor of a +non-blocking, single-poll-per-call design with no Asyncify and no real +threads at all -- see this file's own "MAJOR PIVOT" section for why, and +the top of the file / README for what's actually shipped today. Kept +here for the historical record of how that conclusion was reached; treat +everything below as "what we tried next after pthreads," not as the +current architecture. Also stale: the branch name below +(`feature/emscripten-wasm32-zenoh-pico`) -- the actual current branch is +`pico-update-tmp`. + +This repo (fork branch `feature/emscripten-wasm32-zenoh-pico`, pushed to +`Tobias-Fischer/ros-rolling`) plus the deployed demo at +`~/robot/ros2-emscripten-zenoh-demo` (git clone of +`Tobias-Fischer/ros2-emscripten-zenoh-demo`, moved out of `/tmp` on +2026-09-12 specifically so it survives a reboot -- **never park a live +working copy of this demo repo under `/tmp` again**, only truly disposable +scratch belongs there) together implement: drop real pthreads from the +whole emscripten-wasm32 ROS2 build, replace blocking waits with +Emscripten Asyncify + zenoh-pico's non-threaded polling mode +(`Z_FEATURE_MULTI_THREAD=0`). Goal: rclc/rclpy/rclcpp browser demos AND +`import rclpy` inside a JupyterLite notebook, both working end-to-end. + +### Status (2026-09-12) + +Fixed and pushed: +- zenoh-pico bumped 1.4.0 -> 1.7.0 (multi-publisher write-filter bug, ABI + mismatch from a stale-header pin in `robostack.yaml`). See + `extra_recipes/zenoh-pico/recipe.yaml` and + `patch/ros-rolling-rmw-zenoh-pico.patch`. +- `rmw_wait()` network-pump gap for `Z_FEATURE_MULTI_THREAD=0`: added an + unconditional `zp_read()`/`zp_send_keep_alive()` pump in `rmw_wait.c` + before `skip_wait` is computed (same patch file). rclc and rclpy + standalone browser demos both deliver continuously now. +- `_z_string_len`/`_z_report_system_error` trivial exported stub + definitions for a `static inline` cross-module link gap -- + `browser_demo/wasm_link_stubs.c` in the demo repo. +- `pyjs`'s `pyodide.ffi.to_js()` polyfill missing `dict_converter` kwarg + (upstream bug, emscripten-forge/pyjs#73) -- patched via + `patches/pyjs-pyodide-polyfill-to_js-compat.patch` in the demo repo, + applied to `demo_env_build`'s prefix in `demo_env_build/build.sh`. + Confirmed present in the actual shipped JupyterLite kernel-package + tarball (`jupyterlite-content/_output/xeus/demo_env/kernel_packages/ + pyjs-rt-*.tar.gz`), not just the build-time env. +- Resolved a red herring: the JupyterLite launcher never listing the + `xpython` kernel was traced (via direct `t === serviceManager.kernelspecs` + identity check, `false` on both jupyterlite-xeus 5.0.0 and 5.1.0) to an + **upstream webpack Module Federation shared-singleton bug in + jupyterlite-core/jupyterlite-xeus**, reproduced in a from-scratch + ROS-free environment (`xeus-python` + `numpy` only, no ROS/zenoh) -- + not something to keep chasing in this project's own code. + +Currently blocking `import rclpy` inside the JupyterLite kernel (this is +a *different* bug from the one above -- the kernel now loads and starts, +`import rclpy` itself fails): +- `rclpy`'s compiled extension (`_rclpy_pybind11...so`) is built by this + repo's vinca template as an Emscripten `SIDE_MODULE` with `-sASYNCIFY` + (needed for the non-blocking wait fix above). It gets `dlopen()`'d at + runtime into **xeus-python's own interpreter binary** (`xpython.wasm`, + from `emscripten-forge-4x`, confirmed via `conda-meta` to be a stock, + un-rebuilt package -- channel is the remote repo, not a local build), + which acts as the `MAIN_MODULE` and was **not** built with `-sASYNCIFY`. + Asyncify's dynamic-linking support needs a shared `__asyncify_state` + global that only exists when the main module also has Asyncify enabled, + so linking fails at `dlopen` time: + `LinkError: ... Import #71 "env" "__asyncify_state": imported mutable + global must be a WebAssembly.Global object`. +- **Fix identified, in progress as of 2026-09-12 night session**: + `xeus-python`'s own CMakeLists.txt does the final `-sMAIN_MODULE=1` link + for `xpython.wasm`/`xpython.js` -- confirmed by cloning + jupyter-xeus/xeus-python at the exact installed tag (0.19.0) and reading + its `CMakeLists.txt` directly (`~/robot/wasm-rattler/emscripten-forge-recipes`'s + own copy of the recipe was stale, pinned to 0.17.3 -- don't trust it, + clone the actual xeus-python/xeus/pyjs GitHub repos at the exact + installed version instead when you need real source). Local recipe now + lives at `extra_recipes/xeus-python/` (recipe.yaml + build.sh + a source + patch adding `-sASYNCIFY`/`-sASYNCIFY_STACK_SIZE=24576` to the `xpython` + target's link options, stripping xeus's own hardcoded + `-fwasm-exceptions` from that same target). +- **This turned into a whole dependency chain needing the same + `-fwasm-exceptions`-vs-Asyncify fix**, not just xeus-python itself -- + Binaryen's Asyncify pass (`UNREACHABLE executed ... Asyncify.cpp:1146, + unexpected expression type`) crashes if **any** statically-linked object + anywhere in the final `xpython.wasm` declares the wasm + exception-handling target feature, even a pure-C object that never + actually throws/catches (confirmed via + `wasm-objdump -s -j target_features` on a stock `_bz2module.o` inside + `libpython3.13.a` -- shows `+exception-handling` purely from the compile + flag, not real usage). Every one of these needed its own + `extra_recipes//` with the flag stripped and `build_number` bumped + to 100, discovered one link failure at a time in this order: + 1. `xeus-lite` (`libxeus-lite.a`, statically linked) -- simple + `EMCC_CFLAGS` reset in `build.sh`, built clean first try. + 2. `pyjs` -- only the `pyjs-dev` output is needed (`libpyjs.a` + cmake + config); dropped `pyjs-rt`/meta `pyjs` from the local recipe (an + unrelated pre-existing test-glob gap in `pyjs-rt`, not worth + chasing). Took **5 attempts** to get right -- see + `extra_recipes/pyjs/recipe.yaml`/`build_all.sh` comments for the + full detail, but briefly: (a) needed the same + `cross-python_${target_platform}` + explicit + `-DPYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python` hints as + xeus-python's own first fix, (b) `build_all.sh` had no `set -e`, so + that failure was silently swallowed and rattler-build happily + packaged an **empty** `.conda` (0 content files) -- always check + `grep "Package statistics"` for a nonzero content count, never trust + a clean-looking log tail alone, (c) a shell comment block + accidentally landed *inside* a backslash-continued multi-line `cmake` + command, splitting it and causing `-DBUILD_RUNTIME_BROWSER=OFF: + command not found` -- comments must go *outside* `\`-continued + command blocks, (d) `BUILD_RUNTIME_BROWSER=OFF` turned out to be a + vestigial CMake option in pyjs's own upstream source that doesn't + actually gate the `pyjs_runtime_browser` executable target (checked + by cloning `emscripten-forge/pyjs` at the installed tag and reading + `CMakeLists.txt` directly) -- that unneeded executable needed the + same `LDFLAGS` reset as xeus-python for its own `MAIN_MODULE=1` vs + stray `SIDE_MODULE=1` conflict. + 3. `python` (CPython itself, the biggest of the four) -- `-fwasm-exceptions` + here is hardcoded directly in the recipe's own `Makefile.envs` + (`CFLAGS_BASE`/`LDFLAGS_BASE`), completely independent of the + toolchain's global `EMCC_CFLAGS` env var trick used elsewhere -- + stripped directly from `extra_recipes/python/Makefile.envs`. Recipe + copied from `emscripten-forge/recipes` at commit `fecf57a2` + (`git log --all -- recipes/recipes_emscripten/python/recipe.yaml`, + bisected to find `version: 3.13.1, build_number: 11` matching this + project's actually-installed `python-3.13.1-h_..._11_cp313` -- the + tip of `main` has since moved to 3.14.x, don't use it). + **Hit a genuinely nasty rattler-build limitation** getting this one + to even start building: this recipe's own package is named "python", + and it also needs a *native build-platform* python at build time + (HOSTPYTHON in the Makefile, to bootstrap CPython's own cross-compile + -- regen frozen modules, sysconfigdata). Any requirement whose bare + package name is literally "python" -- in `build:` or `host:`, exact + version+build pin or not, channel-qualified (`conda-forge::python=3.13`) + or not, `cross-python_${{ target_platform }}` swapped in instead, tried + with `--recipe` vs `--recipe-dir`, tried with an explicit + `--build-platform osx-arm64` flag -- makes rattler-build's dependency + analysis see this recipe as self-referential: + `Cycle detected in dependencies: python`. This reproduced identically + across roughly ten variations; it is a hard limitation of building + this recipe standalone (single-recipe invocation), not a syntax + mistake. `cross-python_${{ target_platform }}` alone *does* dodge the + literal name match (it expands to a different string) and does pull + in a working native python (3.13.15 from conda-forge) -- but its own + `activate.d` script *also* unconditionally tries to bootstrap a + `crossenv` using `$PREFIX/bin/python` (the **host/target**-side + python), which doesn't exist because this recipe is what creates it + -- crashes with `"$PREFIX/bin/python does not exist"`. Resolution: + drop every python-named requirement from `recipe.yaml` entirely, and + have `build.sh` itself `wget` + manually unpack (`unzip` then + `zstd -d | tar -x`) a native osx-arm64 `python-3.13.15` `.conda` + directly from `repo.prefix.dev/conda-forge`, dropping just the + `bin/python3.13` binary into `$BUILD_PREFIX/bin/` -- entirely + bypassing rattler-build's dependency graph for this one bootstrap + need. Status as of this writing: build launched, not yet confirmed. + **If any other package in this sub-chain ever needs a native version + of itself to cross-compile, expect the identical cycle bug** and + reach for this same manual-fetch pattern rather than re-litigating + the ~10 dependency-syntax variations above. +- General lesson from this whole sub-chain: **verify every rattler-build + result by grepping its own log for `Package statistics: N files (M + content, ...)` with `M > 0`**, not just the absence of an error at the + tail -- a build script without `set -e` can fail silently and still + produce a technically-valid, empty `.conda` package that a later + consumer then fails against with a much more confusing error + ("Could not find pyjsConfig.cmake" instead of the real underlying + Python-detection failure). +- **Always bump `build_number` when rebuilding any of these packages** so + rattler-build's package-cache treats it as a new artifact and the + solver actually picks up the rebuild. + +### Status update (2026-09-13 overnight session) + +**Milestone: the whole `-fwasm-exceptions`-vs-Asyncify dependency chain is +now fixed end-to-end.** A 4th package needed the same fix, found only +*after* `xeus-lite` + `pyjs-dev` + `python` were all already fixed and +`xeus-python`'s link *still* crashed with the Asyncify `UNREACHABLE`: +`xeus` itself. Its own `cmake/WasmBuildOptions.cmake` (shared by +xeus-lite and xeus-python via `include(WasmBuildOptions)`) hardcodes +`-fwasm-exceptions` as a *PUBLIC* compile/link option on the `xeus` +target -- PUBLIC options propagate via CMake usage requirements into +every consumer's own new compilation units too (confirmed via `grep +INTERFACE_COMPILE_OPTIONS` on the installed `xeusTargets.cmake`), so even +though `libxeus.so` is dynamically loaded and never itself embedded in +`xpython.wasm`, the flag still poisoned xeus-python's own compile. +Fixed via `extra_recipes/xeus/` (recipe.yaml, two patches -- see the +recipe's own header comment for the full trace). Second, separate bug in +the same package: `xeus`'s own `libxeus.so` final link step never set +`DISABLE_EXCEPTION_CATCHING`/`SUPPORT_LONGJMP` explicitly at all (the +only one of the four packages missing this), so it silently defaulted to +wasm-native EH at link time regardless of the compile-time patch -- +caught by direct symbol search (`wasm-objdump -x libxeus.so | grep -o +"_Unwind_CallPersonality\|__cpp_exception\|__wasm_lpad_context"`), NOT by +`target_features` metadata (which looked clean and was misleading). +First attempt at the explicit-flags patch also hit a hard emscripten +error, `DISABLE_EXCEPTION_CATCHING=0 is not compatible with +-fwasm-exceptions`, because `xeus`'s own `build.sh` was the only one of +the four that never reset the toolchain-global `EMCC_CFLAGS` env var +(which the activation script sets to include `-fwasm-exceptions` +unconditionally) -- fixed by adding the same `export EMCC_CFLAGS= +"${EM_FORGE_CFLAGS_BASE:-}"` reset the other three packages already had. + +Result: `xeus-python-0.19.0-py313hfc49295_101.conda` now builds +completely cleanly -- 8 content files, `bin/xpython.wasm`/`bin/ +xpython.js` both present, `package_contents` test passed, zero errors in +the full build log. `demo_env_build` and `jupyterlite-content` both +rebuilt successfully on top of it and confirmed (via `conda-meta`) to +embed all four fixed packages: `python-3.13.1-h_0e8c188_101_cp313`, +`xeus-6.0.5-hc0b4002_103`, `xeus-python-0.19.0-py313hfc49295_101`. + +**Confirmed live in the browser (via one connected kernel tab): the core +fix genuinely works.** The old `LinkError: ... __asyncify_state` +(xpython.wasm as a non-Asyncify MAIN_MODULE refusing rclpy's Asyncify +SIDE_MODULE) is completely gone. `import rclpy`'s first cell now +progresses to a *new, later-stage* error instead: +``` +ImportError: dynamic module does not define module export function +(PyInit__rclpy_pybind11) +``` +This is real progress (a different, later failure), but the root cause +is **not yet found**. Ruled out so far (2026-09-13 follow-up): +- Not a build/export gap: `wasm-objdump -x -j Export` on the actual + `.so` shipped inside the real kernel package tarball + (`jupyterlite-content/_output/xeus/demo_env/kernel_packages/ + ros2-rclpy-11.0.3-*.tar.gz`) shows `func[816] + -> "PyInit__rclpy_pybind11"` in the actual runtime-visible Export + section (not just the object's symbol table, which was the misleading + check in an earlier, different bug this session -- this time the + Export section itself is clean too). +- Not a missing-package gap: `empack_env_meta.json` lists all 145 needed + conda packages (`ros2-rclpy`, `ros2-rmw-zenoh-pico`, `zenoh-pico`, + `python`, etc.) and every one has a matching tarball in + `kernel_packages/` -- nothing is silently dropped from what ships to + the browser. +- **New lead, not yet confirmed**: `pyjs`'s own + `include/pyjs/pre_js/dynload/dynload.js` (compiled verbatim into + `xpython.js` -- `grep loadDynlibsFromPackage bin/xpython.js` finds it) + implements a custom **async promise-based dlopen preloader** + (`Module._emscripten_dlopen_promise`, one at a time behind a mutex) + that's supposed to `dlopen()` every package's shared libraries + up front, at kernel-package-install time, before any Python code runs + -- this is presumably the mechanism that lets CPython's own later + *synchronous* `dlopen()` (inside `_imp.create_dynamic`) just hit an + already-resolved cache instead of needing to itself do async work. + `_rclpy_pybind11.cpython-313-wasm32-emscripten.so` needs 71 transitive + `.so` dependencies (its own `dylink.0` `needed_dynlibs` list -- every + librcl/librmw/rosidl-generated lib) -- **not yet confirmed whether + this preload step actually completes for all 71 before `import rclpy` + executes**, or whether it's silently failing/being skipped for some of + them (a manifest/empack-side gap in how `shared_libs[i]` gets + populated for this package specifically), leaving CPython's own + later plain synchronous dlopen as the only real load attempt for a + .so with an unusually deep dependency chain. Unlike CPython's generic + `ImportError`, the JS preloader *does* capture and rethrow the real + `dlerror()` text on failure (`error loading shared library ${path} + from package ${pkg_file_name}: ${error_msg}`) -- if kernel startup + logs one of these and continues anyway instead of hard-failing, that + would be the smoking gun. +- **Next step once a kernel connects**: check the browser console log + around kernel *startup* (not just the `import rclpy` cell) for any + `"error loading shared library"` message from this preloader; if none + appears, add a diagnostic cell that individually `ctypes.CDLL()`s a + handful of the 71 dependency paths to see whether one throws first. + +**2026-09-13, further console-log archaeology on the kernel-registration +flakiness** (real Chrome, via `claude-in-chrome`, `read_console_messages` +with no pattern filter to get the FULL history across many reloads of the +same tab over several hours): found two genuinely new, previously-unseen +things, neither of which is the module-federation bug itself, but both +of which make it much harder to get a clean test: +1. **Stale-build `ChunkLoadError` from an old cached webpack chunk**: for + roughly 15 minutes of repeated reloads, every attempt logged + `SyntaxError: Unexpected strict mode reserved word` (later `Unexpected + token ','`) when parsing + `extensions/@jupyterlite/xeus-extension/static/724..js`, + immediately followed by `ChunkLoadError: Loading chunk 724 failed` and + `Failed to create module: package: @jupyterlite/xeus-extension`. The + chunk hash (`724.5ee411669b4955cb.js`) stayed IDENTICAL across all + these failing reloads -- almost certainly the JupyterLite ServiceWorker + serving a stale/corrupted cached copy of that chunk from BEFORE one of + this session's several `jupyterlite-content` rebuilds (each rebuild + changes file hashes; the old SW cache doesn't know to invalidate until + it notices a version mismatch). This resolved itself only once the SW + logged `"New version, unregistering existing service workers"` / + `"All existing service workers have been unregistered"` -- after which + the chunk hash changed to a fresh one (`724.be1303a8fd1a3e1b.js`) and + parsed fine. **This self-healing check is NOT immediate** -- it took + on the order of 15-20 minutes of periodic reloads in this observation + before it fired, which lines up with "it takes a while but it shows up + for me." If you hit this exact `SyntaxError`/`ChunkLoadError` pair, + the fix is a real **"Clear site data"** (not just a reload) rather + than waiting -- don't just keep reloading and hoping. +2. **A stale persisted kernel-id reconnect loop, separate from (1) and + separate from the module-federation bug**: long after the chunk-load + issue cleared, the console kept logging `Starting WebSocket: ws://.../ + api/kernels/c5578e6d-1f4d-437f-bb32-8fe7e98cbd5f` followed immediately + by `Trying to send message on removed socket for kernel c5578e6d-...` + on EVERY subsequent reload, hours apart (`20:02`, `01:59`, `02:00` + timestamps all reconnecting to the exact same kernel id). This is + JupyterLite's workspace/layout-restoration state (persisted in + IndexedDB for the origin) remembering "this notebook was bound to + kernel `c5578e6d-...`" from an EARLIER session in this same marathon + (almost certainly the kernel-restart-hang incident from earlier + tonight) and re-attempting that same dead reconnect on every load + instead of ever trying to start a fresh kernel. Explicitly selecting + "No Kernel" in the Select Kernel dialog stops the reconnect attempts + (confirmed), but the Select Kernel dropdown's own list of available + kernelspecs is a *separate* thing (driven by the module-federation + singleton bug) and stayed empty regardless -- so clearing this stale + reconnect state alone did not surface the xpython kernel option. + **If kernel selection is completely stuck, a real "Clear site data"** + for the `127.0.0.1:8877` / `:8880` origins (not just picking "No + Kernel") is the more thorough reset -- it clears both this stale + session-restore state AND any leftover stale-chunk SW cache in one + shot, and is worth doing proactively before a long test session + rather than only after hitting one of these two symptoms. + +**Tested and ruled out**: did a real programmatic "Clear site data" +(`serviceWorker.getRegistrations()`+`unregister()`, `caches.keys()`+ +`delete()`, `indexedDB.databases()`+`deleteDatabase()`, `localStorage`/ +`sessionStorage.clear()`) via the browser console on both `:8877` and +`:8880`, then a fresh reload of each -- the Select Kernel dropdown was +STILL empty (`["No Kernel"], no xpython entry`) on both immediately +after. So clearing site data reliably fixes symptoms (1) and (2) above, +but does **not** by itself fix the core module-federation kernelspec- +registration bug -- that one really does seem to need actual wall-clock +patience/retries as observed before, not a cache reset. + +**2026-09-13, further corroboration via a genuinely fresh tab (not a +reload)**: opened a brand-new tab (no prior JS/IndexedDB state at all) +to `:8880/lab/index.html` and checked `read_network_requests` + +`read_console_messages`. Confirmed the extension's static assets load +perfectly cleanly every time -- `remoteEntry.*.js` and all its chunks +return 200, and critically **the extension successfully fetches its own +kernel manifests**: both `http://.../xeus/kernels.json` and +`http://.../xeus/demo_env/xpython/kernel.json` return 200. So the plugin +code runs far enough to discover and read the xpython kernelspec from +disk. Despite that, the kernel never appears anywhere in the UI on this +fresh tab (`document.body.innerText` contains no "xpython"/"XPython" at +all). **This corroborates rather than contradicts the standing +module-federation-singleton diagnosis**: the plugin genuinely does the +work (fetch + parse the kernelspec), it just doesn't end up registered +in the SAME `IKernelSpecs` instance the shell's UI reads from. Nothing +here suggests a fix on our side -- still upstream jupyterlite-core/ +jupyterlite-xeus territory, not introduced by any of tonight's changes. + +**Kernel-registration upstream bug reconfirmed, not caused by us.** +Reproduced via a *third* independent UI surface beyond the two from the +earlier session (Select Kernel dropdown only offering "No Kernel"; a +kernel restart hanging forever in "Unknown" status) -- the New Launcher's +tile grid also shows no Python/xpython tile at all. All three are +consistent with the already-diagnosed upstream jupyterlite-core/ +jupyterlite-xeus webpack Module Federation shared-singleton bug (the +`IKernelSpecs` instance `activate()` receives `!==` the one +`app.serviceManager.kernelspecs` actually reads from). It genuinely does +resolve sometimes with no code change (one tab connected live, "Python +3.13 (XPython) | Idle", matching what you'd already observed) -- but +**do not click "Restart the kernel" on a working tab to test further**, +it got the only working tab stuck disconnecting/reconnecting forever +("Connection lost, reconnecting in 0 seconds" x3) with no recovery +observed; a fresh reload/new tab is safer than a restart for getting a +kernel back. If you need a reliable test loop, consider: opening several +fresh tabs at once and using whichever one connects, or scripting a +retry-reload loop and polling `app.serviceManager.kernels` from the +browser console rather than relying on the UI dropdown (which reads from +the broken singleton). + +### Local dev server conventions (demo repo) + +Always serve via `site/_serve_local.py ` (sends +`Cache-Control: no-cache` + a content-hash `ETag`, and the COOP/COEP +headers JupyterLite needs) -- never plain `python3 -m http.server`, and +never leave ad-hoc one-off server scripts running; they pile up and make +it easy to test a stale/wrong build by hitting the wrong port. Canonical +ports as of 2026-09-12, all rooted under +`~/robot/ros2-emscripten-zenoh-demo`: +- `8877` -- whole repo root (rclc/rclpy talker demos at + `/browser_demo/out/index_rclc.html` / `index_rclpy.html`) +- `8880` -- `jupyterlite-content/_output` (`/lab/index.html`) + +JupyterLite also keeps its own Service Worker + Cache Storage per origin +for offline support, independent of HTTP caching -- after rebuilding +`jupyterlite-content`, do a real "Clear site data" in the browser before +retesting on the same port, not just a hard reload. + +### Side investigation: `ros2-micro-ros-msgs` CI failure (GHA run 34686508869, unrelated to the Asyncify work above) + +Looked at `gh run view 34686508869 --repo Tobias-Fischer/ros2-emscripten-zenoh-demo +--log-failed` (this CI job builds the FULL generic ros-rolling closure -- +moveit, autoware, gazebo, clearpath, etc. -- much broader than anything this +demo project actually needs; not our narrow local build). The actual error, +repeated for `ros2-micro-ros-msgs` and several sibling message packages +(`ros2-test-msgs`, `ros2-rcl-interfaces`, `ros2-statistics-msgs`, +`ros2-std-msgs`, `ros2-example-interfaces`, `ros2-lifecycle-msgs`, all +clustered in the same ~90s window): +``` +Could NOT find Python3 (missing: Python3_NumPy_INCLUDE_DIRS NumPy) (found ...) +emcmake: error: 'cmake ... -DPYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python3.13 ...' failed +``` +**Root cause hypothesis (fairly confident, not yet verified by a fix +attempt)**: the CMake invocation passes `$BUILD_PREFIX/bin/python3.13` (the +NATIVE/host-arch interpreter used to run codegen scripts during +cross-compilation) as `PYTHON_EXECUTABLE`, and some ament/rosidl CMake macro +in these packages then does `find_package(Python3 COMPONENTS ... NumPy)` +against THAT SAME native interpreter. But numpy in this whole build is only +ever installed as a **cross-compiled wasm32 TARGET package** (`extra_recipes/ +numpy`, installed into `$PREFIX`, the emscripten sysroot) -- confirmed via +the solver's own package table for this exact failing micro_ros_msgs solve, +which shows `numpy 2.5.3 py313h97174d1_100 output` correctly resolved as a +`host:` (cross-compilation target-side) dependency. It is never installed +into `$BUILD_PREFIX`'s own native python at all, so `find_package(Python3 +COMPONENTS NumPy)` against the native interpreter can never succeed -- +this isn't a solver/caching mismatch (ruled out: the right numpy build is +being picked), it's a structural gap between "which python numpy is +installed for" and "which python this particular CMake check inspects". +**Update: fixed 2026-09-13, once the user was back online and explicitly +asked for it** (previously deliberately left unfixed here given the +blast radius -- see below for why that call changed). This affects a much +larger, mostly out-of-scope closure than the demo project's own narrow +build (which doesn't build any of these specific message packages the +same way), and the real fix does mean patching the ament/rosidl macro that +requests the NumPy component against the native interpreter +unconditionally -- done below, scoped to `EMSCRIPTEN` only. + +**Exact culprit found** (via `grep -rn NumPy` over `output/src_cache`): +`rosidl_python-release.git/cmake/rosidl_generator_py_generate_interfaces.cmake` +line 36: +```cmake +find_package(Python3 REQUIRED COMPONENTS Interpreter Development NumPy) +``` +and later (~line 167) `target_link_libraries(${_target_name_lib} PRIVATE +Python3::NumPy Python3::Python)` -- this is `rosidl_generator_py`'s own +interfaces-generation macro, invoked by EVERY ROS message package that +generates Python bindings (which is all of `ros2-test-msgs`, +`ros2-rcl-interfaces`, `ros2-statistics-msgs`, `ros2-std-msgs`, +`ros2-example-interfaces`, `ros2-lifecycle-msgs`, `ros2-micro-ros-msgs`, +and presumably every other `*_msgs`/`*_interfaces` package in the whole +ros-rolling closure). It unconditionally requires the `NumPy` component +of whatever `Python3_EXECUTABLE` vinca's template points CMake at for this +build -- which vinca deliberately pins to `$BUILD_PREFIX/bin/python3.13` +(the native host interpreter, presumably so `Python3_FIND_STRATEGY=LOCATION` +gets consistent version/ABI info without trying to actually *run* a +cross-compiled wasm32 python on the build host). + +**Fixed 2026-09-13** (once the user was back and explicitly asked for this +specific fix + a full emscripten rebuild -- previously left unfixed here +given the blast radius, see the note above). Went with option (b) from +the original writeup -- a patch to `rosidl_python` itself, scoped to +`EMSCRIPTEN` only, in +`patch/ros-rolling-rosidl-generator-py.emscripten.patch` (the same patch +file this recipe already carried, for the earlier, separate +`Python3::NumPy`/pthreads-link fix -- added a second hunk right before it): +on `EMSCRIPTEN`, `find_package(Python3 REQUIRED COMPONENTS Interpreter +Development)` (dropping the `NumPy` component, which can never be found +against the native `$BUILD_PREFIX` python) and instead locate NumPy's +`_core/include` directory directly under the TARGET prefix (`file(GLOB +... "$ENV{PREFIX}/lib/python*/site-packages/numpy/_core/include")`, +verified against the actual installed layout of our own `numpy` `.conda`) +-- non-emscripten platforms are untouched (`else()` branch keeps the +original `find_package(... NumPy)` call). This works because numpy is +already a `host:` (cross-compiled target-side) dependency of every +`*_msgs`/`*_interfaces` package -- confirmed present under `$PREFIX` at +CMake-configure time, just never visible to `find_package`'s native-python +NumPy-component probe. + +Bumped `build_number` (25 -> 26) for `rosidl_generator_py` itself (in +`pkg_additional_info.yaml`, vinca's own per-package override mechanism) +plus all 15 `*_msgs`/`*_interfaces` packages in this repo's own (233-recipe, +much smaller than the CI closure) local build -- `action_msgs`, +`builtin_interfaces`, `example_interfaces`, `geometry_msgs`, +`lifecycle_msgs`, `micro_ros_msgs`, `rcl_interfaces`, `rosgraph_msgs`, +`sensor_msgs`, `service_msgs`, `statistics_msgs`, `std_msgs`, `test_msgs`, +`type_description_interfaces`, `unique_identifier_msgs` -- so rattler's +cache can't silently keep serving a stale pre-fix artifact for any of +them. Verified via `python check_patches_clean_apply.py` that the new +patch hunk applies cleanly (`ros2-rosidl-generator-py -> OK`; the 4 +unrelated failures in that same run, for `python`/`xeus`/`xeus-lite`/ +`xeus-python`, are a pre-existing false-positive in the check script for +those hand-written `extra_recipes` -- nothing to do with this fix). +Kicked off a full `pixi run build-emscripten` (backgrounded, `nohup` to +`/tmp/build_emscripten_run.log`, watched via a Monitor task) to rebuild +this repo's whole emscripten-wasm32 recipe set end to end. + +**Result: complete success.** Both passes of the fixed two-pass sequence +ran (`build-emscripten-pass` -> `sync-native-bootstrap-mirror` -> +`build-emscripten-pass` again) against the full 233-recipe closure. +`ros2-rosidl-generator-py`/`ros-rolling-rosidl-generator-py` rebuilt +clean, and every one of the 15 bumped `*_msgs`/`*_interfaces` packages +(both name variants) rebuilt clean too -- including `ros2-micro-ros-msgs` +itself, the exact package the original CI failure (GHA run 34686508869) +named. `grep -niE "could not find python3|error:|panicked|traceback"` over +the full ~50k-line build log returns **zero matches**; everything else in +the closure that was already built from earlier in this session correctly +`Skip`ped (451 "Skipping build for" lines) rather than needlessly +rebuilding. The `ros2-micro-ros-msgs` CI failure this whole side +investigation started from is now genuinely fixed, not just diagnosed. + +### BREAKTHROUGH 2026-09-13: the "kernel never registers" problem is a +### tab-visibility artifact of automated testing, not an upstream bug in +### our build (or even necessarily a real, permanent upstream bug at all) + +At the user's request, re-tested kernel registration against a **pure, +from-scratch emscripten-forge environment with nothing ROS-related at +all** (`/tmp/vanilla_jupyterlite_test` -- stock `xeus-python` + `numpy` +from `emscripten-forge-4x`, `jupyterlite-xeus` 5.1.0, built earlier this +marathon, served on `:8879`). **Same symptom**: Select Kernel dropdown +shows only "No Kernel" when opened via any of this session's browser +automation tools. This rules out anything specific to this project's own +build/patches -- the earlier "upstream jupyterlite-core/jupyterlite-xeus +Module Federation singleton bug" diagnosis (an `IKernelSpecs` instance +identity mismatch, established much earlier in this marathon) is real, +but is NOT the reason it never resolves for automated testing. + +**Root cause of "never resolves for Claude, always eventually works for +the user" found**: every tab this session's browser tools produce -- +`claude-in-chrome` (even after `tabs_context_mcp`, a real click, or +attempting to bring the tab forward) and the embedded `Claude_Browser` +preview pane (even with `tabs_create({foreground:true})` and an explicit +`tabs_select`) -- reports `document.visibilityState === "hidden"` and +`document.hasFocus() === false`. Neither tool produces a tab that is +genuinely OS-level visible/focused the way a human's own browser window +is; "foreground" in these tools' own vocabulary means "the frontmost tab +*within this tool's tracked group*", not "actually rendered and visible +on a real screen." + +This matters specifically because of how JupyterLab's own service layer +is built: `grep -o "when-hidden" build/jlab_core.*.js` in the vanilla +build confirms `@jupyterlab/services-extension:kernel-spec-manager` +(and every other core service manager -- kernels, sessions, contents, +settings, terminals) constructs its background poll with +`standby: () => !isConnected || "when-hidden"` (Lumino's `Poll` class, +used throughout JupyterLab for periodic refresh). **A poll with +`standby: "when-hidden"` does not run at all while +`document.visibilityState === "hidden"`.** So whatever one-time race +causes the kernelspec to be transiently missing/misregistered right +after the Module Federation extension activates, a real user's visible +tab lets the `KernelSpecManager`'s own periodic refresh poll keep +retrying and self-correct within moments ("takes a while but it shows up +for me") -- while every tab this session drives is permanently `hidden` +from the browser's own perspective, so that self-healing poll never +fires, and the dropdown looks permanently, unfixably broken even though +nothing is actually wrong with the underlying kernel/package data. + +**Follow-up test (same session, right after the finding above) -- +NEGATIVE result, corrects the theory above**: re-did the +`document.visibilityState`/`hidden` monkey-patch (`Object.defineProperty` ++ dispatch a synthetic `visibilitychange`) on a `claude-in-chrome` tab +this time rather than the `Claude_Browser` pane -- it did NOT crash here +(so the earlier crash was likely specific to the `Claude_Browser` preview +pane's own rendering path, not a general hazard of the patch itself), and +`document.visibilityState`/`hidden` genuinely stayed spoofed as +"visible"/`false` for the full duration. Waited **~70 seconds** (well +past any plausible `KernelSpecManager` poll interval) with the page +otherwise untouched. **The kernel still never appeared** -- dropdown +still empty, `document.body.innerText` never gained "Python"/"XPython". +Also tried the Kernels sidebar's "Refresh List" button first (before the +monkey-patch): no effect either, but that button refreshes the +*session* list (running kernels), not the *specs* list (available +kernel types) -- wrong manager, not a real test of the specs-poll theory. + +**Conclusion: the `standby: "when-hidden"` Poll mechanism is real, +confirmed in the actual bundled code, and IS a genuine reason a +background/non-visible tab won't self-heal on its own schedule -- but it +is NOT sufficient by itself to explain this bug, since forcing visibility +"on" well after the fact and waiting a full poll interval still didn't +surface the kernel.** This means the earlier, original diagnosis from +much earlier in this marathon -- an actual `IKernelSpecs` *instance* +identity mismatch between what the `xeus-extension`'s `activate()` +registers into and what the shell's `serviceManager.kernelspecs` reads +from (confirmed via a direct `===` identity check, `false`, on both +jupyterlite-xeus 5.0.0 and 5.1.0) -- is still the more likely primary +root cause: polling (with or without standby) a manager instance that +was simply never given the registration in the first place will never +surface anything, no match how many times or how promptly it retries. +Tab visibility may still be A contributing factor (e.g. for whatever +one-time async race happens at *first activation*, before any poll ever +runs) but is not, on its own, the mechanism behind the "never resolves" +symptom in this session's testing. **Do not re-attempt the global +`document.hidden` monkey-patch as a fix** -- it's now tested twice with +no positive result, only inconsistent side effects (crashed once, no +effect the other time). + +**Practical implication going forward**: this project's actual browser +demos (`browser_demo/build_rclc.sh`/`build_rclpy.sh` output, and the +compiled-to-JS/wasm executables, as opposed to the interactive +JupyterLite *kernel*) do NOT depend on JupyterLab's service-manager +polling at all -- they're plain HTML pages running a compiled program, +not a Jupyter kernel session -- so this visibility issue is specific to +testing the **JupyterLite notebook kernel** path, not the rclc/rclpy +standalone demos, which is why those were confirmed working via +automation earlier without needing this same investigation. + +### BREAKTHROUGH 2026-09-13 (later the same day): `xpython.js`/`xpython.wasm` +### can run directly under Node -- no browser needed at all -- and this +### found and fixed a genuine, previously-undiscovered upstream bug + +At the user's prompt ("doesn't Jupyter have an API interface that doesn't +need browser interaction?"): `xpython.js` is a MODULARIZE-style emscripten +build exporting a plain CommonJS factory function +(`module.exports = createXeusModule`). It's compiled with +`-sENVIRONMENT=web,worker` (confirmed: `readAsync`/`readBinary` are only +assigned inside `if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){...}`, the +`else` branch for Node was completely empty), so it doesn't run under +plain Node out of the box, but the gap is small and patchable: +1. Pass `Module.wasmBinary` (bytes read via Node's own `fs.readFileSync`) + to the factory call -- bypasses the whole browser-only wasm-fetch path. +2. Patch the empty `else{}` branch (in a **local copy** of `xpython.js`, + never the deployed one) to assign `readAsync`/`readBinary` using + Node's global `fetch` (Node 18+), resolving relative paths (e.g. bare + `"libxeus.so"`, requested by the dynamic linker) against the same + `http://127.0.0.1:8880/xeus/demo_env/` root this project already + serves locally. +3. Call `Module.bootstrap_from_empack_packed_environment( + \`${kernel_root}/empack_env_meta.json\`, \`${kernel_root}/kernel_packages\`, + true)` -- this is the SAME function jupyterlite-xeus's own JS harness + calls to fetch/extract every kernel package tarball into the virtual + FS; pointing it at this project's already-served `jupyterlite-content` + deployment reproduces the exact real runtime environment. +4. `Module._eval`/`Module._eval_file` are the raw embind-exported + functions (need embind-wrapped args, not a plain string -- passing a + plain JS string throws `Cannot read properties of undefined (reading + '$$')`); the *real*, usable `Module.eval`/`Module.exec` JS wrappers + (see `pyjs`'s own `include/pyjs/pre_js/init.js`) only exist AFTER + `Module.init_phase_2(...)` completes successfully -- don't call the + underscore-prefixed raw ones directly. + +A working minimal harness following this recipe is invaluable for fast +iteration on kernel-bootstrap bugs -- no browser, no tab-visibility +flakiness, no Module Federation singleton bug in the way, just +`node test.mjs` with full stdout/stderr and JS stack traces. **This is +how the actual `PyInit__rclpy_pybind11` investigation should continue**, +not by fighting for a live browser kernel connection. + +**What this immediately found**: running this harness against the real +deployed `jupyterlite-content` surfaced `ERROR No module named 'pyjs'` +during kernel bootstrap (`Module.init_phase_2`'s own internal +`import pyjs`) -- a **completely different, earlier failure than +`PyInit__rclpy_pybind11`**, meaning the kernel has likely never +successfully finished bootstrapping in ANY environment (browser included) +this whole marathon; `PyInit__rclpy_pybind11` was probably never even +reached in a real kernel session. Root cause: the `pyjs-rt` conda package +(`emscripten-forge/pyjs`'s own recipe, `build_all.sh`, both upstream's +copy and this repo's local copy before this fix) never passes +`-DPY_VERSION` to its `cmake` configure call. `pyjs`'s own +`CMakeLists.txt` defaults `PY_VERSION` to `3.11` when unset, and uses it +to compute `install(DIRECTORY module/pyjs DESTINATION +lib/python${PY_VERSION}/site-packages)` -- so the actual Python module +(`pyjs/__init__.py`, `core.py`, etc.) silently installs to +`lib/python3.11/site-packages` while everything else in this Python 3.13 +build looks under `lib/python3.13/site-packages`. Confirmed via +`tar tzf pyjs-rt-4.0.6-py313h32dd476_100.tar.gz` on the actual deployed +package: **it contained only `conda-meta/*.json` -- zero real files.** +This is a genuine upstream bug (confirmed by checking +`emscripten-forge/recipes`' own `build_all.sh` on GitHub directly -- same +gap, not something introduced by this repo's copy), not previously caught +because nobody had gotten far enough into kernel bootstrap to notice +`import pyjs` itself failing. + +**Fixed**: `extra_recipes/pyjs/build_all.sh` now passes +`-DPY_VERSION=3.13` to the cmake configure line (see that file's own +comment). `extra_recipes/pyjs/recipe.yaml` gained a proper `pyjs-rt` +output (`build_rt.sh` already existed from an earlier abandoned attempt, +just never wired into `outputs:` -- now it is), with a +`package_contents` test asserting `lib/python3.13/site-packages/pyjs/ +core.py` and `__init__.py` exist, specifically so a PY_VERSION regression +shows up as a build-time test failure instead of silently shipping an +empty package again. `build.number` bumped 102 -> 103. Verified via +`tar tzf` on the freshly-built `pyjs-rt-4.0.6-py313hc2c4625_103.tar.bz2`: +all 8 `.py` files genuinely present at the correct path this time. +Rebuilt `demo_env_build` (`ROS_ROLLING_OUTPUT=.../output ./build.sh`, +confirmed it now resolves to `pyjs-rt-...-py313hc2c4625_103`, not the old +broken one) and `jupyterlite-content` (`pixi run build`) through the real +pipelines -- both picked up the fix cleanly, no manual file-swapping +needed in the end (a manual swap-in-place was used ONLY for a first fast +sanity check before doing the real rebuild, then cleaned up). + +**Still open**: with `pyjs-rt` fixed, `import pyjs` no longer fails, but +`Module.init_phase_2` now hits a NEW failure inside its own internal +`Module.exec(...)` call: `RuntimeError: null function or function +signature mismatch` (an emscripten `dynCall_vii`/`invoke_vii` table +lookup failure). Not yet root-caused. Two live hypotheses, not yet +distinguished: (a) a genuine bug that was always there but masked by the +pyjs-rt emptiness (i.e. kernel bootstrap has NEVER actually completed, +in any environment, and this is simply the next layer down), or (b) an +artifact of this Node harness's incomplete replication of the real +browser embedding (Asyncify's actual yield/resume behavior and the +browser event loop timing this build assumes may not translate 1:1 to +Node's own microtask/timer semantics) -- **test this same fixed +deployment in a real, live browser kernel session next** (now genuinely +worth another patient attempt, since this is the first real, substantive +fix to kernel bootstrap this entire marathon) to see whether the +signature-mismatch crash reproduces there too or is Node-harness-specific. +If it reproduces in-browser too, this is the new real blocker and +supersedes the `PyInit__rclpy_pybind11` investigation entirely (that +error can never have been reached for real before now). If it does NOT +reproduce in-browser, the Node harness needs a bit more JS-side scaffolding +(look at what jupyterlite-xeus's real `xeus.ts`/kernel-provider JS does +between module instantiation and `bootstrap_from_empack_packed_environment` +that this minimal harness skips) before it can be trusted for testing +past this point. + +**Immediate follow-up, same session: the "null function or function +signature mismatch" crash turned out to be a red herring in the harness, +not a real blocker -- `import rclpy` GENUINELY WORKS now.** Root cause of +the confusion: `Module._eval`/`Module._exec` (underscore-prefixed) are +the RAW embind bindings and need embind-wrapped `globals`/`locals` +arguments, not bare strings -- calling them directly (as the harness +initially did) throws `Cannot read properties of undefined (reading +'$$')`. The real, intended API is `Module.eval`/`Module.exec` (no +underscore) -- plain JS wrapper functions defined in `pyjs`'s own +`init_phase_1` (see `include/pyjs/pre_js/init.js`) that supply the +correct default scope automatically. `init_phase_1` completes +successfully as part of module instantiation, so `Module.exec`/`.eval` +are usable immediately -- **the dynCall signature-mismatch crash inside +`init_phase_2`'s own internal exec call is apparently caught/swallowed +internally by pyjs (bootstrap's promise still resolves, "bootstrap +complete" logs right after) and does NOT prevent basic `Module.exec` +from working afterward.** Switching the harness to use `Module.exec` +instead of `Module._eval` immediately produced: +``` +[harness] executing: import rclpy +[harness] SUCCESS: import rclpy worked! +``` +**The `PyInit__rclpy_pybind11` error that drove the whole earlier +`dynload.js`/dependency-preload investigation is GONE.** It was almost +certainly a downstream symptom of `pyjs-rt` being empty all along (some +partial/inconsistent bootstrap state), not a real, separate rclpy-side +bug -- once `import pyjs` itself started working (the fix above), rclpy's +own `_rclpy_pybind11.so` dlopen chain (all 71 transitive dependencies) +resolves cleanly. + +**New, more precise blocker found immediately after, by executing the +notebook's first-cell statements one at a time**: `import rclpy` alone +succeeds every time; the very next statement, `from rclpy.node import +Node`, aborts with a bare, contextless `RuntimeError: Aborted(). Build +with -sASSERTIONS for more info.` -- no Python traceback, no stderr +message at all before the abort (confirmed by checking every `[stderr]`/ +`[stdout]` line logged up to that point -- genuinely nothing). Leading +hypothesis, not yet confirmed: **`ASYNCIFY_STACK_SIZE=24576`** (set in +`extra_recipes/xeus-python`'s own Asyncify-enablement patch) **may be too +small** for whatever deeper/wider call stack `rclpy.node`'s own import +triggers (it's rclpy's main submodule, likely pulling in more of the +`_rclpy_pybind11` C-extension's actual functionality where `import rclpy` +itself might only touch a shallow subset) -- a bare, message-less +`Aborted()` immediately after a `dynCall`/`invoke_v` frame is exactly the +signature of an Asyncify internal-stack overflow, not a Python-level +exception (which would print a traceback via `printErr` first). **Next +step**: bump `ASYNCIFY_STACK_SIZE` in `extra_recipes/xeus-python`'s patch +(try e.g. 65536 or 131072), rebuild xeus-python + demo_env_build + +jupyterlite-content, and retest the SAME `from rclpy.node import Node` +statement via this same Node harness (fast iteration, no browser/kernel- +registration flakiness needed) before touching anything else. This is now +the closest this whole marathon has gotten to the actual finish line -- +`import rclpy` itself is confirmed working end-to-end for the first time. + +**`ASYNCIFY_STACK_SIZE` bump tested -- ruled out. Real cause found, and +it's much deeper: WASM indirect-function-table corruption, not a stack +overflow, not anything Python/rclpy-specific.** Bumped 24576 -> 131072 +(5x), rebuilt xeus-python (build_number 101->102) + `demo_env_build` + +`jupyterlite-content` through the real pipelines (confirmed the new +`StackSize:131072` literally appears in the rebuilt `xpython.js`), reran +the Node harness -- **identical** `from rclpy.node import Node` -> +`Aborted()`, byte-for-byte the same failure. Stack size was not it. + +Wrote a second, tighter harness (`test_one.mjs`, taking one Python +statement as a CLI arg so each test gets a genuinely fresh Module/ +interpreter -- necessary because after one `Aborted()` the whole wasm +instance is poisoned and every subsequent call in the SAME process also +"fails," which would have made naive one-process-many-statements testing +meaningless) and bisected `rclpy/node.py`'s own early imports one at a +time, always after a working `import rclpy`: +- `from rcl_interfaces.msg import FloatingPointRange` -- OK +- `from rclpy.callback_groups import CallbackGroup` -- OK +- `from rclpy.client import Client` -- **Aborted()** +- `from rclpy.clock import BaseClock, Clock` -- **Aborted()** +- `from rclpy.context import Context` -- **Aborted()** +- `from rclpy.endpoint_info import ActionEndpointInfo` -- **Aborted()** +- `from rclpy.utilities import ok` -- **Aborted()** + +At first glance this looks like "some rclpy submodules are broken, others +aren't." **It isn't that.** Confirmed `rclpy.context` is ALREADY in +`sys.modules` after the earlier successful `import rclpy` (`rclpy/ +__init__.py` itself does `from rclpy.context import Context as Context`) +-- so `from rclpy.context import Context` right after should be a pure +cache hit, zero new code execution, zero new dlopen activity. Yet it +still aborts. Narrowed further with a plain expression-statement (no +import machinery at all): `sys.modules['rclpy.context'].Context` -- +**also aborts**, while `import rclpy.context` (bare form, no attribute +access) succeeds, and `from os import path` (an ordinary stdlib +from-import, same syntax shape) succeeds fine. **So this was never about +which module gets imported, or even about import statements at all -- +it's about something in ATTRIBUTE ACCESS on an object descended from the +compiled `_rclpy_pybind11` extension, and it doesn't reproduce +consistently for the same code -- different attribute accesses on +different already-loaded objects abort while syntactically identical +operations on other objects (`os.path`) do not.** + +**Working theory (not yet confirmed, but fits every observation):** this +is WASM indirect-function-table corruption from the sheer scale of the +dlopen chain, not a Python-level or rclpy-authorship bug at all. +`_rclpy_pybind11.so` alone pulls in 71 transitive `.so` dependencies +(`dylink.0`'s `needed_dynlibs`, confirmed via `wasm-objdump` much earlier +this marathon). Emscripten's dynamic linker grows a single shared +indirect function table as each `.so` is dlopen'd, appending each +module's exported functions/vtable entries -- under Asyncify, dlopen +itself is asynchronous, and with a chain this deep it's plausible for +table-growth bookkeeping to end up with a stale or overlapping entry for +at least one function-pointer slot (a class's vtable slot, a bound +method's C function pointer, etc.). That would produce exactly this +non-deterministic-looking pattern: most calls resolve to the right +function and work fine, but some specific pre-existing objects' +attribute-dispatch happens to route through a corrupted/reused table +slot and calls into whatever ended up there instead -- a `dynCall_vii` +"null function or function signature mismatch" is the textbook signature +of exactly this failure mode (an indirect call through a bad table +index), not of a stack overflow (ruled out above) or a Python exception +(which would print a traceback via `printErr`, and none ever does). + +**This is a much bigger, harder problem than anything fixed so far +tonight** -- it's not a missing `-DPY_VERSION` flag or an unset ASYNCIFY +option, it's a potential Emscripten dynamic-linker correctness issue +under deep multi-`.so` dlopen chains combined with Asyncify, which would +need either a genuine Emscripten upstream fix/workaround or a +significant reduction in how many separate `.so` files get dlopen'd at +once (e.g. statically linking more of the 71 dependencies together +instead of leaving them as 71 separate dynamic libraries) to sidestep +rather than fix directly. **Not attempted yet this session** -- this is +where the investigation should pick up next. Concretely worth trying, +roughly in order of effort: +1. ~~Re-run the SAME failing statement (e.g. `from rclpy.context import + Context`) two or three times in a fresh process each time~~ -- DONE, + confirmed **fully deterministic**: 3/3 fresh-process runs of + `from rclpy.context import Context` abort identically. Doesn't rule + out the table-corruption theory (a fully deterministic dlopen call + order would corrupt the same slot the same way every time), but does + rule out any theory relying on run-to-run timing randomness. +2. Try calling `Module.exec('import gc; gc.collect()')` or forcing a + table-consistency check between `import rclpy` and the failing + statement, to see if anything makes the corruption visible/detectable + earlier. +3. Check emscripten's own changelog/issue tracker for known + indirect-function-table bugs interacting with `dlopen()` + `ASYNCIFY` + at this scale -- this may already be a filed, understood upstream + limitation with a documented workaround (e.g. a minimum + `TABLE_BASE`/`RESERVED_FUNCTION_POINTERS` setting, or a + `-sMAIN_MODULE=2` vs `=1` distinction). +4. As a blunter workaround: reduce the SIDE_MODULE count by statically + linking some of the 71 dependencies directly into `_rclpy_pybind11.so` + itself (or into `xpython.wasm`) instead of leaving them all as + separate dlopen targets -- more invasive, but sidesteps the scale + that's plausibly triggering this rather than needing to fix Emscripten + itself. + +This is genuinely the front line of the investigation now. Everything +above it in this file (pyjs-rt, the Asyncify/-fwasm-exceptions chain, the +NumPy CMake fix) is confirmed fixed and shipped; this table-corruption +issue is the one thing standing between here and a fully working +`import rclpy` + `Node()` in the real notebook. + +### Immediate follow-up, same session: precisely characterized -- and it's +### a cross-`Module.exec()`-call object-lifetime bug, not "table corruption" +### in the generic sense; genuinely blocks the real multi-cell notebook + +**Ruled out "any big dlopen chain is unstable"**: tested `numpy` (a +different pybind11/embind-loaded SIDE_MODULE) -- creating arrays, +printing them, reading `.ndarray`/`type()` all work perfectly across +separate `Module.exec()` calls, no issue at all. Also tested +`rcl_interfaces.msg.FloatingPointRange.__import_type_support__()` (a +REAL, different typesupport `.so` dlopen, triggered explicitly) followed +by more calls in a fresh exec -- also totally fine. **This rules out any +"generic pyjs/exec-across-calls" or "any ROS typesupport .so" theory.** +It is specific to objects tied to `_rclpy_pybind11` itself. + +**Precise trigger, found by testing single combined vs. separate exec +calls**: `import rclpy` followed immediately by `from rclpy.node import +Node` **in the SAME `Module.exec()` call** -- works. In fact, **the +ENTIRE real demo-notebook first cell** (`import os`, env vars, `import +rclpy`, `from rclpy.node import Node`, event-handler/message imports, +`rclpy.init(args=[])`, `Node(...)` construction, `print(...)`) run +together as one `Module.exec()` call -- **succeeds completely**: +``` +[test] executing full cell 1 as ONE exec call... +[test] RESULT: CELL 1 SUCCEEDED +``` +This IS the actual finish line for `import rclpy` + `Node()` construction +-- genuinely confirmed working, for the whole real first-cell content, +not just a bare `import rclpy`. + +**But it does NOT stop there -- tested cell 2 next (a separate +`Module.exec()` call, using `node`/`PublisherEventCallbacks`/`String` +created in cell 1's call, matching the real demo notebook's actual +`create_publisher`/`create_subscription` cell) -- and it crashes the same +way**: +``` +[test] executing CELL1... [test] CELL1: OK +[test] executing CELL2... [test] CELL2: FAILED: Aborted(). +``` +Bisected CELL2 down to the single simplest possible statement: **merely +referencing `node` (`print(node)`, `x = node`, `node.get_name()`) or +`String` (`print(String)`, `String()`) from a NEW exec call after CELL1's +exec call finished -- aborts, every time.** A totally unrelated trivial +statement (`print('trivial')`) in that SAME new call is fine. So: **any +Python-level reference to an object connected to `_rclpy_pybind11`'s +compiled layer, made from a DIFFERENT top-level `Module.exec()` +invocation than the one that originally created/touched it, crashes with +a message-less abort.** Within one call: totally fine, however much code. +Across two separate calls: guaranteed crash, deterministic, regardless of +which specific rclpy-descended object or how trivial the reference is. + +**Why this matters a lot**: a real Jupyter notebook executes each CELL as +its own separate top-level "execute this code" call into the kernel -- +there is no way to make a real notebook's cell 1/cell 2/cell 3 collapse +into a single call. If this bug is real in the actual browser kernel (not +just an artifact of this Node harness's use of `Module.exec` specifically +-- see caveat below), **it would still fully block the practical goal** +even with pyjs-rt fixed: you could get `import rclpy` and even construct +a `Node` in one cell, but the moment a LATER cell tries to use that node +(publish, subscribe, spin, anything), it would crash. + +**Open question, not yet resolved**: does the REAL xeus-python kernel +even route notebook cell execution through this same `Module.exec()` JS +function at all? `Module.exec`/`Module.eval` are pyjs's own JS<->Python +bridge (used, per its own `init.js`, for things like the async/webloop +integration) -- xeus-python's actual `execute_request` handling is +implemented in xeus's own C++ interpreter class (calling CPython's C API +like `PyRun_String` directly, compiled into `xpython.wasm`'s `main()` +loop), and no `execute_request`/`interpreter`-named function is exposed +on `Module` at all (`grep -o 'Module\["[a-zA-Z_]*"\]=' xpython.js` finds +nothing named that way) -- meaning the REAL per-cell entry point is +entirely internal to the compiled binary, reached via some other +message-passing mechanism (likely a Web Worker `postMessage` protocol +from jupyterlite-xeus's own JS, not a plain JS function call at all). +**This Node harness cannot currently exercise that real path** -- it can +only call pyjs's own `Module.exec`, which may or may not share the exact +same crash-prone code path as the real per-cell interpreter loop. +Tried switching to `Module.async_exec_eval`/`Module.exec_eval` (pyjs's +own "run a script" functions, closer in spirit to what a REAL kernel +`execute_request` handler might use) instead of plain `Module.exec` to +see if they behave differently -- **both are `undefined`**, because +`init_phase_2` (which defines them) itself aborts partway through on its +own internal `import pyjs` call before reaching that assignment (the +SAME "null function or function signature mismatch" `dynCall_vii` crash +documented above, at a DIFFERENT point in the sequence than the +cross-cell rclpy-object bug -- these may or may not be manifestations of +the same underlying root cause; not yet determined). + +**Next step**: get a real, live, connected browser kernel (patience +required, per the earlier-documented Module Federation flakiness -- but +now genuinely worth another attempt, since this is the single most +valuable open question) and test the SAME cell-1-then-cell-2 pattern for +real, in the actual demo.ipynb, to determine whether this cross-cell +crash is a real bug that will need a genuine fix (Emscripten-level, or a +recipe-level workaround reducing dlopen scope) or an artifact specific to +this Node harness's use of pyjs's `Module.exec` bridge rather than the +real kernel's own C++ execution path. + +### Follow-up, same session: found and used the REAL xeus kernel entry +### point (not pyjs's `Module.exec` bridge) -- same underlying bug +### confirmed present there too, and it's a KNOWN, longstanding, +### unresolved Emscripten limitation, not something specific to this +### project + +**Found the actual production entry point.** `xeus-lite`'s +`include/xeus-lite/xembind.hpp`/`src/xembind.cpp` expose a real +`Module.xkernel` JS class via embind (`xeus::export_kernel +("xkernel")`, instantiated in xeus-python's own `src/main_wasm.cpp`) with +`.start()` and `.get_server()`; the returned server object has +`.notify_listener(js_message)`, which for `{channel: "shell", header: +{msg_type: "execute_request", ...}, content: {code, ...}}` calls straight +into `xserver_emscripten::notify_shell_listener` -- **this is exactly +what jupyterlite-xeus's own JS calls for every real notebook cell +execution**, not pyjs's `Module.exec`. Built a harness +(`test_real_kernel.mjs`) that constructs a real `xkernel`, stubs +`self.postMessage`/`self.get_stdin` (the two JS globals +`xserver_emscripten` calls out to, normally provided by the browser's Web +Worker context) to log replies instead, and sends real `execute_request` +messages for cell 1 and cell 2 content. + +**Result: neither cell crashes with the "null function"/`Aborted()` +symptom via this real path** -- both come back with a clean +`execute_reply`. But both ALSO fail, with a different, very telling +error: `RuntimeError: no running event loop` from +`xeus_python_shell/shell.py`'s `run_cell_async` (`asyncio.get_running_loop()` +inside `XPythonLoopRunner.__call__`). Traced this to `pyjs/webloop.py` +(imported as a side effect of the bare `import pyjs` that +`wasm_interpreter::configure_impl()` does via `py::module::import("pyjs")` +during `kernel.start()`): its module-level code does +`asyncio.set_event_loop_policy(WebLoopPolicy())` and, since +`PYJS_DONT_AUTOSTART_EVENT_LOOP` isn't set, constructs a `WebLoop()` -- +whose own `__init__` immediately calls `asyncio._set_running_loop(self)`. +So there SHOULD be a running loop by the time `kernel.start()` returns. +Confirmed directly (bypassing rclpy and the real kernel entirely, testing +via two separate plain `Module.exec()` calls) that this genuinely doesn't +persist: `import pyjs` succeeds, but a LATER separate exec call's +`asyncio.get_running_loop()` still raises `RuntimeError: no running event +loop` -- **the exact same shape of bug as the rclpy-object crash, just +manifesting as "state silently reverted to unset" instead of a hard +abort**, because asyncio's own running-loop bookkeeping degrades +gracefully where pybind11's does not. + +**This unifies the whole investigation into one theory**: whatever +Asyncify/Emscripten does between separate top-level calls into the wasm +module (`Module.exec()` calls, OR real `notify_listener()` calls -- both +exhibit it, ruling out "it's specific to pyjs's bridge") resets or +invalidates some form of call-scoped state that several different +subsystems depend on being persistent: pybind11's own type/instance +registry (crashes hard when touched) and CPython's asyncio running-loop +marker (silently reverts, since asyncio's `RuntimeError` path is a normal, +graceful check rather than a crash). Tested and ruled out one concrete +candidate mechanism: emscripten's `noExitRuntime`/`EXIT_RUNTIME` runtime- +teardown-after-`main()`-returns behavior (`Module.noExitRuntime = true` +passed at module-construction time) -- made no difference, so it isn't +simply that. The true mechanism is still unidentified at the Emscripten +internals level. + +**Researched via web search: this is a real, known, longstanding, +UNRESOLVED category of Emscripten bug, not something specific to this +project's build.** "Function signature mismatch"/"null function" errors +with dynamic libraries (`dlopen`) + Embind are the subject of multiple +long-running, still-open GitHub issues on `emscripten-core/emscripten` +going back years -- e.g. [#13026 "Random 'function signature mismatch' +with dynamic libraries + Embind"](https://github.com/emscripten-core/emscripten/issues/13026), +[#13241](https://github.com/emscripten-core/emscripten/issues/13241), +[#9901](https://github.com/emscripten-core/emscripten/issues/9901), +[#12950](https://github.com/emscripten-core/emscripten/issues/12950), +[#8235 "dlopen: RuntimeError: indirect call signature mismatch"](https://github.com/emscripten-core/emscripten/issues/8235), +[#5337](https://github.com/emscripten-core/emscripten/issues/5337). No +generic, reliable fix is documented across these threads -- reported +causes vary (ABI/signature mismatches for specific parameter/return +types, table-growth races, optimization-level sensitivity) and several +are explicitly described as intermittent/"random." This project is +currently on **emscripten 4.0.9** (`conda_build_config.yaml`'s +`emscripten_emscripten-wasm32` pin) -- a version bump is a large, +untested, many-hour undertaking (the whole toolchain + every package +would need rebuilding) and isn't something to attempt casually; worth +keeping in mind as a possible future avenue if this remains blocking, +but out of scope for this session. + +**Where this leaves the project**: `import rclpy` and constructing a +`Node()` are CONFIRMED working, for real, when done together in one +notebook cell (this is a genuine, first-time milestone this marathon). +Using the node/rclpy objects from a LATER, separate cell currently does +not work, for what looks like a real, upstream Emscripten limitation +around dynamic-linking + Embind/pybind11 state persistence across +separate top-level wasm entry points -- not a bug in this project's own +recipes, patches, or ROS packages. + +**Correction, tested immediately after via the real `xkernel`/ +`notify_listener` path**: the "single-cell workaround" idea above does +**not** actually hold up for the real kernel. Sent the ENTIRE combined +cell 1+2+3 content (`import rclpy` through `pub.publish(msg)`) as ONE +`execute_request` via the real `notify_listener()` -- it still hits +`RuntimeError: no running event loop`, on this very first and only +`notify_listener()` call. This clarifies the actual mechanism: `pyjs`'s +webloop gets set up during `configure_impl()`, which runs as part of the +**`kernel.start()`** call -- a call that is necessarily SEPARATE from +whatever later call runs `notify_listener()`, no matter how the +notebook's own cells are organized. So the earlier "everything in one +`Module.exec()` call works" result was specific to pyjs's own simplified +`exec()` bridge (which never touches `asyncio.get_running_loop()` at +all) -- it does not carry over to the real kernel's actual +`xeus_python_shell.run_cell_async` mechanism, which needs a running +event loop for EVERY cell, starting with the very first one. **There is +currently no known single-cell or multi-cell workaround** -- this is a +real blocker on the real kernel path specifically, distinct from (but +likely sharing a root cause with) the rclpy cross-cell crash found via +`Module.exec`. Next avenue, not yet tried: see whether the event loop can +be (re-)established from WITHIN the same call as `notify_listener` itself +-- e.g. patching `xeus_python_shell`'s `run_cell_async`/`XPythonLoopRunner` +to defensively call `asyncio.set_event_loop(pyjs.webloop.WebLoop())` +(or check-and-recreate) right before use instead of assuming a loop +already exists from a previous call, since creating a `WebLoop()` is +cheap and its own `__init__` self-registers as the running loop +immediately. + +**Tried this immediately -- doesn't work, and reveals mixing the two +entry points is itself unsafe.** Attempted to inject exactly this +defensive patch via a `Module.exec()` call sandwiched between +`kernel.start()` and `server.notify_listener()` (same process, same +kernel instance). **The `Module.exec()` call itself crashed** -- +`RuntimeError: memory access out of bounds` -- merely from importing +`pyjs.webloop`/`xeus_python_shell.shell` fresh and defining a function, +nothing pybind11-instance-specific this time. So it's not only "touching +an existing pybind11 object across calls" that's unsafe -- **any +`Module.exec()` call made after `kernel.start()` has already run seems to +inherit the same instability**, suggesting `kernel.start()`'s own +internal `configure_impl()` (which itself does real Python-level work +via this same class of call) leaves the runtime in a state where pyjs's +simplified exec bridge specifically can no longer be used safely +afterward -- a further wrinkle, not yet fully understood. **Do not try +to patch Python-side behavior via `Module.exec()` after `kernel.start()` +as a workaround** -- confirmed unsafe. Any future fix attempt for the +event-loop issue needs to happen either (a) inside `xeus_python_shell`'s +own source *before* it's packaged (a real code change, rebuilt into the +package) rather than injected at runtime, or (b) inside the C++ +`configure_impl()`/kernel-startup path itself. + +**Tried (a) for real -- a genuine, rebuilt-into-the-package patch, not a +runtime injection.** Added `patches/xeus_python_shell-defensive-event- +loop.patch` to the demo repo (wired into `demo_env_build/build.sh` +alongside the other 3 existing `xeus_python_shell`/`rclpy`/`pyjs` +patches), rewriting `XPythonLoopRunner.__call__` to catch +`RuntimeError` from `asyncio.get_running_loop()` and construct a fresh +`WebLoop()` instead of assuming a prior call's setup persisted. Rebuilt +`demo_env_build` + `jupyterlite-content` through the real pipeline and +retested via `test_real_kernel.mjs` (the real `xkernel`/`notify_listener` +path). + +**Result: confirms the patch code path IS reached (progress), but +uncovers something even more fundamental.** The error changed from `no +running event loop` to `ModuleNotFoundError: No module named 'js'`, +raised from `pyjs/webloop.py`'s own top-level `import js` -- meaning the +`except RuntimeError` branch correctly fired, but `import pyjs.webloop` +(the fallback) re-executes that module's top-level code fresh, which +fails. Revised the patch to check `sys.modules.get('pyjs.webloop')` +first and only fall back to a real `import` if not already cached +(reasoning: reuse the module object from the SUCCESSFUL earlier `import +pyjs` in `configure_impl()`, whose own globals -- including its already- +resolved `js` reference -- should still be valid, sidestepping a fresh, +fragile `import js`). Rebuilt and retested again -- **still exactly the +same `ModuleNotFoundError`, at the SAME fresh-import line**, meaning +`sys.modules.get('pyjs.webloop')` returned `None`. **This means +`sys.modules` itself does not reliably carry the `pyjs.webloop` entry +from the `kernel.start()` call into the later `notify_listener()` call** +-- a stronger and more fundamental version of the persistence problem +than what the `Module.exec()`-only tests suggested (those showed +`sys.modules` entries DO persist across separate `Module.exec()` calls, +e.g. `'rclpy.context' in sys.modules` reliably returned `True` in a later +call). The discrepancy suggests `kernel.start()`'s C++-side +`py::module::import("pyjs")` (called via pybind11's own `gil_scoped_acquire` +API, not through pyjs's JS `Module.exec` bridge at all) and pyjs's own +JS-driven exec path may not be fully sharing the same persistence +guarantees, even though both ultimately run in the one embedded CPython +interpreter -- exactly why is still unresolved. + +**Status of this patch**: left in place (it's strictly an improvement -- +it now fails with a clearer, more specific `ModuleNotFoundError` instead +of the more generic `no running event loop`, and is harmless/inert on any +future build where the underlying persistence issue gets fixed some +other way, since the `try` branch is a no-op whenever a loop is already +running). **Not a working fix on its own.** This whole event-loop/ +`sys.modules`-persistence rabbit hole is now understood to be deeply +intertwined with the SAME root-cause class as the earlier rclpy-object +crash and the `init_phase_2` "null function" crash -- all three are +different symptoms of state not reliably surviving across separate +top-level entries into the compiled kernel, which independent web +research confirms is a real, longstanding, still-unresolved category of +Emscripten bug with dynamic libraries (`dlopen`) + Embind (see the +GitHub issue links above). **Stopping the deep C++/Emscripten-internals +investigation here for this session** -- further progress most likely +needs either genuine Emscripten-level expertise/upstream engagement, or +a fundamentally different build strategy (e.g. reducing reliance on +`dlopen` for this many side modules). The `import rclpy` + `Node()` +success (confirmed working end-to-end in one `Module.exec()` call) and +the `pyjs-rt`/NumPy-CMake/Asyncify-chain fixes earlier in this file +remain solid, real, shipped progress regardless of this remaining +blocker. + +### CONFIRMED 2026-09-13: the "null function" crash reproduces in a real, +### live browser kernel too -- not specific to the Node harness + +The user opened `http://127.0.0.1:8880/lab/index.html?path=demo.ipynb` +directly in their own real browser (the same freshly-rebuilt deployment, +with the pyjs-rt fix, the `ASYNCIFY_STACK_SIZE` bump, and the +`xeus_python_shell` defensive event-loop patch all applied) and hit +`RuntimeError: null function` **before even trying to execute a cell** -- +i.e. during kernel startup/bootstrap itself, matching the exact +`init_phase_2` "null function or function signature mismatch" crash +documented above (`Module.exec`'s own internal `import pyjs` call, inside +`bootstrap_from_empack_packed_environment`). **This resolves the open +question from earlier in this file definitively: it is NOT specific to +this session's Node.js harness.** It's a real bug that manifests in an +actual, live, browser-connected xeus-python kernel. Combined with +everything else found this session (the same class of "state doesn't +persist across separate top-level wasm calls" issue affecting pybind11 +objects, `sys.modules` entries, and asyncio's running-loop marker; the +web-research confirmation that "function signature mismatch"/"null +function" with Emscripten `dlopen` + Embind is a known, longstanding, +unresolved upstream bug class) -- this is now about as thoroughly +triangulated as it can be without either live browser DevTools access to +capture a full stack trace, or genuine Emscripten-internals debugging. + +**Got the real browser stack trace (from the user's own DevTools):** +``` +Uncaught (in promise) Error: RuntimeError: null function + at Bg.initialize (654.01688496c997e850.js?v=01688496c997e850:68:20425) + at async 654.01688496c997e850.js?v=01688496c997e850:54:114975 +``` +`654.01688496c997e850.js` is the `@jupyterlite/xeus-extension`'s own +webpack chunk (the SAME file whose `visibilitychange`/hidden-tracking +code was found much earlier this marathon) -- i.e. this is **JupyterLite's +own JS kernel-provider code**, not raw wasm-engine output. `Bg` is a +minified class (almost certainly the xeus remote-kernel wrapper class +jupyterlite-xeus uses to drive `xpython.wasm`), and `.initialize()` is +presumably exactly the method that calls into `Module.async_init`/ +`bootstrap_from_empack_packed_environment` -- i.e. this confirms the +crash happens during **kernel bootstrap**, called from the real +extension's own initialization path, not something invoked later by a +cell. The browser's own promise-rejection handling caught the original +Emscripten `RuntimeError` and re-threw it wrapped in a plain `Error`, +which is why the deeper `dynCall_vii`/`invoke_vii`/`Asyncify` wasm-level +frames visible in the Node harness's own capture don't show up here -- +JS-level try/catch across an async boundary loses the original engine +stack. Still unmistakably the same underlying crash: `init_phase_2`'s +internal `Module.exec('import pyjs...')` call, now confirmed to happen +for real, inside `Bg.initialize()`, in a live browser. + +**New, important hypothesis this raises**: if `Bg.initialize()` -- the +kernel PROVIDER's own initialization -- throws uncaught during kernel +startup, that could very plausibly be why the kernelspec never +successfully finishes registering with the shell's `serviceManager`, +which is exactly the symptom this whole marathon has called "the +Module Federation kernel-registration bug" (empty Select Kernel dropdown, +no tile in the New Launcher, etc.). In other words: **the "kernel +registration is flaky" mystery from much earlier in this marathon and +this session's `init_phase_2`/"null function" crash may be the SAME bug, +not two separate ones** -- a provider whose `initialize()` sometimes +throws (perhaps depending on Asyncify/dlopen table-state timing, matching +this session's "state doesn't reliably persist across separate top-level +wasm calls" theme) would look exactly like "sometimes the kernel shows +up, sometimes it doesn't," entirely independent of any genuine Module +Federation singleton-identity issue. This reframes the whole night's +"upstream jupyterlite-core bug, not our problem" framing -- it may +actually be traceable to the SAME class of Emscripten dlopen/Asyncify +issue documented throughout this file, just surfacing earlier (at kernel +*registration* time) than where this session mostly investigated it (at +cell *execution* time). Not yet proven -- would need to correlate several +kernel-connection attempts against whether `Bg.initialize()` throws each +time -- but a strong, parsimonious unifying explanation. + +### BREAKTHROUGH 2026-09-13 (autonomous overnight session): root cause +### narrowed to `-sASYNCIFY` on xpython's own MAIN_MODULE -- not rclpy, +### not package count, not anything ROS-specific at all + +Per the user's explicit instruction ("start with the vanilla non-ROS +stuff, see if the bug is there, then stepwise add functionality"), built +a pure `xeus-python` + `numpy` vanilla environment (`jupyter lite build`, +31 stock emscripten-forge-4x packages, no local patches/builds at all, +served on port 8879) and tested it with the exact same real-kernel-path +Node harness technique (`Module.xkernel()` -> `.start()` -> +`server.notify_listener()` with real `execute_request` messages, matching +what `jupyterlite-xeus`'s own JS does for every cell). + +**Result: the vanilla environment has ZERO trace of this bug.** +`kernel.start()` didn't throw, a real `execute_request` cell executed +cleanly with `status: "ok"`, and -- critically -- a SECOND, separate +`notify_listener()` call (the same cross-top-level-call shape that broke +everything in our own build) saw the identical `pyjs.webloop.WebLoop` +object survive from cell 1 (`asyncio.get_running_loop()` succeeded, +returning the very same `` +constructed during `kernel.start()`), plain Python global state (`x`) +persisted, and `async`/`await` worked normally across the separate call. +**This directly falsifies the "fundamental, unfixable Emscripten Asyncify +limitation" conclusion this file drew earlier in the marathon** -- the +underlying mechanism (Asyncify + pyjs + embind + xeus-lite) is NOT +inherently incapable of preserving cross-call state; something specific +to *our* build breaks it. + +Next, bisected whether it's about ROS/rclpy specifically or "too many +packages" in general, using our own project's real, already-built +`demo_env` kernel (145 packages, our own patches, port 8880) run through +the identical harness: + +- **Same 145-package ROS build, deliberately never touching `rclpy` at + all** (just `x = 1+1` / asyncio in cell 1, same cross-call asyncio test + in cell 2): the `init_phase_2` bootstrap crash (`RuntimeError: null + function or function signature mismatch`, same `dynCall_vii`/ + `invoke_vii` signature as everything else in this file) reproduces + **during kernel construction itself**, before cell 1 even runs -- + proving this has nothing to do with which Python code a cell executes. +- **Same build, but with a hand-trimmed `empack_env_meta.json` stripping + every single `ros2-*`-prefixed package** (145 -> 58 packages, serving + the trimmed manifest from a throwaway local `http.server` on port 8881 + while still fetching real tarballs from the ROS build's own + `kernel_packages/`): **the crash still reproduces, identically.** + Zero ROS packages loaded, same crash. This rules out rclpy's dlopen + chain, rclpy's package count, and "too many total packages" as the + trigger -- the only thing left in common across every failing test is + **our own compiled `xpython.js`/`xpython.wasm` binary itself**, versus + vanilla's stock, unmodified emscripten-forge-4x build. + +Diffing our `xeus-python` recipe against upstream +(`extra_recipes/xeus-python/patches/0001-add-asyncify-to-xpython-main-module.patch`, +recipe.yaml's own header comment) shows exactly one substantive +difference: **we add `-s ASYNCIFY` (+ `ASYNCIFY_STACK_SIZE=131072`) to +xpython's own MAIN_MODULE link step**, purely so that rclpy's +Asyncify-enabled SIDE_MODULE (`_rclpy_pybind11...so`) can `dlopen()` +without hitting `LinkError: ... Import #71 "env" "__asyncify_state": +imported mutable global must be a WebAssembly.Global object` -- Asyncify's +dynamic-linking support requires a shared `__asyncify_state` global that +only exists when the *hosting* MAIN_MODULE also has Asyncify enabled. +Vanilla's stock xeus-python has no Asyncify on its main module at all +(and never loads anything that needs it). **This lines up exactly** with +the web-researched known bug class (Embind + `dlopen` + Asyncify +indirect-function-table corruption, e.g. +`emscripten-core/emscripten#13026`) -- except now the trigger looks like +it's simply *"xpython's own compiled code is Asyncify-instrumented at +all,"* independent of whether any Asyncify SIDE_MODULE is ever actually +dlopen'd. + +**In progress at time of writing**: kicked off an isolated single-package +diagnostic build (`scratch_test_recipes/xeus-python-noasyncify/`, package +renamed `xeus-python-noasyncify-test` to avoid cache collision with the +real `xeus-python` build) -- identical to our real recipe except the +`-s ASYNCIFY`/`ASYNCIFY_STACK_SIZE` block is removed from xpython's link +options (the `-fexceptions`-vs-`-fwasm-exceptions` fix is kept, since +that's unrelated and needed regardless). Building via a direct +`rattler-build build -r ` (not the full vinca pipeline) against +the existing `output/` local channel + the same remote channels the real +build uses, logged to `/tmp/xeus_python_noasyncify_build.log`. Once built, +the plan is to re-run the same trimmed-meta (no-rclpy) harness test +against this new binary: if the crash disappears, this is definitively +confirmed as the root cause, and the real fix becomes "find a way to +satisfy rclpy's SIDE_MODULE `__asyncify_state` import requirement WITHOUT +Asyncify-instrumenting xpython's own MAIN_MODULE" (e.g. hand-supplying a +dummy `__asyncify_state` WebAssembly.Global via a small pre-js shim, +rather than a real `-sASYNCIFY` compile) -- a much narrower, more +tractable problem than "Asyncify+Embind+dlopen is fundamentally broken." + +**RETRACTED same session**: the isolated no-Asyncify diagnostic build +(`xeus-python-noasyncify-test`) finished and was tested against the same +trimmed (no-`ros2-*`) 145->58-package harness. **The crash still +happens** -- different surface error +(`TypeError: getWasmTableEntry(...) is not a function`, thrown from a +plain `invoke_vii` wrapper instead of Asyncify's `dynCall_vii`), but +confirmed to be the exact same underlying phenomenon: `xpython.js`'s own +`getWasmTableEntry = funcPtr => { ... wasmTable.get(funcPtr) ... }` +returns `undefined` when the table slot is empty, and calling `undefined +(...)` produces exactly this message -- i.e. this is still "indirect call +landed on a null/unpopulated wasm table slot," just observed via the +codepath Emscripten uses when Asyncify is off instead of the +Asyncify-specific `dynCall_*` path used when it's on. **This falsifies +"-sASYNCIFY on xpython's own MAIN_MODULE is the root cause"** -- removing +it did not fix anything, it just changed which JS wrapper reports the +same table-corruption symptom. Downstream behavior was also identical +(cell1/cell2 still hit `ModuleNotFoundError: No module named 'js'` from +the same defensive-loop-runner fallback, for the same reason: whatever +broke during `init_phase_2` still leaves `pyjs.webloop` never properly +cached). + +**Corrected next hypothesis**: the differentiator is NOT the Asyncify +flag specifically -- it's something about *this project's own locally +rebuilt* `xeus`/`xeus-lite`/`pyjs-dev`/`pyjs-rt`/`python` packages (all +required host/run deps of xeus-python, all locally recompiled through +this project's own recipes, none of them stock emscripten-forge-4x +binaries) versus vanilla's 100% stock, unmodified upstream build of the +same stack. The next most suspicious remaining difference: `xeus`'s own +`WasmBuildOptions.cmake` is patched project-wide (see `extra_recipes/xeus`) +to swap the hardcoded `-fwasm-exceptions` for the JS-based `-fexceptions` +mechanism (`DISABLE_EXCEPTION_CATCHING=0`, `SUPPORT_LONGJMP=emscripten`) -- +originally justified as "Asyncify can't handle wasm-native exceptions," +but xpython's own patch applies this SAME swap to itself independent of +Asyncify, and it was left in place in the no-Asyncify test build above +(deliberately, thinking it was "unrelated"). Since the crash persisted +even with Asyncify fully removed, this exception-handling-mechanism swap +(rather than Asyncify) is now the leading suspect -- it changes which +system libc++abi/libunwind/compiler-rt variant every C++ object in the +whole chain links against, a much more fundamentally invasive ABI-level +change than a single link flag, and is applied project-wide (via vinca's +`EMCC_CFLAGS` override), not just to xpython. Next diagnostic step: +build xeus-python with NEITHER `-sASYNCIFY` NOR the `-fexceptions` swap +(i.e. as close to true stock upstream recipe as this project's own +locally-rebuilt `xeus`/`xeus-lite`/`pyjs-dev` host deps allow) and re-run +the same trimmed-meta harness test. If that also still crashes, the bug +lives in `xeus`/`xeus-lite`/`pyjs-dev`'s own local rebuild itself (a +toolchain/version/config difference from whatever vanilla's `jupyter +lite build` actually downloaded), not in xeus-python's patch at all -- +worth diffing `extra_recipes/xeus`'s patch and confirming vanilla's exact +`xeus`/`xeus-lite` build+version match ours before going further. + +**Further update, same session**: the "no source patches at all" diagnostic build +(`xeus-python-nopatch-test`) produced **byte-identical compiled output** to the +no-Asyncify build (same `wasm://wasm/03da3316` hash, same crashing function offsets) -- +i.e. xeus-python's own patch is provably inert/redundant once xeus's own (locally +rebuilt) `WasmBuildOptions.cmake` macro already applies the `-fexceptions` swap +project-wide. This means neither of xeus-python's own two patch mechanisms +(Asyncify, or its own redundant exceptions-flag-stripping) is the differentiator -- +confirming the true difference has to be inside `xeus`/`xeus-lite`/`pyjs-dev`'s own +locally-rebuilt binaries (all three are HOST/build-time deps of xeus-python; `xeus` +specifically also ships as a standalone dlopen'd `libxeus.so` sitting loose in the +kernel root next to `xpython.js`, confirmed present in both vanilla's and our own +build's output directories, different file sizes: 289KB stock vs 372KB ours). + +Attempted a zero-recompile test: served vanilla's own (working) `xpython.js`/`.wasm` +unchanged, but substituted **our own locally-rebuilt `libxeus.so`** in place of +vanilla's stock one (same runtime-fetch mechanism, no meta.json involvement since +`libxeus.so` is dlopen'd from a fixed relative path, not part of the empack package +list). Result: a DIFFERENT failure again -- +`Dynamic linking error: cannot resolve symbol invoke_ii`, thrown immediately inside +`new Module.xkernel()`'s C++ constructor (`__ZN4xeus30make_in_memory_history_managerEv`). +This is a straightforward ABI mismatch, not the same table-corruption bug: our +`libxeus.so` was compiled expecting the exception-safe `invoke_ii` JS runtime helper +(from the `-fexceptions`/`DISABLE_EXCEPTION_CATCHING=0` swap), which vanilla's own +MAIN_MODULE (built without that swap) never generates/exports. **This specific +cross-build `.so` swap test is invalid/inconclusive** -- the host main module and a +dlopen'd `.so` must share the same exception-handling ABI configuration to link at +all, so this only proves the two builds use incompatible ABI configurations, not +which one causes the original crash. + +To get a valid, apples-to-apples comparison, forced `rattler-build` to resolve +**genuinely stock, unmodified upstream `xeus`/`xeus-lite`/`pyjs-dev`/`python`** as +xeus-python's host deps (rattler-build was, by default, implicitly treating its own +`./output` directory as a searchable local channel even when not passed via `-c`, +so every previous "diagnostic" build had silently kept re-resolving our own local +rebuilds regardless of intent -- fixed by passing `--output-dir `, +which stopped the implicit local-channel pickup and let the remote +`emscripten-forge-4x` stock builds win the solve: confirmed `xeus 6.0.5 h0b0027f_0`, +`xeus-lite 5.0.0 h0b0027f_0`, `pyjs-dev 4.0.6 py313h06ab7c0_0`, +`python 3.13.1 h_2efca29_11_cp313` -- all matching vanilla's exact build strings). +This new build (`xeus-python-stockdeps-test`, recipe under +`scratch_test_recipes/xeus-python-stockdeps/`, same zero-source-patch CMakeLists.txt +as the `-nopatch-test` build) is the first real test of "is it xeus-python's own +code/config, or is it xeus/xeus-lite/pyjs-dev's own rebuild" with a truly controlled +comparison. In progress at time of writing (log: +`/tmp/xeus_python_stockdeps_build2.log`) -- check the result and update this section +accordingly. If it builds clean and the crash disappears when tested via the same +trimmed-meta harness, that pins the bug definitively on our own `xeus`/`xeus-lite`/ +`pyjs-dev` rebuild (worth then bisecting those three individually the same way); if +it still crashes, that would mean even xeus-python compiled with zero patches AND +against genuinely stock host deps still breaks merely by being recompiled fresh +(pointing at something in the *toolchain/environment* -- e.g. a different emscripten +patch version, a non-reproducible codegen difference, or a compiler-flag/environment +variable this project's build sets globally that vanilla's `jupyter lite build` never +sees -- worth checking vinca's/this repo's global `EMCC_CFLAGS`/`CXXFLAGS` exports +that apply to every build in this environment, not just recipe-level patches). + +**Further update, same session (this is now the leading hypothesis)**: the +`xeus-python-stockdeps-test` build (zero xeus-python patches, genuinely stock +`xeus`/`xeus-lite`/`pyjs-dev`/`python` host deps) **still crashed**, identical +"null function or function signature mismatch" signature, this time with a +very telling frame in the trace: `_PyEM_TrampolineCall_JavaScript` -- a +CPython/Emscripten Python<->JS trampoline detail, not xeus-specific at all. + +While chasing this, ran a genuinely clean zero-recompile control test: took +vanilla's own WORKING `xpython.js`/`.wasm` completely unchanged, and +substituted ONLY the runtime `python` package (the empack-fetched +interpreter+stdlib tarball) for **our own locally-rebuilt one** +(`python-3.13.1-h_0e8c188_101_cp313`, same build used in every ROS-side test +throughout this file). **Result: no crash at all** -- `init_phase_2` bootstrap +completed cleanly, cell1 and cell2 both executed with `status: "ok"`, and the +exact same `pyjs.webloop.WebLoop` object survived the separate `notify_listener()` +call (cross-cell asyncio persistence intact). This clears our own "python" +runtime package as a suspect too, and -- combined with the stockdeps-test +result above -- means the differentiator is not any *package* at all (not +rclpy, not python, not xeus/xeus-lite/pyjs-dev's *precompiled binaries*), but +something in how xeus-python's own **compile step** happens in this project, +even independent of any recipe.yaml patch. + +Root-caused (pending final confirmation) to `extra_recipes/xeus-python/build.sh` +itself -- specifically this line, present unconditionally (i.e. NOT part of +the now-proven-irrelevant CMakeLists.txt patch, and copied verbatim into every +scratch diagnostic recipe used in this file so far, meaning **every single +diagnostic build in this file up to and including `stockdeps-test` was +unknowingly still affected by it**): +``` +export EMCC_CFLAGS="${EM_FORGE_CFLAGS_BASE:-}" +``` +`EM_FORGE_CFLAGS_BASE` is never actually defined anywhere in this project (grep +confirms zero matches outside this exact line and its 3 sibling copies in +`xeus`/`xeus-lite`/`pyjs-dev`'s own `build.sh` files -- see AGENTS.md's earlier +"xeus" package fix section, ~line 411). So `"${EM_FORGE_CFLAGS_BASE:-}"` always +evaluates to the **empty string**, silently wiping the emscripten-forge +toolchain's own default `EMCC_CFLAGS="... -fwasm-exceptions"` for every +compilation unit in the package -- not "resetting to a project base" as the +surrounding comments imply, but unconditionally disabling exception handling +codegen project-wide across all four locally-rebuilt packages. Every one of +this session's "controlled" tests recompiled xeus-python fresh each time +(since that's the package under direct test), so every one of them silently +carried this same override regardless of which CMakeLists.txt patch was +present or absent -- explaining why removing Asyncify, removing the redundant +exceptions patch, and even using stock host deps all failed to fix anything: +none of those tests ever restored real exception-handling codegen to +xpython.wasm's own compile, which is the one thing genuinely different from +vanilla's true stock build in every test run so far. + +Kicked off `xeus-python-truestock-test` (`scratch_test_recipes/xeus-python-truestock/`): +identical to `xeus-python-stockdeps-test` (zero CMakeLists patch, stock host +deps via `--output-dir`) but with the `export EMCC_CFLAGS=...` line deleted +from `build.sh` entirely, letting the toolchain's real default +(`-fwasm-exceptions`) flow through untouched -- as close to vanilla's true +stock build as this project's own build.sh can get. In progress at time of +writing (log `/tmp/xeus_python_truestock_build.log`); check the result and +update this section. If this build's crash disappears, that's the real, +final root cause: **not a source patch at all**, but an environment-variable +override in `build.sh` (present in FOUR packages: xeus, xeus-lite, pyjs-dev, +xeus-python) that was clearly *intended* to reset `EMCC_CFLAGS` to some +"project base" value but, due to `EM_FORGE_CFLAGS_BASE` never being defined, +actually just deletes it -- and this in turn means all four locally-rebuilt +packages have been compiled with inconsistent/absent exception-handling +codegen this whole time, most likely producing the subtle indirect-call +dynamic-linking table corruption seen throughout this file. The real fix +would then be startlingly simple compared to everything explored above: +either define `EM_FORGE_CFLAGS_BASE` properly (to whatever the toolchain +activation script actually sets, i.e. effectively a no-op reset), or simply +delete these four redundant/broken `export EMCC_CFLAGS=...` lines outright, +and separately re-solve the ACTUAL problem the exceptions patch was trying to +fix (Asyncify vs wasm-native-EH incompatibility for the `xpython` MAIN_MODULE +specifically, which is a real, narrower, already-well-understood issue -- +see the very first patch comment in +`extra_recipes/xeus-python/patches/0001-...`) as a properly-scoped, +target-specific fix instead of a project-wide environment-variable stomp. + +**RETRACTED again, same session**: the `xeus-python-truestock-test` build (stock +host deps + `build.sh`'s `EMCC_CFLAGS` override deleted entirely) produced a +**byte-identical wasm hash** (`03c355f6`) to `stockdeps-test` and hit the exact +same crash. Deleting that line changed *nothing* -- directly disproving the +`EMCC_CFLAGS`/`EM_FORGE_CFLAGS_BASE` hypothesis. In hindsight this makes sense: +that env var only affects flags CMake doesn't already set explicitly per-target, +and apparently doesn't reach xeus-python-wasm's own compile units in a way that +changes codegen either way in this toolchain. + +**New, cleaner zero-recompile control tests, same session**: swapped OUR +locally-rebuilt `pyjs-rt` package (and separately, earlier, `python`) into +vanilla's completely unmodified, working `xpython.js`/`.wasm` + vanilla's own +meta.json (only the one package entry changed each time). **Neither reproduces +the crash** -- both work perfectly, cross-cell state persists correctly. So +`python`, `pyjs-rt`, and (separately) the absence/presence of ROS/rclpy +packages are now ALL cleared. The one earlier "positive" swap +(`libxeus.so`) was invalid/inconclusive (ABI mismatch: our `libxeus.so` expects +`invoke_ii`, an exception-safe JS helper vanilla's own main-module runtime +never generates -- a straightforward link-time ABI incompatibility between +main module and side module exception-handling configuration, not evidence of +the actual table-corruption bug). + +Stepping back: **five separate local recompiles of xeus-python this session** +(original w/ Asyncify+patches, no-Asyncify, no-patch, stock-host-deps, +stock-host-deps+no-EMCC_CFLAGS-override) **ALL reproduce the identical crash** +-- two of them (`stockdeps-test`/`truestock-test`) even compiled to +byte-identical wasm. Meanwhile **every zero-recompile runtime-package swap +into vanilla's untouched, remotely-built binary succeeds**. The common thread +across all five failing builds: every one was compiled fresh, locally, by +*this machine's own emscripten-forge-4x toolchain install* -- none of them +tested whether merely recompiling xeus-python's own C++ sources locally +(with an otherwise 100% byte-for-byte-identical upstream recipe) reproduces +the bug regardless of any of this project's modifications at all. That's the +one variable never yet isolated: **local recompilation itself**, independent +of source changes. + +Fetched the ACTUAL, current `emscripten-forge/recipes` upstream `xeus-python` +recipe.yaml + build.sh verbatim via `gh api` (not this project's copy) to run +that exact test. Found one more real, previously unexamined difference in the +process: upstream's real `build.sh` does `rm -f $PREFIX/bin/python*` ("remove +all the fake pythons") with NO `-DPYTHON_EXECUTABLE`/`-DPython_EXECUTABLE` +hints at all, while our `build.sh` explicitly skips that deletion and adds +those hints instead (per our build.sh's own comment, reasoning the deletion +would break subsequent `emcc`/`em++` wrapper scripts that need `$PREFIX/bin/ +python` to exist) -- genuinely different CMake python-resolution code paths, +never controlled for in any test so far. Neither upstream's nor our build.sh +touches `LDFLAGS`/`EMCC_CFLAGS` in this pure-upstream version (further +confirming the earlier `EMCC_CFLAGS` theory was a dead end). + +Kicked off `xeus-python-pureupstream-test` +(`scratch_test_recipes/xeus-python-pureupstream/`): the verbatim upstream +recipe.yaml + build.sh (only the package name changed, to avoid a cache +collision, and `pyjs >=4.0.6` -> `pyjs-dev >=4.0.6` since this project's local +channel never built the aggregating `pyjs` meta-package, only `pyjs-rt`/ +`pyjs-dev` separately -- an inert substitution, same underlying dev package +either way), built with `--output-dir ` to force genuinely stock +host deps, exactly as done for `stockdeps-test`/`truestock-test`. In progress +at time of writing (log `/tmp/xeus_python_pureupstream_build.log`) -- this is +the cleanest possible test of "is this project's build even the problem, or +does simply recompiling xeus-python locally on this machine's toolchain +reproduce the bug regardless of any of our own recipe changes." If this ALSO +crashes, the conclusion becomes: **the bug is not caused by anything in this +project's recipes/patches at all** -- it's either a genuine non-determinism in +this specific compiler-optimization-sensitive Emscripten bug class (matching +the "intermittent"/"optimization-level-sensitive" reports from the +web-researched upstream issues earlier this marathon), or a difference between +this machine's exact local emscripten-forge-4x toolchain snapshot and whatever +snapshot emscripten-forge's own CI used the one time it produced the +currently-published stock `xeus-python-0.19.0-py313he5686da_3` binary. In that +scenario, the realistic path forward is probably NOT more bisection of this +project's own patches (already proven innocent five times over) but one of: +(a) accepting the currently-published stock binary as the one known-good +artifact and finding a way to reuse ITS compiled xpython.wasm/js directly +while only swapping in rclpy-specific packages at the empack/runtime level +(no recompilation of xeus-python itself), if rclpy's own `.so` can be made to +dlopen into it without needing MAIN_MODULE Asyncify (this may still hit the +original `__asyncify_state` LinkError, unresolved); or (b) trying a full clean +rebuild from a freshly-fetched emscripten-forge-4x toolchain snapshot to see +if non-determinism is the explanation (re-running the exact same recipe twice +and diffing wasm hashes would settle this quickly). + +**Result, and where this line of investigation stops for now**: the verbatim +upstream `build.sh`, completely unmodified, **fails to even configure** on +this machine -- +`CMake Error ... Python config failure: Python is 64-bit, chosen compiler is +32-bit` (`$PREFIX/share/cmake/pybind11/FindPythonLibsNew.cmake:224`) -- the +exact bug this project's own `-DPYTHON_EXECUTABLE`/`-DPython_EXECUTABLE` +hints exist to fix. This **confirms this machine's local cross-compilation +environment genuinely differs** from whatever environment emscripten-forge's +CI used to produce the currently-published, working stock `xeus-python` +binary -- our hints are a real, necessary workaround here, not a stylistic +difference, and re-adding them to get a build that actually compiles would +just reproduce `stockdeps-test`/`truestock-test` a third time. + +**Consolidated conclusion after 6 local recompiles + 2 zero-recompile +control swaps this session**: +1. Original build (Asyncify + both patches) -- crashes. +2. No-Asyncify -- crashes, byte-identical crash class. +3. No xeus-python patches at all, still against our own xeus/xeus-lite/pyjs-dev -- crashes, wasm byte-identical to #2. +4. Zero patches + genuinely stock xeus/xeus-lite/pyjs-dev/python host deps -- crashes. +5. Same as #4 minus the `EMCC_CFLAGS`-clearing env override -- crashes, wasm byte-identical to #4. +6. Verbatim upstream recipe.yaml+build.sh -- doesn't even configure without reintroducing our own hints (would reproduce #4/#5 again). +- Meanwhile: vanilla's own remotely-built stock binary, untouched, combined + one-at-a-time with our own locally-rebuilt `python` package, and separately + our own locally-rebuilt `pyjs-rt` package (both swapped into vanilla's + otherwise-100%-stock 31-package environment) -- **both succeed perfectly**, + full cross-cell asyncio/webloop persistence intact. + +Every plausible *recipe-content* culprit (Asyncify, the exceptions-mechanism +patch, host-dependency selection, an environment-variable override, upstream +vs. modified build.sh) has now been individually falsified. The only +remaining common factor distinguishing every failing case from every passing +case is: **the failing binary was compiled fresh, locally, by this specific +machine's emscripten-forge-4x toolchain install**, vs. the passing binary +being the one already-published artifact from emscripten-forge's own CI. +This strongly suggests the true root cause is either (a) a real +non-determinism/environment-sensitivity in this well-documented "Embind + +`dlopen` + indirect-call-table" Emscripten bug class (the web research done +earlier this marathon already found multiple upstream issues describing it as +intermittent/optimization-level-sensitive) manifesting differently across +toolchain snapshots, or (b) something genuinely different/stale about this +machine's local emscripten-forge-4x toolchain install (a different exact +emsdk/Binaryen/LLVM point-release than whatever produced the currently +cached, working stock binary) that isn't captured by the nominal version +pins (`emscripten 4.0.9`, etc.) in `conda_build_config.yaml`. + +**Recommended next steps for when the user is back** (not pursued further +autonomously -- this has reached the point of needing either a decision from +the user or a fundamentally different kind of evidence than more bisection +builds can provide): +1. **Test toolchain staleness directly**: build the *exact same* recipe + (e.g. `xeus-python-stockdeps-test`) twice in a row and diff the resulting + wasm hashes -- if they're non-deterministic run-to-run even with + completely unchanged inputs, that confirms genuine compiler/optimizer + non-determinism as the mechanism (matching the "intermittent" reports from + the earlier web research) rather than something fixed about this + machine's toolchain specifically. +2. **Try a clean/updated local emsdk**: purge and re-fetch the + `emscripten-forge-4x` toolchain packages (`emscripten`, `binaryen` if + pinned separately) fresh, in case the currently-cached local install is + stale, corrupted, or was itself built from a slightly different upstream + commit than what's live on the channel today, and re-run + `stockdeps-test`. +3. **Pragmatic workaround, sidesteps the whole question**: stop trying to + recompile `xeus-python` locally at all. Use the currently-published, + working stock `xeus-python-0.19.0-py313he5686da_3` binary directly + (already confirmed compatible with our own `python`/`pyjs-rt` runtime + packages), and solve rclpy's dlopen requirement WITHOUT touching + xpython's own MAIN_MODULE compile: e.g. investigate whether a small + hand-written pre-js shim can define a dummy `__asyncify_state` + `WebAssembly.Global` directly (satisfying the SIDE_MODULE's import without + ever Asyncify-instrumenting xpython's own code), or whether rclpy's own + `.so` can be linked without needing `-sASYNCIFY` at all if the specific + code paths JupyterLite actually exercises never hit a genuine blocking + `rmw_wait` (may be fine for simple init/pub/sub patterns even if + long-running `spin()` still needs it) -- this was the ORIGINAL, much + narrower problem before this whole investigation, and may be more + tractable than continuing to fight local-recompile non-determinism. +4. If neither of the above resolves it, consider filing/searching further + in the specific upstream `emscripten-core/emscripten` issues already + identified (#13026 et al.) for anything describing toolchain-version- or + machine-specific reproducibility, since that would validate hypothesis + (a) directly. + +**Determinism check, final result this session**: rebuilt the exact same +`xeus-python-stockdeps-test` recipe a second time (identical recipe.yaml, +identical `--output-dir`-forced stock host deps, same machine, back to back). +Compared the two artifacts BEFORE any Node-shim patching, via `shasum -a 256` +and `cmp` on the raw extracted files: +- `bin/xpython.js`: **identical** sha256 both runs (the JS glue/runtime + code is fully deterministic). +- `bin/xpython.wasm`: **different** sha256, and `cmp` finds the first + byte difference at offset 1,057,813 -- i.e. compilation of the wasm binary + itself is NOT fully deterministic on this machine/toolchain (expected: + parallel `ninja`/LLVM link ordering, symbol-table ordering, etc. are common + non-determinism sources and don't necessarily indicate a problem by + themselves). +- **Correction to earlier claims in this file**: the `wasm://wasm/03c355f6` + -style hash string that Node/V8 prints in stack traces is NOT a reliable + full-content hash -- this second build's `xpython.wasm` differs byte-for-byte + from the first (confirmed above) yet V8 printed the exact same + `wasm://wasm/03c355f6` identifier for both. Every earlier claim in this file + of "byte-identical wasm" based solely on matching `wasm://wasm/...` strings + (e.g. comparing `no-patch-test` vs `no-asyncify-test`, and `stockdeps-test` + vs `truestock-test`) should be read as "V8 printed the same identifier," + NOT "confirmed byte-identical compiled output" -- those pairs may also have + differed in bytes elsewhere the same way this pair does. This doesn't + change the actual conclusions drawn from those tests (all based on the + crash/no-crash behavior, not the hash matching), but the "byte-identical" + framing in the write-ups above is not reliably established and should not + be trusted as strong evidence of anything. +- **The actually decisive part**: ran this second, confirmed-genuinely-different + compile through the same trimmed-meta (no-rclpy) harness test. **It hits + the identical crash** -- same `_PyEM_TrampolineCall_JavaScript` frame in the + `init_phase_2` bootstrap failure, same subsequent `invoke_ii` dynamic-linking + error when constructing `xkernel`. A build with genuinely different + compiled bytes elsewhere in the module still reproduces the exact same + failure mode. + +**What this settles**: the crash is NOT simple per-build random luck (if it +were, two builds with confirmed-different codegen would have at least some +chance of landing on opposite sides of working/broken -- instead both broke +identically). This points more toward hypothesis (b) from the recommendations +above: something structurally different between this machine's local +emscripten-forge-4x toolchain (exact emsdk/Binaryen/LLVM commit/build) and +whatever toolchain snapshot emscripten-forge's CI used for the currently-published, +working stock binary -- consistently producing this table-corruption pattern +regardless of the specific (non-deterministic, but immaterial) byte-level +differences elsewhere in each local compile. "Just keep rebuilding until you +get lucky" is NOT a promising workaround based on this evidence (2 for 2 +failures with genuinely different binaries) -- pursuing a toolchain-version +comparison/refresh, or the pragmatic "don't recompile xeus-python locally" +workaround, are the more promising remaining options from the recommendations +list above. + +**This is where autonomous bisection stops for this session.** Every +recipe-content hypothesis has been individually tested and falsified (7 local +recompiles total now, all crashing; 2 zero-recompile control swaps into +vanilla's stock binary, both succeeding). The remaining open question -- +exactly what differs between this machine's toolchain and whatever produced +the working stock binary -- needs either a toolchain-level comparison/refresh +or a decision from the user on which of the recommended next steps to pursue; +further blind local rebuild-and-test cycles are unlikely to add new +information at this point. + +### BREAKTHROUGH 2026-09-13 (later the same autonomous session): pursued +### recommendation #2 ("stop recompiling xeus-python, patch the stock +### binary at the JS level instead") to completion -- `import rclpy` and +### `from rclpy.node import Node` now both work against the genuinely +### untouched, remotely-built stock binary, with the "null function" crash +### completely absent + +The user's only instruction at this point was "I trust your judgment go for +what you think is best" -- picked recommendation #2 from the list above, on +the reasoning that it sidesteps the whole unresolved toolchain-non-determinism +question entirely rather than trying to diagnose it further. + +**Result: this worked, completely.** Bootstrapped the STOCK (never locally +recompiled) `xeus-python-0.19.0-py313he5686da_3` binary with this project's +own REAL, full 145-package ROS2 kernel environment (rclpy, rmw_zenoh_pico, +zenoh-pico, every message-type package, all locally built by this project's +own pipeline) via the real `Module.xkernel`/`notify_listener()` kernel path, +and got a real notebook cell to successfully run: +```python +import os +os.environ['RCL_LOGGING_IMPLEMENTATION'] = 'rcl_logging_noop' +os.environ['RMW_IMPLEMENTATION'] = 'rmw_zenoh_pico' +import rclpy # -> "rclpy imported OK" +from rclpy.node import Node # -> "Node imported OK" +``` +with **zero trace of the "null function"/table-corruption crash** that +consumed the entire rest of this file's investigation -- confirming, as +strongly suspected, that the crash really was specific to *locally recompiling* +xeus-python on this machine, and had nothing to do with rclpy, ROS2 packages, +or anything about this project's own recipes/patches. + +Getting there needed four small, well-understood JS-level patches applied +directly to the stock `xpython.js` (NOT a recompile -- the `.wasm` binary +itself is never touched, only its JS glue code), now packaged as a reusable, +documented script: +**`~/robot/ros2-emscripten-zenoh-demo/patches/patch_stock_xpython_js.mjs`** +(run as `node patch_stock_xpython_js.mjs `, edits +in place; read the file's own top-of-file comment for the full rationale of +each patch, condensed here): + +1. **Fake `__asyncify_state`/`__asyncify_data` globals.** rclpy's own + compiled extension (`_rclpy_pybind11...so`) is an Asyncify SIDE_MODULE + (needed elsewhere in this project for `rmw_wait`'s cooperative-polling + fix) and its wasm import table literally requires + `env.__asyncify_state`/`env.__asyncify_data` as real + `WebAssembly.Global` objects at link time (confirmed via `wasm-objdump -x` + on the .so directly: both are `i32 mutable=1`). The stock main module has + no Asyncify support at all, so these normally don't exist -- the dynamic + linker's existing `env` import Proxy (`proxyHandler` in `xpython.js`) + only auto-synthesizes *function* stubs for missing symbols, not globals, + which is exactly why the original `LinkError: ... imported mutable global + must be a WebAssembly.Global object` happened days ago in this + investigation. Patched the proxy to special-case these two symbols and + hand back real (dummy, always-zero) globals instead. **This is safe as + long as the code that would actually need to observe real Asyncify state + transitions (unwind/rewind across a real cooperative sleep, i.e. the + deep-blocking-wait path inside `rmw_wait`) is never reached** -- true for + everything tested so far (import, init, Node construction); would need + real revisiting before ever relying on genuine blocking `spin()`/`wait()` + behavior. + +2. **Hooked up the real `dlerror` wasm export**, present in the compiled + binary but never wired to `Module` by the stock build (a harmless, + narrow fix, used only for readable error messages). + +3. **Replaced the eager/bootstrap-time shared-library preload mechanism.** + The stock build's JS glue calls `Module._emscripten_dlopen_promise` for + this, which genuinely exists as a raw wasm export (confirmed via + `WebAssembly.Module.exports()`) but is not wired to `Module` either -- + and, critically, **must not be hooked up the same way `dlerror` was**: + this function internally relies on real Asyncify unwind/rewind to + suspend a C call stack across an async fetch, and actually calling it + on a non-Asyncify host causes a silent, uncatchable hard crash (proven + by trying exactly that -- the harness process just vanished mid-log, + `exit 0`, no JS exception at all). Instead, replaced the whole preload + loop to go through the SAFE, already-correct + `Module.loadDynamicLibrary()` JS function (used natively by this stock + build for lazy/on-demand dlopen, which already worked correctly for + `_rclpy_pybind11.so` and `libmicrocdr.so` before this patch even + existed) -- with two refinements found empirically: + - Libraries `libraryType()` classifies as `"local"` (Python + C-extensions, e.g. any `*.cpython-313-wasm32-emscripten.so`) are + skipped during eager preload entirely: `loadDynamicLibrary` needs a + `localScope` object to receive a local library's exports into, which + the generic per-package preload loop has no way to provide -- routing + these through it anyway silently discards their exports, leaving a + stale, symbol-less cache entry that later breaks Python's own + (separately-working) lazy import of the exact same file with + `ImportError: dynamic module does not define module export function + (PyInit_..)`. + - Libraries classified `"global"` are retried across multiple passes + (`Module._retryFailedEagerPreloads`, added by the same patch): ROS2's + typesupport/introspection C++ libraries have circular/cross-package + template-instantiation dependencies (e.g. `geometry_msgs`'s + introspection lib needs `builtin_interfaces`'s `Time_<...>` template + instantiation, `unique_identifier_msgs`'s for `rclpy` itself, etc.) + and are discovered in arbitrary file-tree order per package, not true + dependency order -- a single top-to-bottom pass leaves ~10-12 of ~150 + libraries unresolved; repeated passes (the harness calls this with + `maxPasses=6`) converge to zero failures every time tested. + +4. **Extended `readBinary`'s synchronous fallback with a bounded recursive + virtual-filesystem search** (layered on top of whatever Node-specific + readAsync/readBinary shim the deployment already needs -- real browsers + never need this, since they support synchronous XHR natively for this + exact code path). Needed because some locally-built conda packages (e.g. + `microcdr`) keep their own versioned top-level directory in the extracted + tarball (`/microcdr-2.0.2/lib/libmicrocdr.so.2.0.2`) instead of being + flattened to a standard `$PREFIX` layout (`/lib/libmicrocdr.so.2.0.2`) -- + `loadDynamicLibrary`'s lazy-fetch fallback for a not-yet-preloaded + dependency doesn't know to look there. Not included in the checked-in + script (kept as a documented snippet here) since it's Node-harness/test + -specific plumbing, not part of the actual browser deployment fix. + +**New, separate, much narrower next blocker**: `rclpy.init()` (with or +without `signal_handler_options=SignalHandlerOptions.NO`, tried both) now +fails with `thread constructor failed: Resource temporarily unavailable` -- +confirmed via `strings` on `_rclpy_pybind11...so` directly that this exact +message and a `pthread_create` reference are baked into **rclpy's own +compiled extension itself**, not zenoh-pico (already correctly built with +`Z_FEATURE_MULTI_THREAD=0`, confirmed by grepping +`extra_recipes/zenoh-pico/build.sh`) or rcl/rmw. This is a real +`std::thread` construction attempt inside `_rclpy_pybind11`'s own C++ code +(most likely something like a graph-change-listener or wait-set +implementation detail -- not yet identified precisely) failing because this +build has no real pthreads support at all, matching this whole project's +original, deliberate architectural choice (see this file's very first +section: pthreads were dropped project-wide in favor of Asyncify-based +cooperative polling). **This is a new, well-scoped, narrow follow-up task** +squarely in this project's own existing pattern of work (c.f. the already +-existing `ros2-emscripten-zenoh-demo/patches/rclpy-node-rmw_zenoh_pico-workarounds.patch`, +a Python-source patch to `rclpy/node.py` that already disables one other +problematic default, `TypeDescriptionService`) -- NOT a continuation of the +Emscripten-toolchain mystery this file spent all night chasing. **Root cause pinned down precisely** (fetched rclpy's actual upstream source +via `gh api repos/ros2/rclpy/contents/rclpy/src/rclpy/signal_handler.cpp`): +`setup_deferred_signal_handler()` (rclpy's C++ `signal_handler.cpp`, +~line 118) unconditionally does +`g_deferred_signal_handling_thread = std::thread([]{ ... });` -- a real +background thread whose job is to `sem_wait()`/block waiting for a +deferred-signal semaphore to be posted from an actual OS signal handler +(SIGINT/SIGTERM), then trigger guard conditions and call +`rclpy::shutdown_contexts()`. Critically, **this thread gets created +regardless of the `signal_handler_options` value passed to `rclpy.init()`**: +`install_signal_handlers(SignalHandlerOptions options)` (~line 582) calls +`setup_deferred_signal_handler()` unconditionally as its very first +statement, and only the SUBSEQUENT `switch(options)` decides which actual +POSIX signals get hooked to notify it -- `SignalHandlerOptions::No` skips +installing any signal, but never skips spawning the background thread that +would have served them. This is exactly why passing +`signal_handler_options=rclpy.signals.SignalHandlerOptions.NO` (tried +explicitly, tested above) made no difference at all. + +There is no existing Python- or C++-level API to skip this entirely -- +fixing it needs a real source patch to `signal_handler.cpp` itself, in the +same spirit as this project's existing +`ros2-emscripten-zenoh-demo/patches/rclpy-node-rmw_zenoh_pico-workarounds.patch` +(which already disables one other problematic rclpy default, +`TypeDescriptionService`, at the Python level) and as `extra_recipes/zenoh-pico`'s +own `#if Z_FEATURE_MULTI_THREAD==0` conditional-compilation pattern for the +exact same class of problem one layer down the stack. The natural fix: guard +`setup_deferred_signal_handler()`'s body (or the whole function) with +`#if !defined(__EMSCRIPTEN__)` (or a narrower "no real OS signals ever reach +a wasm binary in a browser tab, so this entire subsystem is meaningless +here" argument) so it becomes a no-op on this target, matching how the rest +of this project already treats real OS-level concurrency primitives as +simply unavailable/unnecessary in this environment. This DOES need a real +recompile of `ros2-rclpy` -- but unlike xeus-python, there is currently no +evidence rclpy's own compile is affected by tonight's mysterious +non-determinism (every crash chased all night was specifically about +xeus-python's own compiled output; rclpy's compiled `.so` has behaved +consistently and correctly throughout every test in this file), so a normal +local rebuild of just this one package should be safe. + +### BREAKTHROUGH 2026-09-13 (continued, next session): the `signal_handler.cpp` +### patch was written, built, and deployed -- `rclpy.init()` now succeeds -- +### and this uncovered the TRUE remaining limit of the "patch the stock +### binary" strategy: a real, unavoidable Asyncify requirement in +### Emscripten's own socket layer, not a bug + +User said "Continue, remember to bump the build number." Wrote the patch +exactly as planned above: guarded `setup_deferred_signal_handler()`/ +`teardown_deferred_signal_handler()` (in +`~/robot/ros-rolling-emscripten-zenoh/patch/ros-rolling-rclpy.emscripten.patch`, +appended as a third hunk to the existing patch) with `#if defined(__EMSCRIPTEN__)` +to make both complete no-ops on this target. Verified against a pristine +checkout of the exact pinned source (`git show +release/rolling/rclpy/11.0.3-1:src/rclpy/signal_handler.cpp`, from the +already-cached `output/src_cache/rclpy-release.git`) before touching anything +real. Bumped the build number the RIGHT way for a vinca-generated recipe +(NOT by hand-editing `recipes/ros2-rclpy/recipe.yaml`, which is +machine-generated and gets wiped by `pixi run generate-recipes-emscripten`) -- +vinca reads a real per-package override from +`~/robot/ros-rolling-emscripten-zenoh/pkg_additional_info.yaml` +(`get_pkg_build_number()` in `vinca/vinca/utils.py`, backed by +`configuration.py`'s load of `pkg_additional_info.yaml`), which already had an +`rclpy: {build_number: 26}` entry from an earlier pthreads-era bump -- bumped +to 27, then regenerated (`pixi run generate-recipes-emscripten`, safe: `recipes/` +is gitignored and fully machine-generated). Verified via this project's own +`check_patches_clean_apply.py --recipe ros2-rclpy` before doing a real build. + +First real build attempt failed at CMake CONFIGURE time (`Could not find ROS +middleware implementation 'rmw_wasm_cpp'`) -- unrelated to the patch; +`build_ament_cmake.sh`'s generic vinca template defaults +`RMW_IMPLEMENTATION` to `${VINCA_EMSCRIPTEN_RMW_IMPLEMENTATION:-rmw_wasm_cpp}`, +and invoking `rattler-build` directly on a single recipe (rather than through +`pixi run build-emscripten`) skips the env vars that task's own `[activation]` +section sets. Found the right values in `pixi.toml`'s activation env +(`VINCA_EMSCRIPTEN_RMW_IMPLEMENTATION=rmw_zenoh_pico`, +`VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_C=rosidl_typesupport_microxrcedds_c`, +`VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_CPP=rosidl_typesupport_microxrcedds_cpp`), +exported them, and the real build succeeded: +`ros2-rclpy-11.0.3-np2py313hbace3f5_27.tar.bz2`. (Side note: the solver picked +zenoh-pico 1.10.1 from the remote channel this time rather than matching the +deployed environment's own locally-built 1.7.0 -- believed harmless since +rclpy only calls the generic `rmw_*` C API, never zenoh-pico directly; not +yet an issue in testing below, but worth remembering if anything zenoh +-version-sensitive ever misbehaves.) + +**Validated the fix directly**: re-ran the same stock-xpython.js + +`patch_stock_xpython_js.mjs` harness from earlier, this time with the new +`ros2-rclpy` build substituted in for the old one (swapped via the same +"edit one `empack_env_meta.json` package entry, serve from a small merged +tarball directory" technique used earlier for the `python`/`pyjs-rt` control +tests) and using the PLAIN `rclpy.init(args=[])` call (no +`signal_handler_options` override needed this time). **Result: `rclpy +imported OK`, `Node imported OK`, and -- for the first time all +session -- `rclpy.init() OK`** with zero trace of the `std::thread` +crash. The patch works exactly as intended. + +**New finding, right at the next line (`Node(...)` construction)**: hit +`TypeError: peer.socket.on is not a function` inside Emscripten's own +Node.js WebSocket `SOCKFS.websocket_sock_ops` glue -- a Node-test-harness +-only gap (this build's socket code just references the ambient `WebSocket` +global directly with no `ENVIRONMENT_IS_NODE`-specific handling of its own; +Node 24's *native* global `WebSocket` exists but is browser-style +(`addEventListener`), while this code expects the `ws` npm package's +EventEmitter-style (`.on(...)`) API -- irrelevant for the real deployment, +since real browsers only ever have the browser-style WebSocket this code +is actually written for). Fixed for **testing purposes only** by installing +`ws` (`npm install ws` inside +`~/robot/ros2-emscripten-zenoh-demo/scratch/rclpy_on_stock/`) and setting +`globalThis.WebSocket = (await import('ws')).default` at the top of the +harness before instantiating the module. + +**With that Node-only shim in place, hit the TRUE remaining limit**: +``` +Please compile your program with async support in order to use asynchronous +operations like emscripten_sleep +``` +This is thrown from deep inside Emscripten's own socket-emulation layer +during the real POSIX `connect()` syscall emulation (`___syscall_connect` in +the earlier stack trace) -- **this is a genuine, documented Emscripten +requirement, not a bug in any of this session's patches or in zenoh-pico's +own application-level code**: Emscripten's userspace-socket support +implements a *blocking* `connect()` (as C code expects) by internally +suspending execution until the underlying WebSocket's `open` event fires, +which requires REAL Asyncify support (genuine unwind/rewind across the +suspended C call stack) -- not just the linker-satisfying dummy +`__asyncify_state`/`__asyncify_data` globals this session's +`patch_stock_xpython_js.mjs` supplies. Node()'s constructor sets up a real +zenoh-pico session, which needs to actually open a WebSocket connection to +a router -- there is no way around hitting this specific code path for any +demo that does real pub/sub, unlike everything tested successfully up to +this point (import, init, Node construction itself all complete without +ever needing a real blocking socket operation). + +**This is the natural, previously-anticipated limit of the whole "patch the +stock binary instead of recompiling" strategy** (explicitly flagged as a +caveat when the `__asyncify_state` stub was first introduced: "safe as long +as the code that would actually need to observe real Asyncify state +transitions... is never reached... would need real revisiting before ever +relying on genuine blocking spin()/wait() behavior") -- we now know exactly +where that boundary is (real Asyncify is needed as soon as a genuine +blocking socket `connect()`/read happens, i.e. as soon as a Node actually +talks to a zenoh router), and it is NOT one that a JS-level patch can work +around: this specific need is baked into Emscripten's own C-runtime/socket +implementation, not into any Python or ROS2 code this project controls. +Getting a real, working zenoh connection therefore requires xpython's own +MAIN_MODULE to have genuine, functioning Asyncify support -- which loops +back to the still-unsolved core mystery from earlier this session (every +local recompile of xeus-python, Asyncify-enabled or not, hits the "null +function"/table-corruption bug; only the untouched, remotely-built stock +binary is known to work, and it has no Asyncify at all). + +**Where this actually leaves the project**: this is genuine, substantial, +validated progress -- `import rclpy`, `rclpy.init()`, and `Node()` +construction (right up to, but not including, opening its zenoh session's +network connection) all work end-to-end against the real, deployed package +set, with zero xeus-python recompilation and a real, upstream-quality rclpy +source patch. The remaining gap is precisely bounded: making a genuine +network-connected ROS2 demo work in this browser/JupyterLite target +requires SOMETHING to provide working Asyncify semantics in xpython's own +MAIN_MODULE (recompiling xeus-python locally still hits the unresolved +non-determinism from earlier this session; that mystery was never solved, +only avoided). Concrete options for a future session, in rough order of +promise: (1) revisit the toolchain-non-determinism angle now that there's a +SPECIFIC, concrete payoff for solving it (a full working pub/sub demo, not +just avoiding a crash) -- e.g. try building on a different machine/fresh +container to see if the crash is truly machine-specific; (2) investigate +whether zenoh-pico's OWN emscripten WS transport (`_z_ws_emscripten_read` +et al., see this file's very first section) could be changed to avoid the +libc-level blocking `connect()`/read path entirely -- e.g. a non-blocking +connect + manual readiness poll driven from JS/Python, sidestepping +Emscripten's own Asyncify-dependent socket emulation layer altogether, +matching the "cooperative polling from application code" approach already +used for zenoh-pico's ongoing read loop; (3) accept partial functionality +(rclpy usable for everything that doesn't need a live network session -- +message type introspection, offline testing, local-only demos) as a +reasonable interim milestone while (1) or (2) are pursued. + +**Housekeeping note**: partway through this session the user corrected the +use of `/private/tmp/.../scratchpad` for test harnesses and merged +`kernel_packages` copies ("stop using these temporary checkouts... keep +everything in the robot directory") -- all Node.js test harnesses and +patch-validation scratch work now live under +`~/robot/ros2-emscripten-zenoh-demo/scratch/` (gitignored, added to that +repo's own `.gitignore`), not under `/tmp` or the session scratchpad. See +[[feedback_scratch_work_placement]] (memory) for the durable version of this +guidance. + +**How to reproduce/continue from here**: see +`~/robot/ros2-emscripten-zenoh-demo/patches/patch_stock_xpython_js.mjs`'s own +header comment for the exact patch mechanics. To re-run the validating test: +copy a stock `xpython.js`/`.wasm` (e.g. from a fresh `jupyter lite build` +with a plain `xeus-python` environment, or extract them from the +`emscripten-forge-4x` channel's own published `xeus-python-0.19.0` package), +run the patch script on the `.js` file, layer a Node +readAsync/readBinary shim on top (base URL pointing at this project's real +`jupyterlite-content/_output/xeus/demo_env/` server) plus the FS-search +`readBinary` extension from point 4 above, then drive it exactly like every +other harness in this file (`Module.xkernel()` -> `.start()` -> +`server.notify_listener()` with a real `execute_request` running the CELL1 +content shown above). For a real browser deployment (not just this Node +test harness), the equivalent integration point would be +`jupyterlite-xeus`'s own build/bundling step -- swap in the stock +`xeus-python` conda package instead of this project's own locally-rebuilt +one, and apply `patch_stock_xpython_js.mjs` to its `xpython.js` as a +post-processing step before publishing to `jupyterlite-content`. Not yet +wired into the real `demo_env_build`/`jupyterlite-content` pipeline -- +that's the natural next integration task once the remaining `std::thread` +issue is also resolved (no point rewiring the deploy pipeline for a binary +that still can't complete `rclpy.init()`). + +**How to reproduce/continue this test**: +- Vanilla harness: `/tmp/vanilla_jupyterlite_test` (port 8879, `jupyter + lite build --XeusAddon.environment_file=environment.yml`, pure + xeus-python+numpy, no local patches) + a Node harness copying + `_output/xeus/xeus-python-kernel/bin/{xpython.js,xpython.wasm}`, + patching the Node `readAsync`/`readBinary` shim to point at + `http://127.0.0.1:8879/xeus/xeus-python-kernel/`, and calling + `Module.xkernel()`/`.start()`/`server.notify_listener()` directly + (see any of this session's `test_real_kernel*.mjs` harnesses for the + exact pattern -- construct `execute_request` messages, stub + `self.postMessage`/`self.get_stdin`). +- ROS-build harness: same pattern, `xpython.js`/`.wasm` copied from + `~/robot/ros2-emscripten-zenoh-demo/jupyterlite-content/_output/xeus/demo_env/` + (served on port 8880 by `site/_serve_local.py`), trimmed + `empack_env_meta.json` (strip `packages` entries whose `name` starts + with `ros2-`) served from a throwaway `python3 -m http.server` on a free + port, `package_tarballs_root_url` left pointing at the real build's own + `kernel_packages/` (tarball filenames are unaffected by the trim). + +## BREAKTHROUGH 2026-09-13 (cont'd) -- pybind11 pin CONFIRMED not the (sole) +remaining blocker; NEW root cause isolated to CPython's own `_PyEM_Trampo- +lineCall_JavaScript` mechanism vs. real-Asyncify synchronous `dlopen()` + +Context: after the `pybind11 <3` pin (see the "ROOT CAUSE FOUND 2026-09-13" +section above, and `extra_recipes/xeus-python/recipe.yaml`'s own comment) +fixed the "null function or function signature mismatch" crash for +xeus-python itself, the same pin was applied to `ros2-rclpy` (whose own +`_rclpy_pybind11...so` also links pybind11 unpinned by default) via a +scratch test package `ros2-rclpy-pybind11pin-test` (built locally on this +Mac, `pkg_additional_info.yaml`'s rclpy entry not yet bumped since this +was a throwaway "-test"-suffixed package name, see +`scratch_test_recipes/ros2-rclpy-pybind11pin/recipe.yaml`). Verified via +`strings ... | grep pybind11_internals`: unpinned build 27 uses +`__pybind11_internals_v12_system_libcpp_abi2__` (pybind11 3.x's newer +internals layout); the pinned test build uses +`__pybind11_internals_v5_clang_libcpp_cxxabi1002__` (matches xeus-python's +own now-pinned pybind11 2.13.x) -- so the pin genuinely took effect. + +Swapped into the real, fully-fixed xeus-python build 104 test harness +(`~/robot/ros2-emscripten-zenoh-demo/scratch/real_xeuspython_v3/`) and +re-ran the full `import rclpy` CELL1 test: **the `RuntimeError: unreachable` +trap during CELL1, with zero Python output before the crash, was +COMPLETELY UNCHANGED** -- the pybind11 pin for rclpy has no effect on this +specific crash. This means the two pybind11 pins are both independently +correct/necessary (matching ABIs is still the right fix for what it fixes), +but they were never the cause of *this* crash. + +**Isolating the real cause** (bisection harness: +`scratch/real_xeuspython_v3/test_rclpy_bisect.mjs`, sends one Python +statement per `execute_request` cell with an explicit +`sys.stdout.flush()` after every print, and installs +`process.on('unhandledRejection'/'uncaughtException', ...)` handlers that +log-and-continue instead of letting Node hard-crash, so subsequent cells +can still run and the harness doesn't need to guess where output was +merely buffered): + +1. The crash is not "no output at all" -- CPython's stdout is genuinely + block-buffered under wasm even mid-statement; the real xeus iopub + `stream` messages (`self.postMessage`) are the reliable place to check + for printed output, not the harness's own low-level `Module.print` + hookup (which is NOT what carries Python's `print()` output in this + build -- that goes through xeus's own C++-side stdout capture / + iopub streaming instead). Always check `[kernel->frontend]` / + `msg_type":"stream"` lines, not `[stdout]` lines, when debugging cell + output in this harness family from now on. +2. Splitting `import rclpy` into a standalone cell, THEN into an even + more minimal reproduction (`import ctypes; h = + ctypes.CDLL('/lib/python3.13/site-packages/rclpy/_rclpy_pybind11...so')`) + confirmed the trap is specifically at the `dlopen()` call itself (via + ctypes, which uses the exact same libc `dlopen()` CPython's own + extension-module import machinery uses) -- not at any later pybind11 + method-call/runtime-ABI issue, since we never get that far. +3. Ruled out "missing shared library on the search path" as the cause: + built a full `needed_dynlibs` list from the target `.so`'s own + `dylink.0` custom section (`wasm-objdump -x | grep -A80 + needed_dynlibs`, 71 entries for `_rclpy_pybind11...so`) and diffed + against a full (unfiltered -- watch for `.endsWith('.so')` filter bugs + dropping versioned `.so.N.N.N` names, which produced a false-positive + "missing" result the first time around) `Module.FS.readdir('/lib')` + dump. All 71 needed libraries are present in `/lib` once the diff is + done correctly. (Along the way, noticed `microcdr`'s own conda tarball + -- built by this project's own `extra_recipes/microcdr` -- installs to + a versioned subdir `$PREFIX/microcdr-2.0.2/lib/...` instead of the flat + `$PREFIX/lib/...` every other package here uses, unlike e.g. + `browser_demo/build.sh`'s native/non-jupyter demo path which explicitly + copies `libmicrocdr.so*` into its flat output dir as a separate step. + This is a real latent packaging inconsistency worth fixing eventually + for cleanliness/robustness, but empirically confirmed NOT the cause of + this crash -- flattening it into `/lib` via a patched test tarball made + zero difference to the trap.) +4. Ruled out "the async dlopen/Asyncify-unwind machinery is fundamentally + broken in this build" -- calling `Module.loadDynamicLibrary(path, + {global:true, nodelete:true})` directly from JS (bypassing + ctypes/Python entirely) for BOTH `libmicrocdr.so` (a "global"-type + library) AND `_rclpy_pybind11...so` itself (a "local"/Python-C- + extension-type library, normally skipped by empack's eager bootstrap + preload and left for Python's own lazy import) **succeeds cleanly**. + Real Asyncify-based async dlopen genuinely works when driven from JS. +5. Pre-loading `_rclpy_pybind11...so` via the (working) JS-level + `Module.loadDynamicLibrary()` call BEFORE any Python code runs, then + trying `ctypes.CDLL()` on the SAME already-resident path from Python + afterward, **still traps identically** -- so this isn't about needing + to suspend/await a fetch at all (the library is already fully loaded + and linked by the time Python's `dlopen()` call happens); the trap + fires even for what should be a synchronous cache-hit. +6. Captured the full JS exception object (not just `.message`) via the + `unhandledRejection`/`uncaughtException` handlers above. The stack + trace's only non-wasm, symbol-named frame is: + ``` + RuntimeError: unreachable + at wasm://.../wasm-function[19026]:... + at _PyEM_TrampolineCall_JavaScript (xpython.js:...) + at wasm://.../wasm-function[17953]:... + ... + ``` + `_PyEM_TrampolineCall_JavaScript` is CPython's own Emscripten-specific + "call an arbitrary native function pointer whose signature isn't known + until runtime" trampoline mechanism (the Pyodide-style patch that lets + `ctypes` foreign-function calls -- and extension-module `PyInit_*` + entry points obtained via `dlsym` -- work despite wasm's strict + `call_indirect` signature checking). This is the SAME general + mechanism implicated in the original "null function or function + signature mismatch" mystery earlier this session (also routed through + an indirect-call/signature-dispatch path), but this is a **distinct** + crash: it happens even for `ctypes.CDLL('/lib/libmicrocdr.so')` alone + (a plain C library with zero Python/pybind11 content), so it is not + pybind11-ABI-related at all. The common thread across both bugs is + CPython-on-Emscripten's function-pointer-dispatch machinery being + fragile to *some* mismatch between how the calling host (`xpython.wasm`) + and the thing it's calling into were each built/configured. + +**Current best hypothesis (NOT yet confirmed)**: CPython's own Emscripten +patches for `ctypes`/dynamic-loading (the `_PyEM_TrampolineCall_JavaScript` +mechanism, part of `python`/`libpython`'s own build -- a stock +emscripten-forge package this project has never rebuilt or patched) may +themselves need to be Asyncify-aware/matching in a way the currently- +consumed stock `python`/`libpython` conda package isn't, mirroring this +whole session's recurring "stock package built against different +assumptions than our custom real-Asyncify host" pattern (pybind11 3.x vs +2.13.x for xeus-python/rclpy; native-wasm-exceptions vs JS-exceptions for +pyjs-dev). If so, the fix would require rebuilding `python`/`libpython` +itself for emscripten-wasm32 with Asyncify-compatible trampoline handling +-- a substantially bigger undertaking than anything touched so far this +session (CPython has never been part of this project's own recipe set; +it's always been consumed as a stock upstream package). This has NOT been +investigated yet (haven't looked at what conda channel/recipe currently +provides `python`/`libpython` for emscripten-wasm32, nor whether upstream +Pyodide/emscripten-forge has a newer or differently-configured build that +already handles this). **This is the natural next investigation step**, +but is flagged here as a scope escalation worth confirming with the user +before sinking further build time into it, since it means rebuilding a +foundational interpreter package this project has so far only ever +consumed pre-built. + +**UPDATE 2026-09-13, later same session -- hypothesis TESTED AND DISPROVEN.** +Added `--enable-wasm-dynamic-linking` to `extra_recipes/python/Makefile`'s +`./configure` invocation (confirmed via CPython's own `configure.ac` that +this flag gates `BLDSHARED`/`ac_cv_func_dlopen`/`-sMAIN_MODULE` for +Emscripten -- a real, previously-never-enabled flag, independently named +in this project's own PR history, `Tobias-Fischer/ros-rolling#46`, while +chasing the earlier pthreads-era rclpy work). Rebuilt `python` (build +102) and `xeus-python` against it (build 105, since it statically links +`libpython3.13.a`). Result: **the exact same `RuntimeError: unreachable` +trap, in the exact same place** (`_PyEM_TrampolineCall_JavaScript`, same +function-index shape) on the identical `ctypes.CDLL('/lib/libmicrocdr.so')` +repro. One real, incidental behavior change did surface: with the flag +enabled, `xpython.wasm`'s own direct dependency on `libxeus.so` now goes +through a genuine async `dlopen()`/`loadDynamicLibrary` at module-init +time (previously it apparently didn't reach this code path at all) -- +needed patching the Node test harness with a `locateFile` override +mapping `libxeus.so` -> its serve URL, and fixing this build's `xpython.js` +glue's otherwise-empty `else{}` branch for `readAsync`/`readBinary` under +Node (that glue only wires up fetch-based readAsync for +`ENVIRONMENT_IS_WEB`/`WORKER`, never for Node -- harmless for a real +browser deployment, but blocks Node-based testing of any dlopen path +that wasn't already fully resident in the FS). Neither of those changes +affected the actual crash. + +**Reconsidered from first principles**: `_PyEM_TrampolineCall_JavaScript`'s +signature (`PyCFunctionWithKeywords func, PyObject *arg1/2/3`) means it is +ONLY ever used to invoke a `PyCFunction`-shaped Python built-in/extension +method -- it is CPython's generic "call a C-implemented Python function" +dispatch, used for literally every built-in call in the interpreter (and +proven working correctly thousands of times already in every test this +session). It is NOT used to call `dlopen()` itself (a plain C function with +an unrelated signature). So the trap is not "dlopen() traps" -- it's some +specific `PyCFunction` (almost certainly inside `_ctypes`'s own C +implementation, e.g. whatever `ctypes.CDLL.__init__` calls internally to +open the library) whose function-pointer dispatch via this trampoline +fails, for reasons still unknown. `--enable-wasm-dynamic-linking` was a +reasonable, concretely-justified hypothesis (and is arguably still correct +to keep/ship regardless, since it fixed the `libxeus.so` load-time +behavior to be more correct), but it does not address whatever is actually +broken here. **Not yet re-investigated further** -- this is a natural +checkpoint to get user input again before continuing to sink build time +into blind hypotheses; see the project's memory file +([[project_emscripten_zenoh_jupyterlite]]) for the corresponding summary. + +**UPDATE 2026-09-13, still later same session -- narrowed further via a +`time.sleep()` control test, second hypothesis ALSO tested and DISPROVEN.** + +Reasoned from first principles that since `_PyEM_TrampolineCall_JavaScript` +is used for EVERY C-implemented Python function call (proven working +thousands of times already), the trap must be specific to what happens +*inside* whichever function gets dispatched at the crash site, not the +dispatch mechanism itself. Added a `time.sleep(0.05)` cell to the bisect +harness as a control: `time.sleep()`'s C implementation (`pysleep()` in +`Modules/timemodule.c`) also does a genuinely Asyncify-suspending blocking +call (`nanosleep`/`select`), dispatched through the exact same +`_PyEM_TrampolineCall_JavaScript` mechanism ctypes.CDLL() uses (confirmed +`time_sleep` is `METH_O`, `py_dl_open` is `METH_VARARGS` -- both get cast +through the same 3-arg trampoline via +`_PyCFunction_TrampolineCall`/`_PyCFunctionWithKeywords_TrampolineCall` +macros in `pycore_emscripten_trampoline.h`). **Result: `time.sleep() OK` +prints successfully** -- real Asyncify suspend/resume through the ceval +loop, through this exact trampoline mechanism, genuinely works in general. +This rules out "the trampoline/ceval loop can't be unwound by Asyncify" as +a blanket explanation. + +Also checked (via `typeof Module.PyEM_CountArgs` and +`'Function' in WebAssembly`) whether Node 24 actually uses the +type-reflection-based trampoline variant (`_PyEM_TrampolineCall_Reflection`, +a real wasm `call_indirect` Binaryen CAN statically analyze) instead of the +JS-mediated one (`_PyEM_TrampolineCall_JavaScript`, using +`wasmTable.get(func)(...)` from JS -- invisible to Binaryen's static +Asyncify call-graph analysis, since the target isn't resolved via any +wasm-level `call_indirect` instruction). **Confirmed Node 24's own +`WebAssembly` global does not expose `WebAssembly.Function`/type +reflection at all** (`'Function' in WebAssembly` is `false`), so this +build always uses the JS-mediated trampoline for both `time_sleep` and +`py_dl_open` -- ruling out "one uses a Binaryen-visible path and the other +doesn't" as the explanation, since both go through the identical +mechanism. + +Compared `time_sleep`'s and `py_dl_open`'s actual C source side by side: +`pysleep()` wraps its blocking call in +`Py_BEGIN_ALLOW_THREADS`/`Py_END_ALLOW_THREADS` (releases/reacquires the +GIL around the call); `py_dl_open()` (`Modules/_ctypes/callproc.c`) calls +`dlopen(name_str, mode)` completely bare, with no GIL release at all -- +the one concrete, real difference found between the two call sites. +Hypothesized this GIL-release/interpreter-thread-state bookkeeping might +be what a real Asyncify suspend-through-this-call-chain needs. Wrote and +shipped a real patch to test it: +`extra_recipes/python/patches/0006-ctypes-dlopen-release-gil-for-asyncify.patch` +(wraps `py_dl_open`'s `dlopen()` call in the same +`Py_BEGIN_ALLOW_THREADS`/`END` pair, matching `pysleep()`'s own pattern; +verified applies cleanly via the usual git-diff-against-pristine-source +technique). Rebuilt `python` (build 103) and `xeus-python` against it +(build 106). + +**Result: DISPROVEN again -- the exact same `RuntimeError: unreachable` +trap, at the exact same function-index shape, in the exact same place.** +GIL release around `dlopen()` has no effect on this crash either. + +**Where this leaves things**: two concrete, source-grounded hypotheses +(missing `--enable-wasm-dynamic-linking`; missing GIL release around +`dlopen()`) have now been built and tested end-to-end, and both are +conclusively ruled out. The `time.sleep()` control test is a genuinely +useful, permanent addition to this bisection harness -- it proves real +Asyncify suspend/resume through the interpreter works in general, so +whatever's wrong is specific to the `dlopen()`/`ctypes.CDLL()` call chain +itself, not a general ceval/Asyncify incompatibility. Further progress +likely needs either (a) actual low-level wasm/Binaryen debugging tools +(e.g. inspecting the Asyncify instrumentation lists that were actually +baked into this specific `xpython.wasm` build, or single-stepping the +trap in a wasm debugger) rather than reasoning from C source alone, or (b) +searching Emscripten's own issue tracker for prior reports of +"ctypes.CDLL/dlopen traps under Asyncify" specifically, since this may be +a known, documented limitation rather than something fixable via a small +CPython patch. This is a natural checkpoint -- see the project's memory +file for the corresponding summary and status going into any future +session. + +**UPDATE 2026-09-13, still later same session -- disassembled the actual +trap site, found the true shape of the bug, and CONFIRMED via upstream +sources this is a known, unresolved Emscripten/Pyodide limitation.** + +Ran `wasm-objdump -d` on the built `xpython.wasm` and located the exact +trap instruction (matching the reported byte offset precisely). The +compiled code at the trap site has this exact, repeating shape (same in +both the original METH_VARARGS build and, as it turned out, structurally +identical in spirit after the METH_FASTCALL conversion below): +``` + ... call the async-suspending function ... + global.get $__asyncify_state + i32.eqz + if + ... restore stack, return the real result ... + end + unreachable <-- the actual trap +``` +This is Binaryen's own Asyncify instrumentation pattern: "if we're back to +normal execution, return the result; this point should be unreachable +otherwise." It fires whenever the function is reached with +`__asyncify_state != 0` at exactly this point without an earlier +`br_if`-based propagation catching it first -- i.e. exactly what happens +when Asyncify's unwind/rewind bookkeeping doesn't correctly propagate +through this specific call. + +**Tested the METH_VARARGS-vs-METH_FASTCALL hypothesis for real** (the +patch from the previous update, +`patches/0007-ctypes-dlopen-methfastcall.patch`, converting +`_ctypes.dlopen()`'s calling convention): confirmed via a `strings` check +on the new `xpython.wasm` that the patch's own new error string +(`"dlopen() takes 1 or 2 arguments"`) is present, i.e. the patch really is +compiled in. Result: **the crash's exact stack trace changed** (no longer +routes through `_PyEM_TrampolineCall_JavaScript` at all -- now traps +inside `_PyObject_MakeTpCall`, called from `PyObject_Vectorcall`, called +from `_PyEval_EvalFrameDefault`), confirming the calling-convention change +genuinely took effect and changed the dispatch path -- **but the crash +itself is unchanged**: same "unreachable after an async call, no +propagation" shape, just in a different generic CPython dispatch function. +Also confirmed via a direct `_ctypes.dlopen()` call (bypassing +`ctypes.CDLL` entirely) that the trap is specifically at the `dlopen()` +call itself, not something later in `CDLL.__init__`. + +This means the bug is NOT specific to any one CPython dispatch function +(trampoline vs `MakeTpCall` vs vectorcall) -- it reproduces through +*every* generic "call a C-implemented Python function" path CPython has, +whenever that call reaches a genuinely Asyncify-suspending operation +(`dlopen()` via `__dlopen_js`/`Asyncify.handleSleep`). + +**Confirmed via web search this is a known, longstanding, unresolved +upstream limitation, not something specific to this project or fixable +via a CPython patch:** +- [emscripten-core/emscripten#13049](https://github.com/emscripten-core/emscripten/issues/13049) + ("Invalid Asyncify stack when using dlopen() with SIDE_MODULE and + asyncify imports") -- root cause described as an invalid Asyncify call + stack when combining `dlopen()` + `SIDE_MODULE`/`MAIN_MODULE` + + `ASYNCIFY` + JS library functions with asyncify imports; the *only* + documented workaround is to avoid `dlopen()` at runtime entirely (link + the library statically/as a regular callable module and use `ccall()` + instead). No fix as of the issue's content. +- [emscripten-core/emscripten#15594](https://github.com/emscripten-core/emscripten/issues/15594) + ("emscripten_sleep in side module corrupts stack") -- same family: an + Asyncify-suspending call made through a dynamically-loaded side module + doesn't correctly resume; no confirmed fix. +- [pyodide/pyodide#4087](https://github.com/pyodide/pyodide/discussions/4087) + ("Using Asyncify from C/C++ Python module") -- **this is essentially the + exact bug, reported against Pyodide's own CPython fork**: calling + `emscripten_sleep()` from inside a pybind11-based Python C extension + (i.e. through CPython's own PyCFunction call trampoline -- + `_PyCFunctionWithKeywords_TrampolineCall`/`_PyEM_TrampolineCall_JavaScript`, + the EXACT mechanism at the heart of this whole investigation) traps with + `RuntimeError: unreachable` in `$cfunction_call`. Described as a + "known limitation without a straightforward solution." **The only + workaround identified is pushing the async operation onto a real OS + thread (`std::async`)** -- i.e. genuine pthreads, which is precisely + what this whole project deliberately moved away from (see the + "MAJOR PIVOT" / pthreads-to-Asyncify sections earlier in this file) for + unrelated, equally solid reasons (pthreads' viral shared-memory + requirement blocking rclpy from loading into non-pthreads xeus-python, + and xeus-python's own thread model deadlocking under pthreads). + +**Bottom line**: this is not a bug in this project's own code, in +CPython's `_ctypes` module specifically, or in anything a source patch to +`_ctypes`/`dynload_shlib.c` can realistically fix -- it's Emscripten's +Asyncify transform itself having a fundamental, still-unresolved +incompatibility with invoking a *dynamically dlopen()'d* module (or, per +the Pyodide report, even just calling an async-suspending function through +CPython's own generic C-function-call dispatch) from inside compiled C +code, as opposed to driving the exact same `Module.loadDynamicLibrary()` +call directly from JS (which has been proven to work reliably, repeatedly, +throughout this investigation). Two concrete, well-targeted CPython +patches (`0006`, GIL release; `0007`, METH_FASTCALL conversion) were +written, built, and tested against this exact hypothesis space and both +confirm the same conclusion from different angles: the problem is at the +Emscripten/Binaryen Asyncify layer, not in how CPython calls into it. + +**Where this leaves the project**: getting `import rclpy` (which needs a +real, lazy, Python-triggered `dlopen()` of `_rclpy_pybind11.so`) to work +under a genuinely non-pthreads, real-Asyncify `xeus-python` host appears +to require one of: +1. Avoid ever triggering a C-level/Python-level `dlopen()` for Python + C-extensions at runtime at all -- i.e. statically link `rclpy`'s + compiled extension (and everything else Python would otherwise + `import`) directly into `xpython.wasm`'s own `MAIN_MODULE` at build + time, matching issue #13049's own documented workaround ("build the + library as a regular callable module... instead of dlopen()"). This is + a substantial build-system change (would mean building a CUSTOM + xeus-python binary with `_rclpy_pybind11` and its ~71 transitive `.so` + dependencies baked in directly, rather than dlopen'd at runtime) but is + the only approach with a real, working precedent (`ccall()`-style + static linking is explicitly called out as the working alternative). +2. Accept pthreads specifically for this one narrow purpose (the + `std::async`-based workaround from the Pyodide discussion) -- almost + certainly reintroduces the shared-memory viral-dependency problem this + project spent real effort eliminating project-wide, so likely a + net-negative trade unless scoped extremely narrowly (e.g. a tiny, + isolated pthread pool JUST for dlopen calls, never touching xeus-python + itself) -- unexplored, uncertain feasibility. +3. Ship the JupyterLite `rclpy` integration WITHOUT dynamic/lazy import of + its own C extension -- e.g. pre-populate ALL of rclpy's own + dependencies (including `_rclpy_pybind11.so` itself) via the + JS-level `Module.loadDynamicLibrary()` eager-preload mechanism BEFORE + Python starts, then patch CPython's/rclpy's own import machinery (or + the compiled extension's own init path) to skip the C-level `dlopen()` + call and treat the module as already-resolved -- effectively + Pyodide's own actual solution for its "load packages with compiled + extensions at runtime" feature, likely requiring Pyodide-specific + CPython patches this project doesn't currently have (not investigated + this session -- Pyodide's own micropip/`pyodide.loadPackage()` + mechanism is the natural reference implementation to study for this, + since Pyodide DOES successfully load compiled numpy/scipy-style + extensions at runtime in production under real Asyncify). + +None of these have been attempted yet. This is a natural, real +architectural decision point -- not a "keep guessing at CPython patches" +situation -- given three independent hypotheses (missing +`--enable-wasm-dynamic-linking`, missing GIL release, wrong calling +convention) have each been built, tested, and disproven, and external +sources now confirm why: this is Emscripten's own documented, unresolved +limitation, not a bug in this project's code. + +**MAJOR PIVOT 2026-09-13, still later same session -- Asyncify dropped +project-wide; back to plain stock packages + runtime dlopen().** + +User pushed back on the whole Asyncify-for-dlopen chase with the right +question: "why do we need asyncify? Can't we do without? We did it back +then [pthreads/humble era], what's different now?" This led to checking +two things that changed the whole picture: + +1. **`Tobias-Fischer/ros-humble`'s own working emscripten-wasm32 port** + (a genuinely separate, working, *published* build, "ros-humble" + channel) uses `RoboStack/vinca`'s own upstream `build_ament_cmake.sh.in` + template directly (pinned commit `b5e03d1f...`), which has + `USE_PTHREADS=0` and its own Asyncify variant **commented out** -- + confirming dlopen() of a SIDE_MODULE into a MAIN_MODULE works fine on + its own; it's specifically Asyncify combined with dlopen() that's + broken (matching emscripten-core/emscripten#13049's own title + precisely). +2. **The actual "how do you wait for a message without Asyncify" trick**, + found by digging into `ros2wasm`'s own real, published, working + JupyterLite demo (`ros2wasm/pixi-ros2-wasm`'s `RosLibJs.ipynb`, and its + own `rmw_wasm` middleware, `ros2wasm/rmw_wasm`) -- its `xpython.js` has + **no Asyncify at all** (`grep` for `__asyncify_state`: absent). The demo + never calls blocking `rclpy.spin()`; it does: + ```python + async def spin_subscriber(sub): + while running: + rclpy.spin_once(sub, timeout_sec=0) + await asyncio.sleep(0.01) + ``` + `rclpy.spin_once(..., timeout_sec=0)` triggers `rcl_wait()`'s own + `is_non_blocking` fast path (confirmed by reading `rcl`'s own + `src/rcl/wait.c`: `bool is_non_blocking = timeout == 0;`, which forces + a `{0,0}` timeout down into `rmw_wait()`) -- and **this project's own + `rmw_zenoh_pico` patch already special-cases exactly this**: its + single-threaded poll loop breaks out immediately when + `timeout_ms == 0`, *before* ever reaching the `z_sleep_ms()` call that + needs Asyncify. No zenoh/rmw patch was needed at all -- the fast path + already existed; the demo just needed to be restructured to use it. The + "keep checking periodically" cadence lives entirely in Python's own + `asyncio.sleep()`, bridged to the browser's JS event loop via `pyjs`'s + webloop -- not Asyncify. + +**Consequence**: since Asyncify was the whole reason this project ever +needed its own custom `python`/`xeus`/`xeus-lite`/`xeus-python`/`pyjs`/ +`numpy` recipes (every one of `extra_recipes/{python,xeus,xeus-lite, +xeus-python,numpy,pyjs}`'s own header comment says so explicitly, in +those exact words, once re-read with this in mind), **all of those are +now deleted**. This project now consumes stock, unmodified +`emscripten-forge-4x` packages for all of them -- confirmed via the +actually-published `xeus-python-0.19.0-py313he5686da_3`'s own +`rendered_recipe.yaml` (zero patches, bare unpinned `pybind11` that +happened to resolve `<3` at its own build time) and by downloading and +inspecting the *current* stock `pyjs-rt-4.0.6` package directly (already +has real `lib/python3.13/site-packages/pyjs/webloop.py` content -- the +"pyjs-rt ships an empty package" bug this project found and fixed +locally earlier in the marathon is now fixed upstream too, independently). + +Also **dropped `-sASYNCIFY`/`ASYNCIFY_IMPORTS`/`ASYNCIFY_STACK_SIZE` +entirely from `vinca`'s own `build_ament_cmake.sh.in` template** +(`~/robot/vinca`, this project's fork) -- it was applied globally to +*every* emscripten-wasm32 ROS package (not just rclpy-adjacent ones), so +this affects the whole ~230-package closure, including `browser_demo`'s +own rclc/rclcpp C++ demo, which still uses a real blocking +`rclcpp::spin()`/`rclc_executor_spin()` today. User explicitly chose (over +keeping two build variants) to unify on no-Asyncify everywhere: this means +`browser_demo`'s own C++ demo will need restructuring too, to the same +"non-blocking `spin_some`/poll-once + externally-driven tick" pattern (a +JS-side `setInterval`-equivalent calling a small exported tick function, +analogous to Python's `asyncio.sleep()` loop) -- **not yet done, tracked as +a follow-up** once the Python/JupyterLite side is confirmed working. +`pixi.toml`'s own `vinca` dependency is temporarily pointed at a local +path (`../vinca`, editable) for fast iteration while this settles -- +remember to re-pin to a pushed commit once it does. + +Rebuilding now: identified and deleted the specific ~40 stale +Asyncify-built artifacts in `output/emscripten-wasm32/` that are part of +rclpy's own transitive `.so` closure (matched by scanning each existing +`.tar.bz2`'s file list against the previously-computed 77-file closure -- +see the "disassembled the actual trap site" section above for how that +list was built), then kicked off the project's own standard +`pixi run build-emscripten` to rebuild exactly those (everything +unaffected gets skipped via rattler-build's own existing-package check). + +**Reproduction**: `~/robot/ros2-emscripten-zenoh-demo/scratch/real_xeuspython_v3/test_rclpy_bisect.mjs` +against the real build-104 `xpython.js`/`.wasm` (patched in that same +scratch dir with the `_dlerror` JS hookup from +`patches/patch_stock_xpython_js.mjs`'s "hook-up-dlerror-export" patch, +otherwise unmodified -- that hookup is itself a separate, confirmed-real +gap in build 104's JS glue: `Module["_dlerror"]` is never wired to the +compiled wasm export, so any exception path that tries to report a real +`dlopen()` failure via `dlerror()` throws `TypeError: Module._dlerror is +not a function` and masks the original error -- worth fixing upstream in +`extra_recipes/xeus-python`'s own patch too, independent of this +trampoline investigation). + ## Practical triage order 1. Build a failing package directly. @@ -230,3 +2810,791 @@ For full rebuilds also remember: 4. Rebuild same package. 5. Move on immediately if it becomes complex; prioritize easy wins. 6. Revisit hard failures after reducing the failure queue. + +## UPDATE 2026-09-13, later same session -- rclpy.init() OK end-to-end; Node() creation blocked on a NEW, deeper Asyncify-shaped hole (zenoh session-open handshake) + +Picking back up after the "MAJOR PIVOT" above: rebuilt `rmw_zenoh_pico` +(build 27) with a real fix for the `ament_target_dependencies()` CMake +shim (this project's own patch macro never actually called +`target_link_libraries()` for `zenohpico` because its modern +`Config.cmake` only exports the namespaced imported target +`zenohpico::zenohpico_shared`, no legacy `zenohpico_LIBRARIES` var -- +added an `elseif(TARGET ${_dep}::${_dep}_shared)` fallback branch). +Confirmed via `wasm-objdump -x librmw_zenoh_pico.so | grep needed_dynlibs` +that `libzenohpico.so` is now correctly declared, fixing the +`cannot resolve symbol z_malloc` crash. + +Also fixed, all in `scratch/noasyncify_test/xpython.js` (hand-patched +copy of the *stock*, unmodified emscripten-forge `xeus-python` JS glue -- +these are test-harness-local patches, not yet upstreamed anywhere, kept +here purely to unblock iteration): +- Node harness: `readBinary`/`readAsync`'s Node-only `else` branch only + tried the literal dlopen path (e.g. bare `librcl_logging_noop.so`), + never `/lib/` -- added that fallback so a bare-name runtime + `dlopen()` (as done by `rcutils_shared_library_load` for + `RCL_LOGGING_IMPLEMENTATION`) can find a file bootstrap already + extracted into FS. +- **Real browser** (not just the Node harness) has the exact same class + of bug, worse: stock Emscripten's main-thread (non-Worker) browser + build **never defines `readBinary` at all** (there is no way to + block-wait on a real fetch from the main thread without Asyncify). + Added a `readBinary` for that branch too, checking the in-memory FS + cache (literal path, then `/lib/`) -- since + `bootstrap_from_empack_packed_environment` already extracted every + package into MEMFS up front, this needs no real I/O and works + synchronously on the main thread. +- `loadDynlibsFromPackage` (empack's bulk per-package dylib eager-preload + helper) calls `Module._emscripten_dlopen_promise`, which this stock + build's JS glue never actually binds onto `Module` (confirmed via + `wasm-objdump`: `emscripten_dlopen_promise` *is* a real wasm export, + but no `Module._emscripten_dlopen_promise = ...` assignment exists + anywhere in `xpython.js` -- this bulk-preload feature appears to + require JSPI, which this build wasn't compiled with). Made this + function a no-op: regular Python-import-triggered `dlopen()` (the + plain sync path) already works correctly and is all that's actually + needed -- confirmed by testing `import rclpy` and friends fully + succeed with this preload step skipped entirely. +- Root-caused the "WebSocket connection to 'ws://127.0.0.1:7447/' failed" + (browser devtools shows code 1006, immediate abnormal close): + Emscripten's *stock* SOCKFS `websocket_sock_ops.createPeer()` defaults + to requesting the `"binary"` WebSocket subprotocol + (`SOCKFS.websocketArgs`, sourced from `Module["websocket"]` at FS-mount + time) -- meant for Emscripten's own websockify-style TCP-over-WS relay, + not a generic WS server. `zenohd`'s own `-l ws/...` listener doesn't + support it and the handshake is rejected outright. Fix: pass + `websocket: { subprotocol: null }` in the `Module` config object passed + to `createXeusModule({...})` -- this is a real, standard, documented + Emscripten networking config knob, not a source patch. Confirmed via a + manual `new WebSocket('ws://127.0.0.1:7447/')` (no protocols) opening + fine, vs the same call with `['binary']` failing with code 1006. + +With all of the above applied, `rclpy imported OK` / `Node class imported +OK` / **`rclpy.init() OK`** now print successfully end-to-end, in both the +Node test harness (`scratch/noasyncify_test/test_rclpy_noasyncify.mjs`) +and a new real-browser test page +(`scratch/noasyncify_test/browser_test.html`, driven via the +Claude-Code-in-desktop Browser pane tool against the same +`merged_kernel_packages`/`empack_env_meta_patched.json` served over +`python -m http.server`). **This is real progress the browser side alone +would never have surfaced without the Node harness's much faster iteration +loop -- keep using the Node harness first, browser only to confirm/root- +cause things that are Node-harness-specific (see below) or genuinely +browser-only.** + +**The Node.js test harness's own "async hook stack has become corrupted" +crash (seen repeatedly, always right around `Node()` construction) is +confirmed to be a pure Node.js-harness artifact, NOT a real bug**: the +identical `Node()`-construction failure reproduces in the real browser +(via `browser_test.html`) as a normal, non-fatal `RuntimeWarning` +(`Failed to fini node: guard_condition argument is null`) with no crash +at all. `async_hooks` doesn't exist in browsers, so this specific crash +class cannot occur there. Lesson: when the Node harness crashes +mysteriously around exception/traceback-heavy code paths, don't chase it +further in Node -- switch to the real browser (cheap via the Browser pane +tool) to see the *actual* underlying behavior. + +### THE CURRENT BLOCKER: `Node()` construction never completes -- zenoh +### session/link *establishment* still silently depends on Asyncify + +After `rclpy.init() OK`, `node = Node('wasm_rclpy_jupyter', ...)` never +prints `Node created: ...` -- it fails inside `_rclpy.Node(...)` +construction, producing a cascade of secondary rcutils errors (each +overwriting the last, so the *original* root cause is never shown): +`'map is not initialized'` (hash_map.c) -> `'Unable to fini type cache +for node.'` (rcl/node.c:362) -> `'node argument is null'` +(rmw_zenoh_pico's rmw_node.c:271, i.e. `rmw_destroy_node()` being handed +a NULL node because `rmw_create_node()` upstream of it returned NULL) -> +`'guard_condition argument is null'` (rcl/guard_condition.c:120). No +Python-level traceback or `execute_reply` error message is ever produced +for CELL1 -- it just silently never finishes. + +Root-caused via `zenohd`'s own debug log (`RUST_LOG=debug`, see +`~/robot/ros-rolling-emscripten-zenoh/zenoh_router/`, a locally-running +test-only `zenohd -l ws/127.0.0.1:7447 ... -P storage_manager` fixture -- +there's no config issue with it, its REST admin space at +`http://127.0.0.1:8000/@/**` is a handy way to check `sessions: []` / +`subscriber/**` live state going forward): + +``` +09:01:34.880170 zenoh_link_ws::unicast: Accepted TCP (WebSocket) connection on 127.0.0.1:7447: ... +09:01:34.880383 tungstenite::handshake::server: Server handshake done. +09:01:44.883652 zenoh_transport::unicast::manager: Failed to accept link before deadline (10000ms) +``` + +The raw WebSocket **transport** opens fine (confirmed independently: a +manual `new WebSocket('ws://127.0.0.1:7447/')` from the same browser tab +opens immediately). But **zenohd never receives a single byte of the +actual zenoh protocol handshake** (Init/Open messages) in the full +10-second `accept_timeout` window -- our wasm client's WS transport opens, +and then nothing is ever sent. + +**Root cause, confirmed by reading zenoh-pico's own source +(`src/system/emscripten/system.c`)**: + +```c +z_result_t z_sleep_us(size_t time) { emscripten_sleep((time/1000)+...); return 0; } +z_result_t z_sleep_ms(size_t time) { emscripten_sleep(time); return 0; } +``` + +`z_sleep_ms()`/`z_sleep_us()` on the emscripten platform port are +implemented via **`emscripten_sleep()`, which is itself an Asyncify-only +primitive** -- it requires the Binaryen Asyncify transform to actually +suspend/resume the wasm call stack while yielding control back to the +browser's event loop. Now that Asyncify has been dropped project-wide +(the whole point of the "MAJOR PIVOT" above), `emscripten_sleep()` can no +longer do what it used to: it does *not* genuinely yield, so nothing ever +gives the browser's own event loop a turn to actually finish the +WebSocket handshake / deliver queued send-buffer flushes before the +calling C code barrels on and tries to write the zenoh Init message -- +onto a socket that, from the JS side, may still be in `CONNECTING` state. +There's already a prior-session patch +(`extra_recipes/zenoh-pico/emscripten-longer-ws-open-wait.patch`) that +bumped this exact call site's delay from 100ms to 2000ms -- that fix only +ever worked because Asyncify was still enabled at the time it was +written; it is now silently a no-op (or near-no-op) and needs to be +revisited. + +**Why this can't be patched the same lightweight way as `rmw_wait`'s +`timeout_ms==0` fast path**: `rmw_wait()`'s fast path works because a +*zero* timeout genuinely means "one single non-blocking poll, then +return" -- no waiting is semantically required at all. Session/link/node +*establishment*, by contrast, inherently requires waiting for a real +network round-trip (the browser must complete the WS handshake, then the +Init/OpenAck exchange with the router) before it can succeed -- there is +no zero-timeout fast path available for it, because the work hasn't +happened yet, period. And a synchronous busy-spin (checking +`readyState`/re-attempting `recv()` in a tight C loop with no real delay) +categorically cannot substitute for real waiting, because a JS +macrotask (which is what a WebSocket `open`/`message` event is) can only +run once the JS call stack has *actually returned* to the browser's own +event-loop dispatcher -- there is no way to reenter/pump it from inside a +still-running synchronous WASM call, with or without an artificial delay, +short of Asyncify, JSPI (WebAssembly Promise Integration -- unavailable: +already confirmed in this exact build, `Module._emscripten_dlopen_promise` +is a dead, unwired export, meaning this build has no working JSPI-driven +async primitive at all), or a real OS thread (pthreads/Workers -- already +tried project-wide earlier in the marathon and reverted, both for the +Asyncify+dlopen SIDE_MODULE crash *and*, independently, because +xeus-python's own thread model deadlocked hard under real pthreads). +Re-adding Asyncify **only** to zenoh-pico/rmw_zenoh_pico's own `.so` +files would not help either: Asyncify's unwind/rewind mechanism needs +*every* frame between the suspend point and the original Python-level +entry point instrumented consistently, and that unwind path necessarily +crosses back up through several OTHER separately-`dlopen()`'d +SIDE_MODULEs (`_rclpy_pybind11.so`, `librcl.so`, ...) that would need +Asyncify too -- i.e. it reduces right back to the exact Asyncify+dlopen +combination this whole pivot exists to avoid. + +**The only architecturally-consistent fix**: restructure zenoh-pico's +session/transport-*open* handshake (not just the already-fixed +read/wait side) into an explicit, externally-driven, resumable state +machine -- mirroring the *pattern* already proven for `rmw_wait`, but a +meaningfully bigger lift because (unlike `rmw_wait`) there is no existing +non-blocking code path to route through; one has to be built: +1. `_z_open_ws()` (network.c) needs to stop trying to wait for the + socket to reach `OPEN` internally at all -- issue `connect()`, check + `readyState` once, and return a "not yet, call me again" status + immediately if it isn't open, rather than sleeping. +2. Whatever sends the zenoh Init message and awaits InitAck/OpenAck + (deeper in zenoh-pico's `src/transport/unicast/...` session-open + sequence) needs the same treatment: attempt one non-blocking + send/recv step per call, track progress across calls in a persistent + state struct, and return "still connecting" vs "established" vs + "failed" rather than blocking to completion. +3. `rmw_init()` (rmw_zenoh_pico) needs to expose this as something + retriable rather than a single one-shot blocking call -- likely a new + low-level "pump the connection" entry point that Python-level code + calls repeatedly inside an `await asyncio.sleep(...)` loop, the same + shape as the already-working `spin_subscriber()`/`spin_once(timeout_sec=0)` + pattern in CELL2 -- meaning `rclpy.init()` itself may need to become + async-retriable at the Python level too (not a trivial, purely-C-side + fix). + +This is a materially bigger undertaking than everything fixed so far in +this pivot (all of which were narrowly-scoped, single-symptom patches). +Paused here to discuss direction with the user before investing in it, +per this project's standing "confirm before large architecture +decisions" pattern (matches how the original Asyncify-removal pivot +itself started from the user's own question rather than an autonomous +guess). + +**Test fixtures now in place, reusable for whatever comes next**: +- `~/robot/ros-rolling-emscripten-zenoh/zenoh_router/zenohd` -- run with + `RUST_LOG=debug` and `> /tmp/zenohd_debug.log 2>&1 &` to see exactly + what the router observes per connection attempt; its REST admin space + (`--rest-http-port 8000`, `curl http://127.0.0.1:8000/@/**`) shows live + `sessions`/`subscriber` state, handy for checking whether a session + ever actually registers without needing to grep debug logs. +- `~/robot/ros2-emscripten-zenoh-demo/scratch/noasyncify_test/browser_test.html` + -- real-browser equivalent of `test_rclpy_noasyncify.mjs`, served via + the same `python -m http.server` on port 8887 (alongside + `merged_kernel_packages/`, `empack_env_meta_patched.json`, + `libxeus.so`), driven via the Claude-Code-in-desktop Browser pane tool. + Includes a `WebSocket` constructor monkeypatch (logs every + `[ws#N] constructing/OPEN/ERROR/CLOSE`) that was essential for + root-causing the subprotocol bug above -- keep it in place, it's cheap + and has already paid for itself twice. + +## MAJOR BREAKTHROUGH 2026-09-13, still later same session -- the zenoh session-open handshake is now genuinely resumable without Asyncify, and `Node()` construction succeeds end-to-end + +Continuing directly from "THE CURRENT BLOCKER" section above: built the full non-blocking, +resumable client-handshake state machine the user asked for. **It works.** Confirmed via the +real browser test harness (`scratch/noasyncify_test/browser_test.html`): + +``` +rclpy.init() OK after 1 attempt(s) +Node() attempt 1 failed: RCLError(...) <- expected, handshake still in progress +Node() attempt 2 failed: RCLError(...) <- expected, handshake still in progress +Node() OK after 3 attempt(s) +Node created: wasm_rclpy_jupyter +``` + +### What actually shipped + +1. **`zenoh-pico` (`extra_recipes/zenoh-pico/`, now build 12)**: + - `emscripten-nonblocking-io.patch`: `_z_open_ws()` no longer waits at all after `connect()` + (that wait relied on the now-dead `emscripten_sleep()`); `_z_read_ws()`/`_z_send_ws()` each + make exactly ONE non-blocking `recv()`/`send()` attempt per call instead of an internal + retry-with-sleep loop. Also adds a **persistent fd cache** + (`static int _z_ws_persistent_fd`): `_z_open_ws()` returns this cached fd on every call + after the first (skipping `socket()`/`connect()` entirely), and `_z_close_ws()` is a + deliberate no-op -- the underlying WebSocket must survive across separate Python-driven + retries, or every retry would open a doomed brand-new connection that can never progress + within its own single synchronous call either (see the reasoning trail below). + - `emscripten-nonblocking-sleep.patch`: `z_sleep_us()`/`z_sleep_ms()` are now true no-ops + (no `emscripten_sleep()` call at all) -- see the "why this can't be patched the same + lightweight way as rmw_wait" reasoning in the previous section; the short version is that + nothing can synchronously wait for browser-side network progress without Asyncify/JSPI/ + threads, so don't even try -- let the caller's own retry cadence (Python `await + asyncio.sleep()`) be the only "wait a bit" mechanism anywhere in this whole path. + - `emscripten-resumable-handshake.patch`: the big one. Adds + `_z_unicast_handshake_open_client_resumable()` (`src/transport/unicast/transport.c`, + `#ifdef __EMSCRIPTEN__`), a phase-tracked (`NOT_STARTED` / `INIT_SENT` / `OPEN_SENT`) + rewrite of the existing (portable, untouched-for-every-other-platform) + `_z_unicast_handshake_open()`, wired in via `_z_unicast_open_client()`. Each call does AT + MOST one non-blocking step (send whatever hasn't been sent yet, then try once to receive + whatever's next expected) and returns immediately -- critically, it does NOT resend a + message a prior call already sent, reusing a single static `_z_hs_state` (this project only + ever has one zenoh session in flight). **A naive "just retry the whole call from scratch" + approach was tried FIRST and empirically proven broken**, via `zenohd`'s own `RUST_LOG=debug` + log: `Received invalid message instead of an OpenSyn ... InitSyn(...)` -- a retry that + resends InitSyn on a connection zenohd is already past that stage on is a genuine protocol + violation from the server's perspective, not a fresh session (exactly because the + persistent-fd cache above means it really is the same underlying connection). + - **The trickiest bug, found only via raw byte-level tracing**: WS links use + `Z_LINK_CAP_FLOW_DATAGRAM` (`_z_link_recv_t_msg` in `transport/common/rx.c`), whose read + path only treats a raw `SIZE_MAX` return as a hard failure -- a clean "nothing available + yet" (0 bytes, from our new single-attempt `_z_read_ws`) is NOT specially handled at all; it + falls through to attempting to decode an EMPTY buffer, which + `_z_transport_message_decode()` correctly rejects with + `_Z_ERR_MESSAGE_DESERIALIZATION_FAILED` (-119) -- NOT the `_Z_ERR_TRANSPORT_RX_FAILED` (-99) + this patch originally (incorrectly) assumed was the only "try again" signal, borrowed from + the STREAM-flow code path's semantics without checking DATAGRAM-flow's own. Confirmed via + temporary `printf`-based tracing (raw `recv()`/`errno` values, raw received bytes, decode + return codes -- all now removed, see below) showing a "no data yet" attempt hitting + `recv()==-1, errno=ENXIO` correctly, yet still reaching `decode()` with a genuinely empty + zbuf and getting -119. Fixed: the resumable handshake now treats **both** -99 and -119 as + "still in progress, call again later" (safe here because a WS message is always delivered + as one complete atomic unit against a trusted local `zenohd` -- a non-empty read that still + fails to decode would be a real, different bug, not something this fast path needs to mask). + - `emscripten-rx-debug.patch`: temporary diagnostic tracing in `_z_link_recv_t_msg` + (`transport/common/rx.c`) -- dumps raw received bytes + decode result on every call. **Still + present in the build as of this writing (build 12) -- remove once the remaining CELL2 issue + below is fully resolved**, along with the `printf` tracing left inside + `emscripten-resumable-handshake.patch`'s handshake function and `emscripten-nonblocking-io.patch`'s `_z_read_ws`. + +2. **`rmw_zenoh_pico` (build 28)**: `session_connect()` (`src/zenoh_pico/zenoh_pico_session.c`) + now clones a **fresh** `z_owned_config_t` for each `z_open()` attempt instead of `z_move()`ing + `session->config` directly -- `z_open()` consumes (moves-from) its config argument whether or + not it succeeds, so a naive retry would hand it an already-invalidated config on the second + and every later call. This keeps the session's own original config alive and valid across + however many retries `session_connect()` takes. + +3. **`rclpy` (build 28)**: ported `ros2-emscripten-zenoh-demo/patches/ + rclpy-node-rmw_zenoh_pico-workarounds.patch` (previously only ever applied in the SEPARATE + `demo_env_build` deployment path, never folded into this project's own rattler-build recipe + pipeline) into this repo's own `patch/ros-rolling-rclpy.emscripten.patch`. Once `Node()` + construction could finally get far enough to reach it (i.e. after the handshake fix above), + it hit a NEW, narrower, already-known issue: + `RCLError('failed to create publisher event: Publisher implementation identifier not from + this implementation, ... rmw_event.c:242')` -- `Node.__init__()` unconditionally creates a + `/parameter_events` publisher with default QoS event callbacks and a `TypeDescriptionService`, + neither of which rmw_zenoh_pico (a prototype/incomplete RMW implementation) fully supports. + Fix (ported verbatim from the demo repo's own patch): pass + `event_callbacks=PublisherEventCallbacks(use_default_callbacks=False)` to that publisher, and + set `self._type_description_service = None` instead of constructing a real one. + +### The retry pattern, Python-side + +`rclpy.init()` and `Node()` construction are no longer guaranteed to succeed on the first call -- +both need to be wrapped in a retry loop with a real `await asyncio.sleep()` between attempts +(mirroring the already-established `rclpy.spin_once(timeout_sec=0)` pattern for the read/wait +side). See `scratch/noasyncify_test/browser_test.html`'s `init_with_retry()` helper for the +reference implementation: catch the exception, sleep, retry, up to a bounded attempt count. +**This is now a real, permanent part of this project's rclpy usage pattern for JupyterLite** -- +`rclpy.init()`/`Node()` (and likely other zenoh-session-dependent calls made before the session +is confirmed fully open) must be called this way from any real notebook cell going forward, not +just this test harness. + +### Remaining work (not yet done) + +- **CELL2 (creating a SECOND node + subscriber, then actually publishing/receiving messages) + hangs the whole browser tab** -- after `tasks scheduled` prints, the page becomes fully + unresponsive (even a trivial `javascript_exec` call times out), suggesting a tight busy-loop + somewhere (possibly an unhandled-exception flood in the `spin_once`/`asyncio.sleep()` loop, or + the SECOND `Node()`'s own retry loop spinning faster than expected). Not yet root-caused -- + next step, in a fresh, unfrozen tab: reduce `init_with_retry`'s `max_attempts` for a faster + fail-fast, wrap `setup_and_spin()`'s body in its own try/except to surface whatever's actually + throwing instead of silently flooding, and check whether the SECOND node's session-connect + call path (reusing the already-open `_zenohSession` singleton, refcounted from the first node) + behaves differently now that a session already exists. +- Remove all temporary diagnostic `printf` tracing once CELL2 is fully working (see the + `emscripten-rx-debug.patch` note above, plus the `[HS_DEBUG]`/`[READ_WS_DEBUG]` prints still in + `emscripten-resumable-handshake.patch`/`emscripten-nonblocking-io.patch`). +- Once JupyterLite/Python pub-sub is fully confirmed end-to-end, restructure `browser_demo`'s C++ + rclc/rclcpp demo (still uses blocking `spin()`) to the same non-blocking + Python-retry-style + pattern -- likely needs an analogous "pump this from a JS `setInterval`" driver since there's no + Python/asyncio layer there. +- Re-pin `pixi.toml`'s `vinca` dependency back to a real pushed git commit (currently a local path + override) once the vinca template changes are committed and pushed. + +### CELL2 hang root-caused (partially): NOT the session-open path -- a SECOND Node() truly hangs (not a clean retry-able failure) + +Confirmed via the harness's own added print markers: `setup_and_spin: creating sub_node...` +prints, then the entire browser tab goes fully unresponsive (even a trivial `javascript_exec` +call times out) -- no `Node() attempt N failed` prints ever appear, unlike the FIRST node's +construction (which cleanly failed-and-retried 2 times before succeeding). This means the second +`Node()` call is not hitting our new retry-able exception path at all -- it's a genuine, silent, +uninterruptible native hang, most likely a real blocking wait somewhere we haven't patched. + +Ruled out via source inspection (`rmw_zenoh_pico/src/rmw_node.c`'s `rmw_create_node()` and +`declaration_node_data()`): +- `session_connect()` should return `RMW_RET_OK` immediately for the second node -- the + `_zenohSession` singleton (ref-counted in `zenoh_pico_generate_session()`) is already + connected from the first node, so `if (session->enable_session) return RMW_RET_OK;` should + short-circuit before ever touching `z_open()`/our resumable handshake again. +- `declaration_node_data()`'s `z_liveliness_declare_token()` → `_z_declare_liveliness_token()` + (`zenoh-pico/src/net/liveliness.c`) is a fire-and-forget `_z_send_declare()` (write-only, no + reply wait) -- confirmed by reading its source, not just assumed. + +**Not yet root-caused**: something else, most likely a graph-discovery/query-reply operation +triggered specifically by having a SECOND node coexist with the first (e.g. rclpy eagerly +populating its graph cache, or some other component querying the OTHER node's TypeDescription +or similar), that involves a genuine query+wait-for-reply round trip -- the same fundamental +class of problem as the session-open handshake (a real network round trip inside one synchronous +call, no Asyncify to yield), but in a DIFFERENT code path we haven't identified precisely yet. +Zenohd's own debug log around this point shows it processing a `send_close` for the FIRST node's +session/resources (liveliness token unpropagation, parameter_events resource cleanup) -- worth +investigating whether this close is a stray/leftover artifact from one of the two intentionally- +failed early attempts, or something actually torn down the working first session. + +**Next steps for whoever picks this back up**: reproduce in a way that doesn't freeze the whole +tab (e.g. run the sub_node creation in a Web Worker, or add a hard wall-clock watchdog around the +call using `Promise.race` with a timeout at the JS level before assuming a hang vs. just slow); +grep `rclpy`'s own `Node.__init__` and `rmw_zenoh_pico`'s remaining `rmw_*` entry points called +during node creation (parameter services, `rcl_node_init`'s own graph-info bookkeeping) for +anything doing a query-and-wait; consider whether this needs the SAME resumable/retry treatment +as session-open, applied to whatever this new blocking call turns out to be. + +This is a **separate, narrower** problem from "THE CURRENT BLOCKER" section above, which is now +fully solved and confirmed working (`rclpy.init()` + first `Node()` construction succeed +end-to-end via the resumable handshake). Reported to the user as a natural checkpoint before +continuing further, since the specific thing they asked to be built (the non-blocking +session-open state machine) is done. + +### CELL2 hang, ROOT-CAUSED: not a new blocker at all -- the test harness's own idle sleeps let the zenoh session lease expire + +Confirmed via a controlled experiment: shortened the gap between CELL1 (first `Node()`) and a +diagnostic cell (constructing a second, raw `_rclpy.Node()` directly) from 15 seconds down to 2 +seconds. **The second node construction succeeded instantly, no hang at all.** With the 15-second +gap, it hung solid every time. + +Root cause: `Z_TRANSPORT_LEASE` is 10000ms (`zenoh-pico/include/zenoh-pico/config.h`) -- +zenohd expects periodic keep-alive traffic from a client to consider its session alive. This +project's whole single-threaded (`Z_FEATURE_MULTI_THREAD=0`) architecture relies on the +*application* pumping `zp_send_keep_alive()`/`zp_read()` manually (that's what `rmw_wait()`'s +poll loop already does whenever something calls `rclpy.spin_once()`) -- there is no background +thread doing this automatically, by design. The test harness's own artificial `await +sleep(15000)` gaps between cells, with nothing calling `spin_once()` in between, let the session +go quiet long enough for zenohd to expire and close it server-side -- so the SECOND node's +construction attempt was genuinely trying to use an already-dead connection, hanging forever +waiting for a reply that could never arrive (our client-side code never even noticed the +server-initiated close, since nothing was polling `recv()` during the idle gap either). + +**This is not a new architectural gap** -- it's a consequence of test-harness sleeps being far +longer and less representative than real interactive notebook usage (where a user runs cells in +reasonably close succession, and any `spin_once()`/`spin()` call along the way keeps the lease +alive). Fixed by shortening the harness's inter-cell sleeps to realistic values. **For genuine +long-idle robustness** (a notebook cell that sits untouched for a long time before the next one +runs), a background keep-alive pump would be needed eventually -- noted as a real, but separate +and much lower-priority, follow-up; not a blocker for the core pub/sub demo working. + +### CELL2 continued: node hang was a red herring (lease expiry from harness sleeps); pub/sub now runs cleanly but only 1 of 20 published messages reaches the router + +Two fixes landed since the last update: +1. Confirmed via a controlled experiment that the "second Node() hangs" symptom was purely a + test-harness artifact: shortening the gap between cells from 15s to 2s made the second + `Node()` succeed instantly. Root cause: `Z_TRANSPORT_LEASE` (10000ms) requires periodic + keep-alive traffic, which only happens when something calls `rclpy.spin_once()` -- our + harness's own long idle `await sleep()` gaps between cells (with nothing spinning) let + zenohd expire and close the session, so the second node tried to use an already-dead + connection. Not a new architectural gap. +2. `create_publisher()`/`create_subscription()` (unlike the one internal `/parameter_events` + publisher already patched) still default to `PublisherEventCallbacks()`/ + `SubscriptionEventCallbacks()` **with** default callbacks enabled, hitting the same + `rmw_event.c:242` "Publisher implementation identifier not from this implementation" error + as before. Fixed in the test harness by passing `use_default_callbacks=False` explicitly to + both -- **this is a real, general limitation of rmw_zenoh_pico for ANY real notebook usage + going forward, not just this test**: any `create_publisher()`/`create_subscription()` call + needs this passed explicitly (or rclpy's own defaults need patching project-wide, not yet + done -- consider whether to change `create_publisher`/`create_subscription`'s OWN default in + the rclpy patch, rather than requiring every call site to remember this). +3. Also found: the spin loop was only pumping `sub_node` via `rclpy.spin_once()` -- adding a + second `rclpy.spin_once(node, timeout_sec=0)` call (for the PUBLISHER's own node) was needed + too, since each rmw "node" has its own wait-set/dispatch bookkeeping even though both nodes + share the same underlying zenoh session. + +With all of the above, the full CELL2 lifecycle now runs end-to-end with **zero exceptions**: +sub_node construction, publisher/subscription creation, a 4-second spin+publish loop, and clean +shutdown all complete normally. **But `received count: 0`** -- the subscriber's `on_msg` callback +never actually fires, even though a publisher and subscriber both exist for the same topic. + +Root-caused (partially) via `zenohd`'s debug log: `declare_subscriber` for `chatter` DOES appear +(confirms the subscription was properly registered with the router this time, thanks to fix #3 +above) and exactly ONE `send_push`/`compute_data_route` event appears, WITH a valid computed +route (`return=[Direction{dst=...}]`) -- meaning the very first `pub.publish()` call's data +genuinely reached the router and was routed correctly. But messages 2 through 20 never produced +another `send_push` log line, and ~14 seconds after that first successful push, the log shows +`RX task failed: ... expired after 10000 milliseconds` -- the session died again from pure +inactivity, meaning nothing (no further publishes, no keep-alives) reached the wire after that +first message. + +**Leading hypothesis, not yet confirmed**: zenoh-pico's write path may batch outgoing messages +(`Z_FEATURE_BATCHING`, referenced in `transport/unicast/transport.c`'s +`_z_transport_start_batching`/`_z_transport_stop_batching`) and only actually flush the batch to +the socket via a mechanism this project's single-threaded (`Z_FEATURE_MULTI_THREAD=0`) +architecture never triggers -- normally a background thread's job. If so, `pub.publish()` calls +2-20 may be silently accumulating in an internal buffer that nothing ever flushes, while only the +first call (or some threshold-triggered flush) actually reached the socket. Also worth checking: +whether `_z_send_ws`'s new single-attempt, non-blocking design has a related but DISTINCT bug -- +DATAGRAM-flow callers (`_z_link_send_wbuf` in `link.c`) only treat a write as failed when it +returns `SIZE_MAX`; a send that silently transmits **zero** bytes (which our rewritten +`_z_send_ws` can now return, unlike a real blocking send that either fully succeeds or hard-fails) +would NOT be caught as an error there, silently dropping data with no retry -- worth checking +whether `_z_send_ws` should return `SIZE_MAX` rather than 0 when the underlying `send()` sends +nothing at all, to make that failure mode visible to callers that already know how to handle it. + +Not yet resolved -- next session should check `Z_FEATURE_BATCHING`'s actual state in this +project's zenoh-pico build config, and audit `_z_send_ws`'s zero-vs-SIZE_MAX return semantics +against every DATAGRAM-flow caller, before assuming which of the two (or something else) is the +real cause. + +**Follow-up: ruled out both leading hypotheses for "only 1 of 20 messages reaches the router".** +Checked via source: `Z_FEATURE_BATCHING` IS enabled by default in this build +(`zenoh-pico/include/zenoh-pico/config.h`), but batching is opt-in at runtime +(`zp_batch_start()`/`zp_batch_stop()`, public API functions) -- confirmed rmw_zenoh_pico never +calls them, so `_batch_state` stays `_Z_BATCHING_IDLE` and every write should flush immediately, +un-batched. Also checked `_z_transport_tx_mutex_lock()` (`transport/transport.h`): under +`Z_FEATURE_MULTI_THREAD == 0` (this project's config) it's an unconditional no-op returning +`_Z_RES_OK` regardless of the `block`/congestion-control argument -- no drop-on-congestion path +is actually reachable here either. So the write path should be unconditional and immediate for +every single `_z_send_n_msg` call; neither batching nor congestion-control/mutex logic explains +why messages 2-20 never produced a `send_push` log line. + +**Not yet investigated**: whether ROS2's default RELIABLE QoS introduces a sliding-window / +sequence-number-based flow-control mechanism in zenoh-pico's reliability layer that requires an +ACK (arriving via the read/`zp_read()` path) before advancing to send further messages -- this +would fit the observed symptom (first message goes out fine, subsequent ones stall) if the +ACK-processing side has its own gap. Worth checking `_z_transport_tx_send_n_msg_inner` and +whatever sequence-number/retransmission bookkeeping exists in the reliability path for a +non-blocking-compatibility gap, following the same root-cause-via-zenohd-log-plus-source-reading +approach that resolved every previous layer of this investigation. + +**Follow-up: BEST_EFFORT QoS ruled out too -- same symptom persists regardless of reliability.** +Switched both publisher and subscription to explicit `BEST_EFFORT` QoS (sidestepping any +reliable-QoS ACK/retransmission machinery entirely) and gave the test much more runway (8s +publish window, 39 messages actually attempted this run). **Identical result**: `zenohd`'s debug +log shows exactly one `send_push`/`compute_data_route` event, no matter how many `pub.publish()` +calls happen or which QoS reliability is used. Also noticed the router's own log line still says +`is_reliable=true` for that one push regardless of the BEST_EFFORT QoS setting -- rmw_zenoh_pico +apparently never maps ROS QoS reliability down to a real zenoh-level distinction here, which is +consistent with "changing QoS made zero difference." + +**New leading hypothesis, more specific, not yet confirmed**: zenoh-pico's own client-side +"write filter" optimization (`src/net/filtering.c`, gated by `Z_FEATURE_INTEREST`) exists +specifically to suppress `z_put()`/publish calls when the client believes there are no matching +subscribers, to avoid wasting bandwidth. Its state (`ctx->state`, `WRITE_FILTER_ACTIVE` = suppress +vs `WRITE_FILTER_OFF` = allow) is computed as `(ctx->targets == NULL && ctx->local_targets == 0)` +-- i.e. it *actively drops writes* unless it has at least one known target. `ctx->targets` is a +list populated when the ROUTER sends back an "interest" declaration in response to our own +subscriber's declaration (this project's own subscriber declaring itself IS visible in zenohd's +log, and interest/token propagation IS logged happening) -- meaning the filter almost certainly +was legitimately OFF (allowing writes) for exactly long enough to let that first message out, then +flipped back to ACTIVE afterward, silently dropping every later `publish()` call with no error +surfaced to Python at all (this call path doesn't return an error even when the filter drops the +write -- confirmed indirectly: `pub.publish()` never raised an exception in any test run). + +**Not yet found**: the actual code path that would cause `ctx->targets`/`ctx->local_targets` to +revert to empty shortly after being populated. Candidates for next session to check, roughly in +order of suspicion: +1. Whether the same class of problem that hit session keep-alives (nothing pumping + `zp_read()`/`zp_send_keep_alive()` frequently/promptly enough without a real background + thread) also starves whatever incoming message keeps this target list alive/refreshed -- i.e. + maybe the "interest" registration itself needs to be periodically refreshed/re-affirmed by an + incoming message that our polling cadence (`rclpy.spin_once(..., timeout_sec=0)` in a 50ms + Python loop) isn't delivering promptly enough, and it expires similarly to the session lease. +2. Whether `_z_write_filter_ctx_remove_local_match`/target-removal logic + (`Z_FEATURE_LOCAL_SUBSCRIBER`-gated) fires incorrectly for this project's specific "publisher + and subscriber share one session, no real separate local-process dispatch" topology -- worth + checking whether `Z_FEATURE_LOCAL_SUBSCRIBER` is even enabled in this build + (`extra_recipes/zenoh-pico/build.sh` doesn't set it explicitly; check `config.h`'s default). +3. Whether some OTHER unrelated event (e.g. the same kind of spurious "session looks idle, tear + something down" logic already found and fixed once for the session-open handshake) is + incorrectly interpreting normal idle time between publishes as a signal to drop the write + filter's targets. + +Same investigative pattern that resolved every earlier layer should work here too: add targeted +`printf` tracing directly in `_z_write_filter_ctx_update_state`/`_z_write_filter_push_target`/ +`_z_write_filter_ctx_remove_local_match` to see exactly when and why `ctx->state` flips back to +`WRITE_FILTER_ACTIVE`, cross-referenced against `zenohd`'s own debug log timeline (the +`RUST_LOG=debug` + REST admin space + `WebSocket` constructor monkeypatch tooling built up this +session in `scratch/noasyncify_test/browser_test.html` all remain in place and are still the +fastest way to root-cause this class of bug). + +### Session status summary (for whoever picks this up next) + +**Fully working, confirmed end-to-end**: `import rclpy`, `rclpy.init()` (with retry), +`Node()` construction (with retry, including a second node reusing the same session), publisher/ +subscriber object creation (with the `use_default_callbacks=False` workaround), and a full +spin/publish loop running for 8+ seconds with zero crashes or exceptions anywhere in the stack. +This is the architectural goal the user asked for this session ("build the non-blocking state +machine") -- done, and confirmed via a real browser test, not just reasoning. + +**Not yet working**: actual message delivery beyond the very first publish -- subscriber's +`on_msg` callback never fires (`received count: 0` every run so far), even though the very first +`pub.publish()` call after subscriber registration does get routed correctly by `zenohd`. This is +now narrowed to zenoh-pico's own client-side write-filter optimization silently suppressing later +writes, not a browser/Asyncify/threading issue -- a genuinely different, narrower class of bug +than everything else fixed this session, likely fixable with the same tracing-driven approach. + +**Follow-up: pub/sub creation ORDER ruled out too** (creating the subscription before the +publisher made no difference -- still exactly one `send_push` per run, confirmed via `zenohd`'s +log). **Found the precise mechanism that flips the write filter back to blocking**, via +`src/net/filtering.c`'s `_z_write_filter_callback()`: it handles four interest-message types -- +`DECL_SUBSCRIBER`/`DECL_QUERYABLE` (adds a target), `UNDECL_SUBSCRIBER`/`UNDECL_QUERYABLE` +(removes one target), and **`_Z_INTEREST_MSG_TYPE_CONNECTION_DROPPED`, which wipes ALL targets +for that peer at once** (`_z_filter_target_slist_drop_all_filter(..., _z_filter_target_peer_eq, +...)`). Given this whole investigation has already found multiple cases of this project's +single-threaded, no-Asyncify architecture producing spurious "connection looks dead" signals +(the session-lease-expiry issue fixed a few sections up is the clearest precedent), a +`CONNECTION_DROPPED` interest message firing shortly after the one real subscriber declaration +arrives -- even though the connection is still nominally alive -- would exactly explain "exactly +one write gets through, then every later one is silently dropped with no error," matching every +run's observed behavior regardless of QoS or creation order. + +**This is the concrete next thing to check**, with `printf` tracing directly in +`_z_write_filter_callback()` (log `msg->type` and the peer/connection identity on every call) to +confirm whether a spurious `CONNECTION_DROPPED` event is really what's firing, and if so, trace +backward to find what's synthesizing it. Not confirmed this session -- ran out of session budget +to chase it further, but the exact file, function, and mechanism are now pinned down precisely +enough that this should be a fast, bounded fix for whoever picks it up next (same +`printf`-tracing-plus-`zenohd`-log-cross-reference technique used for every other layer this +session). + +## UPDATE 2026-09-13, later same session -- message-delivery bug FULLY ROOT-CAUSED AND FIXED at the zenoh-pico layer; a NEW, separate bug found one layer up in rmw_zenoh_pico + +The write-filter/`CONNECTION_DROPPED` hypothesis above turned out to be a dead end: direct +`printf` tracing inside `_z_write_filter_callback()` showed `write_filter_active=0` (i.e. NOT +blocking) on virtually every real publish call. The write filter was never the problem. + +### The real root cause: `Z_FEATURE_LOCAL_SUBSCRIBER` was never enabled + +Raw `send()`-level tracing (`SEND_WS_DEBUG` in `_z_send_ws`) showed every publish succeeding at +the socket level (100% of requested bytes sent), yet `zenohd`'s own debug log only ever showed +one `send_push` event, ever. Querying `zenohd`'s REST admin/storage interface directly +(`curl http://127.0.0.1:8000/**`) proved this was a **logging artifact, not real data loss** -- +the storage plugin held the value from the *latest* published message every single time, meaning +every publish genuinely reached the router. + +The actual bug: this project's `rclpy` publisher and subscriber, in the same process, share +**one single `_zenohSession`** (rmw_zenoh_pico's `zenoh_pico_session.c` declares it as a +file-scope `static ZenohPicoSession _zenohSession`, a true per-process singleton -- confirmed by +reading the source directly, not inferred). A router correctly never echoes data back to the +same face it originated from, so **same-session pub/sub was never actually looping data back at +all** -- not a bug in delivery, but a missing feature. zenoh-pico ships exactly this as an +opt-in, separate feature: `Z_FEATURE_LOCAL_SUBSCRIBER` / `Z_FEATURE_LOCAL_QUERYABLE`, both +`0` (off) by default in zenoh-pico's own `config.h`, and never turned on anywhere in this +project's build. Enabling both via `extra_recipes/zenoh-pico/build.sh`'s cmake configure line +(`-DZ_FEATURE_LOCAL_SUBSCRIBER=1 -DZ_FEATURE_LOCAL_QUERYABLE=1`, zenoh-pico build 15) is the +fix -- confirmed genuinely complete via a `printf`-tracing chain all the way down zenoh-pico's own +call stack (`_z_write()` → `_z_session_deliver_push_locally()` → `_z_handle_network_message()` → +`_z_trigger_push()` → `_z_trigger_subscriptions_impl()` → `__unsafe_z_get_subscriptions_by_key()`), +which showed, on every publish: `sub_nb=1`, `origin_allowed=1`, `intersects=1` -- a real, +correct subscription match -- and the exact bytes handed to the local subscriber are a +byte-for-byte-correct, well-formed CDR-encoded message (hex-dumped and verified: for a published +`"hello 0"` string, the local subscriber's callback receives +`00 01 00 00 08 00 00 00 68 65 6c 6c 6f 20 30 00`, i.e. a correct CDR_LE header + 8-byte +length-prefixed "hello 0\0" -- exactly right). **The zenoh-pico layer is done and confirmed +correct.** All temporary diagnostic `printf` patches added while chasing this +(`emscripten-rx-debug.patch`, `emscripten-writefilter-debug.patch`, +`emscripten-write-locality-debug.patch`, `emscripten-subscription-match-debug.patch`) have been +removed again (zenoh-pico build 19) now that the fix is confirmed -- see that recipe's own +`recipe.yaml` build-number comments (15 through 19) for the blow-by-blow. + +### A NEW bug, one layer up: rmw_zenoh_pico's string typesupport never grows the destination buffer + +With local delivery now genuinely working, the subscriber's callback fires and rclpy's `rmw_take()` +is reached for the very first time ever in this whole project's history (previously, only remote +peers -- running their own, different, dynamic-string-capable RMW -- ever received wasm-published +messages; nothing on the wasm side had ever successfully taken a message before today). It fails +immediately with `RCLError('failed to take message from subscription: Typesupport deserialize +error.', rmw_take.c:38)`. + +Traced directly into `rmw_zenoh_pico_deserialize()` (`zenoh_pico_rosMessage.c`): the payload +bytes reaching it are still correct (`payload_size=16`, matching the hex dump above), and +`callbacks->cdr_deserialize(&temp_buffer, ros_message)` itself is what returns `false`. Printed +`ros_message`'s fields (treating it as a `rosidl_runtime_c__String`, valid for `std_msgs/String`): +`size=0 capacity=1`. Reading `rosidl_typesupport_microxrcedds_c`'s own codegen template +(`msg__type_support_c.c.em`) confirms why: its `AbstractString` deserialize branch does + +```c +size_t capacity = ros_message->data.capacity; +rv = ucdr_deserialize_sequence_char(cdr, ros_message->data.data, capacity, &string_size); +``` + +-- it deserializes **into the destination's pre-existing, fixed capacity**, and never grows or +reallocates it. `rclpy` always constructs a fresh message via the standard +`..._String__init()` before calling `rmw_take()`, which allocates the DDS/rosidl_runtime_c +default: an empty string, `capacity=1`. Any nonempty incoming string (here, `"hello 0"`, needing +capacity ≥ 8) exceeds that, and this codegen path simply fails rather than reallocating -- unlike +every other RMW's deserializer (fastrtps, cyclonedds, etc.), which dynamically resizes the +destination string to fit. + +**This is a general, always-present limitation of `rmw_zenoh_pico`'s microxrcedds-based +typesupport for any unbounded/variable-length string field** (the micro-XRCE-DDS/micro-ROS world +this codegen comes from is built around *bounded* strings sized at IDL-compile-time, not +DDS-style dynamic strings) -- completely unrelated to local-vs-remote delivery, and it was simply +never exposed before because nothing on the wasm side had ever reached `rmw_take()` until +`Z_FEATURE_LOCAL_SUBSCRIBER` started working today. Full root-cause trail (builds 29-31, with the +hex dump and the `capacity=1` confirmation) is documented in `rmw_zenoh_pico`'s own entry in +`pkg_additional_info.yaml`. The debug tracing added to chase this +(`rmw_zenoh_pico_generate_recv_sample_msg_data`'s hex/ASCII dump, and +`rmw_zenoh_pico_deserialize`'s pointer/size/return-value + `String` struct dump, both in +`zenoh_pico_rosMessage.c`) is left in place (build 31) since this bug is NOT yet fixed -- remove +it once it is. + +**Not yet done**: an actual fix. The real fix has to live in `rosidl_typesupport_microxrcedds_c`'s +codegen (or a patch to the generated `.c` file, or a wrapper that pre-grows `ros_message`'s +string fields before calling `cdr_deserialize`) to `realloc()` the destination string buffer to +`string_size` before/during deserialization, mirroring what every other RMW's typesupport does. +This has not been attempted yet -- next session should start there. + +## UPDATE 2026-09-14 -- the string-typesupport bug is FIXED and CONFIRMED: full end-to-end pub/sub now works, 39/39 messages received + +Fixed the `rosidl_typesupport_microxrcedds_c` bug described in the previous section. Cloned +`Tobias-Fischer/rosidl_typesupport_microxrcedds` (the fork this project's `ros2-rosidl-typesupport- +microxrcedds-c` recipe pins by exact rev) and patched its `.em` codegen template directly +(`patch/ros-rolling-rosidl-typesupport-microxrcedds-c.emscripten.patch`, wired in via the standard +vinca `.emscripten.patch` naming convention -- no `patches:` list edit needed, vinca +auto-discovers it by filename). + +### The actual bug was worse than "capacity too small, deserialize politely rejects" + +Reading micro-CDR's own source (`src/c/types/sequence.c`'s `ucdr_deserialize_sequence_header`, +`src/c/types/array.c`'s `ucdr_buffer_to_array`) showed the capacity check +(`if (*length > capacity) { ub->error = true; }`) only ever sets an out-of-band error flag -- it +does **not** stop the very next line, an unconditional `ucdr_deserialize_endian_array_char()` call, +from `memcpy()`-ing the *full* incoming length into the destination regardless. Given +`rclpy`/`rosidl_runtime_c__String__init()` always allocates a 1-byte "empty string" buffer before +`rmw_take()`, and any real incoming string (e.g. `"hello 0"`, needing 8 bytes) is larger than that +1-byte capacity, this codegen path was a genuine, silent **heap buffer overflow** every single time +a non-empty string was ever taken -- not merely a rejected/truncated string as the generated +fallback code (`else if(string_size > capacity){ ...skip past it... }`) assumed. + +### The fix + +In `msg__type_support_c.c.em`'s `_cdr_deserialize()` codegen, for both a single `AbstractString` +member and a sequence-of-strings member: before calling `ucdr_deserialize_sequence_char()`, peek +the incoming length via a **throwaway copy of the `ucdrBuffer` cursor** (`ucdrBuffer peek_cdr = *cdr;` +then `ucdr_deserialize_uint32_t(&peek_cdr, &incoming_size)` -- safe because `ucdrBuffer` is a plain +value-type struct with no self-referential pointers, so copying it and advancing the copy has zero +effect on the real `cdr`), and `realloc()` the destination string's buffer to fit *before* the real +deserialize call. This is exactly what every other RMW's typesupport already does for unbounded +strings; this codegen just never grew the buffer at all. + +### Verified genuinely end-to-end in a real browser run + +Rebuilt `rosidl_typesupport_microxrcedds_c` (build 28) and, since the actual per-message +`_cdr_deserialize()` C code is generated at *each message package's own* build time from that +template, also rebuilt `std_msgs` (build 27) to pick up the fix for `std_msgs/String` specifically +(every other interface package with a string field carries the same stale, unfixed codegen and +will need the same rebuild eventually -- not done yet, out of scope for this session's demo). + +Result, with all temporary debug tracing removed from every layer (zenoh-pico, rmw_zenoh_pico) and +one final clean rebuild + browser run: **all 39 published `"hello 0"`..`"hello 38"` messages are +received by the subscriber's `on_msg` callback, byte-for-byte correct, `received count: 39`.** This +is the first genuinely complete, working, non-Asyncify ROS2 pub/sub loop in this whole project's +history -- publisher and subscriber on the same wasm-side session, in a real browser, with zero +crashes, zero Asyncify, and zero data loss. + +### What's left (not done this session) + +- Every other ROS interface package containing a string field (nearly all of them) still carries + the pre-fix, buggy generated typesupport code baked in from its last build -- each will silently + hit the exact same class of bug (or, for messages that happen to fit within whatever capacity + they were initialized with, might coincidentally not) the first time it's actually exercised with + local delivery. Rebuilding all of them is straightforward (same pattern as `std_msgs` above: + bump each package's `build_number` in `pkg_additional_info.yaml`, regenerate recipes, rebuild) but + not done yet -- do it lazily as each message type is actually needed, or proactively rebuild + everything in one pass if a clean baseline is preferred. +- **Known, pre-existing, unrelated issue found in passing**: `patch/ros-rolling-rmw-zenoh-pico.patch` + has a genuine internal inconsistency -- a chunk of its `CMakeLists.txt` hunk content + (the `-Wl,--export=...` comment block) appears duplicated, and this throws off `git apply`'s + (and plain `patch`'s) hunk-position tracking badly enough that `rmw_wait.c`'s last hunk + (the `Z_FEATURE_MULTI_THREAD == 0` unconditional network-pump added at the top of `rmw_wait()`) + fails to apply on a strict, fresh clone (`git apply --check` / `patch --dry-run` both reproduce + this deterministically, confirmed against a byte-for-byte fresh clone at the exact pinned rev). + `rattler-build`'s own patch-apply step is evidently more fuzzy/tolerant and has applied this same + file successfully in every build this session (confirmed: the `rmw_wait()` network-pump fix is + demonstrably present and working at runtime throughout this whole session's testing) -- so this + is not currently blocking real builds, but it's a landmine for anyone who tries to + `git apply --check` this patch file directly, and the duplicated content should be cleaned up + properly at some point. + +## UPDATE 2026-09-14 (continued) -- patch/ros-rolling-rmw-zenoh-pico.patch was silently corrupted this whole time; regenerated cleanly, and this uncovered a real fix that had never actually been compiled in + +While auditing this project's emscripten patches for leftover cruft, `git apply --check` against a +fresh clone of `rmw_zenoh_pico` at the pinned rev turned up a genuine, reproducible failure: the last +hunk in `src/rmw_wait.c`'s diff (adding the unconditional `zp_read()`/`zp_send_keep_alive()` network +pump at the very top of `rmw_wait()`) failed to apply. Root cause: the patch file's `CMakeLists.txt` +hunk had somehow accumulated a **duplicated block** of its own content (the `-Wl,--export=...` comment +and `target_link_options()` call appeared twice, back-to-back, with mismatched hunk line-count +headers) -- almost certainly from an earlier session's manual patch-file editing going wrong. This +corruption threw off hunk-position tracking badly enough for the LAST hunk in a LATER file +(`rmw_wait.c`) to fail, even though the actual content problem was entirely contained in the FIRST +file's diff. + +**The real, unpleasant discovery**: real `rattler-build` builds all session (and, per the persistent +`output/src_cache` clone's own untouched state, likely for a while before that too) use a fuzzier +`patch`-based apply that tolerated the corruption for `CMakeLists.txt` (silently reconciling the +duplicate into one correct copy) but **silently rejected** the `rmw_wait.c` hunk entirely, saving it to +a `.rej` file with no hard build failure. That means the "unconditional network pump" fix -- the exact +mechanism the earlier "CELL2 hang, ROOT-CAUSED" section of this document credits with fixing the +session-lease-expiry issue -- was **never actually compiled into any build**, this session's included. +Confirmed conclusively by manually re-deriving a correct apply of all 4 `rmw_wait.c` hunks and diffing +it against what every prior build actually used: the `__pump_session`/`__pump_zsession`/`zp_read`/ +`zp_send_keep_alive` block was missing outright. + +Regenerated `patch/ros-rolling-rmw-zenoh-pico.patch` from scratch (fresh pristine clone, every existing +change re-applied by hand, including manually restoring the missing `rmw_wait.c` hunk, then a clean +`git diff`) -- it now passes a strict `git apply --check`. Rebuilt (`rmw_zenoh_pico` build 33) and +re-ran the full end-to-end browser demo as a regression check: still 39/39 messages received, no +change in observable behavior for that specific test (which spins both nodes in a tight loop and never +actually goes idle long enough to exercise the lease-expiry path this pump protects against) -- but the +fix is now genuinely present in the compiled artifact for the first time, for whenever a talker-only +(no-subscription, timer-only) scenario actually needs it. + +**Lesson for future patch-file edits in this project**: after hand-editing any multi-hunk `.patch` file +(not just regenerating it fresh from a scratch clone), always verify with a strict +`git apply --check` against a truly fresh clone at the pinned rev before considering the edit done -- +`rattler-build`'s own patch tool is forgiving enough to silently swallow exactly this class of mistake. diff --git a/browser_demo/build.sh b/browser_demo/build.sh new file mode 100755 index 000000000..af5683a4b --- /dev/null +++ b/browser_demo/build.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +set -eo pipefail + +DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PREFIX="$DEMO_DIR/../demo_env" +BUILD_ENV=/private/tmp/zenoh-emsdk-env + +mkdir -p "$DEMO_DIR/out" + +# No pthreads (see build_ament_cmake.sh.in for the full rationale) -- rclcpp's +# default executor (rclcpp::spin -> Executor::wait_for_work) doesn't have any +# blocking primitive of its own; it delegates entirely to rcl_wait -> +# rmw_wait, same as rclc/rclpy, which is patched to poll instead of block +# (see the rmw_zenoh_pico patch). Asyncify is what lets that poll loop +# cooperatively yield. MAIN_MODULE+dlopen is how the final executable pulls +# in all the separately-built SIDE_MODULE .so packages at runtime. +LIBS=( + "$PREFIX/lib/librclcpp.so" + "$PREFIX/lib/librcl.so" + "$PREFIX/lib/librcl_yaml_param_parser.so" + "$PREFIX/lib/librcl_logging_interface.so" + "$PREFIX/lib/librmw.so" + "$PREFIX/lib/librmw_zenoh_pico.so" + "$PREFIX/lib/libzenohpico.so" + "$PREFIX/lib/librosidl_runtime_c.so" + "$PREFIX/lib/librosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/librcutils.so" + "$PREFIX/lib/librcpputils.so" + "$PREFIX/lib/liblibstatistics_collector.so" + "$PREFIX/lib/libstd_msgs__rosidl_generator_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_cpp.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_introspection_cpp.so" + "$PREFIX/lib/librosidl_typesupport_cpp.so" + "$PREFIX/lib/librosidl_typesupport_introspection_cpp.so" + "$PREFIX/lib/librosidl_typesupport_introspection_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_generator_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_cpp.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_introspection_cpp.so" + "$PREFIX/lib/librosgraph_msgs__rosidl_generator_c.so" + "$PREFIX/lib/librosgraph_msgs__rosidl_typesupport_c.so" + "$PREFIX/lib/librosgraph_msgs__rosidl_typesupport_cpp.so" + "$PREFIX/lib/librosgraph_msgs__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/librosgraph_msgs__rosidl_typesupport_introspection_cpp.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_generator_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_cpp.so" + "$PREFIX/lib/libservice_msgs__rosidl_generator_c.so" + "$PREFIX/lib/libservice_msgs__rosidl_typesupport_c.so" + "$PREFIX/lib/libservice_msgs__rosidl_typesupport_cpp.so" + "$PREFIX/lib/libservice_msgs__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libservice_msgs__rosidl_typesupport_introspection_cpp.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_generator_c.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_typesupport_c.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_typesupport_cpp.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_typesupport_introspection_cpp.so" + "$PREFIX/microcdr-2.0.2/lib/libmicrocdr.so" +) + +INCLUDE_FLAGS=(-I"$PREFIX/include") +for d in "$PREFIX"/include/*/; do + INCLUDE_FLAGS+=(-I"${d%/}") +done + +# The emscripten-forge toolchain env's own activation script sets +# EMCC_CFLAGS="$EM_FORGE_CFLAGS_BASE -sSUPPORT_LONGJMP=wasm -fwasm-exceptions" +# globally -- every em++ invocation gets native wasm exception-handling by +# default, which crashes binaryen's Asyncify pass outright ("UNREACHABLE +# executed ... Asyncify.cpp"), not just compiles slower. Override it here to +# drop just the exception-handling part (matching EM_FORGE_CFLAGS_BASE's own +# value, from that same activation script) -- see build_ament_cmake.sh.in +# for the same fix applied to the vinca-driven package builds. +micromamba run -p "$BUILD_ENV" env EMCC_CFLAGS="-O2 -g0 -fPIC -msimd128" em++ \ + -std=c++17 \ + -DZENOH_EMSCRIPTEN -DRMW_IMPLEMENTATION=rmw_zenoh_pico \ + "${INCLUDE_FLAGS[@]}" \ + -sMAIN_MODULE=1 \ + -s ASSERTIONS=1 \ + -fexceptions \ + -sWASM_BIGINT \ + -sASYNCIFY -s ASYNCIFY_STACK_SIZE=24576 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -L"$PREFIX/lib" \ + -L"$PREFIX/microcdr-2.0.2/lib" \ + "$DEMO_DIR/talker.cpp" \ + "${LIBS[@]}" \ + -o "$DEMO_DIR/out/talker.js" + +echo "Build finished: $DEMO_DIR/out/talker.js / talker.wasm" diff --git a/browser_demo/build_nettest.sh b/browser_demo/build_nettest.sh new file mode 100755 index 000000000..c87367391 --- /dev/null +++ b/browser_demo/build_nettest.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -eo pipefail +DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BUILD_ENV=/private/tmp/zenoh-emsdk-env +mkdir -p "$DEMO_DIR/out" + +# See build.sh's comment on EMCC_CFLAGS / -fwasm-exceptions vs Asyncify. +micromamba run -p "$BUILD_ENV" env EMCC_CFLAGS="-O2 -g0 -fPIC -msimd128" em++ \ + -std=c11 -x c \ + -s ASSERTIONS=1 \ + -sWASM_BIGINT \ + -sASYNCIFY -s ASYNCIFY_STACK_SIZE=24576 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -sSOCKET_DEBUG=1 \ + "$DEMO_DIR/nettest.c" \ + -o "$DEMO_DIR/out/nettest.js" + +echo "Build finished: $DEMO_DIR/out/nettest.js" diff --git a/browser_demo/build_pytest_boot.sh b/browser_demo/build_pytest_boot.sh new file mode 100755 index 000000000..58752408b --- /dev/null +++ b/browser_demo/build_pytest_boot.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -eo pipefail +DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PREFIX="$DEMO_DIR/../demo_env" +BUILD_ENV=/private/tmp/zenoh-emsdk-env +mkdir -p "$DEMO_DIR/out" + +# See build.sh's comment on EMCC_CFLAGS / -fwasm-exceptions vs Asyncify. +micromamba run -p "$BUILD_ENV" env EMCC_CFLAGS="-O2 -g0 -fPIC -msimd128" em++ \ + -std=c11 -x c \ + -I"$PREFIX/include/python3.13" \ + -sMAIN_MODULE=1 \ + -s ASSERTIONS=1 \ + -sWASM_BIGINT \ + -sASYNCIFY -s ASYNCIFY_STACK_SIZE=24576 \ + -s ALLOW_MEMORY_GROWTH=1 \ + --embed-file "$PREFIX/lib/python3.13@/pyhome/lib/python3.13" \ + -L"$PREFIX/lib" \ + "$DEMO_DIR/pytest_boot.c" \ + -lpython3.13 \ + -o "$DEMO_DIR/out/pytest_boot.js" + +echo "Build finished: $DEMO_DIR/out/pytest_boot.js" diff --git a/browser_demo/build_rclc.sh b/browser_demo/build_rclc.sh new file mode 100755 index 000000000..0c6f291d3 --- /dev/null +++ b/browser_demo/build_rclc.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +set -eo pipefail + +DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PREFIX="$DEMO_DIR/../demo_env" +BUILD_ENV=/private/tmp/zenoh-emsdk-env + +mkdir -p "$DEMO_DIR/out" + +LIBS=( + "$PREFIX/lib/librclc.so" + "$PREFIX/lib/librcl.so" + "$PREFIX/lib/librcl_yaml_param_parser.so" + "$PREFIX/lib/librcl_logging_interface.so" + "$PREFIX/lib/librmw.so" + "$PREFIX/lib/librmw_zenoh_pico.so" + "$PREFIX/lib/libzenohpico.so" + "$PREFIX/lib/librosidl_runtime_c.so" + "$PREFIX/lib/librosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/librcutils.so" + "$PREFIX/lib/liblibstatistics_collector.so" + "$PREFIX/lib/libstd_msgs__rosidl_generator_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/microcdr-2.0.2/lib/libmicrocdr.so" +) + +INCLUDE_FLAGS=(-I"$PREFIX/include") +for d in "$PREFIX"/include/*/; do + INCLUDE_FLAGS+=(-I"${d%/}") +done + +# See build.sh's comment: the toolchain env's own activation script injects +# -fwasm-exceptions into every em++ call via EMCC_CFLAGS, which crashes +# binaryen's Asyncify pass -- override it here even though this source is +# pure C, since the link step also processes the C++ .so's it links against. +micromamba run -p "$BUILD_ENV" env EMCC_CFLAGS="-O2 -g0 -fPIC -msimd128" em++ \ + -std=c11 -x c \ + -DZENOH_EMSCRIPTEN -DRMW_IMPLEMENTATION=rmw_zenoh_pico \ + "${INCLUDE_FLAGS[@]}" \ + -sMAIN_MODULE=2 \ + -s ASSERTIONS=1 \ + -fexceptions \ + -sWASM_BIGINT \ + -lwebsocket.js \ + -sSOCKET_DEBUG=1 \ + -sASYNCIFY -s ASYNCIFY_STACK_SIZE=24576 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -L"$PREFIX/lib" \ + -L"$PREFIX/microcdr-2.0.2/lib" \ + "$DEMO_DIR/talker_rclc.c" \ + "$DEMO_DIR/wasm_link_stubs.c" \ + "${LIBS[@]}" \ + -o "$DEMO_DIR/out/talker_rclc.js" + +echo "Build finished: $DEMO_DIR/out/talker_rclc.js / talker_rclc.wasm" diff --git a/browser_demo/build_rclpy.sh b/browser_demo/build_rclpy.sh new file mode 100755 index 000000000..cdca27aa4 --- /dev/null +++ b/browser_demo/build_rclpy.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +set -eo pipefail + +DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PREFIX="$DEMO_DIR/../demo_env" +PY="$PREFIX/python3.13" +SP="$PY/site-packages-rclpy" +BUILD_ENV=/private/tmp/zenoh-emsdk-env + +mkdir -p "$DEMO_DIR/out" + +LIBS=( + "$PREFIX/lib/librclc.so" + "$PREFIX/lib/librcl.so" + "$PREFIX/lib/librcl_action.so" + "$PREFIX/lib/librcl_lifecycle.so" + "$PREFIX/lib/librcl_yaml_param_parser.so" + "$PREFIX/lib/librcl_logging_interface.so" + "$PREFIX/lib/librmw.so" + "$PREFIX/lib/librmw_zenoh_pico.so" + "$PREFIX/lib/libzenohpico.so" + "$PREFIX/lib/librosidl_runtime_c.so" + "$PREFIX/lib/librcpputils.so" + "$PREFIX/lib/librcutils.so" + "$PREFIX/lib/liblibstatistics_collector.so" + "$PREFIX/lib/libstd_msgs__rosidl_generator_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libstd_msgs__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_generator_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/libbuiltin_interfaces__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_generator_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/librcl_interfaces__rosidl_typesupport_introspection_c.so" + "$PREFIX/lib/liblifecycle_msgs__rosidl_generator_c.so" + "$PREFIX/lib/liblifecycle_msgs__rosidl_typesupport_c.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/libtype_description_interfaces__rosidl_typesupport_c.so" + "$PREFIX/lib/libservice_msgs__rosidl_typesupport_microxrcedds_c.so" + "$PREFIX/lib/libservice_msgs__rosidl_typesupport_c.so" + "$PREFIX/microcdr-2.0.2/lib/libmicrocdr.so" + "$SP/rclpy/_rclpy_pybind11.cpython-313-wasm32-emscripten.so" + "$SP/rcl_interfaces/rcl_interfaces_s__rosidl_typesupport_c.so" + "$SP/builtin_interfaces/builtin_interfaces_s__rosidl_typesupport_c.so" + "$SP/std_msgs/std_msgs_s__rosidl_typesupport_c.so" + "$SP/type_description_interfaces/type_description_interfaces_s__rosidl_typesupport_c.so" + "$SP/service_msgs/service_msgs_s__rosidl_typesupport_c.so" + "$SP/numpy/_core/_multiarray_umath.cpython-313-wasm32-emscripten.so" + "$SP/numpy/_core/_simd.cpython-313-wasm32-emscripten.so" + "$SP/numpy/linalg/_umath_linalg.cpython-313-wasm32-emscripten.so" + "$SP/numpy/linalg/lapack_lite.cpython-313-wasm32-emscripten.so" + "$SP/numpy/fft/_pocketfft_umath.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_common.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_bounded_integers.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/bit_generator.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/mtrand.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_philox.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_sfc64.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_generator.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_pcg64.cpython-313-wasm32-emscripten.so" + "$SP/numpy/random/_mt19937.cpython-313-wasm32-emscripten.so" +) + +INCLUDE_FLAGS=(-I"$PREFIX/include" -I"$PY/include/python3.13") +for d in "$PREFIX"/include/*/; do + INCLUDE_FLAGS+=(-I"${d%/}") +done + +# See build.sh's comment: the toolchain env's own activation script injects +# -fwasm-exceptions into every em++ call via EMCC_CFLAGS, which crashes +# binaryen's Asyncify pass -- override it here (this links CPython and +# rclpy's own C++ pybind11 extension, both Asyncify targets). +micromamba run -p "$BUILD_ENV" env EMCC_CFLAGS="-O2 -g0 -fPIC -msimd128" em++ \ + -std=c11 -x c \ + -DZENOH_EMSCRIPTEN -DRMW_IMPLEMENTATION=rmw_zenoh_pico \ + "${INCLUDE_FLAGS[@]}" \ + -sMAIN_MODULE=2 \ + -s ASSERTIONS=1 \ + -fexceptions \ + -sWASM_BIGINT \ + -s USE_ZLIB=1 -s USE_SQLITE3=1 -s USE_BZIP2=1 \ + -lwebsocket.js \ + -sASYNCIFY -s ASYNCIFY_STACK_SIZE=24576 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s STACK_SIZE=5MB \ + -s INITIAL_MEMORY=67108864 -s MAXIMUM_MEMORY=1024MB \ + --embed-file "$PY/lib/python3.13@/pyhome/lib/python3.13" \ + --embed-file "$SP@/pyhome/site-packages" \ + --embed-file "$DEMO_DIR/talker_rclpy.py@/pyhome/talker_rclpy.py" \ + -L"$PY/lib" \ + -L"$PREFIX/lib" \ + -L"$PREFIX/microcdr-2.0.2/lib" \ + -Wl,--allow-multiple-definition \ + "$DEMO_DIR/rclpy_boot.c" \ + "$DEMO_DIR/wasm_link_stubs_rclpy.c" \ + -Wl,--start-group -lpython3.13 -lffi -llzma "${LIBS[@]}" -Wl,--end-group \ + -o "$DEMO_DIR/out/rclpy_boot.js" + +echo "Build finished: $DEMO_DIR/out/rclpy_boot.js / rclpy_boot.wasm" + +# Emscripten's MAIN_MODULE loader resolves each "needed" shared library by +# basename, relative to the deployed .js file's own directory -- not via the +# -L paths used at link time above. Every dylink dependency has to sit flat +# next to rclpy_boot.js, regardless of where it lived in demo_env/. +cp "$PREFIX"/lib/*.so "$DEMO_DIR/out/" +cp -L "$PREFIX"/microcdr-2.0.2/lib/*.so* "$DEMO_DIR/out/" +find "$SP" -iname "*.so" -exec cp {} "$DEMO_DIR/out/" \; +cp "$DEMO_DIR/index_rclpy.html" "$DEMO_DIR/out/index_rclpy.html" +echo "Deployed $(find "$DEMO_DIR/out" -iname '*.so' | wc -l | tr -d ' ') shared libraries to $DEMO_DIR/out/" diff --git a/browser_demo/index_rclpy.html b/browser_demo/index_rclpy.html new file mode 100644 index 000000000..47b5c8c85 --- /dev/null +++ b/browser_demo/index_rclpy.html @@ -0,0 +1,20 @@ + + +wasm32 rclpy talker (rmw_zenoh_pico) + +

wasm32 rclpy talker (rmw_zenoh_pico)

+

+
+
+
+
diff --git a/browser_demo/nettest.c b/browser_demo/nettest.c
new file mode 100644
index 000000000..a938b5e50
--- /dev/null
+++ b/browser_demo/nettest.c
@@ -0,0 +1,31 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+int main(void) {
+  printf("nettest: starting\n");
+  struct addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = PF_UNSPEC;
+  hints.ai_socktype = SOCK_STREAM;
+  hints.ai_protocol = IPPROTO_TCP;
+  struct addrinfo * res = NULL;
+  int gai = getaddrinfo("127.0.0.1", "10000", &hints, &res);
+  printf("nettest: getaddrinfo rc=%d errno=%d (%s)\n", gai, errno, strerror(errno));
+  if (gai != 0 || res == NULL) {
+    printf("nettest: getaddrinfo failed, aborting\n");
+    return 1;
+  }
+  int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+  printf("nettest: socket() fd=%d errno=%d (%s)\n", fd, errno, strerror(errno));
+  if (fd < 0) {
+    return 1;
+  }
+  int rc = connect(fd, res->ai_addr, res->ai_addrlen);
+  printf("nettest: connect() rc=%d errno=%d (%s)\n", rc, errno, strerror(errno));
+  printf("nettest: done\n");
+  return 0;
+}
diff --git a/browser_demo/proxy.py b/browser_demo/proxy.py
new file mode 100644
index 000000000..f8aa21dc2
--- /dev/null
+++ b/browser_demo/proxy.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+"""Single-origin reverse proxy for the browser demo.
+
+The Browser pane sandbox only tunnels the one origin actively registered via
+preview_start/.claude launch.json -- a page-initiated WebSocket connection to
+a *different* host port bypasses that tunnel and hits the sandbox's own
+(empty) network stack, regardless of whether the target port is genuinely
+open on the real host. So both the static files and the zenoh WS router must
+be reachable through the SAME origin/port: this proxy listens on one port and
+either (a) forwards a WebSocket upgrade request to zenohd's WS listener, byte
+-splicing the raw socket both ways, or (b) forwards a plain HTTP request to
+the static file server.
+"""
+import asyncio
+import sys
+
+LISTEN_PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 8765
+STATIC_PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 8766
+ZENOH_WS_PORT = int(sys.argv[3]) if len(sys.argv) > 3 else 7447
+
+
+async def pipe(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
+    try:
+        while True:
+            data = await reader.read(65536)
+            if not data:
+                break
+            writer.write(data)
+            await writer.drain()
+    except (ConnectionResetError, BrokenPipeError):
+        pass
+    finally:
+        writer.close()
+
+
+async def handle(client_reader: asyncio.StreamReader, client_writer: asyncio.StreamWriter):
+    try:
+        head = await client_reader.read(65536)
+    except Exception:
+        client_writer.close()
+        return
+    if not head:
+        client_writer.close()
+        return
+
+    is_ws_upgrade = b"upgrade: websocket" in head.lower()
+    target_port = ZENOH_WS_PORT if is_ws_upgrade else STATIC_PORT
+    print(f"proxy: connection, ws_upgrade={is_ws_upgrade} -> port {target_port}, first_line={head.splitlines()[0] if head else b''}", flush=True)
+
+    try:
+        upstream_reader, upstream_writer = await asyncio.open_connection("127.0.0.1", target_port)
+    except OSError:
+        client_writer.close()
+        return
+
+    upstream_writer.write(head)
+    await upstream_writer.drain()
+
+    await asyncio.gather(
+        pipe(client_reader, upstream_writer),
+        pipe(upstream_reader, client_writer),
+    )
+
+
+async def main():
+    server = await asyncio.start_server(handle, "127.0.0.1", LISTEN_PORT)
+    print(f"proxy: listening on 127.0.0.1:{LISTEN_PORT} -> static:{STATIC_PORT} ws:{ZENOH_WS_PORT}")
+    async with server:
+        await server.serve_forever()
+
+
+if __name__ == "__main__":
+    asyncio.run(main())
diff --git a/browser_demo/pytest_boot.c b/browser_demo/pytest_boot.c
new file mode 100644
index 000000000..e38d98b70
--- /dev/null
+++ b/browser_demo/pytest_boot.c
@@ -0,0 +1,13 @@
+#include 
+#include 
+
+int main(int argc, char *argv[]) {
+  printf("pytest_boot: initializing CPython\n");
+  Py_SetPythonHome(L"/pyhome");
+  Py_Initialize();
+  printf("pytest_boot: initialized, running script\n");
+  int rc = PyRun_SimpleString("import sys; print('hello from embedded cpython', sys.version)");
+  printf("pytest_boot: PyRun_SimpleString rc=%d\n", rc);
+  Py_Finalize();
+  return 0;
+}
diff --git a/browser_demo/rclpy_boot.c b/browser_demo/rclpy_boot.c
new file mode 100644
index 000000000..264fee88a
--- /dev/null
+++ b/browser_demo/rclpy_boot.c
@@ -0,0 +1,87 @@
+// Embeds CPython + rclpy directly, rather than launching a standalone
+// python.js: this Python is built with --enable-wasm-pthreads (see
+// extra_recipes/python/), and CPython's own docs flag pthreads + its
+// --enable-wasm-dynamic-linking (needed for Python's normal `import` of a
+// compiled .so extension module) as known-crashy together -- so this build
+// doesn't enable dynamic linking, and every compiled extension module any
+// imported code might reach (rclpy's own pybind11 module, each message
+// package's rosidl_generator_py typesupport accessor, numpy's C extensions)
+// has to be registered ahead of time via PyImport_AppendInittab() instead of
+// left for Python's import system to dlopen on demand.
+
+#include 
+#include 
+#include 
+
+PyMODINIT_FUNC PyInit__rclpy_pybind11(void);
+PyMODINIT_FUNC PyInit_rcl_interfaces_s__rosidl_typesupport_c(void);
+PyMODINIT_FUNC PyInit_builtin_interfaces_s__rosidl_typesupport_c(void);
+PyMODINIT_FUNC PyInit_std_msgs_s__rosidl_typesupport_c(void);
+PyMODINIT_FUNC PyInit_type_description_interfaces_s__rosidl_typesupport_c(void);
+PyMODINIT_FUNC PyInit_service_msgs_s__rosidl_typesupport_c(void);
+PyMODINIT_FUNC PyInit__multiarray_umath(void);
+PyMODINIT_FUNC PyInit__simd(void);
+PyMODINIT_FUNC PyInit__umath_linalg(void);
+PyMODINIT_FUNC PyInit_lapack_lite(void);
+PyMODINIT_FUNC PyInit__pocketfft_umath(void);
+PyMODINIT_FUNC PyInit__common(void);
+PyMODINIT_FUNC PyInit__bounded_integers(void);
+PyMODINIT_FUNC PyInit_bit_generator(void);
+PyMODINIT_FUNC PyInit_mtrand(void);
+PyMODINIT_FUNC PyInit__philox(void);
+PyMODINIT_FUNC PyInit__sfc64(void);
+PyMODINIT_FUNC PyInit__generator(void);
+PyMODINIT_FUNC PyInit__pcg64(void);
+PyMODINIT_FUNC PyInit__mt19937(void);
+
+int main(int argc, char *argv[]) {
+  setenv("RCL_LOGGING_IMPLEMENTATION", "rcl_logging_noop", 1);
+  // rcl_interfaces / type_description_interfaces / service_msgs below are
+  // linked against a rebuild with STATIC_ROSIDL_TYPESUPPORT_C=microxrcedds_c
+  // but STATIC_ROSIDL_TYPESUPPORT_CPP left on introspection: the known
+  // rosidl_typesupport_microxrcedds_cpp codegen gap for service "_Event"
+  // messages is specific to the C++ backend -- the C backend those packages
+  // need for rmw_zenoh_pico builds fine.
+  struct { const char *name; PyObject *(*init)(void); } mods[] = {
+    {"_rclpy_pybind11", PyInit__rclpy_pybind11},
+    {"rcl_interfaces.rcl_interfaces_s__rosidl_typesupport_c", PyInit_rcl_interfaces_s__rosidl_typesupport_c},
+    {"builtin_interfaces.builtin_interfaces_s__rosidl_typesupport_c", PyInit_builtin_interfaces_s__rosidl_typesupport_c},
+    {"std_msgs.std_msgs_s__rosidl_typesupport_c", PyInit_std_msgs_s__rosidl_typesupport_c},
+    {"type_description_interfaces.type_description_interfaces_s__rosidl_typesupport_c", PyInit_type_description_interfaces_s__rosidl_typesupport_c},
+    {"service_msgs.service_msgs_s__rosidl_typesupport_c", PyInit_service_msgs_s__rosidl_typesupport_c},
+    {"numpy._core._multiarray_umath", PyInit__multiarray_umath},
+    {"numpy._core._simd", PyInit__simd},
+    {"numpy.linalg._umath_linalg", PyInit__umath_linalg},
+    {"numpy.linalg.lapack_lite", PyInit_lapack_lite},
+    {"numpy.fft._pocketfft_umath", PyInit__pocketfft_umath},
+    {"numpy.random._common", PyInit__common},
+    {"numpy.random._bounded_integers", PyInit__bounded_integers},
+    {"numpy.random.bit_generator", PyInit_bit_generator},
+    {"numpy.random.mtrand", PyInit_mtrand},
+    {"numpy.random._philox", PyInit__philox},
+    {"numpy.random._sfc64", PyInit__sfc64},
+    {"numpy.random._generator", PyInit__generator},
+    {"numpy.random._pcg64", PyInit__pcg64},
+    {"numpy.random._mt19937", PyInit__mt19937},
+  };
+  for (size_t i = 0; i < sizeof(mods) / sizeof(mods[0]); i++) {
+    if (PyImport_AppendInittab(mods[i].name, mods[i].init) == -1) {
+      printf("rclpy_boot: AppendInittab failed for %s\n", mods[i].name);
+      return 1;
+    }
+  }
+  Py_SetPythonHome(L"/pyhome");
+  Py_Initialize();
+
+  int rc = PyRun_SimpleString(
+    "import sys\n"
+    "sys.path.insert(0, '/pyhome/site-packages')\n"
+    "exec(open('/pyhome/talker_rclpy.py').read())\n"
+  );
+  printf("rclpy_boot: PyRun_SimpleString rc=%d\n", rc);
+  if (rc != 0) {
+    PyErr_Print();
+  }
+  Py_Finalize();
+  return rc;
+}
diff --git a/browser_demo/serve.py b/browser_demo/serve.py
new file mode 100644
index 000000000..9fb86ba4e
--- /dev/null
+++ b/browser_demo/serve.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+import http.server
+import functools
+import sys
+
+class Handler(http.server.SimpleHTTPRequestHandler):
+    def end_headers(self):
+        self.send_header("Cross-Origin-Opener-Policy", "same-origin")
+        self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
+        super().end_headers()
+
+if __name__ == "__main__":
+    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8765
+    handler = functools.partial(Handler, directory="out")
+    http.server.ThreadingHTTPServer(("127.0.0.1", port), handler).serve_forever()
diff --git a/browser_demo/talker.cpp b/browser_demo/talker.cpp
new file mode 100644
index 000000000..7f557ca22
--- /dev/null
+++ b/browser_demo/talker.cpp
@@ -0,0 +1,40 @@
+#include 
+#include 
+#include 
+
+#include "rclcpp/rclcpp.hpp"
+#include "std_msgs/msg/string.hpp"
+
+using namespace std::chrono_literals;
+
+class TalkerNode : public rclcpp::Node
+{
+public:
+  TalkerNode() : Node("wasm_zenoh_talker"), count_(0)
+  {
+    publisher_ = this->create_publisher("chatter", 10);
+    timer_ = this->create_wall_timer(
+      500ms, std::bind(&TalkerNode::on_timer, this));
+  }
+
+private:
+  void on_timer()
+  {
+    auto message = std_msgs::msg::String();
+    message.data = "Hello from wasm32 (rmw_zenoh_pico) #" + std::to_string(count_++);
+    RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
+    publisher_->publish(message);
+  }
+
+  size_t count_;
+  rclcpp::TimerBase::SharedPtr timer_;
+  rclcpp::Publisher::SharedPtr publisher_;
+};
+
+int main(int argc, char ** argv)
+{
+  rclcpp::init(argc, argv);
+  rclcpp::spin(std::make_shared());
+  rclcpp::shutdown();
+  return 0;
+}
diff --git a/browser_demo/talker_rclc.c b/browser_demo/talker_rclc.c
new file mode 100644
index 000000000..1f3e6f5e5
--- /dev/null
+++ b/browser_demo/talker_rclc.c
@@ -0,0 +1,65 @@
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RCCHECK(fn) { rcl_ret_t rc = fn; if (rc != RCL_RET_OK) { \
+  printf("Failed status on line %d: %d\n", __LINE__, (int)rc); } }
+
+rcl_publisher_t publisher;
+std_msgs__msg__String msg;
+size_t counter = 0;
+
+void timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t next_call_time)
+{
+  (void) next_call_time;
+  (void) last_call_time;
+  if (timer == NULL) {
+    return;
+  }
+  char buf[128];
+  snprintf(buf, sizeof(buf), "Hello from wasm32 rclc (rmw_zenoh_pico) #%zu", counter++);
+  rosidl_runtime_c__String__assign(&msg.data, buf);
+  printf("Publishing: '%s'\n", buf);
+  RCCHECK(rcl_publish(&publisher, &msg, NULL));
+}
+
+int main(int argc, char const * const * argv)
+{
+  rcl_allocator_t allocator = rcl_get_default_allocator();
+  rclc_support_t support;
+  RCCHECK(rclc_support_init(&support, argc, argv, &allocator));
+
+  rcl_node_t node = rcl_get_zero_initialized_node();
+  RCCHECK(rclc_node_init_default(&node, "wasm_zenoh_talker_rclc", "", &support));
+
+  RCCHECK(rclc_publisher_init_default(
+    &publisher, &node,
+    ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String),
+    "chatter"));
+
+  rcl_timer_t timer = rcl_get_zero_initialized_timer();
+  RCCHECK(rclc_timer_init_default(
+    &timer, &support, RCL_MS_TO_NS(500), timer_callback));
+
+  rclc_executor_t executor;
+  RCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator));
+  RCCHECK(rclc_executor_add_timer(&executor, &timer));
+
+  std_msgs__msg__String__init(&msg);
+
+  printf("wasm32 rclc talker starting, publishing on 'chatter' via rmw_zenoh_pico\n");
+
+  while (true) {
+    rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
+  }
+
+  RCCHECK(rcl_publisher_fini(&publisher, &node));
+  RCCHECK(rcl_node_fini(&node));
+
+  return 0;
+}
diff --git a/browser_demo/talker_rclpy.py b/browser_demo/talker_rclpy.py
new file mode 100644
index 000000000..4a73b0de0
--- /dev/null
+++ b/browser_demo/talker_rclpy.py
@@ -0,0 +1,38 @@
+import rclpy
+from rclpy.node import Node
+from rclpy.event_handler import PublisherEventCallbacks
+from std_msgs.msg import String
+
+print("talker_rclpy: rclpy.init()", flush=True)
+rclpy.init(args=[])
+
+# start_parameter_services=False: the parameter get/set/list services pull in
+# service_msgs.ServiceEventInfo's service-introspection "_Event" type, which
+# hits the still-unpatched rosidl_typesupport_microxrcedds_cpp codegen gap
+# (see rclpy_boot.c for the microxrcedds_c-only workaround used elsewhere).
+# Not needed for a plain talker.
+node = Node('wasm_rclpy_talker', enable_rosout=False, start_parameter_services=False)
+
+# rmw_zenoh_pico doesn't support QoS event handlers (RCL_PUBLISHER_OFFERED_
+# INCOMPATIBLE_QOS etc.) -- it fails with a plain RCLError instead of the
+# UnsupportedEventTypeError rclpy's own create_event_handlers() already
+# catches and ignores, so the default callback has to be turned off
+# explicitly. The same fix is applied to the internal /parameter_events
+# publisher via a local rclpy/node.py patch (see demo_env/README).
+pub = node.create_publisher(
+    String, 'chatter_rclpy', 10,
+    event_callbacks=PublisherEventCallbacks(use_default_callbacks=False))
+
+count = [0]
+
+
+def timer_cb():
+    msg = String()
+    msg.data = 'hello from rclpy wasm32 #%d' % count[0]
+    pub.publish(msg)
+    print('talker_rclpy: published:', msg.data, flush=True)
+    count[0] += 1
+
+
+node.create_timer(1.0, timer_cb)
+rclpy.spin(node)
diff --git a/browser_demo/wasm_link_stubs.c b/browser_demo/wasm_link_stubs.c
new file mode 100644
index 000000000..bb48099b9
--- /dev/null
+++ b/browser_demo/wasm_link_stubs.c
@@ -0,0 +1,185 @@
+// Link-time-only stubs for symbols that some wasm32 SIDE_MODULEs in this
+// build declare as "needed" (Emscripten's MAIN_MODULE dynamic linker
+// resolves every declared import eagerly, even ones dead-code-elimination
+// would otherwise drop) but that this demo never actually calls at runtime:
+//
+//  - rmw_get_* graph-introspection functions: rmw_zenoh_pico (esol-community)
+//    implements the core pub/sub/service lifecycle but not the "list
+//    topics/services/nodes" introspection family -- confirmed via `nm` on
+//    its own .so, 2026-09-09. librcl.so unconditionally exports wrappers
+//    around these, so any rcl-based executable needs them resolvable even
+//    if, like this talker, it never calls rcl_get_topic_names_and_types().
+//  - dlinfo/pthread_setname_np/pthread_getname_np: rcutils/rcpputils use
+//    these Linux-only APIs for a thread-naming debug utility with no
+//    Emscripten guard (same class of gap as tracetools/
+//    rmw_test_fixture_implementation elsewhere in this build).
+//  - Python C-API symbols: the combined rosidl message-typesupport .so's
+//    (rcl_interfaces, std_msgs, etc.) declare a dylink "needed" dependency
+//    on their own sibling *_rosidl_generator_py.so purely as an artifact of
+//    how those packages bundle every typesupport variant together -- no
+//    code here uses rclpy/Python.
+//
+// None of these are ever actually invoked by this C-only demo; they exist
+// solely so Emscripten's MAIN_MODULE loader can resolve every import.
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+// ---- rmw graph-introspection stubs -----------------------------------
+const char * rmw_get_implementation_identifier(void) { return "rmw_zenoh_pico"; }
+
+rmw_ret_t rmw_get_topic_names_and_types(
+  const rmw_node_t * node, rcutils_allocator_t * allocator, bool no_demangle,
+  rmw_names_and_types_t * topic_names_and_types)
+{
+  (void)node; (void)allocator; (void)no_demangle; (void)topic_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_service_names_and_types(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  rmw_names_and_types_t * service_names_and_types)
+{
+  (void)node; (void)allocator; (void)service_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_publisher_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace, bool no_demangle,
+  rmw_names_and_types_t * topic_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)no_demangle; (void)topic_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_subscriber_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace, bool no_demangle,
+  rmw_names_and_types_t * topic_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)no_demangle; (void)topic_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_service_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace,
+  rmw_names_and_types_t * service_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)service_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_client_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace,
+  rmw_names_and_types_t * service_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)service_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_clients_info_by_service(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * service_name, bool no_mangle,
+  rmw_service_endpoint_info_array_t * clients_info)
+{
+  (void)node; (void)allocator; (void)service_name; (void)no_mangle; (void)clients_info;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_servers_info_by_service(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * service_name, bool no_mangle,
+  rmw_service_endpoint_info_array_t * servers_info)
+{
+  (void)node; (void)allocator; (void)service_name; (void)no_mangle; (void)servers_info;
+  return RMW_RET_UNSUPPORTED;
+}
+
+// ---- posix thread-naming / dl introspection stubs ----------------------
+int dlinfo(void * handle, int request, void * info)
+{
+  (void)handle; (void)request; (void)info;
+  return -1;
+}
+
+int pthread_setname_np(unsigned long thread, const char * name)
+{
+  (void)thread; (void)name;
+  return 0;
+}
+
+int pthread_getname_np(unsigned long thread, char * name, size_t len)
+{
+  (void)thread;
+  if (name != NULL && len > 0) { name[0] = '\0'; }
+  return 0;
+}
+
+// ---- CPython C-API stubs (never reached: this demo doesn't use rclpy) --
+typedef struct _object PyObject;
+typedef struct _object PyTypeObject;
+struct _stub_py_storage { long placeholder; };
+
+#define STUB_TYPE(name) struct _stub_py_storage name##_storage; \
+  PyTypeObject * name = (PyTypeObject *)&name##_storage;
+
+PyObject * PyBool_FromLong(long v) { (void)v; return NULL; }
+STUB_TYPE(PyBool_Type)
+void PyBuffer_Release(void * view) { (void)view; }
+int PyBuffer_ToContiguous(void * buf, void * view, size_t len, char order)
+{ (void)buf; (void)view; (void)len; (void)order; return -1; }
+PyObject * PyBytes_FromStringAndSize(const char * v, ssize_t len) { (void)v; (void)len; return NULL; }
+void PyErr_Clear(void) {}
+void PyErr_SetString(PyObject * type, const char * message) { (void)type; (void)message; }
+struct _stub_py_storage _PyExc_RuntimeError_storage;
+PyObject * PyExc_RuntimeError = (PyObject *)&_PyExc_RuntimeError_storage;
+PyObject * PyFloat_FromDouble(double v) { (void)v; return NULL; }
+STUB_TYPE(PyFloat_Type)
+PyObject * PyImport_ImportModule(const char * name) { (void)name; return NULL; }
+PyObject * PyList_New(ssize_t len) { (void)len; return NULL; }
+int PyList_SetItem(PyObject * list, ssize_t index, PyObject * item)
+{ (void)list; (void)index; (void)item; return -1; }
+long PyLong_AsLong(PyObject * obj) { (void)obj; return 0; }
+long long PyLong_AsLongLong(PyObject * obj) { (void)obj; return 0; }
+size_t PyLong_AsSize_t(PyObject * obj) { (void)obj; return 0; }
+unsigned long PyLong_AsUnsignedLong(PyObject * obj) { (void)obj; return 0; }
+unsigned long long PyLong_AsUnsignedLongLong(PyObject * obj) { (void)obj; return 0; }
+PyObject * PyLong_FromLong(long v) { (void)v; return NULL; }
+PyObject * PyLong_FromLongLong(long long v) { (void)v; return NULL; }
+PyObject * PyLong_FromUnsignedLong(unsigned long v) { (void)v; return NULL; }
+PyObject * PyLong_FromUnsignedLongLong(unsigned long long v) { (void)v; return NULL; }
+PyObject * PyObject_CallFunctionObjArgs(PyObject * callable, ...) { (void)callable; return NULL; }
+PyObject * PyObject_CallObject(PyObject * callable, PyObject * args) { (void)callable; (void)args; return NULL; }
+int PyObject_CheckBuffer(PyObject * obj) { (void)obj; return 0; }
+PyObject * PyObject_GetAttrString(PyObject * obj, const char * attr) { (void)obj; (void)attr; return NULL; }
+int PyObject_GetBuffer(PyObject * obj, void * view, int flags) { (void)obj; (void)view; (void)flags; return -1; }
+int PyObject_SetAttrString(PyObject * obj, const char * attr, PyObject * value)
+{ (void)obj; (void)attr; (void)value; return -1; }
+ssize_t PyObject_Size(PyObject * obj) { (void)obj; return -1; }
+int PySequence_Check(PyObject * obj) { (void)obj; return 0; }
+PyObject * PySequence_Fast(PyObject * obj, const char * message) { (void)obj; (void)message; return NULL; }
+ssize_t PySequence_Size(PyObject * obj) { (void)obj; return -1; }
+int PyType_IsSubtype(PyTypeObject * a, PyTypeObject * b) { (void)a; (void)b; return 0; }
+const char * PyUnicode_AsUTF8(PyObject * obj) { (void)obj; return NULL; }
+PyObject * PyUnicode_AsUTF8String(PyObject * obj) { (void)obj; return NULL; }
+PyObject * PyUnicode_DecodeUTF8(const char * s, ssize_t size, const char * errors)
+{ (void)s; (void)size; (void)errors; return NULL; }
+void _Py_Dealloc(PyObject * obj) { (void)obj; }
+struct _stub_py_storage _Py_TrueStruct_storage;
+PyObject * _Py_TrueStruct = (PyObject *)&_Py_TrueStruct_storage;
diff --git a/browser_demo/wasm_link_stubs_rclpy.c b/browser_demo/wasm_link_stubs_rclpy.c
new file mode 100644
index 000000000..45e580a14
--- /dev/null
+++ b/browser_demo/wasm_link_stubs_rclpy.c
@@ -0,0 +1,111 @@
+// Same rmw graph-introspection / posix thread-naming stubs as
+// browser_demo/wasm_link_stubs.c, minus the CPython C-API section --
+// this build links a real libpython3.13.a, so those symbols are no
+// longer stubs, they're the genuine implementations.
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+const char * rmw_get_implementation_identifier(void) { return "rmw_zenoh_pico"; }
+
+rmw_ret_t rmw_get_topic_names_and_types(
+  const rmw_node_t * node, rcutils_allocator_t * allocator, bool no_demangle,
+  rmw_names_and_types_t * topic_names_and_types)
+{
+  (void)node; (void)allocator; (void)no_demangle; (void)topic_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_service_names_and_types(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  rmw_names_and_types_t * service_names_and_types)
+{
+  (void)node; (void)allocator; (void)service_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_publisher_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace, bool no_demangle,
+  rmw_names_and_types_t * topic_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)no_demangle; (void)topic_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_subscriber_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace, bool no_demangle,
+  rmw_names_and_types_t * topic_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)no_demangle; (void)topic_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_service_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace,
+  rmw_names_and_types_t * service_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)service_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_client_names_and_types_by_node(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * node_name, const char * node_namespace,
+  rmw_names_and_types_t * service_names_and_types)
+{
+  (void)node; (void)allocator; (void)node_name; (void)node_namespace;
+  (void)service_names_and_types;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_clients_info_by_service(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * service_name, bool no_mangle,
+  rmw_service_endpoint_info_array_t * clients_info)
+{
+  (void)node; (void)allocator; (void)service_name; (void)no_mangle; (void)clients_info;
+  return RMW_RET_UNSUPPORTED;
+}
+
+rmw_ret_t rmw_get_servers_info_by_service(
+  const rmw_node_t * node, rcutils_allocator_t * allocator,
+  const char * service_name, bool no_mangle,
+  rmw_service_endpoint_info_array_t * servers_info)
+{
+  (void)node; (void)allocator; (void)service_name; (void)no_mangle; (void)servers_info;
+  return RMW_RET_UNSUPPORTED;
+}
+
+int dlinfo(void * handle, int request, void * info)
+{
+  (void)handle; (void)request; (void)info;
+  return -1;
+}
+
+int pthread_setname_np(unsigned long thread, const char * name)
+{
+  (void)thread; (void)name;
+  return 0;
+}
+
+int pthread_getname_np(unsigned long thread, char * name, size_t len)
+{
+  (void)thread;
+  if (name != NULL && len > 0) { name[0] = '\0'; }
+  return 0;
+}
diff --git a/conda_build_config.yaml b/conda_build_config.yaml
index 2b0ba3424..1244b99b3 100644
--- a/conda_build_config.yaml
+++ b/conda_build_config.yaml
@@ -1,14 +1,18 @@
 # Generated by vinca-pinning-render from vinca_pinning.yaml.
 # Do not edit this file directly.
 c_compiler:
-  - gcc                        # [linux]
-  - clang                      # [osx]
-  - vs2022                     # [win]
-# Please remember to update gcc_compiler_version & clang_compiler_version too.
+  - gcc  # [linux]
+  - clang # [osx]
+  - vs2022 # [win]
+  - emscripten # [emscripten]
 c_compiler_version:            # [unix]
-  - 15                           # [linux]
-  - 21                           # [osx]
-  - 14                           # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  - 15  # [linux]
+  - 21 # [osx]
+  - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+    # Matches emscripten-forge/recipes' variant.yaml c_compiler_version; refresh
+    # alongside cxx_compiler_version and emscripten_emscripten-wasm32 (below) when
+    # emscripten-forge bumps their emscripten SDK version.
+  - 4.0.9 # [emscripten]
 c_stdlib:
   - sysroot                    # [linux]
   - macosx_deployment_target   # [osx]
@@ -18,29 +22,47 @@ m2w64_c_stdlib:                # [win]
 m2w64_c_stdlib_version:        # [win]
   - 12                         # [win]
 c_stdlib_version:              # [unix]
-  - 2.28                         # [linux and not riscv64]
-  - 2.39                         # [linux and riscv64]
-  - 2.28                         # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
-  - 14.0                         # [osx]
+  - 2.28  # [linux and not riscv64]
+  - 2.39 # [linux and riscv64]
+  - 2.28 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  - 14.0 # [osx]
 cxx_compiler:
-  - gxx                        # [linux]
-  - clangxx                    # [osx]
-  - vs2022                     # [win]
-# Please remember to update gxx_compiler_version & clangxx_compiler_version too.
+  - gxx  # [linux]
+  - clangxx # [osx]
+  - vs2022 # [win]
+  - emscripten # [emscripten]
 cxx_compiler_version:          # [unix]
-  - 15                           # [linux]
-  - 21                           # [osx]
-  - 14                           # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  - 15  # [linux]
+  - 21 # [osx]
+  - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  - 4.0.9 # [emscripten]
+  # emscripten-wasm32 support: vinca's own selector namespace (v1_selectors.py)
+  # treats "unix" as linux OR osx OR emscripten OR wasi OR freebsd OR zos, so the
+  # base conda-forge-pinning zip_keys group -- [c_stdlib_version,
+  # c_compiler_version, cxx_compiler_version, fortran_compiler_version,
+  # cuda_compiler_version], all scoped [unix] -- silently applies to emscripten too,
+  # even though conda-forge itself never builds for that platform. Since emscripten
+  # needs its own compiler but has no Fortran toolchain, no libc sysroot, and no
+  # CUDA, simply adding an emscripten branch to c_compiler_version/
+  # cxx_compiler_version would leave them non-empty while c_stdlib_version/
+  # fortran_compiler_version/cuda_compiler_version stay empty for that platform --
+  # a zip-length mismatch ("Zip key elements do not all have same length"). Fixed
+  # by (1) restricting fortran_compiler_version's selector from [unix] to
+  # [linux or osx] so it no longer nominally covers emscripten, and (2) splitting
+  # zip_keys (below) into a [c_compiler_version, cxx_compiler_version] group
+  # (valid for linux/osx/emscripten alike, always 1 entry each) separate from the
+  # [c_stdlib_version, fortran_compiler_version, cuda_compiler_version] group
+  # (linux/osx only, always 0 entries -- i.e. absent -- on emscripten).
 llvm_openmp:                   # [osx]
   - 21                         # [osx]
 fortran_compiler:              # [unix or win]
   - gfortran                   # [unix]
   - flang                      # [win]
 fortran_compiler_version:      # [unix or win]
-  - 15                           # [unix]
-  - 5                            # [win64]
-  - 22                           # [win and arm64]
-  - 14                           # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  - 15  # [linux or osx]
+  - 5 # [win64]
+  - 22 # [win and arm64]
+  - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
 m2w64_c_compiler:                 # [win]
   - gcc                           # [win]
 m2w64_c_compiler_version:         # [win]
@@ -80,7 +102,7 @@ cuda_compiler:
   - cuda-nvcc
 cuda_compiler_version:
   - None
-  - 12.9                         # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  - 12.9  # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
 cuda_compiler_version_min:
   - None                       # [not ((linux and (x86_64 or aarch64)) or win64)]
   - 12.9                       # [((linux and (x86_64 or aarch64)) or win64)]
@@ -169,23 +191,11 @@ docker_image:                                       # [os.environ.get("BUILD_PLA
   - quay.io/condaforge/linux-anvil-ppc64le:alma10   # [os.environ.get("BUILD_PLATFORM") == "linux-ppc64le" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma10"]
 
 zip_keys:
-                                # [unix]
-  -   - c_compiler_version      # [unix]
-      - cxx_compiler_version    # [unix]
-      - fortran_compiler_version # [unix]
-    # CUDA 13.x requires newer glibc than our current baseline
-      - c_stdlib_version        # [linux and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
-      - cuda_compiler_version   # [linux and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
-  -   - python
-      - is_python_min
-  -   - libarrow
-      - libarrow_all
-  -   - root_base
-      - root_cxx_standard
-
-# armv7l specifics because conda-build sets many things to centos 6
-# this can probably be removed when conda-build gets updated defaults
-# for aarch64
+  -   - c_compiler_version
+      - cxx_compiler_version
+  -   - c_stdlib_version         # [linux or osx]
+      - fortran_compiler_version # [linux or osx]
+      - cuda_compiler_version    # [linux or osx]
 cdt_arch: armv7l                          # [armv7l]
 BUILD: armv7-conda_cos7-linux-gnueabihf   # [armv7l]
 
@@ -433,16 +443,8 @@ googleapis_cpp:
 gpgme:
   - '1.24'
 graphviz:
-  - '14'
-# Harfbuzz guarantees total ABI compatibiblity
-# The first version to have this new ABI pin is 11.0.1
-# https://github.com/conda-forge/harfbuzz-feedstock/pull/125
-# But as of 2025/08/03, 11.0.1 is quite "old" and it is pretty safe
-# to release the pin
-# We are leaving this comment here to discourage others from adding
-# a harfbuzz global pin, as it is not needed.
-# harfbuzz:
-# - '11'
+  - 15.1.0  # [emscripten]
+  - '14' # [not emscripten]
 hepmc2:
   - '2.06'
 hepmc3:
@@ -568,7 +570,8 @@ libevent:
 libexactreal:
   - '4'
 libffi:
-  - '3.5'
+  - 3.4.6  # [emscripten]
+  - '3.5' # [not emscripten]
 libflac:
   - '1.5'
 libflatsurf:
@@ -976,10 +979,15 @@ pythia8:
 python:
   # conda-forge supports only 3.14+ for win-arm64 and linux-riscv64
   # part of a zip_keys: python, is_python_min
-  - 3.14.* *_cp314
+  - 3.13.* *_cp313  # [emscripten]
+  - 3.14.* *_cp314 # [not emscripten]
 python_impl:
-  - cpython
-
+  - cpython  # Needed for cross-compiled targets: emitted whenever a recipe's
+  # `packages_select_by_deps`/host deps expand `cross-python_${{ target_platform }}`
+  # with target_platform == emscripten-wasm32. Not a conda-forge-pinning key at
+  # all (conda-forge doesn't cross-compile to emscripten), so it must be added
+  # here rather than merely overridden. Matches emscripten-forge/recipes'
+  # variant.yaml.
 python_min:
   # minimum supported python version per CFEP-25
   # bump to next minor version when we drop python versions
@@ -989,7 +997,8 @@ is_freethreading:
   - false
 is_python_min:
   # part of a zip_keys: python, is_python_min
-  - false
+  - false  # [emscripten]
+  - false # [not emscripten]
 is_abi3:
   - true
 pytorch:
@@ -1170,11 +1179,15 @@ zstd:
 libzenohc:
   - 1.9.0
 libzenohcxx:
-  - 1.9.0
-  # conda-forge published sip 6.16.1 on 2026-09-08, which broke ABI targeting for
-  # packages like qt_gui_cpp_sip that build against PyQt-sip's fixed ABI v12
-  # (hit this on humble/jazzy first; rolling also builds qt_gui_cpp via
-  # pyqt6/sip so it's equally exposed). Pin back to the last known-good line
-  # until upstream fixes it.
+  - 1.9.0  # emscripten-forge/recipes only publishes graphviz 15.1.0 -- our regular
+  # graphviz pin (from conda-forge-pinning) has no candidates there. Keep the
+  # base '14' pin for every other platform (if/then replaces the whole list,
+  # so the non-emscripten branch must be spelled out too).
 sip:
   - 6.15
+cross-python_emscripten-wasm32:
+  - 3.13.1  # The emscripten SDK/toolchain package version itself, keyed by vinca's
+  # `_` convention for cross-compilation toolchain
+  # packages. Keep in sync with c_compiler_version/cxx_compiler_version above.
+emscripten_emscripten-wasm32:
+  - 4.0.9
diff --git a/extra_recipes/microcdr/build.sh b/extra_recipes/microcdr/build.sh
new file mode 100755
index 000000000..b4d0efc9c
--- /dev/null
+++ b/extra_recipes/microcdr/build.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+# See extra_recipes/zenoh-pico/build.sh for why this is needed on
+# cross-compiling conda-forge toolchains.
+unset -f cmake || true
+
+# -DUCDR_ISOLATED_INSTALL=OFF: micro-CDR's own CMakeLists.txt defaults
+# this ON, appending "/${PROJECT_NAME}-${PROJECT_VERSION}" (here,
+# "microcdr-2.0.2") onto CMAKE_INSTALL_PREFIX -- meaning every other file
+# this build installs lands flat under $PREFIX/lib, $PREFIX/include, etc,
+# but microcdr's own lands nested under $PREFIX/microcdr-2.0.2/lib,
+# $PREFIX/microcdr-2.0.2/include. Harmless for a plain CMake consumer
+# (its own exported *Config.cmake sets absolute paths accordingly), but
+# genuinely breaks anything that assumes every package's files sit at
+# the same flat prefix -- confirmed two ways: browser_demo/build_rclc.sh
+# and build_rclpy.sh both need this package special-cased to a different
+# path than every other .so they link/copy, and jupyterlite-xeus's own
+# kernel-package eager-preload logic doesn't know to look here at all,
+# 404ing on libmicrocdr.so.2.0.2 at runtime in the real deployed
+# JupyterLite kernel. Flat install eliminates both problems at the
+# source instead of working around them downstream.
+
+mkdir -p build
+cd build
+
+if [[ $target_platform =~ emscripten.* ]]; then
+  # Building microcdr as a static archive (its own default) causes
+  # "duplicate symbol" wasm-ld errors once two consumers both link against
+  # it in the same final module (confirmed with rmw_zenoh_pico, which
+  # links microcdr directly AND transitively via
+  # rosidl_typesupport_microxrcedds_c's exported libraries, 2026-09-09) --
+  # wasm-ld treats the same static archive appearing twice on the link
+  # line as a hard error, unlike a normal linker. Build a real dynamically
+  # linked SIDE_MODULE .so instead, same fix as zenoh-pico's own build.sh.
+  # No real pthreads, and (as of 2026-09-13) no Asyncify either -- see
+  # vinca's build_ament_cmake.sh.in for the full rationale (Asyncify +
+  # runtime dlopen() of a SIDE_MODULE hits a real, unresolved
+  # Emscripten/Binaryen limitation). This package's own build.sh sets its
+  # shared-module flags directly (bypassing vinca's template, since it's
+  # a hand-written extra_recipe, not vinca-generated), so it needed this
+  # fix applied separately here too -- confirmed necessary the hard way:
+  # a plain vinca-template rebuild left this package's own hardcoded
+  # -sASYNCIFY untouched, still requiring a shared __asyncify_state
+  # global at dlopen() time even after every other package's Asyncify was
+  # dropped.
+  cat > "$SRC_DIR/__vinca_shared_lib_patch.cmake" <<'EOF'
+set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
+set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s ALLOW_MEMORY_GROWTH=1 ")
+EOF
+
+  emcmake cmake .. \
+    -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX="$PREFIX" \
+    -DCMAKE_TOOLCHAIN_FILE="$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" \
+    -DCMAKE_CROSSCOMPILING_EMULATOR="$BUILD_PREFIX/bin/node" \
+    -DCMAKE_PROJECT_INCLUDE="$SRC_DIR/__vinca_shared_lib_patch.cmake" \
+    -DUCDR_SUPERBUILD=OFF \
+    -DUCDR_ISOLATED_INSTALL=OFF \
+    -DUCDR_BUILD_TESTS=OFF \
+    -DUCDR_BUILD_EXAMPLES=OFF \
+    -DBUILD_SHARED_LIBS=ON
+else
+  cmake .. \
+    -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX="$PREFIX" \
+    -DUCDR_SUPERBUILD=OFF \
+    -DUCDR_ISOLATED_INSTALL=OFF \
+    -DUCDR_BUILD_TESTS=OFF \
+    -DUCDR_BUILD_EXAMPLES=OFF \
+    -DBUILD_SHARED_LIBS=OFF
+fi
+
+cmake --build . -j"${CPU_COUNT}"
+cmake --install .
diff --git a/extra_recipes/microcdr/recipe.yaml b/extra_recipes/microcdr/recipe.yaml
new file mode 100644
index 000000000..a29bc422b
--- /dev/null
+++ b/extra_recipes/microcdr/recipe.yaml
@@ -0,0 +1,39 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json
+#
+# Hand-written (not vinca-generated): not a ROS package, no package.xml.
+
+package:
+  name: microcdr
+  version: "2.0.2"
+
+source:
+  git: https://github.com/eProsima/micro-CDR.git
+  tag: "v2.0.2"
+
+build:
+  script: build.sh
+  # Bumped after switching static -> dynamic linking (no version bump).
+  # 1 -> 2: -DUCDR_ISOLATED_INSTALL=OFF, installing flat instead of under
+  # a nested microcdr-2.0.2/ subdirectory -- see build.sh's own comment.
+  number: 2
+
+requirements:
+  build:
+    - ${{ compiler('cxx') }}
+    - ${{ compiler('c') }}
+    - cmake
+    - ninja
+    - if: build_platform != target_platform
+      then:
+        - emscripten_emscripten-wasm32
+  host:
+  run:
+
+about:
+  license: Apache-2.0
+  summary: eProsima Micro CDR -- a small CDR (Common Data Representation) serialization library for constrained devices.
+  homepage: https://github.com/eProsima/micro-CDR
+
+extra:
+  recipe-maintainers:
+    - Tobias-Fischer
diff --git a/extra_recipes/zenoh-pico/build.sh b/extra_recipes/zenoh-pico/build.sh
new file mode 100755
index 000000000..24387942c
--- /dev/null
+++ b/extra_recipes/zenoh-pico/build.sh
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+# conda-forge's cross-compilation activation scripts define a `cmake` shell
+# function that auto-injects -DCMAKE_TOOLCHAIN_FILE/-DCMAKE_CROSSCOMPILING_EMULATOR
+# into every invocation -- including `cmake --build`/`cmake --install`, which
+# don't accept -D defines and fail with "Unknown argument". vinca's own
+# build_ament_cmake.sh.in does the same `unset -f cmake` before calling the
+# real binary directly for anything past the initial configure.
+unset -f cmake || true
+
+mkdir -p build
+cd build
+
+if [[ $target_platform =~ emscripten.* ]]; then
+  # No real pthreads, and (as of 2026-09-13) no Asyncify either -- see
+  # vinca's build_ament_cmake.sh.in for the full rationale (Asyncify +
+  # runtime dlopen() of a SIDE_MODULE hits a real, unresolved
+  # Emscripten/Binaryen limitation). Z_FEATURE_MULTI_THREAD=0 puts
+  # zenoh-pico into its already-existing single-threaded/no-RTOS mode
+  # (the same mode it uses for e.g. WITH_ARDUINO_OPENCR), where the
+  # application pumps the session manually via
+  # zp_read()/zp_send_keep_alive() instead of a background read thread
+  # signalling a condvar -- this project's own rmw_zenoh_pico patch calls
+  # these in a genuinely non-blocking, single-poll fashion whenever the
+  # requested rmw_wait timeout is exactly zero, never actually needing to
+  # cooperatively sleep at all (see that patch, and
+  # ros-rolling-emscripten-zenoh's AGENTS.md's "MAJOR PIVOT" section).
+  #
+  # TARGET_SUPPORTS_SHARED_LIBS still needs the explicit override:
+  # Emscripten.cmake's own default (TARGET_SUPPORTS_SHARED_LIBS=FALSE)
+  # silently downgrades BUILD_SHARED_LIBS=ON to a static libzenohpico.a,
+  # unrelated to threading.
+  cat > "$SRC_DIR/__vinca_shared_lib_patch.cmake" <<'EOF'
+set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
+set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s ALLOW_MEMORY_GROWTH=1 ")
+EOF
+
+  emcmake cmake .. \
+    -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX="$PREFIX" \
+    -DCMAKE_TOOLCHAIN_FILE="$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" \
+    -DCMAKE_CROSSCOMPILING_EMULATOR="$BUILD_PREFIX/bin/node" \
+    -DCMAKE_PROJECT_INCLUDE="$SRC_DIR/__vinca_shared_lib_patch.cmake" \
+    -DZP_PLATFORM=emscripten \
+    -DBUILD_SHARED_LIBS=ON \
+    -DZ_FEATURE_MULTI_THREAD=0 \
+    -DZ_FEATURE_LINK_WS=1 \
+    -DZ_FEATURE_LINK_TCP=0 \
+    -DZ_FEATURE_LINK_UDP_MULTICAST=0 \
+    -DZ_FEATURE_LINK_UDP_UNICAST=0 \
+    -DZ_FEATURE_SCOUTING_UDP=0 \
+    -DZ_FEATURE_LOCAL_SUBSCRIBER=1 \
+    -DZ_FEATURE_LOCAL_QUERYABLE=1 \
+    -DCMAKE_EXE_LINKER_FLAGS="-sALLOW_MEMORY_GROWTH=1" \
+    -DBUILD_EXAMPLES=OFF \
+    -DBUILD_TESTING=OFF
+else
+  cmake .. \
+    -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX="$PREFIX" \
+    -DBUILD_SHARED_LIBS=ON \
+    -DZ_FEATURE_MULTI_THREAD=1 \
+    -DZ_FEATURE_LINK_WS=1 \
+    -DZ_BUILD_EXAMPLES=OFF \
+    -DZ_BUILD_TESTS=OFF
+fi
+
+cmake --build . -j"${CPU_COUNT}"
+cmake --install .
diff --git a/extra_recipes/zenoh-pico/emscripten-nonblocking-io.patch b/extra_recipes/zenoh-pico/emscripten-nonblocking-io.patch
new file mode 100644
index 000000000..c4c43964a
--- /dev/null
+++ b/extra_recipes/zenoh-pico/emscripten-nonblocking-io.patch
@@ -0,0 +1,149 @@
+diff --git a/src/system/emscripten/network.c b/src/system/emscripten/network.c
+index 66f745fe..1e6b20bc 100644
+--- a/src/system/emscripten/network.c
++++ b/src/system/emscripten/network.c
+@@ -14,6 +14,7 @@
+ 
+ #include 
+ #include 
++#include 
+ #include 
+ #include 
+ #include 
+@@ -75,9 +76,34 @@ z_result_t _z_create_endpoint_ws(_z_sys_net_endpoint_t *ep, const char *s_addr,
+ void _z_free_endpoint_ws(_z_sys_net_endpoint_t *ep) { freeaddrinfo(ep->_iptcp); }
+ 
+ /*------------------ TCP sockets ------------------*/
++// NOTE (no-Asyncify): a session/link-open handshake attempt that fails
++// because a response simply hasn't arrived YET (see _z_read_ws/_z_send_ws
++// above) gets its link torn down by the generic, portable caller
++// (_z_new_transport_client() in transport/manager.c calls _z_link_free(),
++// which calls _z_close_ws() below) before returning -- normally correct
++// (a real failure shouldn't leak a socket), but fatal for retryability
++// here: every retry would open a brand new WebSocket that's *itself*
++// guaranteed to still be CONNECTING (not OPEN) by the time this same
++// synchronous call tries to use it, for exactly the same reason the
++// previous attempt failed. Persist the single underlying fd across
++// attempts instead, so a later retry (driven by rmw_zenoh_pico's
++// session_connect(), itself called repeatedly from a Python-side `await
++// asyncio.sleep()` loop) resumes the SAME, hopefully-by-now-further-along
++// connection rather than starting a new, equally-doomed one. This project
++// only ever opens one zenoh session to one locator at a time, so a single
++// slot (no per-locator keying) is sufficient -- see _z_close_ws() below,
++// which intentionally does NOT close this fd for the same reason.
++static int _z_ws_persistent_fd = -1;
++
+ z_result_t _z_open_ws(_z_sys_net_socket_t *sock, const _z_sys_net_endpoint_t rep, uint32_t tout) {
+     z_result_t ret = _Z_RES_OK;
+ 
++    if (_z_ws_persistent_fd != -1) {
++        sock->_ws._fd = _z_ws_persistent_fd;
++        sock->_ws._tout = tout;
++        return _Z_RES_OK;
++    }
++
+     sock->_ws._fd = socket(rep._iptcp->ai_family, rep._iptcp->ai_socktype, rep._iptcp->ai_protocol);
+     if (sock->_ws._fd != -1) {
+         // WARNING: commented because setsockopt is not implemented in emscripten
+@@ -105,12 +131,23 @@ z_result_t _z_open_ws(_z_sys_net_socket_t *sock, const _z_sys_net_endpoint_t rep
+             }
+         }
+ 
+-        // WARNING: workaround as connect returns before the websocket is
+-        // actually open.
+-        z_sleep_ms(100);
++        // NOTE (no-Asyncify): connect() returns immediately regardless of
++        // whether the underlying browser WebSocket has actually finished its
++        // handshake yet (a real Emscripten/browser characteristic, not a bug
++        // -- see network.c's own original comment above). This used to be
++        // "fixed" with a z_sleep_ms() heuristic delay, but that relied on
++        // emscripten_sleep()'s Asyncify-only cooperative yield, which this
++        // build doesn't have (see z_sleep_ms's own comment in system.c) --
++        // it was never actually waiting for anything once Asyncify was
++        // dropped project-wide. Removed: the caller (the zenoh session/link
++        // open handshake, itself restructured to be non-blocking/resumable
++        // -- see rmw_zenoh_pico's session_connect_poll()) is responsible for
++        // retrying until the socket is genuinely usable, not this function.
+ 
+         if (ret != _Z_RES_OK) {
+             close(sock->_ws._fd);
++        } else {
++            _z_ws_persistent_fd = sock->_ws._fd;
+         }
+     } else {
+         _Z_ERROR_LOG(_Z_ERR_GENERIC);
+@@ -132,20 +169,36 @@ z_result_t _z_listen_ws(_z_sys_net_socket_t *sock, const _z_sys_net_endpoint_t l
+     return ret;
+ }
+ 
+-void _z_close_ws(_z_sys_net_socket_t *sock) { close(sock->_ws._fd); }
++void _z_close_ws(_z_sys_net_socket_t *sock) {
++    // NOTE (no-Asyncify): intentionally NOT closing the real fd here -- see
++    // _z_open_ws()'s _z_ws_persistent_fd comment above. This is called on
++    // every failed/incomplete handshake attempt (as part of the generic,
++    // portable link-teardown path), which -- without Asyncify -- is most
++    // attempts, by design, until enough real wall-clock time has passed
++    // (across separate Python-driven retries) for the browser to actually
++    // finish connecting/responding. A real close() here would throw away
++    // that progress every single time.
++    (void)sock;
++}
+ 
+ size_t _z_read_ws(const _z_sys_net_socket_t sock, uint8_t *ptr, size_t len) {
+-    // WARNING: workaroud implementing here the timeout
+-    ssize_t rb = 0;
+-    z_time_t start = z_time_now();
+-    while ((z_time_elapsed_ms(&start) < sock._ws._tout) && (rb <= 0)) {
+-        z_sleep_ms(WS_LINK_SLEEP);  // WARNING: workaround need to give the hand to the emscripten threads
+-        rb = recv(sock._ws._fd, ptr, len, 0);
+-    }
++    // NOTE (no-Asyncify): this used to retry recv() in a loop for up to
++    // sock._ws._tout milliseconds, sleeping WS_LINK_SLEEP between attempts
++    // to "give the hand to the emscripten threads" -- but that sleep was
++    // emscripten_sleep(), which cannot actually yield without Asyncify (see
++    // system.c's z_sleep_ms). A JS-delivered WebSocket 'message' event (the
++    // only way recv()'s underlying buffer ever gets more data) can only fire
++    // once this synchronous call returns control to the browser's own event
++    // loop -- no amount of internal looping/sleeping can make that happen.
++    // So: try exactly once, return immediately either way, and let the
++    // caller retry (across separate top-level calls, with real yields via
++    // Python's own `await asyncio.sleep()` in between) instead of spinning
++    // uselessly in here for the entire timeout every single call.
++    ssize_t rb = recv(sock._ws._fd, ptr, len, 0);
+     if (rb < 0) {
+-        rb = SIZE_MAX;
++        rb = 0;  // Nothing available yet -- not a hard error, try again later.
+     }
+-    return rb;
++    return (size_t)rb;
+ }
+ 
+ size_t _z_read_exact_ws(const _z_sys_net_socket_t sock, uint8_t *ptr, size_t len) {
+@@ -167,18 +220,18 @@ size_t _z_read_exact_ws(const _z_sys_net_socket_t sock, uint8_t *ptr, size_t len
+ }
+ 
+ size_t _z_send_ws(const _z_sys_net_socket_t sock, const uint8_t *ptr, size_t len) {
+-    // WARNING: workaroud implementing here the timeout
+-    ssize_t sb = 0;
+-    z_time_t start = z_time_now();
+-    while ((z_time_elapsed_ms(&start) < sock._ws._tout) && (sb <= 0)) {
+-        z_sleep_ms(WS_LINK_SLEEP);  // WARNING: workaround need to give the hand to the emscripten threads
+-        sb = send(sock._ws._fd, ptr, len, 0);
+-    }
+-    // WARNING: workaround as the recv returns -1 not only in case of errors
++    // NOTE (no-Asyncify): same reasoning as _z_read_ws above -- a single
++    // non-blocking attempt per call, no internal sleep-and-retry loop (that
++    // loop's z_sleep_ms() couldn't yield to the browser anyway, so it was
++    // just burning the entire timeout with zero chance of the socket
++    // becoming writable mid-loop). If the underlying WebSocket isn't open
++    // yet, send()/write() fails immediately; the caller is responsible for
++    // retrying later once the socket has had a chance to actually open.
++    ssize_t sb = send(sock._ws._fd, ptr, len, 0);
+     if (sb < 0) {
+         sb = 0;
+     }
+-    return sb;
++    return (size_t)sb;
+ }
+ 
+ #endif
diff --git a/extra_recipes/zenoh-pico/emscripten-nonblocking-sleep.patch b/extra_recipes/zenoh-pico/emscripten-nonblocking-sleep.patch
new file mode 100644
index 000000000..b2acf81f8
--- /dev/null
+++ b/extra_recipes/zenoh-pico/emscripten-nonblocking-sleep.patch
@@ -0,0 +1,36 @@
+diff --git a/src/system/emscripten/system.c b/src/system/emscripten/system.c
+index a7209801..1cb6d1be 100644
+--- a/src/system/emscripten/system.c
++++ b/src/system/emscripten/system.c
+@@ -125,12 +125,29 @@ z_result_t _z_condvar_wait_until(_z_condvar_t *cv, _z_mutex_t *m, const z_clock_
+ 
+ /*------------------ Sleep ------------------*/
+ z_result_t z_sleep_us(size_t time) {
+-    emscripten_sleep((time / 1000) + (time % 1000 == 0 ? 0 : 1));
++    // emscripten_sleep() requires Asyncify to actually suspend/resume the
++    // wasm call stack while yielding to the browser event loop -- this
++    // project's whole emscripten-wasm32 ROS2 build deliberately doesn't use
++    // Asyncify (see rmw_zenoh_pico's own patch and this project's AGENTS.md
++    // "MAJOR PIVOT" for the full rationale: Asyncify + runtime dlopen() of a
++    // SIDE_MODULE is a confirmed, unresolved upstream Emscripten/Binaryen
++    // limitation). Without Asyncify, emscripten_sleep() cannot genuinely
++    // wait -- it's a dead call here regardless of what it might otherwise
++    // do, so calling it bought nothing but a nonfunctional 100%-CPU stall.
++    // Every caller of z_sleep_us/z_sleep_ms in this platform's link layer
++    // (_z_open_ws/_z_read_ws/_z_send_ws) has been rewritten to make exactly
++    // one non-blocking attempt per call instead of retrying-with-sleep
++    // internally -- the actual "wait a bit, then retry" cadence now lives at
++    // the caller's own level (ultimately a Python-side `await
++    // asyncio.sleep()` loop), the same non-Asyncify pattern already used for
++    // rmw_wait()'s zero-timeout fast path. This is now a real no-op rather
++    // than a call into a primitive that silently can't do its job.
++    (void)time;
+     return 0;
+ }
+ 
+ z_result_t z_sleep_ms(size_t time) {
+-    emscripten_sleep(time);
++    (void)time;
+     return 0;
+ }
+ 
diff --git a/extra_recipes/zenoh-pico/emscripten-resumable-handshake.patch b/extra_recipes/zenoh-pico/emscripten-resumable-handshake.patch
new file mode 100644
index 000000000..3b63f9654
--- /dev/null
+++ b/extra_recipes/zenoh-pico/emscripten-resumable-handshake.patch
@@ -0,0 +1,221 @@
+diff --git a/src/transport/unicast/transport.c b/src/transport/unicast/transport.c
+index 85ce3d44..64057c35 100644
+--- a/src/transport/unicast/transport.c
++++ b/src/transport/unicast/transport.c
+@@ -14,6 +14,7 @@
+ #include "zenoh-pico/transport/common/transport.h"
+ 
+ #include 
++#include 
+ #include 
+ #include 
+ #include 
+@@ -101,6 +102,196 @@ z_result_t _z_unicast_transport_create(_z_transport_t *zt, _z_link_t *zl,
+     return ret;
+ }
+ 
++#ifdef __EMSCRIPTEN__
++// NOTE (no-Asyncify resumable client handshake): without Asyncify there is
++// no way to cooperatively yield to the browser's event loop from inside a
++// single synchronous call (see zenoh-pico's own emscripten-nonblocking-io/
++// -sleep patches, and rmw_zenoh_pico's session_connect() patch, for the
++// full rationale) -- so the client-side Init/Open handshake below
++// (_z_unicast_handshake_open, CLIENT mode only) needs to survive being
++// entered, exited, and re-entered across SEPARATE top-level calls (each
++// one driven by a fresh Python-level `await asyncio.sleep()` retry), never
++// resending a message that a prior call already sent. A naive "just call
++// the whole thing again" retry was tried first and empirically confirmed
++// broken via zenohd's own debug log: it logs "Received invalid message
++// instead of an OpenSyn ... InitSyn(...)" when a retry re-sends InitSyn
++// on a connection zenohd is already past that stage on -- the persistent
++// per-fd connection (see network.c's _z_ws_persistent_fd) means the SAME
++// underlying socket really is reused, so the server sees this as a
++// genuine protocol violation, not two separate sessions.
++//
++// This tracks handshake progress in a single static slot (this project
++// only ever has one zenoh session in flight at a time) and, on each call,
++// does at most the ONE next non-blocking step: send whatever hasn't been
++// sent yet, then attempt exactly one non-blocking receive for whatever
++// response is next expected.
++//
++// WS links use Z_LINK_CAP_FLOW_DATAGRAM (see _z_link_recv_t_msg in
++// transport/common/rx.c): its read path only treats a raw SIZE_MAX return
++// from _z_read_ws as a hard failure -- a clean "nothing available yet"
++// (0 bytes) is NOT special-cased at all, so it falls through to
++// attempting to decode an empty buffer, which
++// _z_transport_message_decode() naturally rejects with
++// _Z_ERR_MESSAGE_DESERIALIZATION_FAILED (-119). Confirmed via temporary
++// raw byte-level tracing: a "no data yet" attempt shows raw recv()==-1
++// (errno=ENXIO) but still reaches decode() with a genuinely empty (0-byte)
++// zbuf, producing -119 -- NOT the _Z_ERR_TRANSPORT_RX_FAILED (-99) this
++// code originally (incorrectly) assumed was the only "try again" signal.
++// So: -119 is ALSO treated as "still in progress, call again later" here,
++// alongside -99 -- safe for this project's usage because a WS "message"
++// is always delivered as one complete, atomic unit (never a partial/
++// garbled fragment) against a trusted local zenohd, so a non-empty read
++// that still fails to decode would be a genuine, different bug, not
++// something this fast path is being asked to paper over. Any OTHER error
++// is treated as a real protocol failure and resets the phase so a
++// subsequent retry starts a fresh handshake attempt.
++typedef enum {
++    _Z_HS_PHASE_NOT_STARTED = 0,
++    _Z_HS_PHASE_INIT_SENT,
++    _Z_HS_PHASE_OPEN_SENT,
++} _z_hs_phase_t;
++
++typedef struct {
++    _z_hs_phase_t phase;
++    _z_transport_message_t ism;
++    _z_transport_unicast_establish_param_t param;
++} _z_hs_state_t;
++
++static _z_hs_state_t _z_hs_state = {0};
++
++static z_result_t _z_unicast_handshake_open_client_resumable(_z_transport_unicast_establish_param_t *param,
++                                                              const _z_link_t *zl, const _z_id_t *local_zid,
++                                                              _z_sys_net_socket_t *socket) {
++    z_result_t ret = _Z_RES_OK;
++
++    if (_z_hs_state.phase == _Z_HS_PHASE_NOT_STARTED) {
++        _z_hs_state.ism = _z_t_msg_make_init_syn(Z_WHATAMI_CLIENT, *local_zid);
++        _z_hs_state.param._seq_num_res = _z_hs_state.ism._body._init._seq_num_res;
++        _z_hs_state.param._req_id_res = _z_hs_state.ism._body._init._req_id_res;
++        _z_hs_state.param._batch_size = _z_hs_state.ism._body._init._batch_size;
++
++        _Z_DEBUG("Sending Z_INIT(Syn) [resumable]");
++        ret = _z_link_send_t_msg(zl, &_z_hs_state.ism, socket);
++        if (ret != _Z_RES_OK) {
++            _z_t_msg_clear(&_z_hs_state.ism);
++            return ret;
++        }
++        _z_hs_state.phase = _Z_HS_PHASE_INIT_SENT;
++    }
++
++    if (_z_hs_state.phase == _Z_HS_PHASE_INIT_SENT) {
++        _z_transport_message_t iam = {0};
++        ret = _z_link_recv_t_msg(&iam, zl, socket);
++        if (ret != _Z_RES_OK) {
++            if (ret == _Z_ERR_TRANSPORT_RX_FAILED || ret == _Z_ERR_MESSAGE_DESERIALIZATION_FAILED) {
++                return ret;  // Nothing available yet -- keep waiting, don't resend.
++            }
++            _z_t_msg_clear(&_z_hs_state.ism);
++            _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;
++            return ret;
++        }
++        if ((_Z_MID(iam._header) != _Z_MID_T_INIT) || !_Z_HAS_FLAG(iam._header, _Z_FLAG_T_INIT_A)) {
++            _z_t_msg_clear(&iam);
++            _z_t_msg_clear(&_z_hs_state.ism);
++            _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;
++            _Z_ERROR_RETURN(_Z_ERR_MESSAGE_UNEXPECTED);
++        }
++        _z_hs_state.param._remote_whatami = iam._body._init._whatami;
++        _Z_DEBUG("Received Z_INIT(Ack) [resumable]");
++
++        if (iam._body._init._seq_num_res <= _z_hs_state.param._seq_num_res) {
++            _z_hs_state.param._seq_num_res = iam._body._init._seq_num_res;
++        } else {
++            _Z_ERROR_LOG(_Z_ERR_TRANSPORT_OPEN_SN_RESOLUTION);
++            ret = _Z_ERR_TRANSPORT_OPEN_SN_RESOLUTION;
++        }
++        if (iam._body._init._req_id_res <= _z_hs_state.param._req_id_res) {
++            _z_hs_state.param._req_id_res = iam._body._init._req_id_res;
++        } else {
++            _Z_ERROR_LOG(_Z_ERR_TRANSPORT_OPEN_SN_RESOLUTION);
++            ret = _Z_ERR_TRANSPORT_OPEN_SN_RESOLUTION;
++        }
++        if (iam._body._init._batch_size <= _z_hs_state.param._batch_size) {
++            _z_hs_state.param._batch_size = iam._body._init._batch_size;
++        } else {
++            _Z_ERROR_LOG(_Z_ERR_TRANSPORT_OPEN_SN_RESOLUTION);
++            ret = _Z_ERR_TRANSPORT_OPEN_SN_RESOLUTION;
++        }
++#if Z_FEATURE_FRAGMENTATION == 1
++        if (iam._body._init._patch <= _z_hs_state.ism._body._init._patch) {
++            _z_hs_state.param._patch = iam._body._init._patch;
++        } else {
++            _Z_ERROR_LOG(_Z_ERR_GENERIC);
++            ret = _Z_ERR_GENERIC;
++        }
++#endif
++        if (ret != _Z_RES_OK) {
++            _z_t_msg_clear(&iam);
++            _z_t_msg_clear(&_z_hs_state.ism);
++            _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;
++            return ret;
++        }
++        _z_hs_state.param._key_id_res = (uint8_t)(0x08 << _z_hs_state.param._key_id_res);
++        _z_hs_state.param._req_id_res = (uint8_t)(0x08 << _z_hs_state.param._req_id_res);
++
++        z_random_fill(&_z_hs_state.param._initial_sn_tx, sizeof(_z_hs_state.param._initial_sn_tx));
++        _z_hs_state.param._initial_sn_tx =
++            _z_hs_state.param._initial_sn_tx & !_z_sn_modulo_mask(_z_hs_state.param._seq_num_res);
++
++        _z_hs_state.param._remote_zid = iam._body._init._zid;
++
++        _z_zint_t lease = Z_TRANSPORT_LEASE;
++        _z_zint_t initial_sn = _z_hs_state.param._initial_sn_tx;
++        _z_slice_t cookie = _z_slice_null();
++        if (!_z_slice_is_empty(&iam._body._init._cookie)) {
++            _z_slice_copy(&cookie, &iam._body._init._cookie);
++        }
++        _z_transport_message_t osm = _z_t_msg_make_open_syn(lease, initial_sn, cookie);
++        _z_t_msg_clear(&iam);
++        _z_t_msg_clear(&_z_hs_state.ism);
++
++        _Z_DEBUG("Sending Z_OPEN(Syn) [resumable]");
++        ret = _z_link_send_t_msg(zl, &osm, socket);
++        _z_t_msg_clear(&osm);
++        if (ret != _Z_RES_OK) {
++            _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;
++            return ret;
++        }
++        _z_hs_state.phase = _Z_HS_PHASE_OPEN_SENT;
++    }
++
++    if (_z_hs_state.phase == _Z_HS_PHASE_OPEN_SENT) {
++        _z_transport_message_t oam = {0};
++        ret = _z_link_recv_t_msg(&oam, zl, socket);
++        if (ret != _Z_RES_OK) {
++            if (ret == _Z_ERR_TRANSPORT_RX_FAILED || ret == _Z_ERR_MESSAGE_DESERIALIZATION_FAILED) {
++                return ret;  // Nothing available yet -- keep waiting, don't resend.
++            }
++            _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;
++            return ret;
++        }
++        if ((_Z_MID(oam._header) != _Z_MID_T_OPEN) || !_Z_HAS_FLAG(oam._header, _Z_FLAG_T_OPEN_A)) {
++            _z_t_msg_clear(&oam);
++            _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;
++            _Z_ERROR_LOG(_Z_ERR_MESSAGE_UNEXPECTED);
++            return _Z_ERR_MESSAGE_UNEXPECTED;
++        }
++        // THIS LOG STRING USED IN TEST, change with caution
++        _Z_DEBUG("Received Z_OPEN(Ack) [resumable]");
++        _z_hs_state.param._lease =
++            (oam._body._open._lease < Z_TRANSPORT_LEASE) ? oam._body._open._lease : Z_TRANSPORT_LEASE;
++        _z_hs_state.param._initial_sn_rx = oam._body._open._initial_sn;
++        _z_t_msg_clear(&oam);
++
++        *param = _z_hs_state.param;
++        _z_hs_state.phase = _Z_HS_PHASE_NOT_STARTED;  // reset -- ready for any future session
++        return _Z_RES_OK;
++    }
++
++    return _Z_ERR_TRANSPORT_RX_FAILED;
++}
++#endif  // __EMSCRIPTEN__
++
+ static z_result_t _z_unicast_handshake_open(_z_transport_unicast_establish_param_t *param, const _z_link_t *zl,
+                                             const _z_id_t *local_zid, z_whatami_t mode, _z_sys_net_socket_t *socket) {
+     _z_transport_message_t ism = _z_t_msg_make_init_syn(mode, *local_zid);
+@@ -292,7 +483,11 @@ z_result_t _z_unicast_handshake_listen(_z_transport_unicast_establish_param_t *p
+ 
+ z_result_t _z_unicast_open_client(_z_transport_unicast_establish_param_t *param, const _z_link_t *zl,
+                                   const _z_id_t *local_zid) {
++#ifdef __EMSCRIPTEN__
++    return _z_unicast_handshake_open_client_resumable(param, zl, local_zid, NULL);
++#else
+     return _z_unicast_handshake_open(param, zl, local_zid, Z_WHATAMI_CLIENT, NULL);
++#endif
+ }
+ 
+ z_result_t _z_unicast_open_peer(_z_transport_unicast_establish_param_t *param, const _z_link_t *zl,
diff --git a/extra_recipes/zenoh-pico/emscripten-stddef-include.patch b/extra_recipes/zenoh-pico/emscripten-stddef-include.patch
new file mode 100644
index 000000000..4eb78044f
--- /dev/null
+++ b/extra_recipes/zenoh-pico/emscripten-stddef-include.patch
@@ -0,0 +1,12 @@
+diff --git a/include/zenoh-pico/system/platform/emscripten.h b/include/zenoh-pico/system/platform/emscripten.h
+index f90f6308..b9f719b1 100644
+--- a/include/zenoh-pico/system/platform/emscripten.h
++++ b/include/zenoh-pico/system/platform/emscripten.h
+@@ -15,6 +15,7 @@
+ #ifndef ZENOH_PICO_SYSTEM_WASM_TYPES_H
+ #define ZENOH_PICO_SYSTEM_WASM_TYPES_H
+ 
++#include 
+ #include 
+ 
+ #include "zenoh-pico/config.h"
diff --git a/extra_recipes/zenoh-pico/multithread0-mutex-condvar-stubs.patch b/extra_recipes/zenoh-pico/multithread0-mutex-condvar-stubs.patch
new file mode 100644
index 000000000..65cbb04ef
--- /dev/null
+++ b/extra_recipes/zenoh-pico/multithread0-mutex-condvar-stubs.patch
@@ -0,0 +1,101 @@
+diff --git a/src/system/common/platform.c b/src/system/common/platform.c
+index 9d042a4f..17e837d8 100644
+--- a/src/system/common/platform.c
++++ b/src/system/common/platform.c
+@@ -43,9 +43,23 @@ z_result_t z_task_detach(z_moved_task_t *task) {
+ 
+ z_result_t z_task_drop(z_moved_task_t *task) { return z_task_detach(task); }
+ 
++#endif  // Z_FEATURE_MULTI_THREAD == 1
++
++// The owned/loaned/moved plumbing below (_Z_OWNED_FUNCTIONS_SYSTEM_IMPL) is
++// generic pointer/struct bookkeeping that doesn't touch the underlying
++// mutex/condvar type at all -- it works unchanged against the dummy void*
++// _z_mutex_t/_z_condvar_t stub typedefs platform.h already provides for
++// Z_FEATURE_MULTI_THREAD == 0 ("dummy types for correct macros work"). Only
++// the actual lock/wait semantics below need a real vs. no-op split.
++
+ /*------------------ Mutex ------------------*/
+ _Z_OWNED_FUNCTIONS_SYSTEM_IMPL(_z_mutex_t, mutex)
+ 
++/*------------------ CondVar ------------------*/
++_Z_OWNED_FUNCTIONS_SYSTEM_IMPL(_z_condvar_t, condvar)
++
++#if Z_FEATURE_MULTI_THREAD == 1
++
+ z_result_t z_mutex_init(z_owned_mutex_t *m) { return _z_mutex_init(&m->_val); }
+ z_result_t z_mutex_drop(z_moved_mutex_t *m) { return _z_mutex_drop(&m->_this._val); }
+ 
+@@ -53,9 +67,6 @@ z_result_t z_mutex_lock(z_loaned_mutex_t *m) { return _z_mutex_lock(m); }
+ z_result_t z_mutex_try_lock(z_loaned_mutex_t *m) { return _z_mutex_try_lock(m); }
+ z_result_t z_mutex_unlock(z_loaned_mutex_t *m) { return _z_mutex_unlock(m); }
+ 
+-/*------------------ CondVar ------------------*/
+-_Z_OWNED_FUNCTIONS_SYSTEM_IMPL(_z_condvar_t, condvar)
+-
+ z_result_t z_condvar_init(z_owned_condvar_t *cv) { return _z_condvar_init(&cv->_val); }
+ z_result_t z_condvar_drop(z_moved_condvar_t *cv) { return _z_condvar_drop(&cv->_this._val); }
+ 
+@@ -65,4 +76,62 @@ z_result_t z_condvar_wait_until(z_loaned_condvar_t *cv, z_loaned_mutex_t *m, con
+     return _z_condvar_wait_until(cv, m, abstime);
+ }
+ 
++#else  // Z_FEATURE_MULTI_THREAD == 0
++
++// No real threads on this platform, so nothing ever runs concurrently with
++// a mutex holder or a condvar waiter -- every one of these is a safe no-op.
++// Callers that actually need to block waiting for incoming data (i.e.
++// rmw_zenoh_pico's rmw_wait) don't rely on z_condvar_wait to do that
++// anymore: they poll zp_read()/zp_send_keep_alive() directly instead, since
++// that's the only place with a session handle to pump. A z_condvar_wait
++// that just returned immediately without pumping would busy-loop its
++// caller with no progress; anything still calling it here is only doing so
++// to protect a data structure that's never actually contended.
++z_result_t z_mutex_init(z_owned_mutex_t *m) {
++    (void)m;
++    return _Z_RES_OK;
++}
++z_result_t z_mutex_drop(z_moved_mutex_t *m) {
++    (void)m;
++    return _Z_RES_OK;
++}
++
++z_result_t z_mutex_lock(z_loaned_mutex_t *m) {
++    (void)m;
++    return _Z_RES_OK;
++}
++z_result_t z_mutex_try_lock(z_loaned_mutex_t *m) {
++    (void)m;
++    return _Z_RES_OK;
++}
++z_result_t z_mutex_unlock(z_loaned_mutex_t *m) {
++    (void)m;
++    return _Z_RES_OK;
++}
++
++z_result_t z_condvar_init(z_owned_condvar_t *cv) {
++    (void)cv;
++    return _Z_RES_OK;
++}
++z_result_t z_condvar_drop(z_moved_condvar_t *cv) {
++    (void)cv;
++    return _Z_RES_OK;
++}
++
++z_result_t z_condvar_signal(z_loaned_condvar_t *cv) {
++    (void)cv;
++    return _Z_RES_OK;
++}
++z_result_t z_condvar_wait(z_loaned_condvar_t *cv, z_loaned_mutex_t *m) {
++    (void)cv;
++    (void)m;
++    return _Z_RES_OK;
++}
++z_result_t z_condvar_wait_until(z_loaned_condvar_t *cv, z_loaned_mutex_t *m, const z_clock_t *abstime) {
++    (void)cv;
++    (void)m;
++    (void)abstime;
++    return _Z_RES_OK;
++}
++
+ #endif  // Z_FEATURE_MULTI_THREAD == 1
diff --git a/extra_recipes/zenoh-pico/recipe.yaml b/extra_recipes/zenoh-pico/recipe.yaml
new file mode 100644
index 000000000..acfdefd1b
--- /dev/null
+++ b/extra_recipes/zenoh-pico/recipe.yaml
@@ -0,0 +1,215 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json
+#
+# Hand-written (not vinca-generated): not a ROS package, no package.xml.
+# Lives under extra_recipes/ to survive `rm -rf recipes` regeneration;
+# copied into ./recipes/ by pixi.toml's build-emscripten task.
+
+package:
+  name: zenoh-pico
+  version: "1.7.0"
+
+source:
+  git: https://github.com/eclipse-zenoh/zenoh-pico.git
+  # Bumped from 1.4.0 (d08c096944807a00853892ea45696152308350a2) to pick up
+  # upstream's "Fix matching" (#1069) rewrite of the write-filter/interest
+  # subsystem: the pinned 1.4.0 rev had a real bug where declaring a SECOND
+  # publisher (any second _z_add_interest registration) on one session broke
+  # write-filter matching for *both* publishers -- reproduced with a plain
+  # two-publisher rclc demo (no rmw_zenoh_pico/wasm/Asyncify involved): the
+  # first publisher published fine alone, but as soon as a second was added,
+  # neither publisher's messages ever reached a real zenohd router again,
+  # confirmed via REST+storage-plugin verification and by disabling router
+  # TX batching (ruled out) and adding a delay between declarations (ruled
+  # out) -- pointing at the client-side interest-matching logic itself.
+  # rmw_zenoh_pico's own C source only reaches into a handful of internal
+  # _z_ symbols (_z_keyexpr_t, _z_query_rc_t/_z_bytes_to_buf/
+  # _z_condvar_wait_until/_z_simple_rc_strong_count and friends), none of
+  # which live in the filtering.c/matching.c/interest.c files this rewrite
+  # touched -- confirmed by grepping its source for every _z_-prefixed
+  # identifier it references. All 4 of this project's own patches below
+  # still apply cleanly (verified with `git apply --check`) against 1.7.0,
+  # needing only a one-line context shift in ws-locator-valid-inverted-check.
+  # Pinned by exact rev, not the tag (tag resolution is unstable).
+  rev: 569e2fbccc7d25f2eb3bb362ef8e882eba02610e
+  patches:
+    - ws-locator-valid-inverted-check.patch
+    # REPLACES the old "emscripten-longer-ws-open-wait.patch" (2026-09-13):
+    # that patch bumped a z_sleep_ms() delay from 100ms to 2000ms to "fix"
+    # the WS transport's connect-before-actually-open race. It only ever
+    # worked because Asyncify was enabled at the time -- z_sleep_ms() is
+    # emscripten_sleep(), an Asyncify-only primitive, and this project
+    # dropped Asyncify project-wide (see AGENTS.md's "MAJOR PIVOT"). Without
+    # it, that delay was silently a no-op, and _z_open_ws/_z_read_ws/
+    # _z_send_ws's internal "retry with sleep until timeout" loops just
+    # busy-spun for the whole timeout with zero chance of ever observing
+    # progress -- a synchronous C call cannot make network progress without
+    # returning control to the browser's event loop, no matter how it waits
+    # internally. This patch instead makes all three genuinely
+    # non-blocking (exactly one attempt per call, return immediately) and
+    # makes z_sleep_us/z_sleep_ms real no-ops -- the "wait a bit, then
+    # retry" cadence now lives entirely at the caller's level (a
+    # Python-driven `await asyncio.sleep()` loop), the same pattern already
+    # proven for rmw_wait()'s zero-timeout fast path. See
+    # rmw_zenoh_pico's own patch (session_connect_poll) for the resumable
+    # session-open state machine that drives this.
+    - emscripten-nonblocking-io.patch
+    - emscripten-nonblocking-sleep.patch
+    # Makes the CLIENT-mode Init/Open handshake in
+    # _z_unicast_handshake_open (transport/unicast/transport.c) resumable
+    # across separate top-level calls instead of a single blocking
+    # sequence -- required because a naive "just retry the whole thing"
+    # approach (tried first) resends InitSyn on a connection zenohd is
+    # already past that stage on (confirmed via zenohd's own debug log:
+    # "Received invalid message instead of an OpenSyn ... InitSyn(...)"),
+    # since emscripten-nonblocking-io.patch's persistent-fd cache means a
+    # retry really does reuse the same underlying socket, not a fresh one.
+    - emscripten-resumable-handshake.patch
+    # Z_FEATURE_MULTI_THREAD=0 (below) leaves platform.c's mutex/condvar
+    # bodies undefined -- their types/declarations are always present (see
+    # platform.h's "dummy types for correct macros work"), but nothing
+    # implements z_mutex_lock/z_condvar_wait/etc without this. Needed by
+    # every platform build with no real threads, not emscripten-specific.
+    - multithread0-mutex-condvar-stubs.patch
+    # system/platform/emscripten.h only ever got  (for size_t)
+    # transitively, via  when Z_FEATURE_MULTI_THREAD==1 -- with
+    # that gone, size_t is undefined throughout platform.h ("unknown type
+    # name 'size_t'"). Confirmed: never previously exercised, since
+    # emscripten + Z_FEATURE_MULTI_THREAD==0 was never actually built here
+    # before now.
+    - emscripten-stddef-include.patch
+
+build:
+  script: build.sh
+  # Bump whenever content changes without a version bump, to avoid
+  # rattler-build package-cache collisions under an unchanged identity.
+  # 5->6: emscripten-nonblocking-io/-sleep patches replace
+  # emscripten-longer-ws-open-wait (see patches list comment above).
+  # 6->7: emscripten-nonblocking-io.patch extended with a persistent-fd
+  # cache in _z_open_ws()/_z_close_ws() -- the underlying WebSocket fd now
+  # survives a failed/incomplete handshake attempt (instead of being
+  # closed and reopened fresh every retry), so a later attempt can resume
+  # progress on the SAME connection. See rmw_zenoh_pico's session_connect()
+  # patch (build 28) for the caller-side half of this.
+  # 7->8: added emscripten-resumable-handshake.patch (see patches list
+  # comment above) -- makes the client handshake itself phase-aware and
+  # resumable, not just the underlying socket persistent.
+  # 8->9: temporary printf-based tracing added to
+  # emscripten-resumable-handshake.patch to diagnose why a duplicate
+  # InitSyn was still observed after the build-8 fix (TODO: remove once
+  # root-caused).
+  # 9->10: added emscripten-rx-debug.patch, more diagnostic tracing.
+  # 10->11: added raw recv()/errno tracing to _z_read_ws in
+  # emscripten-nonblocking-io.patch.
+  # 11->12: root-caused via the raw recv() tracing -- WS links use
+  # Z_LINK_CAP_FLOW_DATAGRAM, whose read path only treats SIZE_MAX as a
+  # hard failure; a clean "nothing yet" (0 bytes) falls through to
+  # decode()ing an empty buffer, producing
+  # _Z_ERR_MESSAGE_DESERIALIZATION_FAILED (-119), not
+  # _Z_ERR_TRANSPORT_RX_FAILED (-99) as emscripten-resumable-handshake.patch
+  # originally assumed. Fixed: -119 is now ALSO treated as "not ready yet,
+  # keep waiting" in the resumable handshake.
+  # 12->13: added emscripten-writefilter-debug.patch (see patches list
+  # comment above) to trace the message-delivery bug where only the
+  # first published message ever reaches the router.
+  # 13->14: added raw send()/errno tracing to _z_send_ws (same file as the
+  # emscripten-writefilter-debug.patch tracing above touches).
+  # 14->15: enabled Z_FEATURE_LOCAL_SUBSCRIBER/Z_FEATURE_LOCAL_QUERYABLE in
+  # build.sh's cmake configure line (both default OFF in zenoh-pico's own
+  # config.h). Root-caused via the writefilter/send tracing above plus
+  # zenohd's own storage-plugin state (`curl 127.0.0.1:8000/**` showed the
+  # LATEST published value actually reached the router/storage every time
+  # -- the "only one send_push ever logged" red herring was a zenohd
+  # logging/span-caching quirk, not real data loss): a publisher and a
+  # subscriber sharing the SAME zenoh session (this project's own
+  # rmw_zenoh_pico topology -- one ZenohPicoSession singleton shared by
+  # every rmw "node" in one process) never actually loop data back to
+  # each other over the network at all -- the router correctly never
+  # re-sends data to the face it originated from, and same-session
+  # local-subscriber delivery is a SEPARATE, opt-in client-library
+  # feature that was simply never turned on. Confirmed via
+  # `READ_WS_DEBUG` tracing: our client's own recv() never once saw a
+  # message-sized read during the whole spin loop, even though the
+  # publish itself provably succeeded.
+  # 15->16: added emscripten-write-locality-debug.patch (see patches list
+  # comment above) -- the build-15 fix alone did not change the observed
+  # symptom (`received count: 0`), so this adds direct tracing inside
+  # _z_write() itself to find out where the local-delivery path actually
+  # diverges from expectations.
+  # 16->17: build-16 tracing showed _z_session_deliver_push_locally()
+  # returning _Z_RES_OK (0) on every single publish -- proving the local
+  # dispatch call site itself is reached and doesn't error out. But
+  # _z_trigger_subscriptions_impl() (session/subscription.c) also returns
+  # _Z_RES_OK when it matches ZERO subscriptions (an empty dispatch loop
+  # isn't an error), so "returned 0" never actually proved the subscriber's
+  # own callback fired. Added emscripten-subscription-match-debug.patch to
+  # trace the real matching logic (candidate count, allowed_origin check,
+  # keyexpr intersection) and settle this directly.
+  # 17->18: build-17 confirmed sub_nb=1 (a real subscription match!) and
+  # deliver_push_locally() returning _Z_RES_OK -- but rclpy's subsequent
+  # rmw_take() then fails with "Typesupport deserialize error"
+  # (rmw_take.c:38). Root cause hypothesis: _z_write()'s remote branch
+  # (_z_n_msg_make_push_put) does a bare struct copy of the caller's
+  # _z_bytes_t into its own _z_network_message_t -- _z_bytes_t internally
+  # holds _z_arc_slice_t entries wrapping a _z_slice_simple_rc_t (an
+  # atomically-refcounted heap buffer), and a raw struct copy doesn't
+  # increment that refcount the way an explicit clone would. If anything in
+  # the remote TX path (serialization/batching) drops its ostensible
+  # reference on that basis, the buffer could be freed before the NEW
+  # Z_FEATURE_LOCAL_SUBSCRIBER branch steals the same (by-then-dangling)
+  # _z_bytes_t for local dispatch, which would read freed memory as the
+  # payload -- exactly matching "callback fires, but the bytes deserialize
+  # to garbage". Extended emscripten-write-locality-debug.patch to print
+  # _z_bytes_len(payload) right before the local-delivery call, to confirm
+  # or rule this out empirically before writing the real fix.
+  # 18->19: build-18's tracing DISPROVED the "premature free" hypothesis
+  # above -- _z_bytes_len(payload) read a correct, non-zero length (16)
+  # right before local delivery, and a follow-up hex dump (added to
+  # rmw_zenoh_pico's own patch, see that package's build 29-30 comments)
+  # confirmed the actual bytes handed to the local subscriber are a
+  # byte-for-byte-correct, well-formed CDR-encoded message. So
+  # Z_FEATURE_LOCAL_SUBSCRIBER / Z_FEATURE_LOCAL_QUERYABLE (enabled at
+  # build 15) is a COMPLETE, CORRECT fix for this project's own
+  # message-delivery bug: local pub/sub on one shared session now
+  # genuinely dispatches, with intact data, to the matching local
+  # subscription (confirmed via subscription-match tracing: sub_nb=1,
+  # origin_allowed=1, intersects=1). All temporary printf-based tracing
+  # added while diagnosing this (emscripten-rx-debug.patch,
+  # emscripten-writefilter-debug.patch, emscripten-write-locality-debug.patch,
+  # emscripten-subscription-match-debug.patch) is removed in this build --
+  # its job is done. The remaining "Typesupport deserialize error" seen at
+  # rmw_take.c:38 is a SEPARATE, downstream bug in rmw_zenoh_pico's own
+  # microxrcedds-based typesupport (a string-deserialize codegen that
+  # doesn't grow the destination buffer to fit an incoming variable-length
+  # string) -- see rmw_zenoh_pico's own pkg_additional_info.yaml entry
+  # (builds 29-31) for the full root-cause writeup. That bug is unrelated
+  # to zenoh-pico and needs no further changes here.
+  # 19->20: removed the remaining leftover printf tracing that build 19
+  # missed -- `SEND_WS_DEBUG`/`READ_WS_DEBUG` in emscripten-nonblocking-io.patch
+  # (from the raw send()/recv() byte-level tracing used to root-cause the
+  # -119-vs--99 and message-delivery investigations, both now resolved) and
+  # `HS_DEBUG` in emscripten-resumable-handshake.patch (from the original
+  # handshake-retry debugging, also long since resolved). No functional
+  # changes -- confirmed zero `_DEBUG`-tagged printf tracing remains
+  # anywhere in zenoh-pico's patched source tree.
+  number: 20
+
+requirements:
+  build:
+    - ${{ compiler('cxx') }}
+    - ${{ compiler('c') }}
+    - cmake
+    - ninja
+    - if: build_platform != target_platform
+      then:
+        - emscripten_emscripten-wasm32
+  host:
+  run:
+
+about:
+  license: Apache-2.0
+  summary: Eclipse zenoh-pico -- an extremely lightweight, C-only Zenoh client for constrained devices and WASM.
+  homepage: https://github.com/eclipse-zenoh/zenoh-pico
+
+extra:
+  recipe-maintainers:
+    - Tobias-Fischer
diff --git a/extra_recipes/zenoh-pico/ws-locator-valid-inverted-check.patch b/extra_recipes/zenoh-pico/ws-locator-valid-inverted-check.patch
new file mode 100644
index 000000000..a30b3f332
--- /dev/null
+++ b/extra_recipes/zenoh-pico/ws-locator-valid-inverted-check.patch
@@ -0,0 +1,13 @@
+diff --git a/src/link/unicast/ws.c b/src/link/unicast/ws.c
+index 200bb60d..af2d1f7e 100644
+--- a/src/link/unicast/ws.c
++++ b/src/link/unicast/ws.c
+@@ -77,7 +77,7 @@ z_result_t _z_endpoint_ws_valid(_z_endpoint_t *endpoint) {
+     z_result_t ret = _Z_RES_OK;
+ 
+     _z_string_t str = _z_string_alias_str(WS_SCHEMA);
+-    if (_z_string_equals(&endpoint->_locator._protocol, &str)) {
++    if (!_z_string_equals(&endpoint->_locator._protocol, &str)) {
+         _Z_ERROR_LOG(_Z_ERR_CONFIG_LOCATOR_INVALID);
+         ret = _Z_ERR_CONFIG_LOCATOR_INVALID;
+     }
diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml
index 2bba7815e..18d7431ab 100644
--- a/patch/dependencies.yaml
+++ b/patch/dependencies.yaml
@@ -1,5 +1,66 @@
 ament_package:
   add_host: ['importlib_resources']
+# These four packages carry an extra "if target_platform=='emscripten-wasm32':
+# add ros2-rosidl-default-generators" *build* (native, build_platform) dependency
+# that most other message packages (action_msgs, std_msgs, etc, which build fine)
+# simply don't have -- confirmed by comparing recipes directly. Those other
+# packages' codegen only ever needs native python + cross-python_ (the
+# `if: build_platform != target_platform` block every rosidl-generating package
+# has) to run the rosidl generator scripts against the already-cross-compiled,
+# pure-Python host packages (rosidl_generator_c/cpp/py) -- no natively-*compiled*
+# rosidl_default_generators binary is actually needed. That extra dependency is
+# real, though: robostack-rolling only publishes it built against python 3.14
+# now, conflicting with this whole pipeline's python 3.13 pin, with no matching
+# python-3.13 build available at any version/build number. Removing it lets
+# these four packages fall back to the same working mechanism as everything else.
+test_msgs:
+  remove_build: ["ros2-rosidl-default-generators"]
+example_interfaces:
+  remove_build: ["ros2-rosidl-default-generators"]
+libstatistics_collector:
+  remove_build: ["ros2-rosidl-default-generators"]
+# Every emscripten-wasm32 message package needs this explicitly -- there's
+# no generic/wildcard rule, get_used_typesupports.cmake checks each
+# package's own host environment for a resolvable microxrcedds package.
+# If you add another message package to vinca.yaml's wasm32
+# packages_select_by_deps, it needs an entry here too, or it fails CMake
+# configure with "The ROS IDL typesupport 'rosidl_typesupport_microxrcedds_c'
+# ... is not available".
+geometry_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+sensor_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+rosidl_typesupport_cpp:
+  # get_used_typesupports.cmake (rosidl_typesupport_c's own upstream CMake)
+  # validates that whatever STATIC_ROSIDL_TYPESUPPORT_CPP names (set from
+  # VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_CPP=rosidl_typesupport_microxrcedds_cpp
+  # in this repo's build-emscripten task) is actually registered as an
+  # available ament_index extension -- which only happens if that package is
+  # actually installed in this package's own isolated build prefix. It isn't,
+  # by default: rosidl_typesupport_cpp's package.xml has no idea this
+  # emscripten-only override backend exists, so nothing pulls it in
+  # transitively. Confirmed via direct build failure: "CMake Error ...
+  # 'rosidl_typesupport_microxrcedds_cpp' ... is not available
+  # (rosidl_typesupport_introspection_cpp)".
+  #
+  # Also: building this pulls in rosidl_typesupport_c's own
+  # get_used_typesupports check too (see CMakeLists.txt's find_package(
+  # rosidl_typesupport_c)) -- confirmed by a separate failure: building
+  # rosidl_typesupport_cpp fresh, with neither microxrcedds variant built
+  # yet, fails configuring on the *_c one specifically. Hence the second,
+  # emscripten-conditional entry below needing microxrcedds-c too.
+  add_host:
+    - if: wasm32
+      then: ["ros2-rosidl-typesupport-microxrcedds-cpp"]
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+  add_run:
+    - if: wasm32
+      then: ["ros2-rosidl-typesupport-microxrcedds-cpp"]
 foxglove_bridge:
   add_host: ["ros-rolling-ament-cmake"]
 ros_ign_interfaces:
@@ -10,11 +71,28 @@ cartographer_ros:
   add_host: ["cartographer 2.*", "libboost-devel", "ceres-solver * cpu*", "ros2-pcl-conversions"]
   add_run: ["ros2-pcl-conversions"]
 libyaml_vendor:
-  add_host: ["yaml-cpp", "yaml"]
-  add_run: ["yaml-cpp", "yaml"]
+  add_host:
+    - if: not wasm32
+      then: ["yaml-cpp", "yaml"]
+  add_run:
+    - if: not wasm32
+      then: ["yaml-cpp", "yaml"]
+  # No wasm32 pkg-config build exists; it's a build-machine tool, not a target dep.
+  remove_host:
+    - if: wasm32
+      then: ["pkg-config"]
+  remove_run:
+    - if: wasm32
+      then: ["pkg-config"]
 yaml_cpp_vendor:
-  add_host: ["yaml-cpp"]
-  add_run: ["yaml-cpp"]
+  # No yaml-cpp conda package exists for wasm32; omitting it makes find_package()
+  # fail as designed so it falls back to its own ExternalProject source build.
+  add_host:
+    - if: not wasm32
+      then: ["yaml-cpp"]
+  add_run:
+    - if: not wasm32
+      then: ["yaml-cpp"]
 zstd_vendor:
   add_host: ["zstd", "${{ 'zstd-static' if not win }}"]
   add_run: ["zstd"]
@@ -268,8 +346,86 @@ camera_calibration:
 livox_ros_driver2:
   add_host: ["livox-sdk2"]
 spdlog_vendor:
-  add_host: ["spdlog"]
-  add_run: ["spdlog"]
+  # No spdlog conda package for wasm32; same fallback approach as yaml_cpp_vendor.
+  add_host:
+    - if: not wasm32
+      then: ["spdlog"]
+  add_run:
+    - if: not wasm32
+      then: ["spdlog"]
+rcl_logging_spdlog:
+  add_host: ["${{ 'fmt' if emscripten }}"]
+
+rmw_implementation:
+  # rmw_implementation discovers RMWs dynamically rather than declaring a real
+  # package.xml dependency, so build order isn't forced; add it explicitly for
+  # wasm32, our only RMW there. add_run (not just add_host) matters because
+  # every rcl consumer re-invokes get_default_rmw_implementation() at configure
+  # time, so a run dep on rmw_implementation transitively pulls it in for free.
+  add_host:
+    - if: emscripten
+      then: ["ros2-rmw-zenoh-pico"]
+  add_run:
+    - if: emscripten
+      then: ["ros2-rmw-zenoh-pico"]
+rmw_test_fixture_implementation:
+  # Same get_default_rmw_implementation() ordering issue as rmw_implementation above.
+  add_host:
+    - if: emscripten
+      then: ["ros2-rmw-zenoh-pico"]
+
+rosidl_typesupport_c:
+  # Same class of ordering issue as rmw_implementation above:
+  # get_used_typesupports.cmake finds candidate typesupports via a plain
+  # find_package(rosidl_typesupport_microxrcedds_c QUIET), not a real
+  # package.xml/recipe dependency, so rattler-build's own topological sort
+  # has no way to know microxrcedds_c has to exist first when
+  # VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_C names it. Without this, a
+  # from-scratch build of the full closure is order-dependent -- it only
+  # succeeds if rattler-build happens to build rosidl_typesupport_microxrcedds_c
+  # before this one.
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c"]
+
+# rmw_zenoh_pico and its rosidl_typesupport_microxrcedds_c/cpp only need the
+# plain CMake macros from ament_cmake_ros_core, but depending on the full
+# ament_cmake_ros creates a cycle via rmw_test_fixture_implementation ->
+# rmw_implementation -> rmw_zenoh_pico. Swap to ament_cmake_ros_core, like
+# upstream RMWs (e.g. rmw_fastrtps_cpp) do; matching source patches update
+# the find_package()/package.xml calls to match.
+rmw_zenoh_pico:
+  # Also needs plain ament_cmake for the ament_target_dependencies() shim macro
+  # the matching source patch adds (removed from rolling's ament_cmake).
+  #
+  # package.xml also declares micro_ros_msgs, but nothing
+  # in the actual C source references it at all (confirmed: `grep -rn
+  # micro_ros_msgs` across src/include finds only the manifest line) --
+  # vestigial, likely inherited from a micro-ROS package template. Pulling
+  # it in for wasm32 forces a native (build-platform) codegen dependency on
+  # ros2-rosidl-default-generators that robostack-rolling only publishes
+  # for python 3.14 now, conflicting with this whole pipeline's python 3.13
+  # pin -- removing the genuinely-unused dependency avoids that mismatch.
+  remove_host:
+    - "ros2-ament-cmake-ros"
+    - if: wasm32
+      then: ["ros2-micro-ros-msgs"]
+  add_host: ["ros2-ament-cmake-ros-core", "ros2-ament-cmake"]
+  remove_run:
+    - "ros2-ament-cmake-ros"
+    - if: wasm32
+      then: ["ros2-micro-ros-msgs"]
+  add_run: ["ros2-ament-cmake-ros-core", "ros2-ament-cmake"]
+rosidl_typesupport_microxrcedds_c:
+  remove_host: ["ros2-ament-cmake-ros"]
+  add_host: ["ros2-ament-cmake-ros-core"]
+  remove_run: ["ros2-ament-cmake-ros"]
+  add_run: ["ros2-ament-cmake-ros-core"]
+rosidl_typesupport_microxrcedds_cpp:
+  remove_host: ["ros2-ament-cmake-ros"]
+  add_host: ["ros2-ament-cmake-ros-core"]
+  remove_run: ["ros2-ament-cmake-ros"]
+  add_run: ["ros2-ament-cmake-ros-core"]
 console_bridge_vendor:
   add_host: ["console_bridge"]
   add_run: ["console_bridge"]
@@ -318,3 +474,52 @@ rmf_visualization_schedule:
 rmf_websocket:
   add_host: ["asio <1.30"]
   add_run: ["asio <1.30"]
+
+# rosidl_generate_interfaces() only generates a typesupport backend when its
+# provider package is present in the message package's own host env, not
+# based on package.xml. rmw_zenoh_pico requires the microxrcedds typesupport,
+# so add it explicitly to every core message package here.
+action_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+builtin_interfaces:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+lifecycle_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+rcl_interfaces:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+rosgraph_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+service_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+statistics_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+std_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+type_description_interfaces:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+unique_identifier_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
+micro_ros_msgs:
+  add_host:
+    - if: emscripten
+      then: ["ros2-rosidl-typesupport-microxrcedds-c", "ros2-rosidl-typesupport-microxrcedds-cpp"]
diff --git a/patch/ros-rolling-osrf-testing-tools-cpp.emscripten.patch b/patch/ros-rolling-osrf-testing-tools-cpp.emscripten.patch
new file mode 100644
index 000000000..9ec4fdb35
--- /dev/null
+++ b/patch/ros-rolling-osrf-testing-tools-cpp.emscripten.patch
@@ -0,0 +1,100 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 97f7726..c12d966 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -17,15 +17,15 @@ endif()
+ 
+ add_subdirectory(src)
+ 
+-include(CTest)
+-if(BUILD_TESTING)
+-  include(cmake/osrf_testing_tools_cpp_require_googletest.cmake)
+-  # ensures target gtest_main exists
+-  osrf_testing_tools_cpp_require_googletest(VERSION_GTE 1.14
+-    VENDOR_DIR "${CMAKE_SOURCE_DIR}/vendor")
+-
+-  add_subdirectory(test)
+-endif()
++# googletest's own vendored build doesn't cross-compile cleanly for this
++# project's emscripten-wasm32 pipeline, and nothing here needs the test
++# suite built as part of a normal package build -- skip it outright.
++# (Note: `if(EMSCRIPTEN)` doesn't work as a platform gate in this specific
++# build path -- build_catkin.sh's emscripten branch never loads
++# Emscripten.cmake's own toolchain file, so CMake's EMSCRIPTEN variable is
++# never actually set here, confirmed empirically. Since this project only
++# ever builds this recipe for emscripten-wasm32 in practice, skip
++# unconditionally rather than add a platform check that wouldn't work.)
+ 
+ configure_file(osrf_testing_tools_cppConfig.cmake.in
+   "${PROJECT_BINARY_DIR}/osrf_testing_tools_cppConfig.cmake" @ONLY)
+diff --git a/src/memory_tools/count_function_occurrences_in_backtrace.hpp b/src/memory_tools/count_function_occurrences_in_backtrace.hpp
+index c5e0cc2..c3b8cb5 100644
+--- a/src/memory_tools/count_function_occurrences_in_backtrace.hpp
++++ b/src/memory_tools/count_function_occurrences_in_backtrace.hpp
+@@ -17,7 +17,7 @@
+ 
+ #include "./safe_fwrite.hpp"
+ 
+-#if defined(_WIN32) || defined(__QNXNTO__) || defined(__ANDROID__)
++#if defined(_WIN32) || defined(__QNXNTO__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__)
+ 
+ // Include nothing for now.
+ 
+@@ -50,7 +50,7 @@ struct is_function_pointer
+   >
+ {};
+ 
+-#if defined(_WIN32) || defined(__QNXNTO__) || defined(__ANDROID__)
++#if defined(_WIN32) || defined(__QNXNTO__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__)
+ 
+ struct count_function_occurrences_in_backtrace_is_implemented : std::false_type {};
+ 
+diff --git a/src/memory_tools/vendor/bombela/backward-cpp/backward.hpp b/src/memory_tools/vendor/bombela/backward-cpp/backward.hpp
+index ac7ad51..442c9de 100644
+--- a/src/memory_tools/vendor/bombela/backward-cpp/backward.hpp
++++ b/src/memory_tools/vendor/bombela/backward-cpp/backward.hpp
+@@ -63,7 +63,9 @@
+ #elif defined(BACKWARD_SYSTEM_UNKNOWN)
+ #elif defined(BACKWARD_SYSTEM_WINDOWS)
+ #else
+-#if defined(__linux) || defined(__linux__)
++#if defined(__EMSCRIPTEN__)
++#define BACKWARD_SYSTEM_UNKNOWN // Not supported in emscripten
++#elif defined(__linux) || defined(__linux__)
+ #define BACKWARD_SYSTEM_LINUX
+ #elif defined(__APPLE__)
+ #define BACKWARD_SYSTEM_DARWIN
+@@ -393,12 +395,14 @@ typedef SSIZE_T ssize_t;
+ // anyway.
+ //
+ // Luckily we can play on the fact that the guard macros have a different name:
++#ifndef __EMSCRIPTEN__ // Emscripten has the same prototype as gcc
+ #ifdef __CLANG_UNWIND_H
+ // In fact, this function still comes from libgcc (on my different linux boxes,
+ // clang links against libgcc).
+ #include 
+ extern "C" uintptr_t _Unwind_GetIPInfo(_Unwind_Context *, int *);
+ #endif
++#endif
+ 
+ #endif // BACKWARD_HAS_UNWIND == 1
+ 
+diff --git a/src/test_runner/CMakeLists.txt b/src/test_runner/CMakeLists.txt
+index ffbc9cf..8bc17a6 100644
+--- a/src/test_runner/CMakeLists.txt
++++ b/src/test_runner/CMakeLists.txt
+@@ -1,5 +1,14 @@
+ add_executable(test_runner main.cpp)
+ 
++if (DEFINED EMSCRIPTEN)
++  set_target_properties(
++    test_runner 
++    PROPERTIES SUFFIX ".wasm"
++  )
++
++  target_compile_options(test_runner PUBLIC -fPIC)
++endif (DEFINED EMSCRIPTEN)
++
+ install(TARGETS test_runner
+   EXPORT test_runner
+   DESTINATION lib/${PROJECT_NAME}
diff --git a/patch/ros-rolling-rcl-yaml-param-parser.patch b/patch/ros-rolling-rcl-yaml-param-parser.patch
deleted file mode 100644
index 337bf13a0..000000000
--- a/patch/ros-rolling-rcl-yaml-param-parser.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-diff --git a/src/parse.c b/src/parse.c
-index 33f2995..5465e54 100644
---- a/src/parse.c
-+++ b/src/parse.c
-@@ -17,10 +17,15 @@
- #include 
- #include 
- 
- #ifdef _WIN32
- #include 
-+#elif defined(__APPLE__)
-+#include 
-+typedef pthread_once_t once_flag;
-+#define ONCE_FLAG_INIT PTHREAD_ONCE_INIT
-+#define call_once(flag, func) pthread_once((flag), (func))
- #else
- #include 
- #endif
- 
- #include 
-@@ -804,9 +809,9 @@ BOOL CALLBACK init_c_locale(
- }
- #else
- static locale_t c_locale = 0;
- static once_flag c_locale_once_flag = ONCE_FLAG_INIT;
- 
- static void init_c_locale(void)
- {
-   c_locale = newlocale(LC_NUMERIC_MASK, "C", 0);
- }
diff --git a/patch/ros-rolling-rclpy.emscripten.patch b/patch/ros-rolling-rclpy.emscripten.patch
new file mode 100644
index 000000000..809faae40
--- /dev/null
+++ b/patch/ros-rolling-rclpy.emscripten.patch
@@ -0,0 +1,148 @@
+diff --git a/src/rclpy/_rclpy_logging.cpp b/src/rclpy/_rclpy_logging.cpp
+index 6d0eb283..177aa1e7 100644
+--- a/src/rclpy/_rclpy_logging.cpp
++++ b/src/rclpy/_rclpy_logging.cpp
+@@ -162,7 +162,7 @@ rclpy_logging_rcutils_log(
+   uint64_t line_number)
+ {
+   RCUTILS_LOGGING_AUTOINIT;
+-  rcutils_log_location_t logging_location = {function_name, file_name, line_number};
++  rcutils_log_location_t logging_location = {function_name, file_name, static_cast(line_number)};
+   rcutils_log(&logging_location, severity, name, "%s", message);
+ }
+ 
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 4c81ea76..93e1f613 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -117,7 +117,7 @@ pybind11_add_module(_rclpy_pybind11
+   src/rclpy/wait_set.cpp
+ )
+ 
+-if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT APPLE)
++if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT APPLE AND NOT EMSCRIPTEN)
+   target_link_libraries(_rclpy_pybind11 PRIVATE atomic)
+ endif()
+
+diff --git a/src/rclpy/signal_handler.cpp b/src/rclpy/signal_handler.cpp
+index bb72763..6c13dad 100644
+--- a/src/rclpy/signal_handler.cpp
++++ b/src/rclpy/signal_handler.cpp
+@@ -119,6 +119,27 @@ wait_for_signal()
+ void
+ setup_deferred_signal_handler()
+ {
++#if defined(__EMSCRIPTEN__)
++  // This project's wasm32/emscripten target has no real OS-level signal
++  // delivery (no SIGINT/SIGTERM ever reaches a wasm binary running in a
++  // JupyterLite kernel), and -- more importantly -- no real pthreads
++  // support (this whole build deliberately avoids real threads project-wide
++  // in favor of Asyncify-based cooperative polling, see
++  // ros-rolling-emscripten-zenoh/AGENTS.md's Asyncify migration section).
++  // Unconditionally spawning `g_deferred_signal_handling_thread` below
++  // (a real std::thread, regardless of `signal_handler_options` -- that
++  // value only controls which signals get hooked to it afterward, in
++  // `install_signal_handlers()`, never whether this thread itself gets
++  // created) throws `std::system_error: thread constructor failed:
++  // Resource temporarily unavailable` on this target. Make both this
++  // function and its `teardown_deferred_signal_handler()` counterpart
++  // complete no-ops: `g_signal_handler_installed` is simply never set to
++  // true here, so `teardown_deferred_signal_handler()`'s own
++  // `if (!g_signal_handler_installed.exchange(false)) { return; }` guard
++  // takes the early-return path there too, safely -- neither the
++  // semaphore nor the thread are ever touched in either direction.
++  return;
++#else
+   if (g_signal_handler_installed.exchange(true)) {
+     return;
+   }
+@@ -153,6 +174,7 @@ setup_deferred_signal_handler()
+         }
+       }
+     });
++#endif  // defined(__EMSCRIPTEN__)
+ }
+
+ void
+ 
+diff --git a/rclpy/__init__.py b/rclpy/__init__.py
+index 6406063..4b3f463 100644
+--- a/rclpy/__init__.py
++++ b/rclpy/__init__.py
+@@ -40,6 +40,8 @@ all ROS nodes associated with the context), the :func:`shutdown` function should
+ This will invalidate all entities derived from the context.
+ """
+ 
++import asyncio
++import sys
+ from types import TracebackType
+ from typing import Any
+ from typing import List
+@@ -306,6 +308,32 @@ def spin_once(
+             executor.remove_node(node)
+ 
+ 
++def _emscripten_webloop_active() -> bool:
++    """
++    True if running on Emscripten with pyjs's own asyncio event loop
++    (``pyjs.webloop.WebLoop``) actually active as the current event loop --
++    i.e. genuinely inside a pyjs/xeus-python kernel (JupyterLite), not just
++    any Emscripten-target build. ``pyjs`` itself may be *present*
++    (importable) without the JS-interop dependencies a real kernel
++    bootstrap wires up (the ``pyjs_core``/``js`` bridge) actually being
++    available -- e.g. a plain embedded-CPython binary with no kernel around
++    it at all -- in which case ``import pyjs.webloop`` itself fails, which
++    is exactly the signal used here to fall back to the ordinary blocking
++    behavior below.
++    """
++    if sys.platform != 'emscripten':
++        return False
++    try:
++        import pyjs.webloop
++    except ImportError:
++        return False
++    try:
++        loop = asyncio.get_event_loop()
++    except RuntimeError:
++        return False
++    return isinstance(loop, pyjs.webloop.WebLoop)
++
++
+ def spin(node: 'Node', executor: Optional['Executor'] = None) -> None:
+     """
+     Execute work and block until the context associated with the executor is shutdown.
+@@ -314,10 +342,34 @@ def spin(node: 'Node', executor: Optional['Executor'] = None) -> None:
+ 
+     This function blocks.
+ 
++    On Emscripten, inside a real pyjs/xeus-python kernel such as JupyterLite
++    (see :func:`_emscripten_webloop_active`), this function does NOT block:
++    a wasm32 build with neither pthreads nor Asyncify has no way to yield to
++    the browser's event loop from inside a single still-running synchronous
++    call, so a literal blocking loop here would simply freeze the tab
++    forever rather than usefully "block". Instead, the same non-blocking
++    ``spin_once()`` used below is scheduled as a background task on the
++    kernel's own already-running event loop, and this function returns
++    immediately -- spinning continues for as long as the kernel keeps
++    running, which calling code should rely on instead of this function's
++    return.
++
+     :param node: A node to add to the executor to check for work.
+     :param executor: The executor to use, or the global executor if ``None``.
+     """
+     executor = get_global_executor() if executor is None else executor
++    if _emscripten_webloop_active():
++        executor.add_node(node)
++
++        async def _spin_forever() -> None:
++            try:
++                while executor.context.ok():
++                    executor.spin_once(timeout_sec=0.1)
++                    await asyncio.sleep(0.05)
++            finally:
++                executor.remove_node(node)
++        asyncio.get_event_loop().create_task(_spin_forever())
++        return
+     try:
+         executor.add_node(node)
+         while executor.context.ok():
diff --git a/patch/ros-rolling-rcutils.emscripten.patch b/patch/ros-rolling-rcutils.emscripten.patch
new file mode 100644
index 000000000..fe4cbc5a3
--- /dev/null
+++ b/patch/ros-rolling-rcutils.emscripten.patch
@@ -0,0 +1,109 @@
+diff --git a/src/time_unix.c b/src/time_unix.c
+index fdd49bc..bd72338 100644
+--- a/src/time_unix.c
++++ b/src/time_unix.c
+@@ -106,7 +106,16 @@ rcutils_raw_steady_time_now(rcutils_time_point_value_t * now)
+   RCUTILS_CHECK_ARGUMENT_FOR_NULL(now, RCUTILS_RET_INVALID_ARGUMENT);
+   struct timespec timespec_now;
+
+-#if defined(CLOCK_MONOTONIC_RAW)
++  // CLOCK_MONOTONIC_RAW is #define'd by emscripten's headers (so the
++  // defined() check below would pick it) but the wasm32/pthread runtime's
++  // actual implementation of it is broken -- it silently writes back a
++  // bogus timespec (in practice: tv_nsec's value ends up read out where
++  // tv_sec is expected, producing a "now" that looks like tv_nsec * 1e9
++  // nanoseconds instead of the real time), even though plain
++  // CLOCK_MONOTONIC on the exact same build works correctly. Skip the RAW
++  // variant entirely under emscripten rather than trusting whichever clock
++  // ID the SDK headers happen to define.
++#if defined(CLOCK_MONOTONIC_RAW) && !defined(__EMSCRIPTEN__)
+   clockid_t monotonic_raw_clock = CLOCK_MONOTONIC_RAW;
+ #else
+   clockid_t monotonic_raw_clock = CLOCK_MONOTONIC;
+diff --git a/src/shared_library.c b/src/shared_library.c
+index 077478f..f8e38c8 100644
+--- a/src/shared_library.c
++++ b/src/shared_library.c
+@@ -124,7 +124,13 @@ rcutils_load_shared_library(
+     goto fail;
+   }
+   lib->library_path = rcutils_strdup(image_name, lib->allocator);
+-#elif defined(_GNU_SOURCE) && !defined(__QNXNTO__) && !defined(__ANDROID__) && !defined(__OHOS__)
++  // Emscripten defines _GNU_SOURCE but its dlopen()/dlinfo() are a JS-backed
++  // shim, not glibc's -- RTLD_DI_LINKMAP support (reading back a real
++  // struct link_map) doesn't exist there. A successful dlopen() would
++  // otherwise get treated as a failure once dlinfo() returns -1 below; the
++  // #else branch already covers this correctly (it just reuses the path we
++  // opened the library from, no introspection needed).
++#elif defined(_GNU_SOURCE) && !defined(__QNXNTO__) && !defined(__ANDROID__) && !defined(__OHOS__) && !defined(__EMSCRIPTEN__)
+   struct link_map * map = NULL;
+   if (dlinfo(lib->lib_pointer, RTLD_DI_LINKMAP, &map) != 0) {
+     RCUTILS_SET_ERROR_MSG_WITH_FORMAT_STRING("dlinfo error: %s", dlerror());
+@@ -291,7 +297,12 @@ rcutils_get_platform_library_name(
+
+   int written = 0;
+
+-#if defined(__linux__) || defined(__QNXNTO__)
++  // rcl_logging_implementation dlopens its backend (spdlog or noop) by name
++  // at runtime via this function -- with no emscripten case it always falls
++  // through with written == 0 ("failed to format library name"), regardless
++  // of which backend RCL_LOGGING_IMPLEMENTATION selects. wasm32 side modules
++  // use the same "lib.so" naming convention as Linux.
++#if defined(__linux__) || defined(__QNXNTO__) || defined(__EMSCRIPTEN__)
+   if (debug) {
+     if (buffer_size >= (strlen(library_name) + 8)) {
+       written = rcutils_snprintf(
+diff --git a/src/strerror.c b/src/strerror.c
+index a425010..282a107 100644
+--- a/src/strerror.c
++++ b/src/strerror.c
+@@ -27,7 +27,7 @@ rcutils_strerror(char * buffer, size_t buffer_length)
+ {
+ #if defined(_WIN32)
+   strerror_s(buffer, buffer_length, errno);
+-#elif defined(_GNU_SOURCE) && (!defined(ANDROID) || __ANDROID_API__ >= 23) && !defined(__QNXNTO__)
++#elif defined(_GNU_SOURCE) && (!defined(ANDROID) || __ANDROID_API__ >= 23) && !defined(__QNXNTO__) && !defined(__EMSCRIPTEN__)
+   /* GNU-specific */
+   char * msg = strerror_r(errno, buffer, buffer_length);
+   if (msg != buffer) {
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 60b4b85..5615e03 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -6,8 +6,21 @@ include(CheckLibraryExists)
+ 
+ find_package(ament_cmake REQUIRED)
+ find_package(ament_cmake_ros_core REQUIRED)
+-set(THREADS_PREFER_PTHREAD_FLAG TRUE)
+-find_package(Threads REQUIRED)
++# Emscripten (without -pthread/USE_PTHREADS, deliberately -- see this
++# platform's other patches) has no pthread_create at all, so CMake's
++# FindThreads probe (which checks for -pthread flag support and
++# pthread_create) genuinely, correctly fails here -- it's not a false
++# negative to work around. The one pthread_* symbol this file actually
++# calls (pthread_once, in base64.c, guarding lazy one-time init of a
++# lookup table) IS present in emscripten's libc even without -pthread
++# (confirmed via nm on the non-pthreads libc.a: real pthread_once/
++# __pthread_once symbols, not just weak stubs) -- Threads::Threads was
++# only ever needed to add link flags, not to provide missing symbols, so
++# skipping it here changes nothing except what CMake requires up front.
++if(NOT EMSCRIPTEN)
++  set(THREADS_PREFER_PTHREAD_FLAG TRUE)
++  find_package(Threads REQUIRED)
++endif()
+ 
+ if(UNIX AND NOT APPLE)
+   include(cmake/check_c_compiler_uses_glibc.cmake)
+@@ -93,9 +106,10 @@ target_link_libraries(${PROJECT_NAME}
+   PUBLIC
+     ${CMAKE_DL_LIBS}
+     ament_cmake_ros_core::ament_ros_defaults
+-  PRIVATE
+-    Threads::Threads
+ )
++if(NOT EMSCRIPTEN)
++  target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
++endif()
+ 
+ check_library_exists(atomic __atomic_load_8 "" HAVE_LIBATOMICS)
+ 
diff --git a/patch/ros-rolling-rcutils.patch b/patch/ros-rolling-rcutils.patch
deleted file mode 100644
index fb2345436..000000000
--- a/patch/ros-rolling-rcutils.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 95b504e..3ef2c1b 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -6,6 +6,7 @@ include(CheckLibraryExists)
- 
- find_package(ament_cmake REQUIRED)
- find_package(ament_cmake_ros_core REQUIRED)
-+find_package(Threads REQUIRED)
- 
- if(UNIX AND NOT APPLE)
-   include(cmake/check_c_compiler_uses_glibc.cmake)
-@@ -90,6 +91,8 @@ target_link_libraries(${PROJECT_NAME}
-   ${CMAKE_DL_LIBS}
-   ament_cmake_ros_core::ament_ros_defaults
- )
-+target_link_libraries(${PROJECT_NAME} Threads::Threads)
-+ament_export_dependencies(Threads)
- 
- check_library_exists(atomic __atomic_load_8 "" HAVE_LIBATOMICS)
- 
-diff --git a/src/testing/fault_injection.c b/src/testing/fault_injection.c
-index a8b69d6..45fd5ae 100644
---- a/src/testing/fault_injection.c
-+++ b/src/testing/fault_injection.c
-@@ -16,7 +16,11 @@
- 
- #include "rcutils/stdatomic_helper.h"
- 
-+#if defined(_WIN32) && !defined(__MINGW64__)
- static atomic_int_least64_t g_rcutils_fault_injection_count = {-1};
-+#else
-+static atomic_int_least64_t g_rcutils_fault_injection_count = -1;
-+#endif
- 
- void rcutils_fault_injection_set_count(int_least64_t count)
- {
diff --git a/patch/ros-rolling-rmw-test-fixture-implementation.emscripten.patch b/patch/ros-rolling-rmw-test-fixture-implementation.emscripten.patch
new file mode 100644
index 000000000..a72e1f740
--- /dev/null
+++ b/patch/ros-rolling-rmw-test-fixture-implementation.emscripten.patch
@@ -0,0 +1,48 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 906c3d1..fc94182 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -64,20 +64,29 @@ install(
+   RUNTIME DESTINATION bin
+ )
+ 
+-add_executable(run_rmw_isolated
+-  src/run_rmw_isolated.c
+-)
+-target_link_libraries(run_rmw_isolated
+-  ament_cmake_ros_core::ament_ros_defaults
+-  rcutils::rcutils
+-  rmw_test_fixture_implementation
+-)
+-
+-install(
+-  TARGETS run_rmw_isolated
+-  EXPORT ${PROJECT_NAME}
+-  DESTINATION lib/${PROJECT_NAME}
+-)
++# run_rmw_isolated is a debugging/test utility that re-execs an isolated
++# process with dlinfo() + pthread_getname_np()/pthread_setname_np() for
++# introspection -- none of which emscripten's libc implements (confirmed
++# 2026-09-09: "undefined symbol: dlinfo/pthread_getname_np/pthread_setname_np"
++# linking it as a MAIN_MODULE). Not needed at runtime by anything that
++# actually uses rmw_test_fixture_implementation as a library, so just skip
++# building it there.
++if(NOT EMSCRIPTEN)
++  add_executable(run_rmw_isolated
++    src/run_rmw_isolated.c
++  )
++  target_link_libraries(run_rmw_isolated
++    ament_cmake_ros_core::ament_ros_defaults
++    rcutils::rcutils
++    rmw_test_fixture_implementation
++  )
++
++  install(
++    TARGETS run_rmw_isolated
++    EXPORT ${PROJECT_NAME}
++    DESTINATION lib/${PROJECT_NAME}
++  )
++endif()
+ 
+ ament_python_install_package(${PROJECT_NAME})
+ 
diff --git a/patch/ros-rolling-rmw-zenoh-pico.patch b/patch/ros-rolling-rmw-zenoh-pico.patch
new file mode 100644
index 000000000..a5937fb94
--- /dev/null
+++ b/patch/ros-rolling-rmw-zenoh-pico.patch
@@ -0,0 +1,1616 @@
+diff --git a/rmw_zenoh_pico/CMakeLists.txt b/rmw_zenoh_pico/CMakeLists.txt
+index 1038b63..251bf7f 100644
+--- a/rmw_zenoh_pico/CMakeLists.txt
++++ b/rmw_zenoh_pico/CMakeLists.txt
+@@ -22,13 +22,75 @@ project(rmw_zenoh_pico
+     C
+ )
+ 
+-find_package(ament_cmake_ros REQUIRED)
++find_package(ament_cmake REQUIRED)
++find_package(ament_cmake_ros_core REQUIRED)
++
++# ament_target_dependencies() was removed from rolling's ament_cmake (it
++# doesn't exist in any ros2-ament-cmake* package we build here) -- this
++# repo still targets the older jazzy-era convention. Minimal drop-in
++# replacement: every ament package below still exports the classic
++# ${pkg}_INCLUDE_DIRS / ${pkg}_LIBRARIES / ${pkg}_DEFINITIONS variables via
++# ament_cmake_export_include_directories/export_libraries (confirmed via
++# rcutils's installed cmake extras, 2026-09-09), which is literally what
++# the old macro consumed.
++if(NOT COMMAND ament_target_dependencies)
++  macro(ament_target_dependencies _target)
++    foreach(_dep ${ARGN})
++      if(DEFINED ${_dep}_INCLUDE_DIRS)
++        target_include_directories(${_target} PUBLIC ${${_dep}_INCLUDE_DIRS})
++      endif()
++      if(DEFINED ${_dep}_LIBRARIES)
++        target_link_libraries(${_target} ${${_dep}_LIBRARIES})
++      elseif(TARGET ${_dep}::${_dep}_shared)
++        # Some modern, target-only packages (no legacy ${pkg}_LIBRARIES
++        # variable at all -- confirmed for zenohpico's own Config.cmake,
++        # which only exports the zenohpico::zenohpico_shared imported
++        # target) fall through the branch above with NOTHING linked at
++        # all. On a normal platform this is silently wrong but harmless
++        # (the symbols get pulled in some other way, or the link just
++        # fails loudly); on this project's Emscripten SIDE_MODULE builds
++        # it's silently WRONG in a much worse way: wasm-ld still resolves
++        # the actual symbol references at THIS package's own build time
++        # (this project's dynamic-linking side modules are lazy about
++        # unresolved externals by design), so the build succeeds with
++        # zero errors or warnings -- but the resulting .so's
++        # own dylink metadata never records the dependency as NEEDED,
++        # since target_link_libraries() was never actually called for it.
++        # At runtime, Emscripten's dynamic linker then has no reason to
++        # ensure that dependency is loaded before this one, and symbol
++        # resolution becomes pure luck-of-load-order instead of a real
++        # guarantee -- confirmed via a real crash: `rclpy.init()` failing
++        # with "Dynamic linking error: cannot resolve symbol z_malloc"
++        # (zenohpico's own allocator, needed by rmw_zenoh_pico.so) the
++        # first time this project's own JupyterLite rclpy integration
++        # actually got far enough to construct a real zenoh session.
++        target_link_libraries(${_target} ${_dep}::${_dep}_shared)
++      endif()
++      if(DEFINED ${_dep}_DEFINITIONS)
++        target_compile_definitions(${_target} PUBLIC ${${_dep}_DEFINITIONS})
++      endif()
++    endforeach()
++  endmacro()
++endif()
+ find_package(rosidl_runtime_c REQUIRED)
+ find_package(rcutils REQUIRED)
+ find_package(rmw REQUIRED)
+ find_package(microcdr REQUIRED)
+ find_package(zenohpico REQUIRED)
+ 
++if(EMSCRIPTEN)
++  # zenoh-pico's own headers gate platform-specific code on this define
++  # (its emscripten.cmake platform profile sets
++  # ZP_PLATFORM_COMPILE_DEFINITIONS ZENOH_EMSCRIPTEN for ITS OWN sources),
++  # but that's a PUBLIC target_compile_definitions() on zenoh-pico's own
++  # CMake target -- propagating it to a consumer requires linking against
++  # the actual imported target, which our ament_target_dependencies() shim
++  # above doesn't do (it uses the old ${pkg}_LIBRARIES variable instead).
++  # Set it directly instead. Confirmed necessary via zenoh-pico/system/common/
++  # platform.h's #error "Unknown platform", 2026-09-09.
++  add_definitions(-DZENOH_EMSCRIPTEN)
++endif()
++
+ # Build options
+ option(BUILD_DOCUMENTATION              "Use doxygen to create product documentation" OFF)
+ 
+@@ -109,6 +171,7 @@ set(SRCS
+   src/zenoh_pico/zenoh_pico_data.c
+   src/zenoh_pico/zenoh_pico_entity.c
+   src/zenoh_pico/zenoh_pico_gid.c
++  src/zenoh_pico/zenoh_pico_graph_cache.c
+   src/zenoh_pico/zenoh_pico_liveliness.c
+   src/zenoh_pico/zenoh_pico_messageType.c
+   src/zenoh_pico/zenoh_pico_nodeInfo.c
+@@ -147,6 +210,47 @@ target_link_libraries(${PROJECT_NAME}
+   microcdr
+ )
+ 
++if(EMSCRIPTEN)
++  # rmw_zenoh_pico_set_unicast() (and friends, declared in
++  # rmw_zenoh_pico_options.h) aren't part of the standard rmw.h ABI surface,
++  # so nothing inside this library or a normal ROS 2 caller references them
++  # -- unlike most of the standard rmw_* functions (looked up by
++  # rmw_implementation via dlopen+dlsym, so implicitly kept), wasm-ld's
++  # side-module build drops anything with zero references from the dylink
++  # export table. A wasm32 app that wants to override the compiled-in
++  # zenoh connect address at runtime (see ros2-emscripten-zenoh-demo)
++  # needs these actually exported.
++  #
++  # rmw_identifier.c's own three functions (rmw_get_implementation_identifier,
++  # rmw_get_serialization_format, rmw_zenoh_pico_typesupport_c) turned out
++  # to need the exact same treatment: confirmed via `wasm-objdump -x` that
++  # this entire translation unit -- not just one symbol -- was absent from
++  # the built .so's export table, because (unlike rmw_create_node and most
++  # other standard rmw_* entry points, which stay reachable via some other
++  # internal reference chain in this same link unit) NOTHING in this
++  # module references any of these three, so wasm-ld's dead-code
++  # elimination drops the whole object. This was likely always the case
++  # (nothing about dropping this project's Asyncify usage touched this
++  # file), just never observed before: `import rclpy` never got far
++  # enough to actually dlsym() rmw_get_implementation_identifier() until
++  # the unrelated Asyncify+dlopen trap earlier in the same call chain was
++  # fixed (see ros-rolling-emscripten-zenoh/AGENTS.md's "MAJOR PIVOT"
++  # section). Without this export, rclpy's own dlopen() of
++  # _rclpy_pybind11.so fails with "Dynamic linking error: cannot resolve
++  # symbol rmw_get_implementation_identifier" -- rmw_implementation's own
++  # dispatcher calls this immediately after loading the selected RMW
++  # backend, to confirm the loaded library actually identifies as the
++  # implementation that was asked for.
++  target_link_options(${PROJECT_NAME} PRIVATE
++    "-Wl,--export=rmw_zenoh_pico_set_unicast"
++    "-Wl,--export=rmw_zenoh_pico_set_mode"
++    "-Wl,--export=rmw_zenoh_pico_get_mode"
++    "-Wl,--export=rmw_get_implementation_identifier"
++    "-Wl,--export=rmw_get_serialization_format"
++    "-Wl,--export=rmw_zenoh_pico_typesupport_c"
++  )
++endif()
++
+ # Type support lock-up mechanism
+ find_package(rosidl_typesupport_microxrcedds_c)
+ if(rosidl_typesupport_microxrcedds_c_FOUND)
+diff --git a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico.h b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico.h
+index 7cc5e97..604733e 100644
+--- a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico.h
++++ b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico.h
+@@ -56,6 +56,13 @@
+ #include 
+ #include 
+ #include 
++// zenoh-pico >=1.7.0 split _Z_CHECK_SYS_ERR/_z_report_system_error out into
++// their own header (used by zenoh_pico_condition.c's z_condvar_init_with_attr).
++// Must be included here, before rmw_zenoh_pico_logging.h below redefines
++// _Z_ERROR with a different (func-name-first) calling convention -- the
++// static inline _z_report_system_error() body is compiled wherever this
++// header is first seen, so include order determines which _Z_ERROR it gets.
++#include 
+ #include 
+ 
+ // debug print
+@@ -77,6 +84,7 @@ extern int target_print(const char *fmt, ...);
+ #include 
+ #include 
+ #include 
++#include 
+ #include 
+ #include 
+ #include 
+diff --git a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_event.h b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_event.h
+index 9ef8ddf..4c04b53 100644
+--- a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_event.h
++++ b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_event.h
+@@ -29,16 +29,18 @@ extern "C"
+ {
+ #endif  // if defined(__cplusplus)
+ 
+-  // Note :
+-  // the current implement of rmw_zenoh_pico does not support event.
+-  // because, the gid_cache is not implemented on rmw_zenoh_pico.
+-  //
++  // Note:
++  // QoS event/matching support -- see rmw_zenoh_pico_graph_cache.h. Only
++  // the two events a real discovered-peer QoS comparison can actually
++  // drive are enabled: MESSAGE_LOST and the INCOMPATIBLE_TYPE pair need
++  // per-sample/per-type-hash tracking this project doesn't implement, and
++  // remain genuinely unsupported.
+   static rmw_event_type_t _support_event[] = {
+-    // RMW_EVENT_REQUESTED_QOS_INCOMPATIBLE,
+-    // RMW_EVENT_OFFERED_QOS_INCOMPATIBLE,
++    RMW_EVENT_REQUESTED_QOS_INCOMPATIBLE,
++    RMW_EVENT_OFFERED_QOS_INCOMPATIBLE,
+     // RMW_EVENT_MESSAGE_LOST,
+-    // RMW_EVENT_SUBSCRIPTION_MATCHED,
+-    // RMW_EVENT_PUBLICATION_MATCHED,
++    RMW_EVENT_SUBSCRIPTION_MATCHED,
++    RMW_EVENT_PUBLICATION_MATCHED,
+     // RMW_EVENT_SUBSCRIPTION_INCOMPATIBLE_TYPE,
+     // RMW_EVENT_PUBLISHER_INCOMPATIBLE_TYPE,
+   };
+@@ -51,6 +53,16 @@ extern "C"
+     size_t current_count;
+     size_t current_count_change;
+     bool changed;
++    // Only meaningful for RMW_EVENT_REQUESTED_QOS_INCOMPATIBLE /
++    // RMW_EVENT_OFFERED_QOS_INCOMPATIBLE -- which policy caused the most
++    // recent incompatibility (rmw_*_qos_incompatible_event_status_t's own
++    // documented field). rclpy's own default incompatible-QoS callback
++    // (event_handler.py's _default_incompatible_qos_callback) reads this
++    // unconditionally once such an event is taken, so it has to be a real
++    // rmw_qos_policy_kind_t value, never left at its zero-initialized
++    // default (0 is not a valid rmw_qos_policy_kind_t -- see
++    // qos_policy_kind.h, every value there is a nonzero bit flag).
++    rmw_qos_policy_kind_t last_policy_kind;
+   } EventStatus;
+ 
+   typedef struct _DataEventManager {
+@@ -75,7 +87,10 @@ extern "C"
+   } DataEventManager;
+ 
+   extern void add_rmw_zenoh_pico_event_total(DataEventManager *event_mgr, rmw_event_type_t type, bool change);
++  extern void set_rmw_zenoh_pico_event_last_policy_kind(DataEventManager *event_mgr, rmw_event_type_t type, rmw_qos_policy_kind_t policy_kind);
+   extern void add_rmw_zenoh_pico_event_current(DataEventManager *event_mgr, rmw_event_type_t type, bool change);
++  extern void sub_rmw_zenoh_pico_event_current(DataEventManager *event_mgr, rmw_event_type_t type, bool change);
++  extern size_t get_rmw_zenoh_pico_event_current_count(DataEventManager *event_mgr, rmw_event_type_t type);
+   extern bool is_rmw_zenoh_pico_event_changed(DataEventManager *event_mgr, rmw_event_type_t type);
+ 
+   extern bool event_condition_check_and_attach(DataEventManager *event_data,
+diff --git a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_service.h b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_service.h
+index f65088f..83301d3 100644
+--- a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_service.h
++++ b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_service.h
+@@ -74,6 +74,14 @@ extern "C"
+     // Internal mutex.
+     z_owned_mutex_t mutex;
+ 
++    // Client only: count of currently-discovered remote services matching
++    // this client's topic_name/topic_type (kept up to date by
++    // zenoh_pico_graph_cache.c's liveliness discovery, the same
++    // infrastructure QoS event/matching already uses). Backs
++    // rmw_service_server_is_available(). Always 0 for a Service entity --
++    // nothing currently needs a service to know about its clients.
++    int available_services;
++
+   } ZenohPicoServiceData;
+ 
+   // common
+diff --git a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_session.h b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_session.h
+index d05f8c6..d33d466 100644
+--- a/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_session.h
++++ b/rmw_zenoh_pico/include/rmw_zenoh_pico/rmw_zenoh_pico_session.h
+@@ -44,6 +44,15 @@ extern "C"
+     // graph infomation
+     rmw_guard_condition_t graph_guard_condition;
+ 
++    // QoS matching: session-wide liveliness discovery subscriber (declared
++    // once, lazily, on the first local publisher/subscription registered --
++    // see rmw_zenoh_pico_graph_cache.h) plus the list of this session's own
++    // local publishers/subscriptions it matches remote discoveries against.
++    z_owned_subscriber_t graph_liveliness_sub;
++    bool graph_liveliness_sub_active;
++    struct _ZenohPicoGraphLocalEntity *graph_local_entities;
++    z_owned_mutex_t graph_lock;
++
+   } ZenohPicoSession;
+ 
+   extern ZenohPicoSession *zenoh_pico_generate_session(const z_loaned_config_t *config,
+diff --git a/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_condition.h b/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_condition.h
+index 8de2826..9022321 100644
+--- a/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_condition.h
++++ b/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_condition.h
+@@ -14,6 +14,16 @@
+  * limitations under the License.
+  */
+ 
++// pthread_condattr_t (used below) is declared by  unconditionally
++// on emscripten -- the type and the real pthread_cond_init/pthread_mutex_init
++// symbols it's used with both exist in emscripten's libc even without
++// -pthread/USE_PTHREADS=1 (confirmed via nm on the non-pthreads libc.a: only
++// *real* OS-level threading is unavailable without it, not these symbols).
++// zenoh-pico's own platform header only includes  when
++// Z_FEATURE_MULTI_THREAD==1, which this file can't rely on for a type it
++// references regardless.
++#include 
++
+ #include 
+ #include 
+ 
+diff --git a/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_graph_cache.h b/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_graph_cache.h
+new file mode 100644
+index 0000000..46b76a2
+--- /dev/null
++++ b/rmw_zenoh_pico/include/rmw_zenoh_pico/zenoh_pico/rmw_zenoh_pico_graph_cache.h
+@@ -0,0 +1,90 @@
++/*
++ * Copyright(C) 2026 the ros2-emscripten-zenoh-demo project.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef RMW_ZENOH_PICO_GRAPH_CACHE_H
++#define RMW_ZENOH_PICO_GRAPH_CACHE_H
++
++#include 
++#include 
++
++#include 
++#include 
++#include 
++
++#if defined(__cplusplus)
++extern "C"
++{
++#endif  // if defined(__cplusplus)
++
++  // One local publisher, subscription, or client, registered with its
++  // session's graph cache so the session-wide liveliness discovery
++  // subscriber can find it when a same-topic remote peer is discovered (or
++  // lost). For a Publisher/Subscription this updates its MATCHED /
++  // QOS_INCOMPATIBLE event counters; for a Client (matched against a
++  // remote Service) it updates the owning ZenohPicoServiceData's
++  // available_services count instead (backing
++  // rmw_service_server_is_available()) -- qos/event_mgr are unused in that
++  // case, just kept non-NULL for a uniform registration call. Owns none of
++  // the pointed-to data -- topic_name/topic_type/qos/event_mgr all live
++  // inside the ZenohPicoPubData/ZenohPicoSubData/ZenohPicoServiceData this
++  // entry was registered for, and must outlive it (guaranteed:
++  // unregistered in the same rmw_destroy_publisher()/
++  // rmw_destroy_subscription()/rmw_destroy_client() call that frees it).
++  typedef struct _ZenohPicoGraphLocalEntity
++  {
++    struct _ZenohPicoGraphLocalEntity *next;
++
++    ZenohPicoEntityType type;  // Publisher, Subscription, or Client
++    const z_loaned_string_t *topic_name;
++    const z_loaned_string_t *topic_type;
++    rmw_qos_profile_t *qos;
++    DataEventManager *event_mgr;
++
++    // Opaque identity used only to find this entry again on unregister --
++    // always the owning ZenohPicoPubData*/ZenohPicoSubData*/
++    // ZenohPicoServiceData*, never dereferenced here.
++    void *owner;
++  } ZenohPicoGraphLocalEntity;
++
++  // Registers a local publisher, subscription, or client so remote
++  // liveliness discovery can match against it. Safe to call multiple times
++  // per session (once per local entity) -- the session-wide liveliness
++  // subscriber itself is only actually declared once, on the first
++  // registration.
++  extern bool graph_cache_register_local(
++    ZenohPicoSession *session,
++    ZenohPicoEntityType type,
++    const z_loaned_string_t *topic_name,
++    const z_loaned_string_t *topic_type,
++    rmw_qos_profile_t *qos,
++    DataEventManager *event_mgr,
++    void *owner);
++
++  // Unregisters a previously-registered local entity (matched by the same
++  // `owner` pointer passed to graph_cache_register_local()). No-op if not
++  // found (e.g. registration itself failed).
++  extern void graph_cache_unregister_local(ZenohPicoSession *session, void *owner);
++
++  // Tears down the session-wide liveliness discovery subscriber and frees
++  // every remaining registered local entity. Called from
++  // zenoh_pico_destroy_session().
++  extern void graph_cache_session_destroy(ZenohPicoSession *session);
++
++#if defined(__cplusplus)
++}
++#endif  // if defined(__cplusplus)
++
++#endif
+diff --git a/rmw_zenoh_pico/package.xml b/rmw_zenoh_pico/package.xml
+index f17bd1d..a6462eb 100644
+--- a/rmw_zenoh_pico/package.xml
++++ b/rmw_zenoh_pico/package.xml
+@@ -9,9 +9,11 @@
+   Apache License 2.0
+   BSD  
+ 
+-  ament_cmake_ros
++  ament_cmake
++  ament_cmake_ros_core
+   rosidl_cmake
+-  ament_cmake_ros
++  ament_cmake
++  ament_cmake_ros_core
+   rosidl_cmake
+ 
+   zenohpico
+diff --git a/rmw_zenoh_pico/src/rmw_client.c b/rmw_zenoh_pico/src/rmw_client.c
+index ee15681..3045252 100644
+--- a/rmw_zenoh_pico/src/rmw_client.c
++++ b/rmw_zenoh_pico/src/rmw_client.c
+@@ -137,6 +137,20 @@ rmw_create_client(
+   if(!declaration_service_data(client_data))
+     goto error;
+ 
++  // register with the session-wide graph cache so remote liveliness
++  // discovery can match against this client (backs
++  // rmw_service_server_is_available()). Non-fatal if it fails -- the
++  // client itself is otherwise fully functional, is_available() will just
++  // always report false.
++  (void)graph_cache_register_local(
++    client_data->node->session,
++    Client,
++    z_loan(client_data->entity->topic_info->name),
++    z_loan(client_data->entity->topic_info->type),
++    &client_data->qos_profile,
++    &client_data->data_event_mgr,
++    client_data);
++
+   return rmw_client;
+ 
+   error:
+@@ -166,6 +180,7 @@ rmw_destroy_client(
+   ZenohPicoServiceData *client_data = (ZenohPicoServiceData *)client->data;
+ 
+   if(client_data != NULL){
++    graph_cache_unregister_local(client_data->node->session, client_data);
+     undeclaration_service_data(client_data);
+     zenoh_pico_destroy_service_data(client_data);
+     client->data = NULL;
+@@ -308,7 +323,21 @@ rmw_send_request(
+   // set attachment value
+   z_get_options_t options;
+   z_get_options_default(&options);
+-  *sequence_id = attachment_sequence_num_inc(&client_data->attachment);
++  // attachment_sequence_num_inc() is a post-increment: it returns the
++  // OLD value and only then bumps client_data->attachment.sequence_num.
++  // attachment_gen() below always serializes the struct's CURRENT
++  // (already-bumped) field -- so the *sequence_id handed back to the
++  // caller here used to be permanently one behind whatever sequence
++  // number actually went out on the wire (and therefore whatever the
++  // eventual reply's echoed request_id.sequence_number reports). rclpy's
++  // own Client.call_async() keys its pending-request dict by this
++  // *sequence_id, so every reply's sequence number looked up a request
++  // that was never registered -- a plain KeyError, silently swallowed by
++  // executors.py's `except KeyError: pass`, so the future the caller is
++  // waiting on never resolves. Bump first, then read the field back, so
++  // *sequence_id is the exact value attachment_gen() is about to embed.
++  (void)attachment_sequence_num_inc(&client_data->attachment);
++  *sequence_id = (int64_t)client_data->attachment.sequence_num;
+ 
+   z_owned_bytes_t attachment;
+   if(_Z_IS_ERR(attachment_gen(&client_data->attachment, &attachment))){
+@@ -401,9 +430,27 @@ rmw_ret_t rmw_service_server_is_available(
+ {
+   RMW_ZENOH_FUNC_ENTRY(node);
+ 
+-  (void)node;
+-  (void)client;
+-  (void)is_available;
+-  RMW_ZENOH_LOG_INFO("function not implemented");
+-  return RMW_RET_UNSUPPORTED;
++  RMW_CHECK_ARGUMENT_FOR_NULL(node, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_ARGUMENT_FOR_NULL(client, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_ARGUMENT_FOR_NULL(is_available, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_TYPE_IDENTIFIERS_MATCH(
++    node->implementation_identifier,
++    return RMW_RET_INCORRECT_RMW_IMPLEMENTATION);
++  RMW_CHECK_TYPE_IDENTIFIERS_MATCH(
++    client->implementation_identifier,
++    return RMW_RET_INCORRECT_RMW_IMPLEMENTATION);
++
++  ZenohPicoServiceData * client_data = (ZenohPicoServiceData *)client->data;
++  RMW_CHECK_FOR_NULL_WITH_MSG(
++    client_data,
++    "Unable to retrieve client_data from client.",
++    RMW_RET_INVALID_ARGUMENT);
++
++  // Backed by the same liveliness-discovery graph cache QoS event/matching
++  // already uses (zenoh_pico_graph_cache.c) -- available_services is kept
++  // up to date as matching "SS" (service) liveliness tokens are discovered
++  // or lost. See graph_cache_register_local()'s call in rmw_create_client().
++  *is_available = client_data->available_services > 0;
++
++  return RMW_RET_OK;
+ }
+diff --git a/rmw_zenoh_pico/src/rmw_event.c b/rmw_zenoh_pico/src/rmw_event.c
+index 66b6528..40cefce 100644
+--- a/rmw_zenoh_pico/src/rmw_event.c
++++ b/rmw_zenoh_pico/src/rmw_event.c
+@@ -17,12 +17,28 @@
+ 
+ static int support_event_type(rmw_event_type_t type)
+ {
+-#ifndef EVENT_TABLE_SIZE
++  // Upstream bug: this used to read `#ifndef EVENT_TABLE_SIZE` -- but that
++  // macro (see rmw_zenoh_pico_event.h) is unconditionally defined by the
++  // very header this file includes, so the #ifndef is always false and the
++  // lookup loop below was preprocessed out entirely, unconditionally,
++  // forever. support_event_type() therefore always fell straight through
++  // to `return -1`, for every event type, no matter what `_support_event[]`
++  // actually listed. Silently dormant until now: rmw_publisher_event_init()/
++  // rmw_subscription_event_init() failing "unsupported" is non-fatal
++  // (rclpy's own create_event_handlers() catches and ignores it), so no
++  // publisher/subscriber construction ever visibly broke -- it just meant
++  // every event's total_count/current_count bookkeeping in
++  // add_rmw_zenoh_pico_event_total()/_current()/take_event_status() (and,
++  // new in this patch, get_rmw_zenoh_pico_event_current_count()) was
++  // *always* silently skipped, project-wide, regardless of _support_event[]
++  // contents. First surfaced while testing the QoS event/matching feature
++  // added alongside this fix (see rmw_zenoh_pico_graph_cache.h) -- a real
++  // discovered-peer match updated nothing because take_event_status()
++  // could never find a live slot to update.
+   for(size_t index = 0; index < EVENT_TABLE_SIZE; index++){
+     if(_support_event[index] == type)
+       return index;
+   }
+-#endif
+   return -1;
+ }
+ 
+@@ -54,12 +70,23 @@ void add_rmw_zenoh_pico_event_total(DataEventManager *event_mgr, rmw_event_type_
+   return;
+ }
+ 
++void set_rmw_zenoh_pico_event_last_policy_kind(DataEventManager *event_mgr, rmw_event_type_t type, rmw_qos_policy_kind_t policy_kind)
++{
++  z_mutex_lock(z_loan_mut(event_mgr->mutex));
++
++  EventStatus *status = take_event_status(event_mgr, type);
++  if(status != NULL){
++    status->last_policy_kind = policy_kind;
++  }
++
++  z_mutex_unlock(z_loan_mut(event_mgr->mutex));
++}
++
+ void add_rmw_zenoh_pico_event_current(DataEventManager *event_mgr, rmw_event_type_t type, bool change)
+ {
+ 
+   z_mutex_lock(z_loan_mut(event_mgr->mutex));
+ 
+-  int index = support_event_type(type);
+   EventStatus *status = take_event_status(event_mgr, type);
+   if(status != NULL){
+     status->current_count += 1;
+@@ -73,6 +100,47 @@ void add_rmw_zenoh_pico_event_current(DataEventManager *event_mgr, rmw_event_typ
+   return;
+ }
+ 
++// Counterpart to add_rmw_zenoh_pico_event_current() for event types whose
++// current_count can genuinely decrease (RMW_EVENT_*_MATCHED: how many
++// peers are matched *right now*, as opposed to the monotonic total_count
++// lifetime counter -- see rmw_matched_status_t's own documented
++// semantics). Floors at 0 rather than underflowing.
++void sub_rmw_zenoh_pico_event_current(DataEventManager *event_mgr, rmw_event_type_t type, bool change)
++{
++
++  z_mutex_lock(z_loan_mut(event_mgr->mutex));
++
++  EventStatus *status = take_event_status(event_mgr, type);
++  if(status != NULL && status->current_count > 0){
++    status->current_count -= 1;
++    if(change)
++      status->current_count_change += 1;
++    status->changed = true;
++  }
++
++  z_mutex_unlock(z_loan_mut(event_mgr->mutex));
++
++  return;
++}
++
++// Reads back an event's live current_count (e.g. RMW_EVENT_*_MATCHED) without
++// consuming/clearing its "changed" flag -- used by
++// rmw_publisher_count_matched_subscriptions() / rmw_subscription_count_matched_publishers(),
++// which report a live snapshot rather than a one-shot event.
++size_t get_rmw_zenoh_pico_event_current_count(DataEventManager *event_mgr, rmw_event_type_t type)
++{
++  z_mutex_lock(z_loan_mut(event_mgr->mutex));
++
++  size_t count = 0;
++  EventStatus *status = take_event_status(event_mgr, type);
++  if(status != NULL)
++    count = status->current_count;
++
++  z_mutex_unlock(z_loan_mut(event_mgr->mutex));
++
++  return count;
++}
++
+ bool is_rmw_zenoh_pico_event_changed(DataEventManager *event_mgr, rmw_event_type_t type)
+ {
+   z_mutex_lock(z_loan_mut(event_mgr->mutex));
+@@ -93,14 +161,18 @@ bool is_rmw_zenoh_pico_event_changed(DataEventManager *event_mgr, rmw_event_type
+ 
+ static bool event_condition_check(DataEventManager *event_mgr)
+ {
+-#ifndef EVENT_TABLE_SIZE
++  // Same broken `#ifndef EVENT_TABLE_SIZE` upstream bug as
++  // support_event_type() above -- always false, so this loop was always
++  // skipped and event_condition_check() always returned false. Meant
++  // rmw_wait() could never be woken by a genuine event-status change
++  // reaching event_condition_check_and_attach()/
++  // event_condition_detach_and_queue_is_empty() through this path.
+   for(size_t index = 0; index < EVENT_TABLE_SIZE; index++){
+     rmw_event_type_t type = _support_event[index];
+ 
+     if(is_rmw_zenoh_pico_event_changed(event_mgr, type))
+       return true;
+   }
+-#endif
+ 
+   return false;
+ }
+@@ -240,7 +312,7 @@ rmw_publisher_event_init(
+ 
+   if(support_event_type(event_type) < 0){
+     RMW_SET_ERROR_MSG("Publisher implementation identifier not from this implementation");
+-    return RMW_RET_INCORRECT_RMW_IMPLEMENTATION;
++    return RMW_RET_UNSUPPORTED;
+   }
+ 
+   ZenohPicoPubData *pub_data = (ZenohPicoPubData *)publisher->data;
+@@ -271,7 +343,7 @@ rmw_subscription_event_init(
+ 
+   if(support_event_type(event_type) < 0){
+     RMW_SET_ERROR_MSG("Publisher implementation identifier not from this implementation");
+-    return RMW_RET_INCORRECT_RMW_IMPLEMENTATION;
++    return RMW_RET_UNSUPPORTED;
+   }
+ 
+   ZenohPicoSubData *pub_data = (ZenohPicoSubData *)subscription->data;
+@@ -295,7 +367,33 @@ void data_callback_init(DataEventManager *data_callback)
+   data_callback->callback = NULL;
+   data_callback->user_data = NULL;
+   data_callback->unread_count = 0;
+-  memset(data_callback->event_status, 0, sizeof(EventStatus));
++  // sizeof(EventStatus) (one entry) used to be passed here instead of
++  // sizeof(data_callback->event_status) (the whole EVENT_TABLE_SIZE-entry
++  // array) -- only event_status[0] (REQUESTED_QOS_INCOMPATIBLE) ever got
++  // zeroed; every other slot kept whatever garbage was already in this
++  // struct's memory (ZenohPicoPubData/ZenohPicoSubData are heap-allocated
++  // via ZenohPicoDataGenerate() without a full memset, unlike
++  // ZenohPicoSession). Dormant while only 2 event types were ever enabled
++  // (both plain lifetime total_count-only incident counters, so a stray
++  // nonzero start was hard to notice); real for the 4 QoS-matching event
++  // types added alongside the graph cache (see
++  // rmw_zenoh_pico_graph_cache.h) -- current_count read back by
++  // rmw_publisher_count_matched_subscriptions()/
++  // rmw_subscription_count_matched_publishers() needs a real zero start.
++  memset(data_callback->event_status, 0, sizeof(data_callback->event_status));
++  // A zeroed last_policy_kind is not a valid rmw_qos_policy_kind_t (every
++  // real value in qos_policy_kind.h is a nonzero bit flag) -- an
++  // REQUESTED/OFFERED_QOS_INCOMPATIBLE event that fires before
++  // update_match_events() ever sets a real policy kind for it (e.g. this
++  // node's own automatic /parameter_events publisher, which the graph
++  // cache never touches since nothing in this project subscribes to it)
++  // would otherwise hand rclpy's default incompatible-QoS callback a raw
++  // 0, which qos_policy_name_from_kind() rejects with a ValueError.
++  // RMW_QOS_POLICY_INVALID is qos_policy_kind.h's own designated "no
++  // specific policy" value -- a safe, real default.
++  for (size_t index = 0; index < EVENT_TABLE_SIZE; index++) {
++    data_callback->event_status[index].last_policy_kind = RMW_QOS_POLICY_INVALID;
++  }
+ }
+ 
+ void data_callback_set(DataEventManager *data_callback,
+@@ -311,7 +409,7 @@ void data_callback_set(DataEventManager *data_callback,
+       data_callback->callback(data_callback->user_data,
+ 			      data_callback->unread_count);
+       data_callback->unread_count = 0;
+-      memset(data_callback->event_status, 0, sizeof(EventStatus));
++      memset(data_callback->event_status, 0, sizeof(data_callback->event_status));
+     }
+     data_callback->user_data = user_data;
+     data_callback->callback  = callback;
+@@ -365,12 +463,44 @@ rmw_take_event(const rmw_event_t * event_handle,
+     "Publisher implementation identifier not from this implementation",
+     return RMW_RET_INCORRECT_RMW_IMPLEMENTATION);
+ 
++  // event_condition_check() (used by rmw_wait() to decide whether a
++  // wait-set entry is "ready") checks whether *any* of this shared
++  // DataEventManager's event types changed, not specifically the one
++  // `event_handle` here represents -- a publisher/subscription with more
++  // than one registered rmw_event_t (e.g. the default incompatible-QoS
++  // handler alongside a real MATCHED status change) had every sibling
++  // handle spuriously reported "ready" whenever *any* of them changed.
++  // rmw_take_event() used to compound that by never checking its own
++  // type's `changed` flag either, so a spurious wakeup for -- say --
++  // OFFERED_QOS_INCOMPATIBLE would still unconditionally report
++  // total_count=0/last_policy_kind=RMW_QOS_POLICY_INVALID with
++  // *taken=true, firing rclpy's default incompatible-QoS callback for an
++  // incident that never happened. Gate on this event's own `changed`
++  // flag first: a genuine change still reports normally below (and the
++  // switch cases each clear `changed` once taken); nothing to report
++  // otherwise.
++  z_mutex_lock(z_loan_mut(event_mgr->mutex));
++  bool has_changed = st->changed;
++  z_mutex_unlock(z_loan_mut(event_mgr->mutex));
++  if (!has_changed) {
++    return RMW_RET_OK;
++  }
++
+   switch (event_type) {
+   case RMW_EVENT_REQUESTED_QOS_INCOMPATIBLE:
+   {
+     rmw_requested_qos_incompatible_event_status_t *ei = (rmw_requested_qos_incompatible_event_status_t *)event_info;
+     ei->total_count = st->total_count;
+     ei->total_count_change = st->total_count_change;
++    // last_policy_kind used to be left unset here -- rclpy's own default
++    // incompatible-QoS callback (event_handler.py's
++    // _default_incompatible_qos_callback -> qos.py's
++    // qos_policy_kind_from_kind()) reads it unconditionally once this
++    // event is taken, and raised ValueError on whatever uninitialized
++    // stack/heap garbage happened to be there instead of a real
++    // rmw_qos_policy_kind_t value. See update_match_events()
++    // (zenoh_pico_graph_cache.h) for where this gets set.
++    ei->last_policy_kind = st->last_policy_kind;
+     st->changed = false;
+     *taken = true;
+     return RMW_RET_OK;
+@@ -381,6 +511,7 @@ rmw_take_event(const rmw_event_t * event_handle,
+     rmw_requested_qos_incompatible_event_status_t *ei = (rmw_requested_qos_incompatible_event_status_t *)event_info;
+     ei->total_count = st->total_count;
+     ei->total_count_change = st->total_count_change;
++    ei->last_policy_kind = st->last_policy_kind;
+     st->changed = false;
+     *taken = true;
+     return RMW_RET_OK;
+diff --git a/rmw_zenoh_pico/src/rmw_init.c b/rmw_zenoh_pico/src/rmw_init.c
+index 2695094..fca09f1 100644
+--- a/rmw_zenoh_pico/src/rmw_init.c
++++ b/rmw_zenoh_pico/src/rmw_init.c
+@@ -154,7 +154,14 @@ static rmw_ret_t rmw_zenoh_pico_init_option(ZenohPicoTransportParams *params)
+     memset(params->connect_addr, 0, sizeof(params->connect_addr));
+     if(strcmp(_rmw_zenoh_pico_connect_port, "-1") != 0){
+       memset(buf, 0, sizeof(buf));
++      // A browser sandbox has no raw TCP sockets, so the wasm32 build of
++      // zenoh-pico is compiled with Z_FEATURE_LINK_WS instead -- it can only
++      // dial a "ws/" locator, never "tcp/". Native platforms are unaffected.
++#if defined(ZENOH_EMSCRIPTEN)
++      snprintf(buf, sizeof(buf), "ws/%s:%s",
++#else
+       snprintf(buf, sizeof(buf), "tcp/%s:%s",
++#endif
+ 	       _rmw_zenoh_pico_connect,
+ 	       _rmw_zenoh_pico_connect_port);
+       if(strlen(buf) >= sizeof(params->connect_addr) -1) {
+@@ -224,7 +231,12 @@ rmw_init_options_init(rmw_init_options_t * init_options, rcutils_allocator_t all
+   init_options->enclave                   = "/";
+   init_options->domain_id		  = 0;
+   init_options->security_options	  = rmw_get_default_security_options();
+-  init_options->localhost_only		  = RMW_LOCALHOST_ONLY_DEFAULT;
++  // localhost_only was removed from rmw_init_options_s in rolling (folded
++  // into the more general discovery_options mechanism instead) -- this
++  // struct field/macro no longer exists at all (confirmed 2026-09-09).
++  // discovery_options is left at whatever rmw_get_zero_initialized_init_options()
++  // already set it to upstream; this prototype RMW doesn't otherwise
++  // configure discovery ranges.
+ 
+   // This can be call before rmw_init()
+   ZenohPicoTransportParams *params = zenoh_pico_generate_param(NULL);
+diff --git a/rmw_zenoh_pico/src/rmw_logging.c b/rmw_zenoh_pico/src/rmw_logging.c
+index 92604b2..32d2f67 100644
+--- a/rmw_zenoh_pico/src/rmw_logging.c
++++ b/rmw_zenoh_pico/src/rmw_logging.c
+@@ -19,7 +19,7 @@
+ static z_owned_mutex_t mutex_logging;
+ 
+ // Timestamp function
+-#if defined(ZENOH_LINUX) || defined (ZENOH_ARDUINO_ESP32) || defined (ZENOH_ESPIDF)
++#if defined(ZENOH_LINUX) || defined (ZENOH_ARDUINO_ESP32) || defined (ZENOH_ESPIDF) || defined(ZENOH_EMSCRIPTEN)
+ 
+ void z_log_prefix(const char *prefix, const char *func_name, const char *fmt, ...) {
+   static char tstamp[64];
+diff --git a/rmw_zenoh_pico/src/rmw_publisher.c b/rmw_zenoh_pico/src/rmw_publisher.c
+index 4faa566..cfc0054 100644
+--- a/rmw_zenoh_pico/src/rmw_publisher.c
++++ b/rmw_zenoh_pico/src/rmw_publisher.c
+@@ -327,6 +327,19 @@ rmw_create_publisher(
+   if(!declaration_publisher_data(pub_data))
+     goto error;
+ 
++  // register with the session-wide graph cache so remote liveliness
++  // discovery can match against this publisher (QoS event/matching
++  // support). Non-fatal if it fails -- the publisher itself is otherwise
++  // fully functional, it just won't report MATCHED/QOS_INCOMPATIBLE events.
++  (void)graph_cache_register_local(
++    pub_data->node->session,
++    Publisher,
++    z_loan(pub_data->entity->topic_info->name),
++    z_loan(pub_data->entity->topic_info->type),
++    &pub_data->adapted_qos_profile,
++    &pub_data->data_event_mgr,
++    pub_data);
++
+   return rmw_publisher;
+ 
+ error:
+@@ -356,6 +369,7 @@ rmw_destroy_publisher(
+   ZenohPicoPubData *pub_data = (ZenohPicoPubData *)publisher->data;
+ 
+   if(pub_data != NULL){
++    graph_cache_unregister_local(pub_data->node->session, pub_data);
+     undeclaration_publisher_data(pub_data);
+     zenoh_pico_destroy_publisher_data(pub_data);
+     publisher->data = NULL;
+@@ -376,10 +390,16 @@ rmw_publisher_count_matched_subscriptions(
+ {
+   RMW_ZENOH_FUNC_ENTRY(publisher);
+ 
+-  (void)publisher;
+-  (void)subscription_count;
+-  RMW_ZENOH_LOG_INFO("Function not available");
+-  return RMW_RET_UNSUPPORTED;
++  RMW_CHECK_ARGUMENT_FOR_NULL(publisher, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_ARGUMENT_FOR_NULL(publisher->data, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_ARGUMENT_FOR_NULL(subscription_count, RMW_RET_INVALID_ARGUMENT);
++
++  ZenohPicoPubData *pub_data = (ZenohPicoPubData *)publisher->data;
++
++  *subscription_count = get_rmw_zenoh_pico_event_current_count(
++    &pub_data->data_event_mgr, RMW_EVENT_PUBLICATION_MATCHED);
++
++  return RMW_RET_OK;
+ }
+ 
+ rmw_ret_t
+diff --git a/rmw_zenoh_pico/src/rmw_service.c b/rmw_zenoh_pico/src/rmw_service.c
+index 852fb95..24d31e5 100644
+--- a/rmw_zenoh_pico/src/rmw_service.c
++++ b/rmw_zenoh_pico/src/rmw_service.c
+@@ -134,6 +134,8 @@ ZenohPicoServiceData * zenoh_pico_generate_service_data(
+   z_slice_copy_from_buf(&data->attachment.gid, _gid, sizeof(_gid));
+   data->attachment.sequence_num = 0;
+ 
++  data->available_services = 0;
++
+   return data;
+ 
+ error:
+diff --git a/rmw_zenoh_pico/src/rmw_subscription.c b/rmw_zenoh_pico/src/rmw_subscription.c
+index 78c7c08..4c79383 100644
+--- a/rmw_zenoh_pico/src/rmw_subscription.c
++++ b/rmw_zenoh_pico/src/rmw_subscription.c
+@@ -395,6 +395,20 @@ rmw_create_subscription(
+   if(!declaration_subscription_data(sub_data))
+     goto error;
+ 
++  // register with the session-wide graph cache so remote liveliness
++  // discovery can match against this subscription (QoS event/matching
++  // support). Non-fatal if it fails -- the subscription itself is
++  // otherwise fully functional, it just won't report MATCHED/QOS_INCOMPATIBLE
++  // events.
++  (void)graph_cache_register_local(
++    sub_data->node->session,
++    Subscription,
++    z_loan(sub_data->entity->topic_info->name),
++    z_loan(sub_data->entity->topic_info->type),
++    &sub_data->adapted_qos_profile,
++    &sub_data->data_event_mgr,
++    sub_data);
++
+   return rmw_subscription;
+ 
+ error:
+@@ -423,6 +437,7 @@ rmw_destroy_subscription(
+   ZenohPicoSubData *sub_data = (ZenohPicoSubData *)subscription->data;
+ 
+   if(sub_data != NULL){
++    graph_cache_unregister_local(sub_data->node->session, sub_data);
+     undeclaration_subscription_data(sub_data);
+     zenoh_pico_destroy_subscription_data(sub_data);
+     subscription->data = NULL;
+@@ -442,11 +457,17 @@ rmw_subscription_count_matched_publishers(
+   size_t * publisher_count)
+ {
+   RMW_ZENOH_FUNC_ENTRY(subscription);
+-  (void)subscription;
+-  (void)publisher_count;
+-  RMW_ZENOH_LOG_INFO(
+-    "Function not available");
+-  return RMW_RET_UNSUPPORTED;
++
++  RMW_CHECK_ARGUMENT_FOR_NULL(subscription, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_ARGUMENT_FOR_NULL(subscription->data, RMW_RET_INVALID_ARGUMENT);
++  RMW_CHECK_ARGUMENT_FOR_NULL(publisher_count, RMW_RET_INVALID_ARGUMENT);
++
++  ZenohPicoSubData *sub_data = (ZenohPicoSubData *)subscription->data;
++
++  *publisher_count = get_rmw_zenoh_pico_event_current_count(
++    &sub_data->data_event_mgr, RMW_EVENT_SUBSCRIPTION_MATCHED);
++
++  return RMW_RET_OK;
+ }
+ 
+ rmw_ret_t
+diff --git a/rmw_zenoh_pico/src/rmw_wait.c b/rmw_zenoh_pico/src/rmw_wait.c
+index 1302caa..f6a54b2 100644
+--- a/rmw_zenoh_pico/src/rmw_wait.c
++++ b/rmw_zenoh_pico/src/rmw_wait.c
+@@ -57,8 +57,26 @@ static bool _check_and_attach_condition(const rmw_subscriptions_t * const subscr
+   }
+ 
+   if(events) {
++    // Upstream bug: `events->events[i]` here is NOT a DataEventManager* --
++    // rcl's own rcl_wait_set_add_event() (rcl/src/rcl/wait.c) explicitly
++    // stores the `rmw_event_t*` handle itself at this index (overwriting
++    // the `rmw_handle->data` value its own SET_ADD_RMW() macro had just
++    // written one line earlier), and every other rmw implementation
++    // agrees this is the real contract -- e.g. rmw_fastrtps's own
++    // rmw_wait.cpp does `static_cast(events->events[i])`
++    // before ever touching `->data`. This file used to skip that
++    // dereference and cast `events->events[i]` directly to
++    // DataEventManager*, silently reinterpreting an unrelated
++    // rmw_event_t's bytes (implementation_identifier/data/event_type) as
++    // a DataEventManager -- current_count/changed/etc. all landing on
++    // whatever garbage happened to overlap, which is how a bare pointer's
++    // bytes usually happen to look "changed=true" and never quiesce.
++    // Confirmed empirically: instrumenting every real DataEventManager
++    // ever constructed (data_callback_init()'s callers) showed this
++    // path was reading from an address that matched none of them.
+     for (size_t i = 0; i < events->event_count; ++i) {
+-      DataEventManager *event_mgr = (DataEventManager *)events->events[i];
++      rmw_event_t *rmw_event = (rmw_event_t *)events->events[i];
++      DataEventManager *event_mgr = (rmw_event != NULL) ? (DataEventManager *)rmw_event->data : NULL;
+       if (event_mgr == NULL) {
+         continue;
+       }
+@@ -137,10 +155,65 @@ rmw_wait(rmw_subscriptions_t * subscriptions,
+     "waitset data struct is null",
+     return RMW_RET_ERROR);
+ 
++#if Z_FEATURE_MULTI_THREAD == 0
++  // _check_and_attach_condition() below can find a guard condition/timer
++  // already ready (e.g. rclpy's executor attaches one whenever a periodic
++  // timer is pending) and return true *before* the network-pumping loop
++  // further down ever runs -- that loop lives entirely inside the
++  // `if(!skip_wait)` branch below, so on every rmw_wait() call where
++  // something is already ready, zp_read()/zp_send_keep_alive() never get
++  // called at all. With no background thread (Z_FEATURE_MULTI_THREAD==0)
++  // nothing else ever pumps the session, so a talker whose only waitable is
++  // a repeating timer (the common case -- confirmed via rclpy's talker,
++  // where this starved the session of any traffic until the router's
++  // 10-second lease expired and force-closed the transport) can go
++  // completely silent on the wire forever, well before any real timeout.
++  // Pumping once here, unconditionally, guarantees the network gets
++  // serviced on every single call regardless of skip_wait.
++  ZenohPicoSession *__pump_session = (ZenohPicoSession *)wait_set_data->context->impl;
++  const z_loaned_session_t *__pump_zsession = z_loan(__pump_session->session);
++  (void)zp_read(__pump_zsession, NULL);
++  (void)zp_send_keep_alive(__pump_zsession, NULL);
++#endif
++
+   bool skip_wait = _check_and_attach_condition(
+     subscriptions, guard_conditions, services, clients, events, wait_set_data);
+ 
+   if(!skip_wait){
++#if Z_FEATURE_MULTI_THREAD == 0
++    // No background read thread exists to receive data and signal this
++    // wait-set (that's a real OS thread in the Z_FEATURE_MULTI_THREAD==1
++    // build, started automatically by zenoh-pico's session init) -- so
++    // nothing will ever make wait_set_data->triggered become true unless
++    // *we* pump the session ourselves. zp_read()/zp_send_keep_alive() are
++    // the documented single-threaded-mode replacement for that background
++    // thread (see zenoh-pico's "Single Thread helpers").
++    //
++    // This used to loop here -- poll, and if not yet triggered and time
++    // remains, z_sleep_ms() before polling again -- for any nonzero
++    // requested timeout. That's wrong on this platform specifically:
++    // z_sleep_ms() is a hard no-op here (this whole project dropped
++    // Asyncify project-wide; see emscripten-nonblocking-sleep.patch), so
++    // "sleeping between polls" was really just spinning zp_read() as fast
++    // as possible for the full requested timeout with zero yield back to
++    // the browser's event loop the whole time -- freezing the tab for up
++    // to that many milliseconds on any caller that ever passed a nonzero
++    // wait_timeout (rclpy.spin_once(timeout_sec=0) never does, which is
++    // the only reason this never showed up in this project's own testing).
++    // A synchronous call on this platform can never usefully wait longer
++    // than a single attempt anyway -- only the caller, across separate
++    // top-level calls with a real yield in between (Python's own `await
++    // asyncio.sleep()`, or a JS tick()), can actually do that -- so this
++    // now always behaves like the old timeout_ms == 0 case regardless of
++    // what was requested: poll exactly once, then return immediately.
++    ZenohPicoSession *rmw_session = (ZenohPicoSession *)wait_set_data->context->impl;
++    const z_loaned_session_t *zsession = z_loan(rmw_session->session);
++
++    (void)zp_read(zsession, NULL);
++    (void)zp_send_keep_alive(zsession, NULL);
++
++    wait_set_data->triggered = false;
++#else
+     z_loaned_mutex_t *lock = z_loan_mut(wait_set_data->condition_mutex);
+     z_loaned_condvar_t *cv = z_loan_mut(wait_set_data->condition_variable);
+ 
+@@ -167,6 +240,7 @@ rmw_wait(rmw_subscriptions_t * subscriptions,
+     wait_set_data->triggered = false;
+ 
+     z_mutex_unlock(lock);
++#endif  // Z_FEATURE_MULTI_THREAD == 0
+   }
+ 
+   bool wait_result = false;
+@@ -187,17 +261,36 @@ rmw_wait(rmw_subscriptions_t * subscriptions,
+   }
+ 
+   if(events) {
++    // Upstream bug: this used to be a nested `for` loop shadowing its own
++    // index variable (a copy-paste duplicate of the identical loop header,
++    // never actually reached -- see below), whose body ended with
++    // `return true;` even though rmw_wait() returns `rmw_ret_t`, not
++    // `bool` -- `true` is 1, which is RMW_RET_ERROR here, so the very
++    // first ready event made the whole call fail with the unhelpful
++    // "Error from rmw_wait(): 1 error not set" (no message was ever set
++    // to go with that code). Dormant as long as `events->event_count` was
++    // always 0: rmw_publisher_event_init()/rmw_subscription_event_init()
++    // used to always fail "unsupported" (see support_event_type()'s own
++    // fixed #ifndef bug), so rclpy never successfully registered a real
++    // event handle into any wait set to begin with. Real now that MATCHED/
++    // QOS_INCOMPATIBLE events are genuinely supported. Matches the
++    // subscriptions/services/clients loops just below: record readiness
++    // in `wait_result` and null out an entry rcl should treat as not
++    // ready, instead of returning early. Also fixed here: `events->events[i]`
++    // is an `rmw_event_t*` (see the identical fix and full rationale in
++    // _check_and_attach_condition() above), not a DataEventManager*
++    // directly -- go through `->data` to get the real manager.
+     for (size_t i = 0; i < events->event_count; ++i) {
+-      for (size_t i = 0; i < events->event_count; ++i) {
+-	DataEventManager *event_mgr = (DataEventManager *)events->events[i];
+-	if (event_mgr == NULL) {
+-	  continue;
+-	}
+-
+-	if(event_condition_detach_and_queue_is_empty(event_mgr)) {
+-	  // RMW_ZENOH_LOG_INFO("found attach event");
+-	  return true;
+-	}
++      rmw_event_t *rmw_event = (rmw_event_t *)events->events[i];
++      DataEventManager *event_mgr = (rmw_event != NULL) ? (DataEventManager *)rmw_event->data : NULL;
++      if (event_mgr == NULL) {
++	continue;
++      }
++
++      if(event_condition_detach_and_queue_is_empty(event_mgr)) {
++	events->events[i] = NULL;
++      }else{
++	wait_result = true;
+       }
+     }
+   }
+diff --git a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_condition.c b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_condition.c
+index 0101c23..6dae0db 100644
+--- a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_condition.c
++++ b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_condition.c
+@@ -16,7 +16,7 @@
+ 
+ #include 
+ 
+-#if defined(ZENOH_LINUX) || defined (ZENOH_ARDUINO_ESP32) || defined (ZENOH_ESPIDF)
++#if defined(ZENOH_LINUX) || defined (ZENOH_ARDUINO_ESP32) || defined (ZENOH_ESPIDF) || defined(ZENOH_EMSCRIPTEN)
+ 
+ z_result_t z_condvar_init_with_attr(z_owned_condvar_t *cv, pthread_condattr_t *attr){
+   _Z_CHECK_SYS_ERR(pthread_cond_init(&cv->_val, attr));
+diff --git a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_gid.c b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_gid.c
+index 3e3f027..6984719 100644
+--- a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_gid.c
++++ b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_gid.c
+@@ -16,7 +16,7 @@
+ 
+ #include 
+ 
+-#if defined(ZENOH_LINUX) || defined(ZENOH_ARDUINO_ESP32) || defined (ZENOH_ESPIDF)
++#if defined(ZENOH_LINUX) || defined(ZENOH_ARDUINO_ESP32) || defined (ZENOH_ESPIDF) || defined(ZENOH_EMSCRIPTEN)
+ 
+ #define XXH_STATIC_LINKING_ONLY /* access advanced declarations */
+ #define XXH_IMPLEMENTATION      /* access definitions */
+diff --git a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_graph_cache.c b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_graph_cache.c
+new file mode 100644
+index 0000000..a3dac20
+--- /dev/null
++++ b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_graph_cache.c
+@@ -0,0 +1,439 @@
++/*
++ * Copyright(C) 2026 the ros2-emscripten-zenoh-demo project.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ *
++ * QoS event/matching support. rmw_zenoh_pico already declares a real
++ * liveliness token for every publisher/subscription it creates, with the
++ * full topic name/type/QoS encoded into the key (see
++ * zenoh_pico_liveliness.c's generate_liveliness()/qos_to_keyexpr()) -- but
++ * nothing ever subscribed to *other* peers' liveliness tokens to discover
++ * them, which is the "gid_cache is not implemented" this file's own header
++ * comment used to describe. This adds that other half: one session-wide
++ * liveliness subscriber under the same "@ros2_lv" admin space every peer
++ * already announces into, decoding each discovered publisher/subscription's
++ * topic and QoS and matching it against this session's own local
++ * publishers/subscriptions on the same topic.
++ */
++
++#include 
++#include 
++
++#include 
++#include 
++
++// A plain macro (not the z_view_keyexpr_from_substr()-facing char array
++// below) so it can still be concatenated with an adjacent string literal
++// at compile time (e.g. ADMIN_SPACE_PREFIX_LIT "/**") -- a `const char[]`
++// identifier can't be: string-literal concatenation is a preprocessor/
++// lexer-level operation on adjacent literal tokens, not something that
++// works on a variable's runtime value.
++#define ADMIN_SPACE_PREFIX_LIT "@ros2_lv"
++static const char ADMIN_SPACE_PREFIX[] = ADMIN_SPACE_PREFIX_LIT;
++// Segment index (0-based, after splitting the whole key on '/') of the
++// two-letter entity-type code -- see conv_entity_type() in
++// zenoh_pico_liveliness.c for the exact values ("MP" publisher, "MS"
++// subscription, "NN" node, "SS" service, "SC" client) and
++// generate_liveliness() for why it's always this position.
++#define ENTITY_TYPE_SEGMENT_INDEX 5
++#define TOPIC_NAME_SEGMENT_INDEX  9
++#define TOPIC_TYPE_SEGMENT_INDEX  10
++#define TOPIC_QOS_SEGMENT_INDEX   12
++#define MIN_TOPIC_ENTITY_SEGMENTS 13
++
++// ---------------------------------------------------------------- parsing
++
++// Splits `key` (a NUL-terminated, mutable copy of a liveliness sample's key
++// expression) in place on '/', filling `out[]` with a pointer to the start
++// of each segment (each also left NUL-terminated, since the '/' bytes
++// themselves get overwritten). Returns the segment count found, capped at
++// `max_segments`.
++static size_t split_segments(char *key, char **out, size_t max_segments)
++{
++  size_t count = 0;
++  char *p = key;
++
++  out[count++] = p;
++  while (*p != '\0' && count < max_segments) {
++    if (*p == '/') {
++      *p = '\0';
++      out[count++] = p + 1;
++    }
++    p++;
++  }
++
++  return count;
++}
++
++// SLASH_REPLACEMENT ('%') -> '/', in place -- mirrors
++// zenoh_pico_liveliness.c's own (file-local, not exported) demangle_name(),
++// which generate_liveliness() uses to escape a real '/' inside a name
++// (e.g. a namespaced topic) before splicing it into the liveliness key as
++// one segment. Duplicated here rather than exported from that file for one
++// caller.
++static void demangle_segment(char *s)
++{
++  for (; *s != '\0'; s++) {
++    if (*s == '%') {
++      *s = '/';
++    }
++  }
++}
++
++// Reverse of qos_to_keyexpr() (zenoh_pico_liveliness.c): that function
++// always emits these 11 QoS fields in this fixed order, joined by a plain
++// field separator (either ':' or ',' -- deliberately treated the same way
++// here, since the *order* of values is what carries meaning, not which
++// separator character happened to be used at each position) with a
++// zero-valued field written as an empty token instead of "0".
++static void qos_from_segment(const char *qos_segment, rmw_qos_profile_t *out)
++{
++  memset(out, 0, sizeof(*out));
++
++  char buf[64];
++  memset(buf, 0, sizeof(buf));
++  strncpy(buf, qos_segment, sizeof(buf) - 1);
++
++  long values[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
++  size_t idx = 0;
++  char *tok_start = buf;
++  char *p = buf;
++
++  while (idx < 11) {
++    if (*p == ':' || *p == ',' || *p == '\0') {
++      char saved = *p;
++      *p = '\0';
++      values[idx++] = (tok_start[0] != '\0') ? strtol(tok_start, NULL, 10) : 0;
++      if (saved == '\0') {
++	break;
++      }
++      tok_start = p + 1;
++    }
++    p++;
++  }
++
++  out->reliability                    = (rmw_qos_reliability_policy_t)values[0];
++  out->durability                     = (rmw_qos_durability_policy_t)values[1];
++  out->history                        = (rmw_qos_history_policy_t)values[2];
++  out->depth                          = (size_t)values[3];
++  out->deadline.sec                   = (uint64_t)values[4];
++  out->deadline.nsec                  = (uint64_t)values[5];
++  out->lifespan.sec                   = (uint64_t)values[6];
++  out->lifespan.nsec                  = (uint64_t)values[7];
++  out->liveliness                     = (rmw_qos_liveliness_policy_t)values[8];
++  out->liveliness_lease_duration.sec  = (uint64_t)values[9];
++  out->liveliness_lease_duration.nsec = (uint64_t)values[10];
++}
++
++// ------------------------------------------------------------ compatibility
++
++// Standard ROS 2 / DDS offered-vs-requested QoS compatibility rules for the
++// two policies real applications actually rely on for QoS matching in
++// practice. SYSTEM_DEFAULT on either side is treated as "no constraint"
++// here -- a documented simplification; a fully rigorous check would first
++// resolve SYSTEM_DEFAULT to whatever the middleware's actual default is.
++// deadline/lifespan/liveliness compatibility is intentionally not checked:
++// narrower in scope than a complete DDS-compatible implementation, but
++// covers the two policies (reliability, durability) that dominate
++// real-world QoS mismatches.
++static bool qos_reliability_compatible(rmw_qos_reliability_policy_t offered,
++					rmw_qos_reliability_policy_t requested)
++{
++  return !(requested == RMW_QOS_POLICY_RELIABILITY_RELIABLE &&
++	   offered == RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT);
++}
++
++static bool qos_durability_compatible(rmw_qos_durability_policy_t offered,
++				       rmw_qos_durability_policy_t requested)
++{
++  return !(requested == RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL &&
++	   offered == RMW_QOS_POLICY_DURABILITY_VOLATILE);
++}
++
++// pub_qos is always the offered (publisher-side) profile and sub_qos is
++// always the requested (subscription-side) profile, regardless of which
++// side is the local entity being matched.
++static bool qos_compatible(rmw_qos_profile_t *pub_qos, rmw_qos_profile_t *sub_qos)
++{
++  return qos_reliability_compatible(pub_qos->reliability, sub_qos->reliability) &&
++	 qos_durability_compatible(pub_qos->durability, sub_qos->durability);
++}
++
++// ------------------------------------------------------------- matching
++
++static void update_match_events(ZenohPicoGraphLocalEntity *local,
++				  rmw_qos_profile_t *remote_qos,
++				  bool is_put)
++{
++  rmw_qos_profile_t *pub_qos = (local->type == Publisher) ? local->qos : remote_qos;
++  rmw_qos_profile_t *sub_qos = (local->type == Publisher) ? remote_qos : local->qos;
++  bool reliability_ok = qos_reliability_compatible(pub_qos->reliability, sub_qos->reliability);
++  bool durability_ok = qos_durability_compatible(pub_qos->durability, sub_qos->durability);
++  bool compatible = reliability_ok && durability_ok;
++
++  rmw_event_type_t matched_event = (local->type == Publisher)
++    ? RMW_EVENT_PUBLICATION_MATCHED : RMW_EVENT_SUBSCRIPTION_MATCHED;
++  rmw_event_type_t incompatible_event = (local->type == Publisher)
++    ? RMW_EVENT_OFFERED_QOS_INCOMPATIBLE : RMW_EVENT_REQUESTED_QOS_INCOMPATIBLE;
++
++  if (compatible) {
++    if (is_put) {
++      // A newly-discovered compatible peer is both a new lifetime match
++      // (total_count) and one more currently-live match (current_count).
++      add_rmw_zenoh_pico_event_total(local->event_mgr, matched_event, true);
++      add_rmw_zenoh_pico_event_current(local->event_mgr, matched_event, true);
++    } else {
++      // A previously-compatible peer going away is one fewer live match --
++      // total_count (the lifetime count) never decreases, matching
++      // rmw_matched_status_t's own documented semantics.
++      sub_rmw_zenoh_pico_event_current(local->event_mgr, matched_event, true);
++    }
++  } else if (is_put) {
++    // rmw_qos_incompatible_event_status_t has no current_count at all --
++    // it's a pure lifetime incident counter (see rmw/events_statuses/
++    // incompatible_qos.h), so nothing to do on a DELETE here either way.
++    // last_policy_kind must be set before the event's total_count/changed
++    // flag goes live (add_rmw_zenoh_pico_event_total() below) -- a reader
++    // that wakes up on `changed` should never see a stale/unset value.
++    // Reliability is checked first above, so if it's the one that failed,
++    // report it; otherwise durability must be the culprit (compatible is
++    // only false here because at least one of the two failed).
++    set_rmw_zenoh_pico_event_last_policy_kind(
++      local->event_mgr, incompatible_event,
++      !reliability_ok ? RMW_QOS_POLICY_RELIABILITY : RMW_QOS_POLICY_DURABILITY);
++    add_rmw_zenoh_pico_event_total(local->event_mgr, incompatible_event, true);
++  }
++}
++
++// rmw_service_server_is_available() only cares about existence, not QoS
++// compatibility -- unlike update_match_events() (Publisher<->Subscription),
++// there's no MATCHED/INCOMPATIBLE event pair here, just a live count of
++// currently-discovered matching services. Clamped at 0: a DELETE for a
++// service this client never actually saw a matching PUT for (e.g. it
++// existed before this client's own liveliness subscriber was declared, and
++// this session never got the "history" PUT replay for some reason) must
++// never take the count negative.
++static void update_client_availability(ZenohPicoServiceData *client_data, bool is_put)
++{
++  client_data->available_services += is_put ? 1 : -1;
++  if (client_data->available_services < 0) {
++    client_data->available_services = 0;
++  }
++}
++
++static void graph_cache_process_sample(ZenohPicoSession *session,
++					const char *key_str, size_t key_len,
++					bool is_put)
++{
++  char buf[RMW_ZENOH_PICO_MAX_LINENESS_LEN];
++  if (key_len >= sizeof(buf)) {
++    key_len = sizeof(buf) - 1;
++  }
++  memcpy(buf, key_str, key_len);
++  buf[key_len] = '\0';
++
++  char *segments[MIN_TOPIC_ENTITY_SEGMENTS];
++  size_t segment_count = split_segments(buf, segments, MIN_TOPIC_ENTITY_SEGMENTS);
++  if (segment_count < MIN_TOPIC_ENTITY_SEGMENTS) {
++    // Not a topic-bearing entity -- a plain node's liveliness key has no
++    // topic_info segments at all (generate_liveliness() only appends them
++    // `if (entity->topic_info != NULL)`, which a plain Node never has).
++    // Service and Client entities DO carry topic_info (the service name/
++    // type, same as a topic) and so reach the entity_type dispatch below
++    // just like Publisher/Subscription -- confirmed via
++    // zenoh_pico_generate_service_entity()'s own call to
++    // zenoh_pico_generate_topic_info().
++    return;
++  }
++  if (strcmp(segments[0], ADMIN_SPACE_PREFIX) != 0) {
++    return;
++  }
++
++  const char *entity_type = segments[ENTITY_TYPE_SEGMENT_INDEX];
++  ZenohPicoEntityType remote_type;
++  if (strcmp(entity_type, "MP") == 0) {
++    remote_type = Publisher;
++  } else if (strcmp(entity_type, "MS") == 0) {
++    remote_type = Subscription;
++  } else if (strcmp(entity_type, "SS") == 0) {
++    remote_type = Service;
++  } else {
++    // A client/node liveliness token -- also not matched here. Nothing
++    // currently needs a service or client to discover remote *clients*
++    // (only rmw_service_server_is_available(), client-side only, needs
++    // this at all), so "SC" is deliberately left unhandled, same as "NN".
++    return;
++  }
++
++  demangle_segment(segments[TOPIC_NAME_SEGMENT_INDEX]);
++  demangle_segment(segments[TOPIC_TYPE_SEGMENT_INDEX]);
++
++  rmw_qos_profile_t remote_qos;
++  qos_from_segment(segments[TOPIC_QOS_SEGMENT_INDEX], &remote_qos);
++
++  z_mutex_lock(z_loan_mut(session->graph_lock));
++
++  for (ZenohPicoGraphLocalEntity *local = session->graph_local_entities;
++       local != NULL; local = local->next) {
++    // Publisher<->Subscription and Client<->Service are the only pairs
++    // that can ever match -- a local publisher only cares about remote
++    // subscriptions (and vice versa), and a local client only cares about
++    // remote services (nothing currently needs the reverse).
++    bool pubsub_pair =
++      (local->type == Publisher && remote_type == Subscription) ||
++      (local->type == Subscription && remote_type == Publisher);
++    bool client_service_pair =
++      local->type == Client && remote_type == Service;
++    if (!pubsub_pair && !client_service_pair) {
++      continue;
++    }
++
++    if (z_string_len(local->topic_name) != strlen(segments[TOPIC_NAME_SEGMENT_INDEX]) ||
++	strncmp(z_string_data(local->topic_name), segments[TOPIC_NAME_SEGMENT_INDEX],
++		z_string_len(local->topic_name)) != 0) {
++      continue;
++    }
++    if (z_string_len(local->topic_type) != strlen(segments[TOPIC_TYPE_SEGMENT_INDEX]) ||
++	strncmp(z_string_data(local->topic_type), segments[TOPIC_TYPE_SEGMENT_INDEX],
++		z_string_len(local->topic_type)) != 0) {
++      continue;
++    }
++
++    if (client_service_pair) {
++      update_client_availability((ZenohPicoServiceData *)local->owner, is_put);
++    } else {
++      update_match_events(local, &remote_qos, is_put);
++    }
++  }
++
++  z_mutex_unlock(z_loan_mut(session->graph_lock));
++}
++
++static void graph_liveliness_sample_handler(z_loaned_sample_t *sample, void *ctx)
++{
++  ZenohPicoSession *session = (ZenohPicoSession *)ctx;
++  if (session == NULL) {
++    return;
++  }
++
++  z_view_string_t keystr;
++  z_keyexpr_as_view_string(z_sample_keyexpr(sample), &keystr);
++  const z_loaned_string_t *loaned = z_loan(keystr);
++
++  bool is_put = (z_sample_kind(sample) == Z_SAMPLE_KIND_PUT);
++  graph_cache_process_sample(session, z_string_data(loaned), z_string_len(loaned), is_put);
++}
++
++// ----------------------------------------------------------- registration
++
++bool graph_cache_register_local(
++  ZenohPicoSession *session,
++  ZenohPicoEntityType type,
++  const z_loaned_string_t *topic_name,
++  const z_loaned_string_t *topic_type,
++  rmw_qos_profile_t *qos,
++  DataEventManager *event_mgr,
++  void *owner)
++{
++  RMW_CHECK_ARGUMENT_FOR_NULL(session, false);
++  RMW_CHECK_ARGUMENT_FOR_NULL(owner, false);
++
++  ZenohPicoGraphLocalEntity *entry = (ZenohPicoGraphLocalEntity *)
++    malloc(sizeof(ZenohPicoGraphLocalEntity));
++  RMW_CHECK_FOR_NULL_WITH_MSG(
++    entry, "failed to allocate ZenohPicoGraphLocalEntity", return false);
++
++  entry->type = type;
++  entry->topic_name = topic_name;
++  entry->topic_type = topic_type;
++  entry->qos = qos;
++  entry->event_mgr = event_mgr;
++  entry->owner = owner;
++
++  if (!session->graph_liveliness_sub_active) {
++    // Lazily declared on the first local publisher/subscription, once the
++    // session is definitely already open (both rmw_create_publisher() and
++    // rmw_create_subscription() only reach here after their own liveliness
++    // token declared successfully, which itself requires an open session).
++    z_view_keyexpr_t ke;
++    z_view_keyexpr_from_substr(&ke, ADMIN_SPACE_PREFIX_LIT "/**", strlen(ADMIN_SPACE_PREFIX_LIT "/**"));
++
++    z_liveliness_subscriber_options_t options;
++    z_liveliness_subscriber_options_default(&options);
++    options.history = true;  // see already-declared peers, not just future changes
++
++    z_owned_closure_sample_t callback;
++    z_closure(&callback, graph_liveliness_sample_handler, 0, (void *)session);
++
++    if (_Z_IS_ERR(z_liveliness_declare_subscriber(
++	  z_loan(session->session), &session->graph_liveliness_sub,
++	  z_loan(ke), z_move(callback), &options))) {
++      RMW_ZENOH_LOG_INFO("Unable to declare graph liveliness subscriber -- "
++			  "QoS matching/events will not see remote peers.");
++      // Not fatal: the local entity itself still gets created and works
++      // for pub/sub as normal, it just never sees any matches.
++    } else {
++      session->graph_liveliness_sub_active = true;
++    }
++  }
++
++  z_mutex_lock(z_loan_mut(session->graph_lock));
++  entry->next = session->graph_local_entities;
++  session->graph_local_entities = entry;
++  z_mutex_unlock(z_loan_mut(session->graph_lock));
++
++  return true;
++}
++
++void graph_cache_unregister_local(ZenohPicoSession *session, void *owner)
++{
++  if (session == NULL || owner == NULL) {
++    return;
++  }
++
++  z_mutex_lock(z_loan_mut(session->graph_lock));
++
++  ZenohPicoGraphLocalEntity **prev = &session->graph_local_entities;
++  ZenohPicoGraphLocalEntity *cur = session->graph_local_entities;
++  while (cur != NULL) {
++    if (cur->owner == owner) {
++      *prev = cur->next;
++      free(cur);
++      break;
++    }
++    prev = &cur->next;
++    cur = cur->next;
++  }
++
++  z_mutex_unlock(z_loan_mut(session->graph_lock));
++}
++
++void graph_cache_session_destroy(ZenohPicoSession *session)
++{
++  if (session == NULL) {
++    return;
++  }
++
++  if (session->graph_liveliness_sub_active) {
++    z_undeclare_subscriber(z_move(session->graph_liveliness_sub));
++    session->graph_liveliness_sub_active = false;
++  }
++
++  ZenohPicoGraphLocalEntity *cur = session->graph_local_entities;
++  while (cur != NULL) {
++    ZenohPicoGraphLocalEntity *next = cur->next;
++    free(cur);
++    cur = next;
++  }
++  session->graph_local_entities = NULL;
++}
+diff --git a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_session.c b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_session.c
+index f54ac92..b202e9d 100644
+--- a/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_session.c
++++ b/rmw_zenoh_pico/src/zenoh_pico/zenoh_pico_session.c
+@@ -43,10 +43,28 @@ ZenohPicoSession *zenoh_pico_generate_session(const z_loaned_config_t *config,
+   }
+ 
+   session->graph_guard_condition.implementation_identifier = rmw_get_implementation_identifier();
+-  session->graph_guard_condition.data = zenoh_pico_guard_condition_data;
++  // Upstream bug (missing call parens): this used to assign the bare
++  // FUNCTION zenoh_pico_guard_condition_data (a code pointer) instead of
++  // calling it to get the heap-allocated ZenohPicoGuardConditionData* it
++  // actually returns. Dormant during normal operation -- graph_guard_
++  // condition.data is never touched except at session teardown -- but
++  // zenoh_pico_destroy_session() later casts this "pointer" back to
++  // ZenohPicoGuardConditionData* and dereferences/frees it, which on
++  // Emscripten (code and linear memory are separate address spaces) reads
++  // as a wasm trap: "RuntimeError: memory access out of bounds", not some
++  // platform-agnostic C-level UB that happens to limp along elsewhere.
++  // Confirmed via an isolated minimal repro reproducing the exact same
++  // trap from nothing but this one pattern (assign-without-calling, then
++  // cast-and-dereference) -- see ros2-emscripten-zenoh-demo's commit
++  // fixing demo.ipynb's rclpy.shutdown() crash for the full writeup.
++  session->graph_guard_condition.data = zenoh_pico_guard_condition_data();
+ 
+   session->enable_session = false;
+ 
++  z_mutex_init(&session->graph_lock);
++  session->graph_liveliness_sub_active = false;
++  session->graph_local_entities = NULL;
++
+   ZenohPicoDataRefClone(session);
+ 
+   return session;
+@@ -68,6 +86,9 @@ bool zenoh_pico_destroy_session(ZenohPicoSession *session)
+ 
+     zenoh_pico_destroy_guard_condition_data((ZenohPicoGuardConditionData *)session->graph_guard_condition.data);
+ 
++    graph_cache_session_destroy(session);
++    z_drop(z_move(session->graph_lock));
++
+     z_drop(z_move(session->config));
+     z_drop(z_move(session->enclave));
+     z_drop(z_move(session->session));
+@@ -89,11 +110,33 @@ rmw_ret_t session_connect(ZenohPicoSession *session)
+ 
+   RMW_ZENOH_LOG_DEBUG("Opening session...");
+ 
+-  if(_Z_IS_ERR(z_open(&session->session, z_move(session->config), NULL))){
+-    RMW_ZENOH_LOG_ERROR("Error setting up zenoh session");
++  // NOTE (no-Asyncify): z_open()'s own zenoh session/link-open handshake
++  // can genuinely need several attempts to complete -- each recv()/send()
++  // in zenoh-pico's emscripten link layer now makes exactly one
++  // non-blocking attempt per call instead of internally sleeping-and-
++  // retrying (see zenoh-pico's own emscripten-nonblocking-io.patch: there
++  // is no way to cooperatively yield to the browser's event loop from
++  // inside a single synchronous call without Asyncify, which this whole
++  // project deliberately doesn't use). session_connect() is therefore
++  // expected to be called repeatedly (from a Python-side `await
++  // asyncio.sleep()` retry loop, driven through rclpy.init()) until it
++  // stops returning RMW_RET_ERROR.
++  //
++  // z_open() takes ownership of (z_move()s) whatever config pointer it's
++  // given, whether or not it ultimately succeeds -- so retrying with
++  // session->config itself (as the original code did) would hand z_open()
++  // an already-consumed, invalid config on the second and every later
++  // attempt. Clone a fresh, disposable copy for each attempt instead: this
++  // keeps the ORIGINAL session->config (set up once in
++  // zenoh_pico_generate_session()) alive and valid across every retry.
++  z_owned_config_t attempt_config;
++  z_config_clone(&attempt_config, z_loan(session->config));
++  if(_Z_IS_ERR(z_open(&session->session, z_move(attempt_config), NULL))){
++    RMW_ZENOH_LOG_DEBUG("zenoh session not yet established, will retry");
+     return RMW_RET_ERROR;
+   }
+ 
++#if Z_FEATURE_MULTI_THREAD == 1
+   if (_Z_IS_ERR(zp_start_read_task(z_loan_mut(session->session), NULL))
+       || _Z_IS_ERR(zp_start_lease_task(z_loan_mut(session->session), NULL))) {
+     RMW_ZENOH_LOG_ERROR("Unable to start read and lease tasks");
+@@ -101,6 +144,14 @@ rmw_ret_t session_connect(ZenohPicoSession *session)
+     z_drop(z_move(session->session));
+     return RMW_RET_ERROR;
+   }
++#else
++  // No background read/lease task to start in single-threaded mode.
++  // zp_start_read_task()/zp_start_lease_task() are hard-coded to always
++  // return -1 here (see zenoh-pico's own zp_start_read_task() -- it's an
++  // intentional "not supported without real threads" sentinel, not a real
++  // failure): rmw_wait() pumps zp_read()/zp_send_keep_alive() itself
++  // instead (see this project's own patch to rmw_wait.c).
++#endif
+ 
+   session->enable_session = true;
+ 
diff --git a/patch/ros-rolling-rosidl-generator-py.emscripten.patch b/patch/ros-rolling-rosidl-generator-py.emscripten.patch
new file mode 100644
index 000000000..d0b8d6c5c
--- /dev/null
+++ b/patch/ros-rolling-rosidl-generator-py.emscripten.patch
@@ -0,0 +1,73 @@
+diff --git a/cmake/rosidl_generator_py_generate_interfaces.cmake b/cmake/rosidl_generator_py_generate_interfaces.cmake
+index 2fe245b..11d679c 100644
+--- a/cmake/rosidl_generator_py_generate_interfaces.cmake
++++ b/cmake/rosidl_generator_py_generate_interfaces.cmake
+@@ -33,7 +33,32 @@ cmake_minimum_required(VERSION 3.20)
+ cmake_policy(SET CMP0094 NEW)
+ set(Python3_FIND_UNVERSIONED_NAMES FIRST)
+ 
+-find_package(Python3 REQUIRED COMPONENTS Interpreter Development NumPy)
++if(EMSCRIPTEN)
++  # numpy is only ever installed as a cross-compiled TARGET package (a
++  # `host:` dependency of whichever *_msgs/*_interfaces package is
++  # calling rosidl_generate_interfaces(), living under $PREFIX) -- it is
++  # never installed into the native $BUILD_PREFIX python that vinca
++  # points PYTHON_EXECUTABLE/Python3_EXECUTABLE at for cross-compiling
++  # purposes. So the NumPy *component* of find_package(Python3) can never
++  # be found here (confirmed via CI: "Could NOT find Python3 (missing:
++  # Python3_NumPy_INCLUDE_DIRS NumPy)" even though the target-side numpy
++  # package resolved correctly). Only NumPy's headers are needed (the
++  # EMSCRIPTEN branch below doesn't link Python3::NumPy either) -- locate
++  # them directly under the target prefix instead.
++  find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
++  file(GLOB _rosidl_generator_py_numpy_include_dirs
++    "$ENV{PREFIX}/lib/python*/site-packages/numpy/_core/include"
++  )
++  list(LENGTH _rosidl_generator_py_numpy_include_dirs _rosidl_generator_py_numpy_include_dirs_len)
++  if(_rosidl_generator_py_numpy_include_dirs_len EQUAL 0)
++    message(FATAL_ERROR "rosidl_generator_py: could not find numpy's "
++      "_core/include under $ENV{PREFIX}/lib/python*/site-packages/numpy -- "
++      "is numpy a host: dependency of this package?")
++  endif()
++  list(GET _rosidl_generator_py_numpy_include_dirs 0 Python3_NumPy_INCLUDE_DIRS)
++else()
++  find_package(Python3 REQUIRED COMPONENTS Interpreter Development NumPy)
++endif()
+ 
+ # Get a list of typesupport implementations from valid rmw implementations.
+ rosidl_generator_py_get_typesupports(_typesupport_impls)
+@@ -162,11 +187,29 @@ add_dependencies(
+   ${rosidl_generate_interfaces_TARGET}__rosidl_typesupport_c
+ )
+ 
+-target_link_libraries(
+-  ${_target_name_lib} PRIVATE
+-  Python3::NumPy
+-  Python3::Python
+-)
++if(EMSCRIPTEN)
++  # Python3::Python and Python3::Module both resolve to the same static
++  # libpython3.a here -- emscripten-forge's cross-python package ships no
++  # shared libpython, so CMake's FindPython3 has nothing else to point
++  # Development.Module at. This project builds every ROS package as a
++  # dynamically-linked SIDE_MODULE loaded into a single MAIN_MODULE
++  # interpreter (see vinca's build_ament_cmake.sh.in), so statically
++  # linking a second copy of libpython3.a into each one of them is both
++  # unnecessary and unwanted. Skip linking it entirely -- the link already
++  # passes --unresolved-symbols=import-dynamic, so CPython API symbols
++  # resolve at runtime against the MAIN_MODULE's own Python instead. Only
++  # the headers are needed at compile time.
++  target_include_directories(${_target_name_lib} PRIVATE
++    ${Python3_INCLUDE_DIRS}
++    ${Python3_NumPy_INCLUDE_DIRS}
++  )
++else()
++  target_link_libraries(
++    ${_target_name_lib} PRIVATE
++    Python3::NumPy
++    Python3::Python
++  )
++endif()
+ target_include_directories(${_target_name_lib}
+   PRIVATE
+   ${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_c
diff --git a/patch/ros-rolling-rosidl-typesupport-microxrcedds-c.emscripten.patch b/patch/ros-rolling-rosidl-typesupport-microxrcedds-c.emscripten.patch
new file mode 100644
index 000000000..9869c7c49
--- /dev/null
+++ b/patch/ros-rolling-rosidl-typesupport-microxrcedds-c.emscripten.patch
@@ -0,0 +1,211 @@
+diff --git a/rosidl_typesupport_microxrcedds_c/resource/msg__type_support_c.c.em b/rosidl_typesupport_microxrcedds_c/resource/msg__type_support_c.c.em
+index d688bf4..4e9d786 100644
+--- a/rosidl_typesupport_microxrcedds_c/resource/msg__type_support_c.c.em
++++ b/rosidl_typesupport_microxrcedds_c/resource/msg__type_support_c.c.em
+@@ -30,7 +30,12 @@ include_base = '/'.join(include_parts)
+ header_files = [
+     'stdint.h',
+     'stdio.h',
++    'stdlib.h',
+     'string.h',
++    # Provides rosidl_runtime_c__String__Sequence__init/__fini(), used to
++    # grow an unbounded sequence member to fit an incoming message
++    # (see the AbstractSequence/AbstractString deserialize branch below).
++    'rosidl_runtime_c/string_functions.h',
+     # Provides the rosidl_typesupport_microxrcedds_c__identifier symbol declaration.
+     'rosidl_typesupport_microxrcedds_c/identifier.h',
+     # Provides the definition of the message_type_support_callbacks_t struct.
+@@ -314,6 +319,39 @@ static bool _@(message.structure.namespaced_type.name)__cdr_deserialize(
+ @[      end if]@
+ @[    elif isinstance(member.type, AbstractSequence)]@
+ @[      if isinstance(member.type.value_type, BasicType)]@
++    // Same heap-overflow class as the AbstractString case below (and
++    // fixed the same way): ucdr_deserialize_sequence_@(get_suffix(member.type.value_type.typename))()'s
++    // own capacity check (ucdr_deserialize_sequence_header(), micro-CDR's
++    // sequence.c) only sets an out-of-band ucdrBuffer.error flag when the
++    // incoming length exceeds `capacity` -- it does NOT stop the very next
++    // step, an unconditional ucdr_deserialize_endian_array_@(get_suffix(member.type.value_type.typename))()
++    // call that memcpy()s (or, for a mismatched-endianness buffer,
++    // element-by-element writes) the FULL incoming length into `data`
++    // regardless (micro-CDR's array.c, UCDR_DESERIALIZE_ARRAY_BYTE_N).
++    // An unbounded sequence's destination starts at capacity 0 for any
++    // freshly-constructed message, so this is not a rare edge case.
++    // Unlike the AbstractString/NamespacedType sequence cases, a
++    // BasicType element is a plain scalar with no sub-allocations of its
++    // own to preserve or release, so a single realloc() to fit -- no
++    // fresh-destination-only restriction, no zeroing needed, since the
++    // real deserialize call below fully overwrites every element up to
++    // the new size anyway -- is sufficient for every case, not just the
++    // common one.
++    uint32_t incoming_size = 0;
++    {
++      ucdrBuffer peek_cdr = *cdr;
++      ucdr_deserialize_uint32_t(&peek_cdr, &incoming_size);
++    }
++    if (incoming_size > ros_message->@(member.name).capacity) {
++      void * new_data = realloc(
++        ros_message->@(member.name).data,
++        (size_t)incoming_size * sizeof(*ros_message->@(member.name).data));
++      if (new_data == NULL) {
++        return false;
++      }
++      ros_message->@(member.name).data = new_data;
++      ros_message->@(member.name).capacity = incoming_size;
++    }
+     uint32_t size;
+     const size_t capacity = ros_message->@(member.name).capacity;
+     rv = ucdr_deserialize_sequence_@(get_suffix(member.type.value_type.typename))(cdr, ros_message->@(member.name).data, capacity, &size);
+@@ -329,9 +367,51 @@ static bool _@(message.structure.namespaced_type.name)__cdr_deserialize(
+ @[      elif isinstance(member.type.value_type, NamespacedType)]@
+     uint32_t size;
+     rv = ucdr_deserialize_uint32_t(cdr, &size);
++    if (!rv) {
++      return false;
++    }
+ 
+-    if(size > ros_message->@(member.name).capacity){
+-      return 0;
++    if (size > ros_message->@(member.name).capacity) {
++      // Sibling bug to the AbstractString case below (see its comment for
++      // the full rationale): an *unbounded* sequence
++      // (e.g. a nested message array) also starts out completely empty
++      // (capacity 0) for any freshly-constructed destination. Properly
++      // growing it would call the *other* message package's own generated
++      // __Sequence__init() (so each new element is correctly
++      // default-constructed, e.g. its own nested strings/sequences zeroed
++      // the same way this file already zeroes them for its own type) --
++      // but that function isn't available here: this file deliberately
++      // never links directly against sibling message packages beyond
++      // their struct layout (already visible via the include chain),
++      // reaching their cdr_serialize/cdr_deserialize only indirectly
++      // through the generic message_type_support_callbacks_t v-table
++      // below, which has no "construct a default instance" entry of its
++      // own. Only handle the common case -- a genuinely empty
++      // (never-yet-allocated) destination -- with a plain zero-filled
++      // allocation (`sizeof(*ros_message->@(member.name).data)` gives the
++      // element size without needing that other package's literal C
++      // typename at all: `sizeof(*ptr)` is a compile-time property of
++      // `ptr`'s pointee TYPE, evaluated without ever dereferencing `ptr`,
++      // so this is safe even though `data` is NULL here). This is
++      // equivalent to a proper per-element __init() for the overwhelming
++      // majority of message types, whose own fields all default to their
++      // natural zero value (0/false/empty-string/empty-sequence) -- the
++      // same assumption every other "empty means zeroed" message struct
++      // in this codegen already relies on. A destination that's *already*
++      // partially populated and still too small (capacity > 0 but < size)
++      // falls back to the previous behavior instead of growing, since
++      // properly releasing its existing elements' own sub-allocations
++      // needs that same unavailable per-type fini().
++      if (ros_message->@(member.name).capacity == 0) {
++        void * new_data = calloc(size, sizeof(*ros_message->@(member.name).data));
++        if (new_data == NULL) {
++          return false;
++        }
++        ros_message->@(member.name).data = new_data;
++        ros_message->@(member.name).capacity = size;
++      } else {
++        return 0;
++      }
+     }
+ 
+     ros_message->@(member.name).size = size;
+@@ -346,13 +426,73 @@ static bool _@(message.structure.namespaced_type.name)__cdr_deserialize(
+ @[      elif isinstance(member.type.value_type, AbstractString)]@
+     uint32_t size;
+     rv = ucdr_deserialize_uint32_t(cdr, &size);
++    if (!rv) {
++      return false;
++    }
+ 
+-    if(size > ros_message->@(member.name).capacity){
+-      return 0;
++    if (size > ros_message->@(member.name).capacity) {
++      // Unlike a bounded sequence (whose destination is already
++      // allocated at its full maximum_size, so this branch is unreachable
++      // for it), an *unbounded* sequence's destination starts out
++      // completely empty (capacity 0) -- it's default-constructed well
++      // before the real wire size is known, e.g. by rcl_take_request_with_
++      // info()'s own create_from_py(pyrequest_type) building a fresh,
++      // empty request to deserialize into. `size > capacity` is therefore
++      // not an error here; it's the normal case for any non-empty
++      // unbounded sequence. The previous `return 0;` here silently
++      // rejected every such message before ever reaching the per-element
++      // loop below (and its own capacity handling, fixed in #86) --
++      // confirmed empirically: a real rclpy service request carrying a
++      // single-element `string[]` field consistently failed
++      // cdr_deserialize() this way, even though the exact same bytes
++      // decode correctly once this sequence is pre-sized to fit.
++      // rosidl_runtime_c__String__Sequence__fini() is safe to call
++      // unconditionally, including on an already-empty (all-zero)
++      // sequence -- it only frees `data` when non-NULL -- so this also
++      // correctly handles the rarer case of a destination that was
++      // already partially populated (from a previous, differently-sized
++      // deserialize into the same reused message object) instead of
++      // leaking its old element buffers.
++      rosidl_runtime_c__String__Sequence__fini(&ros_message->@(member.name));
++      if (!rosidl_runtime_c__String__Sequence__init(&ros_message->@(member.name), size)) {
++        return false;
++      }
+     }
+     ros_message->@(member.name).size = size;
+ 
+     for (size_t i = 0; rv && i < size; i++) {
++      // NOTE: unlike a bounded string (sized once, at IDL-compile-time,
++      // and correctly rejected/skipped when oversized by the `else if`
++      // branch below), the destination buffer here was allocated by
++      // `rosidl_runtime_c__String__init()` at message-construction time,
++      // long before the actual wire content is known -- it defaults to an
++      // empty string (capacity 1). `ucdr_deserialize_sequence_char()`
++      // does NOT clamp to `capacity` on its own: its internal
++      // `ucdr_buffer_to_array()` memcpy()s the FULL incoming length into
++      // the destination regardless of the capacity check it performs
++      // first (that check only ever sets `cdr->error`, an out-of-band
++      // flag inspected by the caller, not something that stops the copy
++      // already in flight) -- so calling it with a too-small destination
++      // is a real heap buffer overflow, not merely a rejected/truncated
++      // string. Peek the incoming length first (via a throwaway copy of
++      // `cdr`'s cursor -- `ucdrBuffer` is a plain value type with no
++      // self-referential pointers, so copying it is a safe, side-effect-free
++      // way to read ahead) and grow the destination first if needed, so the
++      // real deserialize call below is always given a large-enough buffer.
++      uint32_t incoming_size = 0;
++      {
++        ucdrBuffer peek_cdr = *cdr;
++        ucdr_deserialize_uint32_t(&peek_cdr, &incoming_size);
++      }
++      if (incoming_size > ros_message->@(member.name).data[i].capacity) {
++        char * new_data = (char *)realloc(ros_message->@(member.name).data[i].data, incoming_size);
++        if (new_data == NULL) {
++          rv = false;
++          break;
++        }
++        ros_message->@(member.name).data[i].data = new_data;
++        ros_message->@(member.name).data[i].capacity = incoming_size;
++      }
+       size_t capacity = ros_message->@(member.name).data[i].capacity;
+       uint32_t string_size;
+       char * data = ros_message->@(member.name).data[i].data;
+@@ -374,6 +514,23 @@ static bool _@(message.structure.namespaced_type.name)__cdr_deserialize(
+   rv = ucdr_deserialize_@(get_suffix(member.type.typename))(cdr, &ros_message->@(member.name));
+ @[  elif isinstance(member.type, AbstractString)]@
+   {
++    // See the sequence-of-strings branch above for the full rationale:
++    // grow the destination buffer to fit the incoming string BEFORE
++    // calling ucdr_deserialize_sequence_char(), which does not clamp its
++    // own memcpy to the capacity it's given.
++    uint32_t incoming_size = 0;
++    {
++      ucdrBuffer peek_cdr = *cdr;
++      ucdr_deserialize_uint32_t(&peek_cdr, &incoming_size);
++    }
++    if (incoming_size > ros_message->@(member.name).capacity) {
++      char * new_data = (char *)realloc(ros_message->@(member.name).data, incoming_size);
++      if (new_data == NULL) {
++        return false;
++      }
++      ros_message->@(member.name).data = new_data;
++      ros_message->@(member.name).capacity = incoming_size;
++    }
+     size_t capacity = ros_message->@(member.name).capacity;
+     uint32_t string_size;
+     rv = ucdr_deserialize_sequence_char(cdr, ros_message->@(member.name).data, capacity, &string_size);
diff --git a/patch/ros-rolling-sbg-driver.patch b/patch/ros-rolling-sbg-driver.patch
index efd2b074c..53101b3ab 100644
--- a/patch/ros-rolling-sbg-driver.patch
+++ b/patch/ros-rolling-sbg-driver.patch
@@ -1,47 +1,3 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index a4a3964..4063ea2 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -23,17 +23,17 @@ find_package(builtin_interfaces REQUIRED)
- ## Generate messages in the 'msg' folder
- 
- set (USED_LIBRARIES
--  rclcpp
--  sensor_msgs
--  std_msgs
--  std_srvs
--  geometry_msgs
--  nav_msgs
--  rtcm_msgs
--  tf2_ros
--  tf2_msgs
--  tf2_geometry_msgs
--  nmea_msgs
-+  rclcpp::rclcpp
-+  ${sensor_msgs_TARGETS}
-+  ${std_msgs_TARGETS}
-+  ${std_srvs_TARGETS}
-+  ${geometry_msgs_TARGETS}
-+  ${nav_msgs_TARGETS}
-+  ${rtcm_msgs_TARGETS}
-+  tf2_ros::tf2_ros
-+  ${tf2_msgs_TARGETS}
-+  ${tf2_geometry_msgs_TARGETS}
-+  ${nmea_msgs_TARGETS}
- )
- 
- set (msg_files
-@@ -125,8 +125,8 @@ endif()
- target_link_libraries(sbg_device sbgECom)
- target_link_libraries(sbg_device_mag sbgECom)
- 
--ament_target_dependencies(sbg_device ${USED_LIBRARIES}) 
--ament_target_dependencies(sbg_device_mag ${USED_LIBRARIES})
-+target_link_libraries(sbg_device ${USED_LIBRARIES}) 
-+target_link_libraries(sbg_device_mag ${USED_LIBRARIES})
- 
- rosidl_get_typesupport_target(cpp_typesupport_target "${PROJECT_NAME}" "rosidl_typesupport_cpp")
- target_link_libraries(sbg_device "${cpp_typesupport_target}")
 diff --git a/include/sbg_driver/sbg_vector3.h b/include/sbg_driver/sbg_vector3.h
 index 0bc5b80..0b1b02c 100644
 --- a/include/sbg_driver/sbg_vector3.h
@@ -54,26 +10,4 @@ index 0bc5b80..0b1b02c 100644
 +  SbgVector3(const T* p_raw_data, [[maybe_unused]] size_t array_size)
    {
      assert(array_size == 3);
- 
-diff --git a/src/sbg_device.cpp b/src/sbg_device.cpp
-index 820322e..b802365 100644
---- a/src/sbg_device.cpp
-+++ b/src/sbg_device.cpp
-@@ -5,6 +5,8 @@
- #include 
- #include 
- #include 
-+#include 
-+#include 
- 
- // SbgECom headers
- #include 
-@@ -118,7 +120,7 @@ void SbgDevice::onLogReceived(SbgEComClass msg_class, SbgEComMsgId msg, const Sb
-       log_replay_last_timestamp_ = timestamp;
-     }
- 
--    usleep(time_to_sleep);
-+    std::this_thread::sleep_for(std::chrono::microseconds(time_to_sleep));
-   }
- 
-   //
+
diff --git a/patch/ros-rolling-spdlog-vendor.emscripten.patch b/patch/ros-rolling-spdlog-vendor.emscripten.patch
new file mode 100644
index 000000000..bcb69e30d
--- /dev/null
+++ b/patch/ros-rolling-spdlog-vendor.emscripten.patch
@@ -0,0 +1,22 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 539c4bf..766fde1 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -22,6 +22,17 @@ ament_vendor(spdlog_vendor
+     -DSPDLOG_BUILD_TESTS:BOOL=OFF
+     -DSPDLOG_BUILD_EXAMPLE:BOOL=OFF
+     "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
++    # Forward the parent build's CMAKE_PROJECT_INCLUDE (vinca's
++    # __vinca_shared_lib_patch.cmake under emscripten) into this nested
++    # ament_vendor/ExternalProject build. Without it, the inner spdlog
++    # build never sees the outer build's SIDE_MODULE=1 compile/link flags
++    # (see build_ament_cmake.sh.in), so its object files end up built for
++    # a plain static/EXE-style link instead -- silently producing a
++    # libspdlog.a that's incompatible with (and fails to link into)
++    # anything that links it as a SIDE_MODULE dependency
++    # (rcl_logging_spdlog). Harmless no-op on platforms where
++    # CMAKE_PROJECT_INCLUDE isn't set.
++    "-DCMAKE_PROJECT_INCLUDE=${CMAKE_PROJECT_INCLUDE}"
+ )
+ 
+ if(BUILD_TESTING)
diff --git a/patch/ros-rolling-yaml-cpp-vendor.emscripten.patch b/patch/ros-rolling-yaml-cpp-vendor.emscripten.patch
new file mode 100644
index 000000000..05b5ff72b
--- /dev/null
+++ b/patch/ros-rolling-yaml-cpp-vendor.emscripten.patch
@@ -0,0 +1,42 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index d2bb367..d795e60 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -7,6 +7,37 @@ find_package(ament_cmake_vendor_package REQUIRED)
+ install(DIRECTORY cmake
+   DESTINATION share/${PROJECT_NAME})
+ 
++# No yaml-cpp conda package exists for emscripten-wasm32, so (unlike every
++# other platform, where find_package below succeeds against the real
++# conda-forge package and ament_vendor's SATISFIED check short-circuits)
++# build yaml-cpp from source here.
++find_package(yaml-cpp CONFIG QUIET)
++
++ament_vendor(yaml_cpp_vendor
++  SATISFIED ${yaml-cpp_FOUND}
++  VCS_URL https://github.com/jbeder/yaml-cpp.git
++  VCS_VERSION 0.8.0
++  CMAKE_ARGS
++    -DYAML_BUILD_SHARED_LIBS=ON
++    -DYAML_CPP_BUILD_TESTS=OFF
++    -DYAML_CPP_BUILD_TOOLS=OFF
++    -DYAML_CPP_BUILD_CONTRIB=OFF
++    "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
++    # yaml-cpp 0.8.0's own cmake_minimum_required predates CMake 3.5, which
++    # CMake >=4.0 refuses outright ("Compatibility with CMake < 3.5 has
++    # been removed"). Only reached here on wasm32, where this vendor build
++    # actually fires.
++    -DCMAKE_POLICY_VERSION_MINIMUM=3.5
++    # Forward the parent build's CMAKE_PROJECT_INCLUDE (vinca's
++    # __vinca_shared_lib_patch.cmake under emscripten) into this nested
++    # ament_vendor/ExternalProject build -- see the matching comment in
++    # spdlog_vendor's emscripten patch for why this is required for a real
++    # shared .so to come out instead of a static archive that then
++    # duplicate-symbol-fails wasm-ld when linked into more than one final
++    # module. Harmless no-op on platforms where it isn't set.
++    "-DCMAKE_PROJECT_INCLUDE=${CMAKE_PROJECT_INCLUDE}"
++)
++
+ ament_package(
+   CONFIG_EXTRAS "yaml_cpp_vendor-extras.cmake"
+ )
diff --git a/pixi.lock b/pixi.lock
index 6449b02f3..e769ab28e 100644
--- a/pixi.lock
+++ b/pixi.lock
@@ -76,11 +76,12 @@ environments:
       - conda: https://repo.prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
       - conda: https://repo.prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
       - conda: https://repo.prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
-      - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff
+      - pypi: git+https://github.com/Tobias-Fischer/vinca.git?rev=55cb3792e48f1c191a36956b93684b30008bdae7#55cb3792e48f1c191a36956b93684b30008bdae7
       - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl
+      - pypi: https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
       - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz
@@ -143,7 +144,7 @@ environments:
       - conda: https://repo.prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda
       - conda: https://repo.prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda
       - conda: https://repo.prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
-      - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff
+      - pypi: git+https://github.com/Tobias-Fischer/vinca.git?rev=55cb3792e48f1c191a36956b93684b30008bdae7#55cb3792e48f1c191a36956b93684b30008bdae7
       - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl
@@ -162,6 +163,7 @@ environments:
       - pypi: https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
       - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl
+      - pypi: https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
       - pypi: https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
@@ -203,7 +205,7 @@ environments:
       - conda: https://repo.prefix.dev/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda
       - conda: https://repo.prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda
       - conda: https://repo.prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda
-      - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff
+      - pypi: git+https://github.com/Tobias-Fischer/vinca.git?rev=55cb3792e48f1c191a36956b93684b30008bdae7#55cb3792e48f1c191a36956b93684b30008bdae7
       - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl
@@ -212,6 +214,7 @@ environments:
       - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz
+      - pypi: https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl
       - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
@@ -262,7 +265,7 @@ environments:
       - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda
       - conda: https://repo.prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda
       - conda: https://repo.prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
-      - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff
+      - pypi: git+https://github.com/Tobias-Fischer/vinca.git?rev=55cb3792e48f1c191a36956b93684b30008bdae7#55cb3792e48f1c191a36956b93684b30008bdae7
       - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl
@@ -275,6 +278,7 @@ environments:
       - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl
+      - pypi: https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl
       - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl
       - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl
@@ -321,7 +325,7 @@ environments:
       - conda: https://repo.prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda
       - conda: https://repo.prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda
       - conda: https://repo.prefix.dev/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda
-      - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff
+      - pypi: git+https://github.com/Tobias-Fischer/vinca.git?rev=55cb3792e48f1c191a36956b93684b30008bdae7#55cb3792e48f1c191a36956b93684b30008bdae7
       - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl
@@ -330,6 +334,7 @@ environments:
       - pypi: https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl
       - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl
       - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl
+      - pypi: https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl
       - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz
       - pypi: https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl
       - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl
@@ -2294,19 +2299,21 @@ packages:
   purls: []
   size: 388453
   timestamp: 1764777142545
-- pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff
+- pypi: git+https://github.com/Tobias-Fischer/vinca.git?rev=55cb3792e48f1c191a36956b93684b30008bdae7#55cb3792e48f1c191a36956b93684b30008bdae7
   name: vinca
   version: 0.2.0
   requires_dist:
   - catkin-pkg>=0.4.16
+  - ruamel-yaml>=0.16.6,<0.18.0
+  - rosdistro>=0.8.0
   - empy>=3.3.4,<4.0.0
-  - jinja2>=3.0.0
-  - license-expression>=30.0.0
-  - networkx>=2.5
   - requests>=2.24.0
+  - networkx>=2.5
   - rich>=10
-  - rosdistro>=0.8.0
-  - ruamel-yaml>=0.16.6,<0.18.0
+  - jinja2>=3.0.0
+  - license-expression>=30.0.0
+  - packaging>=23.0
+  - zstandard>=0.19.0
   requires_python: '>=3.9'
 - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl
   name: docutils
@@ -2347,6 +2354,14 @@ packages:
   version: 3.0.3
   sha256: bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581
   requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
+  name: zstandard
+  version: 0.25.0
+  sha256: e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0
+  requires_dist:
+  - cffi~=1.17 ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  - cffi>=2.0.0b0 ; python_full_version >= '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  requires_python: '>=3.9'
 - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl
   name: markupsafe
   version: 3.0.3
@@ -2373,10 +2388,26 @@ packages:
   - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks'
   - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd'
   requires_python: '>=3.9'
+- pypi: https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl
+  name: zstandard
+  version: 0.25.0
+  sha256: c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2
+  requires_dist:
+  - cffi~=1.17 ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  - cffi>=2.0.0b0 ; python_full_version >= '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  requires_python: '>=3.9'
 - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz
   name: empy
   version: 3.3.4
   sha256: 73ac49785b601479df4ea18a7c79bc1304a8a7c34c02b9472cf1206ae88f01b3
+- pypi: https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl
+  name: zstandard
+  version: 0.25.0
+  sha256: e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3
+  requires_dist:
+  - cffi~=1.17 ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  - cffi>=2.0.0b0 ; python_full_version >= '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  requires_python: '>=3.9'
 - pypi: https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
   name: markupsafe
   version: 3.0.3
@@ -2438,6 +2469,14 @@ packages:
   version: 6.0.3
   sha256: c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5
   requires_python: '>=3.8'
+- pypi: https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl
+  name: zstandard
+  version: 0.25.0
+  sha256: 05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f
+  requires_dist:
+  - cffi~=1.17 ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  - cffi>=2.0.0b0 ; python_full_version >= '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  requires_python: '>=3.9'
 - pypi: https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
   name: pyyaml
   version: 6.0.3
@@ -2560,6 +2599,14 @@ packages:
   - pytest-mpl ; extra == 'test-extras'
   - pytest-randomly ; extra == 'test-extras'
   requires_python: '>=3.11,!=3.14.1'
+- pypi: https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
+  name: zstandard
+  version: 0.25.0
+  sha256: 223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439
+  requires_dist:
+  - cffi~=1.17 ; python_full_version < '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  - cffi>=2.0.0b0 ; python_full_version >= '3.14' and platform_python_implementation != 'PyPy' and extra == 'cffi'
+  requires_python: '>=3.9'
 - pypi: https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl
   name: license-expression
   version: 30.4.4
diff --git a/pixi.toml b/pixi.toml
index ae7ba432e..4a84c905d 100644
--- a/pixi.toml
+++ b/pixi.toml
@@ -28,11 +28,44 @@ m2-patch = "*"
 git = "*"
 
 [pypi-dependencies]
-# This is typically the latest commit on main branch
-vinca = { git = "https://github.com/RoboStack/vinca.git", rev = "34316c7f195b359fb9cd4bfd2ae8fd83cb559dff" }
-# Uncomment this line to work with a local vinca for faster iteration, but remember to comment it back
-# (and regenerate the pixi.lock) once you push the modified commit to the repo
-# vinca = { path = "../vinca", editable = true }
+# emscripten-wasm32 in platforms prevents pixi-build from resolving vinca as
+# a conda source dep (uv is unavailable for that target), so use pypi here.
+# Pinned to Tobias-Fischer/vinca#feature/emscripten-pthreads (PR open at
+# https://github.com/RoboStack/vinca/pull/154) until merged upstream, then
+# this should be re-pointed to the merged RoboStack/vinca commit. See that
+# PR / ros-humble-emscripten's pixi.toml for the full rationale (emscripten
+# 4.0.9 rejects -s DEMANGLE_SUPPORT=1; a v1-selector evaluation fix for
+# pinning_overrides). Also includes a cherry-pick of vinca@9e44663 on top:
+# ros2-gbp release tags contain slashes (release/rolling//),
+# and the short raw.githubusercontent.com /// URL
+# form has to guess where such a ref ends -- a guess that's cached
+# inconsistently across CDN edges and 404s from some vantage points
+# (GitHub Actions runners included) while resolving fine from others.
+# Broke recipe generation outright (ros2cli's pinned tag 404ing) on
+# 2026-09-10. Real pthreads was tried (needing a real OS thread for
+# libc++'s condition_variable timed-wait to wake up) and reverted --
+# Asyncify instead, see build_ament_cmake.sh.in's own comment for why.
+# Re-pinned 2026-09-13 to Tobias-Fischer/vinca@f6c8903, which drops
+# Asyncify project-wide from build_ament_cmake.sh.in (see that commit's
+# message / build_ament_cmake.sh.in's own comments for the full
+# rationale: Asyncify + runtime dlopen() of a SIDE_MODULE is a confirmed,
+# unresolved upstream Emscripten/Binaryen limitation) and fixes an
+# EMCC_CFLAGS override that was clobbering the toolchain's own
+# -fwasm-exceptions default instead of appending to it.
+# Re-pinned 2026-09-15 to Tobias-Fischer/vinca@55cb379, fixing the first
+# genuine from-scratch closure rebuild this pipeline has ever done in CI
+# (every prior CI run hit a warm ros-rolling-emscripten-output cache and
+# never really exercised this path). Two issues, found in that order:
+# (1) ament_cmake_core's own CMake configure step needs `import
+# ament_package` using $BUILD_PREFIX's native python, which nothing
+# previously made visible there -- fixed by exporting PYTHONPATH at
+# $PREFIX's site-packages during cross-compilation. (2) the deeper root
+# cause: build_ament_python.sh.in's pip install never passed through
+# emscripten-forge-recipes' own PIP_ARGS="--prefix=$PREFIX ...", so
+# ros2-ament-package itself was landing in $BUILD_PREFIX/venv's private
+# site-packages on Linux instead of $PREFIX -- nothing declaring it as a
+# host: dependency (ament_cmake_core included) could find it at all.
+vinca = { git = "https://github.com/Tobias-Fischer/vinca.git", rev = "55cb3792e48f1c191a36956b93684b30008bdae7" }
 
 [tasks]
 generate-recipes = { cmd = "vinca -m", depends-on = ["remove-recipes"] }
@@ -44,6 +77,35 @@ upload = "rattler-build upload prefix -c robostack-rolling --generate-attestatio
 build_continue_on_failure = { cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://repo.prefix.dev/robostack-rolling -c https://repo.prefix.dev/conda-forge --continue-on-failure --skip-existing --channel-priority disabled", depends-on = ["generate-recipes"] }
 sort = "sh -lc 'vinca-sort-vinca-lists $@ vinca.yaml && vinca-sort-yaml-keys $@ pkg_additional_info.yaml robostack.yaml rosdistro_additional_recipes.yaml' --"
 
+generate-recipes-emscripten = { cmd = "vinca -m --platform emscripten-wasm32 && cp -r extra_recipes/. recipes/", depends-on = ["remove-recipes"] }
+check-patches-emscripten = { cmd = "python check_patches_clean_apply.py", depends-on = ["generate-recipes-emscripten"] }
+
+# No native build of any ros2-*-prefixed package is published anywhere
+# (not on robostack-staging, not on robostack-rolling, not built locally)
+# -- yet several message packages' generated recipe.yaml still declares a
+# build:-time (i.e. resolved against build_platform, not target_platform)
+# dependency on a native copy of ros2-rosidl-default-generators, since
+# CMake's find_package() for it runs via the build-platform toolchain
+# during cross-compilation. That native copy is otherwise permanently
+# unsatisfiable for this closure. The host-prefix (emscripten-wasm32)
+# copy already suffices for CMake's own find_package() resolution (via
+# -DCMAKE_FIND_ROOT_PATH=$PREFIX, already set in build_ament_cmake.sh.in)
+# -- rattler-build's solver just also insists on satisfying the
+# *declared* build: requirement against a real build_platform channel
+# entry. Mirroring the already-built emscripten-wasm32 packages into a
+# channel dir *named after whatever machine this script is actually
+# running on* (see sync_native_bootstrap_mirror.sh -- osx-arm64 on an
+# Apple Silicon Mac, linux-64 on this repo's own ubuntu-latest CI runner,
+# etc.; a directory name hardcoded to one specific machine's platform
+# silently does nothing useful on any other) and reindexing satisfies the
+# solver with zero actual native rebuilding. Nothing in this recipe set
+# nests more than one level deep on this trick (only
+# rosidl_default_generators/rosidl_core_generators themselves are
+# consumed this way, and they don't consume each other), so
+# build-emscripten below is a fixed two-pass sequence -- build, sync,
+# build again -- not an open "loop until nothing new gets built".
+sync-native-bootstrap-mirror = { cmd = "bash sync_native_bootstrap_mirror.sh", description = "Mirror built emscripten-wasm32 packages into a fake same-platform-as-this-machine channel entry, satisfying the build:-time native rosidl_default_generators dependency some message recipes declare (see comment above) without an actual native build." }
+
 [tasks.build]
 cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://prefix.dev/robostack-rolling -c https://prefix.dev/conda-forge --skip-existing --channel-priority disabled"
 depends-on = ["generate-recipes"]
@@ -57,3 +119,91 @@ description = "Remove all generated recipes, before regenerating them."
 cmd = "cp ./patch/{{ PACKAGE }}.*patch ./recipes/{{ PACKAGE }}/patch/; rattler-build build --recipe ./recipes/{{ PACKAGE }}/recipe.yaml -m ./conda_build_config.yaml -c https://prefix.dev/robostack-rolling -c https://prefix.dev/conda-forge --channel-priority disabled"
 args = [{ arg = "PACKAGE", default = "ros-rolling-ros-workspace" }]
 description = "Build a single package, from the ./recipes dir. Add the `ros-rolling-` prefix to the package name, e.g. `pixi build-one --package ros-rolling-ros-workspace`"
+
+[tasks.build-emscripten]
+  # Fixed two-pass sequence, not a loop: pass 1 builds everything that
+  # doesn't need the native-mirror workaround (including
+  # rosidl_default_generators/rosidl_core_generators themselves, which
+  # don't need it), the mirror sync then publishes those into the fake
+  # native-platform channel entry, and pass 2 builds everything that was
+  # waiting on that. See sync-native-bootstrap-mirror's comment for why
+  # two passes is provably enough here (nothing nests deeper than one
+  # level) rather than something that needs to be discovered by looping
+  # until a package count stops changing.
+  cmd = "pixi run build-emscripten-pass && pixi run sync-native-bootstrap-mirror && pixi run build-emscripten-pass"
+  depends-on = ["generate-recipes-emscripten"]
+
+[tasks.build-emscripten-pass]
+  cmd = [
+      "rattler-build", "build",
+      "--package-format", "tar-bz2",
+      "--recipe-dir", "./recipes",
+      "-m", "./conda_build_config.yaml",
+      "-c", "https://repo.prefix.dev/conda-forge",
+      # https://repo.mamba.pm/emscripten-forge is stale/legacy -- emscripten-forge/recipes'
+      # own pixi.toml publishes the emscripten SDK + cross-python toolchain to this
+      # channel instead. See ros-humble-emscripten's pixi.toml for details.
+      "-c", "https://repo.prefix.dev/emscripten-forge-4x",
+      # emscripten-forge-4x publishes the emscripten SDK toolchain package, but not
+      # (yet) cross-python_emscripten-wasm32 -- built locally instead from a clone
+      # of emscripten-forge/recipes (its own `build-cross-python-pkg` task), same
+      # as ros-humble-emscripten needed. TODO: drop this once/if emscripten-forge
+      # publishes it upstream, or vendor the build step into this repo properly.
+      "-c", "file:///tmp/emscripten_forge_recipes/output",
+      "-c", "microsoft",
+      "-c", "robostack-staging",
+      "--target-platform", "emscripten-wasm32",
+      "--skip-existing",
+      "--test", "skip",
+      # Without this, strict channel priority prefers conda-forge's newer
+      # noarch-eligible pyyaml (6.0.2/6.0.3, needing a "yaml" package that
+      # doesn't exist on any channel here) over emscripten-forge-4x's own
+      # pyyaml 6.0 build (needing "libyaml", which does exist for
+      # emscripten-wasm32) purely because conda-forge is listed first --
+      # even though conda-forge itself never publishes emscripten-wasm32
+      # builds. Confirmed necessary 2026-09-08 resolving ros2-launch's
+      # pyyaml dependency. Matches build-one's existing convention.
+      "--channel-priority", "disabled",
+      # General resilience for a ~230-package closure, not specific to any
+      # one known gap -- lets an unrelated single-package failure fall
+      # through without aborting everything else. See
+      # sync-native-bootstrap-mirror's own comment for the one *expected*
+      # class of failure pass 1 of build-emscripten's two-pass sequence
+      # leaves for pass 2 to pick up.
+      "--continue-on-failure"
+      ]
+  # No depends-on here deliberately: this raw pass is invoked twice by
+  # build-emscripten's fixed two-pass sequence, and recipe generation /
+  # mirror-syncing only need to happen once (before pass 1) and once
+  # in between (see build-emscripten), not before every pass -- a
+  # depends-on here would re-run generate-recipes-emscripten (which
+  # wipes and regenerates ./recipes) before pass 2 as well, for no
+  # benefit. Run `pixi run build-emscripten`, not this task directly,
+  # unless you've already generated recipes yourself.
+  # Read by vinca's build_ament_cmake.sh.in (see the vinca fork commits
+  # b504063 and 235bd2f): rmw_implementation's get_default_rmw_implementation()
+  # needs a real, buildable RMW name here -- this repo builds rmw_zenoh_pico,
+  # not ros-humble-emscripten's rmw_wasm_cpp. rmw_zenoh_pico (a
+  # micro-ROS-lineage RMW) also hard-requires every message's
+  # rosidl_typesupport_c/cpp dispatch table to register the
+  # rosidl_typesupport_microxrcedds_c/cpp backend specifically -- the
+  # default (rosidl_typesupport_introspection_c/cpp, what rmw_wasm_cpp
+  # expects) leaves that dispatch table without a matching entry at all,
+  # so rcl_publisher_init fails with "Type support not from this
+  # implementation" for every message type regardless of what's linked at
+  # the final executable. Confirmed via live browser demo, 2026-09-09.
+  #
+  # rosidl_typesupport_microxrcedds_cpp's codegen used to not handle ROS 2's
+  # newer auto-generated service/action "_Event" messages -- a real upstream
+  # gap (micro-ROS/rosidl_typesupport_microxrcedds#83), not fixable by a
+  # dependency declaration, that used to make any package defining a
+  # service or action (action_msgs, rcl_interfaces, test_msgs, ...) fail to
+  # build with STATIC_ROSIDL_TYPESUPPORT_CPP set this way, needing an
+  # elaborate two-group scoped-rebuild workaround after this task. Fixed at
+  # the source instead, via Tobias-Fischer/rosidl_typesupport_microxrcedds's
+  # fork (see rosdistro_additional_recipes.yaml) which now also generates
+  # typesupport for the auto-generated Event message (matching the C
+  # generator, which already did this) -- confirmed building the full
+  # closure in a single `pixi run build-emscripten` pass with both
+  # overrides set globally, no scoped rebuilds needed for any package.
+  env = { VINCA_EMSCRIPTEN_RMW_IMPLEMENTATION = "rmw_zenoh_pico", VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_C = "rosidl_typesupport_microxrcedds_c", VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_CPP = "rosidl_typesupport_microxrcedds_cpp" }
diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml
index 78584686f..3d9cb077e 100644
--- a/pkg_additional_info.yaml
+++ b/pkg_additional_info.yaml
@@ -111,6 +111,7 @@ libcamera:
 libcurl_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
 libg2o:
+  build_number: 27
   additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON"
 liblz4_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
@@ -140,6 +141,31 @@ openvdb_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
 orocos_kdl_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
+osrf_testing_tools_cpp:
+  # Dropped a leftover `set(CMAKE_CXX_FLAGS "-pthread ${CMAKE_CXX_FLAGS}")`
+  # from patch/ros-rolling-osrf-testing-tools-cpp.emscripten.patch's
+  # top-level CMakeLists.txt hunk -- a relic of this project's old
+  # pthreads-enabled build, now stale and actively wrong (this whole
+  # build is pthread-free; unconditionally adding -pthread to only this
+  # one package's flags would create exactly the kind of atomics/
+  # bulk-memory ABI mismatch this project's own zenoh-pico/rmw_zenoh_pico
+  # bugs this session were caused by). The same hunk's removal of the
+  # include(CTest)/BUILD_TESTING/googletest block turned out to still be
+  # genuinely necessary and is kept as-is: this package builds via
+  # build_catkin.sh, not build_ament_cmake.sh, and that script's
+  # emscripten branch never loads Emscripten.cmake's own toolchain file
+  # -- confirmed empirically that CMake's `EMSCRIPTEN` variable is never
+  # actually set in this specific build path, so an `if(NOT EMSCRIPTEN)`
+  # gate (tried first) still built the whole googletest/test_runner
+  # suite and failed the exact same way ("--shared-memory is disallowed
+  # ... not compiled with 'atomics' or 'bulk-memory' features") that the
+  # leftover -pthread flag was originally (incorrectly) added to paper
+  # over. Skip the test block unconditionally instead, matching what the
+  # original patch already did. The other three hunks (EMSCRIPTEN guards
+  # in count_function_occurrences_in_backtrace.hpp, backward.hpp, and
+  # src/test_runner/CMakeLists.txt) are genuinely still needed and
+  # unchanged. Rebuilt to confirm this compiles correctly.
+  build_number: 26
 pcl_ros:
   additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON"
 pinocchio:
@@ -198,13 +224,21 @@ rviz_ogre_vendor:
 sdformat_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
 spdlog_vendor:
-  additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
+  # No emscripten-wasm32 spdlog conda package exists; build from source there instead.
+  additional_cmake_args:
+    if: not wasm32
+    then: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
 sqlite3_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK"
 toppra:
   generate_dummy_package_with_run_deps:
     dep_name: toppra-python
     max_pin: 'x.x'
+tracetools:
+  # lttng-ust doesn't exist for wasm32; tracetools' own OS gate misses emscripten.
+  additional_cmake_args:
+    if: wasm32
+    then: "-DTRACETOOLS_DISABLED=ON"
 ublox_gps:
   additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON"
 uncrustify_vendor:
@@ -232,3 +266,725 @@ visp:
     override_version: '3.7.0'
 zenoh_cpp_vendor:
   additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON"
+action_msgs:
+  # Bump forces a rebuild against the fixed rosidl_generator_py.emscripten
+  # patch (Python3 NumPy component no longer required against the native
+  # $BUILD_PREFIX python) -- see rosidl_generator_py's own entry below.
+  build_number: 26
+builtin_interfaces:
+  build_number: 26
+cv_bridge:
+  build_number: 26
+distro_mutex:
+  build_number: 26
+example_interfaces:
+  # Same rosidl_generator_py NumPy fix as action_msgs above.
+  build_number: 26
+geometry_msgs:
+  build_number: 26
+libmavconn:
+  build_number: 26
+lifecycle_msgs:
+  # Same rosidl_generator_py NumPy fix as action_msgs above.
+  build_number: 26
+mavlink:
+  build_number: 29
+micro_ros_msgs:
+  # Same rosidl_generator_py NumPy fix as action_msgs above.
+  build_number: 26
+pcl_conversions:
+  build_number: 26
+rcl_interfaces:
+  # Same rosidl_generator_py NumPy fix as action_msgs above.
+  #
+  # 26 -> 27: no patch change to this package itself -- forces a rebuild
+  # against rosidl_typesupport_microxrcedds_c's own build 29 (see that
+  # package's note) so GetParameters.Request's `string[] names` field (an
+  # unbounded sequence, the message used to find and verify that
+  # fix) is regenerated with the corrected deserialize code.
+  #
+  # 27 -> 28: no patch change to this package itself -- forces a rebuild
+  # against rosidl_typesupport_microxrcedds_c's own build 30 (see that
+  # package's note) so GetParameters.Response's `ParameterValue[] values`
+  # field (an unbounded sequence, the message used to
+  # find and verify that fix) is regenerated with the corrected
+  # deserialize code.
+  build_number: 28
+rclc:
+  # Bumped 25 -> 26: no patch change -- this package's own build 25 was
+  # produced on 2026-09-12, in the window between vinca commit 69fa7de
+  # ("revert: drop real pthreads for emscripten-wasm32, use Asyncify
+  # instead", 2026-09-11) and f6c8903 ("fix: drop Asyncify project-wide",
+  # 2026-09-13), so its .so was compiled with -sASYNCIFY even though the
+  # vinca template (and every other package in this build) has been
+  # Asyncify-free since f6c8903 -- confirmed via `wasm-objdump -x` showing
+  # env.__asyncify_state/__asyncify_data imports nowhere else in demo_env
+  # except this package and rclcpp (same bump, see below). This is exactly
+  # the same class of staleness as the xeus-python local-channel
+  # contamination bug earlier in this project (see AGENTS.md) -- the fix
+  # is simply forcing a rebuild against the current, already-correct
+  # template, not any new patch.
+  build_number: 26
+rclcpp:
+  # Same stale-Asyncify-build staleness as rclc above -- rebuilt for the
+  # same reason, same day, same vinca commit window.
+  build_number: 26
+rclpy:
+  # Bumped 26 -> 27: added the signal_handler.cpp EMSCRIPTEN guard (see
+  # patch/ros-rolling-rclpy.emscripten.patch) that makes
+  # setup_deferred_signal_handler()/teardown_deferred_signal_handler() safe
+  # no-ops on this target -- unconditionally constructing
+  # g_deferred_signal_handling_thread (a real std::thread, regardless of
+  # `signal_handler_options` passed to rclpy.init()) previously aborted
+  # with `thread constructor failed: Resource temporarily unavailable`,
+  # since this build has no real pthreads support. Bump forces a new
+  # identity so rattler's extraction cache can't serve a stale
+  # _rclpy_pybind11.so built from the pre-patch source (also: bump forces a
+  # new identity so rattler's extraction cache can't serve a stale
+  # _rclpy_pybind11.so built against the old pthreads-enabled ABI).
+  #
+  # 27 -> 28: added a rclpy/node.py patch (ported from
+  # ros2-emscripten-zenoh-demo/patches/rclpy-node-rmw_zenoh_pico-workarounds.patch,
+  # which was already applied in the separate demo_env_build deployment
+  # path but never folded into this project's own rattler-build recipe
+  # pipeline until now): (1) the default `/parameter_events` publisher
+  # Node.__init__() creates unconditionally now passes
+  # `event_callbacks=PublisherEventCallbacks(use_default_callbacks=False)`,
+  # and (2) `self._type_description_service` is set to `None` instead of
+  # constructing a real `TypeDescriptionService(self)`. Both work around
+  # rmw_zenoh_pico (a prototype/incomplete RMW implementation) not fully
+  # supporting standard QoS publisher events -- confirmed via
+  # `RCLError('failed to create publisher event: Publisher implementation
+  # identifier not from this implementation, ... rmw_event.c:242')` the
+  # first time Node() construction got far enough to actually reach this
+  # code (i.e. after the zenoh-pico session-open resumable-handshake fix
+  # -- see AGENTS.md's "THE CURRENT BLOCKER" section -- finally let
+  # rmw_create_node() succeed at all).
+  #
+  # 28 -> 29: added an `__init__.py` patch making `rclpy.spin(node)` usable
+  # inside a real pyjs/xeus-python kernel (JupyterLite): a literal blocking
+  # `while ... spin_once()` loop there would freeze the tab forever (no
+  # pthreads, no Asyncify -- nothing can yield to the browser event loop
+  # from inside one still-running synchronous call). Detects this exact
+  # context via a new `_emscripten_webloop_active()` helper (`sys.platform
+  # == 'emscripten'` AND `pyjs.webloop.WebLoop` is genuinely the active
+  # event loop -- `import pyjs.webloop` itself fails outside a real kernel
+  # bootstrap, which is what keeps the plain compiled browser demos, which
+  # never touch pyjs at all, on the unchanged native code path below) and,
+  # only then, schedules the same non-blocking `spin_once()` this function
+  # already uses as a background `asyncio` task instead of blocking --
+  # returning immediately, deliberately breaking from `spin()`'s documented
+  # "this function blocks" contract on this one platform, since a literal
+  # implementation of that contract is not just inconvenient but impossible
+  # here. Ported from this project's own downstream demo repo
+  # (ros2-emscripten-zenoh-demo), where the identical `spin_async()` pattern
+  # was already shipped as a plain notebook cell; this folds it into rclpy
+  # itself so `rclpy.spin(node)` "just works" without that extra cell.
+  #
+  # 29 -> 30: removed both rclpy/node.py workarounds added in build 28.
+  # Neither is needed anymore: (1) the `/parameter_events` publisher's
+  # `use_default_callbacks=False` was only ever needed because of the same
+  # rmw_event.c bug fixed in rmw_zenoh_pico build 34 (RMW_RET_UNSUPPORTED
+  # instead of RMW_RET_INCORRECT_RMW_IMPLEMENTATION) -- confirmed live with
+  # a real browser run: the internal publisher now uses rclpy's own
+  # unmodified default and no RCLError is raised. (2) `TypeDescriptionService`
+  # never actually hung at construction -- confirmed live: `Node()` with
+  # `self._type_description_service = TypeDescriptionService(self)`
+  # restored completes normally and the demo keeps publishing continuously
+  # afterward. A real, deeper gap does exist one level further in --
+  # calling the resulting `~/get_type_description` service as a client
+  # (`call_async()`) does reach the server (confirmed via the server's own
+  # "Failed to parse type hash" log firing for a deliberately-empty test
+  # request) but the client's future never resolves, so a caller waiting on
+  # a response really does hang forever. That's a general rclpy
+  # client-response-delivery gap on this platform (the exact same
+  # `_execute()`/`send_response()` path in rclpy's own `executors.py` any
+  # other service on this RMW would use, nothing TypeDescriptionService-
+  # specific about it), not something constructing the service itself
+  # triggers -- left as a documented, precise known limitation rather than
+  # papered over by not constructing the service at all. See
+  # ros2-emscripten-zenoh-demo's site for the current wording.
+  #
+  # RESOLVED (confirmed 2026-09-16, no rclpy code change needed): re-tested
+  # this exact scenario -- a client calling this same node's own
+  # `~/get_type_description` with a deliberately-empty type_hash -- against
+  # the currently-shipped rmw_zenoh_pico (build 37). The future now resolves
+  # cleanly: `GetTypeDescription_Response(successful=False, failure_reason=
+  # 'Failed to parse type hash', ...)`. Root cause was in rmw_zenoh_pico's
+  # own rmw_client.c: rmw_send_request()'s attachment_sequence_num_inc() is
+  # a post-increment (returns the OLD value, bumps the field after), but the
+  # code used to read the *already-bumped* field for the sequence_id handed
+  # back to the caller -- permanently one behind what attachment_gen() then
+  # embedded on the wire. rclpy's Client.call_async() keys its pending-
+  # request dict by that sequence_id, so every reply's echoed sequence
+  # number looked up a request that was never registered -- a plain
+  # KeyError, silently swallowed by executors.py's `except KeyError: pass`,
+  # so the future never resolved. This predates the QoS-matching work in
+  # builds 34-37 and was already fixed by the time build 37 shipped; this
+  # note was simply never updated to say so. A *separate*, more
+  # far-reaching bug was found investigating this: rosidl_typesupport_
+  # microxrcedds_c's generated cdr_deserialize() for any *unbounded*
+  # sequence field (e.g. `string[] names` in rcl_interfaces/GetParameters.
+  # Request) always fails on a freshly-received (zero-capacity) message --
+  # msg__type_support_c.c.em's sequence-of-string/sequence-of-namespaced-
+  # type deserialize branches do `if (size > capacity) return 0;` with no
+  # code path that ever grows the destination sequence to fit, so any
+  # unbounded array member is fundamentally undeserializable via this
+  # typesupport backend today. Confirmed via byte-identical, correctly-
+  # formed wire data (verified with a hex dump on both ends) still failing
+  # cdr_deserialize; a request/response using only scalar fields (tested
+  # with lifecycle_msgs/ChangeState) round-trips perfectly. Not yet fixed --
+  # this is a rosidl_typesupport_microxrcedds codegen-template bug, not an
+  # rmw_zenoh_pico one, and affects any message with an unbounded sequence
+  # (e.g. the real `rcl_interfaces/GetParameters` parameter-service call,
+  # not just this synthetic test).
+  build_number: 30
+rmf_battery:
+  build_number: 26
+rmf_task:
+  build_number: 26
+rmf_task_sequence:
+  build_number: 26
+rmf_traffic:
+  build_number: 26
+rmf_traffic_ros2:
+  build_number: 30
+rmf_utils:
+  build_number: 27
+rmw_zenoh_pico:
+  # Bumped 25 -> 26: extended patch/ros-rolling-rmw-zenoh-pico.patch's
+  # existing Emscripten "-Wl,--export=..." list (for rmw_zenoh_pico_set_
+  # unicast/set_mode/get_mode) to also cover rmw_identifier.c's three
+  # functions (rmw_get_implementation_identifier, rmw_get_serialization_
+  # format, rmw_zenoh_pico_typesupport_c) -- wasm-ld's dead-code
+  # elimination was dropping that whole translation unit (nothing in this
+  # link unit references any of the three directly), causing
+  # `import rclpy` to fail with "Dynamic linking error: cannot resolve
+  # symbol rmw_get_implementation_identifier" the moment rmw_implementation
+  # dlsym()'d it after loading this library. See AGENTS.md's "MAJOR PIVOT"
+  # section for the full writeup.
+  #
+  # 26 -> 27: fixed this project's own `ament_target_dependencies()` shim
+  # (added earlier in the same patch, because rolling's real ament_cmake
+  # dropped that macro) to fall back to linking a package's own
+  # `${pkg}::${pkg}_shared` imported target when it has no legacy
+  # `${pkg}_LIBRARIES` variable at all -- confirmed exactly this for
+  # zenohpico's own modern, target-only Config.cmake. Without this
+  # fallback, `ament_target_dependencies(rmw_zenoh_pico "zenohpico" ...)`
+  # silently linked nothing at all for zenohpico specifically: wasm-ld
+  # still resolved the actual z_*/ze_* symbol references at THIS
+  # package's own build time (Emscripten SIDE_MODULE builds are lazy
+  # about unresolved externals by design, so this produced no build
+  # error), but librmw_zenoh_pico.so's own dylink metadata never recorded
+  # zenoh-pico as a NEEDED dependency, since target_link_libraries() was
+  # never actually called for it. At runtime this became pure
+  # load-order luck instead of a real guarantee, surfacing as
+  # `rclpy.init()` failing with "Dynamic linking error: cannot resolve
+  # symbol z_malloc" (zenoh-pico's own allocator) the first time this
+  # project's JupyterLite rclpy integration got far enough to construct a
+  # real zenoh session -- see AGENTS.md's "MAJOR PIVOT" section.
+  #
+  # 27 -> 28: fixed session_connect() (zenoh_pico_session.c) to clone a
+  # fresh z_owned_config_t for each z_open() attempt instead of z_move()ing
+  # session->config directly -- z_open() consumes (moves-from) its config
+  # argument whether or not it succeeds, so a naive retry would hand it an
+  # already-invalidated config on the second and every later call. This
+  # matters now because z_open()'s own session/link-open handshake can
+  # legitimately need several retries to complete without Asyncify (see
+  # zenoh-pico's own emscripten-nonblocking-io.patch and
+  # emscripten-nonblocking-sleep.patch, bumping that package's build
+  # 5 -> 6): every blocking wait in that handshake was rewritten to make
+  # exactly one non-blocking attempt per call (there's no way to
+  # cooperatively yield to the browser's event loop from inside a single
+  # synchronous call without Asyncify), so session_connect() is now
+  # expected to be called repeatedly from a Python-side `await
+  # asyncio.sleep()` retry loop until it stops returning RMW_RET_ERROR.
+  #
+  # 28 -> 29: TEMPORARY diagnostic tracing (TODO: remove) appended to
+  # patch/ros-rolling-rmw-zenoh-pico.patch -- added a printf hex/ASCII dump
+  # of the received payload bytes right after rmw_zenoh_pico_generate_
+  # recv_sample_msg_data()'s own _z_bytes_to_buf() copy
+  # (zenoh_pico_rosMessage.c), to determine whether the bytes handed to
+  # rmw_take() for a SESSION-LOCAL (same-process pub/sub) delivery are
+  # actually correct ROS CDR content or corrupted/garbage. This is the
+  # rmw_zenoh_pico-side half of tracing the "Typesupport deserialize
+  # error" seen at rmw_take.c:38 once zenoh-pico's own
+  # Z_FEATURE_LOCAL_SUBSCRIBER path (see that project's recipe.yaml,
+  # builds 15-18) started actually dispatching locally-published messages
+  # to same-session subscriptions: the subscription match now succeeds
+  # (sub_nb=1) and the callback fires, but the ROS message never
+  # deserializes correctly downstream.
+  #
+  # 29 -> 30: build-29's hex dump confirmed the FIRST locally-delivered
+  # message's bytes are entirely correct, well-formed CDR
+  # (00 01 00 00 08 00 00 00 "hello 0\0" -- a valid CDR_LE-encapsulated
+  # std_msgs/String, byte-for-byte, for a 16-byte payload) -- yet
+  # rmw_take() still fails with "Typesupport deserialize error" on exactly
+  # this first message. Extended the tracing directly into
+  # rmw_zenoh_pico_deserialize() itself (same file) to print the
+  # payload pointer/size/callbacks pointer it actually receives at
+  # take-time, plus cdr_deserialize()'s own return value, to find out
+  # whether the bytes are still intact by the time rmw_take() dequeues
+  # them (ruling out a queue/lifetime bug between generate and take) or
+  # whether cdr_deserialize() itself is what's rejecting well-formed
+  # input specifically for a locally-looped-back message.
+  #
+  # 30 -> 31: build-30 confirmed cdr_deserialize() itself is what returns
+  # false (0), given the exact same correct 16-byte payload seen at
+  # generate-time. Root cause hypothesis, from reading rosidl_typesupport_
+  # microxrcedds_c's own msg__type_support_c.c.em codegen template: an
+  # AbstractString member's deserializer does
+  # `ucdr_deserialize_sequence_char(cdr, ros_message->data, capacity,
+  # &string_size)` using ros_message's PRE-EXISTING capacity -- it does NOT
+  # dynamically grow/reallocate the destination buffer the way
+  # rosidl_runtime_c's usual dynamic-string convention (and every other
+  # RMW's deserializer) does. rclpy always constructs a fresh message via
+  # the standard `..._String__init()` before rmw_take(), which allocates
+  # capacity=1 (an empty string) -- so ANY nonempty incoming string (e.g.
+  # "hello 0", needing capacity>=8) is larger than what's pre-allocated,
+  # and this codegen's deserializer simply fails/truncates rather than
+  # growing the buffer. This would be a general, always-present
+  # microxrcedds-typesupport limitation for unbounded strings -- unrelated
+  # to local-vs-remote delivery -- that was simply never exercised before,
+  # because Z_FEATURE_LOCAL_SUBSCRIBER (builds 15-18 above) is the FIRST
+  # time any message has ever reached rmw_take() on the wasm side of this
+  # whole project (remote peers always used their OWN native RMW to
+  # receive, which handles dynamic strings fine). Extended the debug
+  # tracing to print ros_message's `data`/`size`/`capacity` fields
+  # (treating it as a rosidl_runtime_c__String, valid for std_msgs/String
+  # specifically) right before cdr_deserialize() is called, to confirm
+  # this directly.
+  #
+  # 31 -> 32: build-31's `ros_message as String: ... capacity=1` dump
+  # confirmed the hypothesis exactly. Fixed at the source
+  # (rosidl_typesupport_microxrcedds_c's own `.em` codegen template -- see
+  # that package's build 28 and patch/ros-rolling-rosidl-typesupport-
+  # microxrcedds-c.emscripten.patch) rather than here: this package's own
+  # `zenoh_pico_rosMessage.c` was never wrong, it was just the messenger.
+  # With the fixed typesupport + a rebuilt std_msgs, rmw_take() now
+  # genuinely succeeds -- confirmed via a real browser run: all 39
+  # published "hello N" strings arrive at the subscriber's `on_msg`
+  # callback, byte-for-byte correct, `received count: 39`. All temporary
+  # debug tracing added while diagnosing this
+  # (rmw_zenoh_pico_generate_recv_sample_msg_data's hex/ASCII payload
+  # dump, and rmw_zenoh_pico_deserialize's pointer/size/return-value +
+  # String-struct dump) is removed in this build -- its job is done.
+  #
+  # 32 -> 33: regenerated patch/ros-rolling-rmw-zenoh-pico.patch cleanly
+  # from scratch (git diff against a fresh pristine clone with every
+  # existing change re-applied by hand), replacing a malformed version of
+  # the file that had accumulated a duplicated hunk somewhere along the
+  # way (a chunk of the CMakeLists.txt `-Wl,--export=...` comment/hunk
+  # content appeared twice). That corruption threw off strict `git apply`
+  # / `patch --dry-run` hunk-position tracking badly enough that
+  # rmw_wait.c's LAST hunk -- the unconditional `zp_read()`/
+  # `zp_send_keep_alive()` network pump added at the very top of
+  # `rmw_wait()`, guarding against a talker with no subscriptions ever
+  # starving the session of traffic until its lease expired -- silently
+  # failed to apply via plain `patch` (rejected to a .rej file, with no
+  # hard build failure) every single time this recipe has been built,
+  # this session included: confirmed by grepping the persistent
+  # `output/src_cache` clone and, more conclusively, by manually
+  # re-deriving what a correct, non-corrupted apply of all 4 rmw_wait.c
+  # hunks actually produces and diffing it against what every previous
+  # build actually used -- the pump code was genuinely never compiled in.
+  # This build is the first time it actually exists in a real artifact.
+  # Re-verified the full end-to-end browser demo still passes (39/39
+  # messages) after this fix, as a regression check -- this rebuild
+  # doesn't need to be, and isn't, contingent on rerunning the full
+  # investigation that led here.
+  #
+  # 33 -> 34: fixed rmw_event.c's rmw_publisher_event_init()/
+  # rmw_subscription_event_init() to return RMW_RET_UNSUPPORTED instead of
+  # RMW_RET_INCORRECT_RMW_IMPLEMENTATION when support_event_type() finds no
+  # match -- which, since this RMW's own _support_event[] table is
+  # permanently empty upstream (gid_cache, needed for real QoS event
+  # matching, was never implemented -- see rmw_zenoh_pico_event.h's own
+  # "the current implement of rmw_zenoh_pico does not support event"
+  # comment), is *every* event type, always. rclpy's own event_handler.py
+  # already wraps default-callback construction in
+  # `except UnsupportedEventTypeError: pass`, but that C++ binding
+  # (event_handle.cpp) only maps RCL_RET_UNSUPPORTED to that exception --
+  # the wrong code this RMW returned instead surfaced as a raw RCLError,
+  # which is exactly why every demo in this project has to pass
+  # `event_callbacks=PublisherEventCallbacks(use_default_callbacks=False)`
+  # explicitly rather than just accepting the default. Does not add real
+  # QoS event/matching support (still no gid_cache, no wire-level
+  # notifications) -- just makes the *absence* of it fail the way rclpy
+  # already expects unsupported features to fail, so use_default_callbacks
+  # (the actual default) silently no-ops instead of raising. Confirmed
+  # this is the only thing support_event_type()'s -1 return path feeds
+  # into for these two functions (RMW_CHECK_TYPE_IDENTIFIERS_MATCH's own,
+  # separate use of RMW_RET_INCORRECT_RMW_IMPLEMENTATION a few lines below
+  # each is for a genuinely different failure -- a publisher/subscription
+  # from a different RMW implementation entirely -- and is untouched).
+  #
+  # 34 -> 35: fixed rmw_send_request()'s sequence-number bug --
+  # attachment_sequence_num_inc() is a post-increment (returns the OLD
+  # value, then bumps client_data->attachment.sequence_num), but the very
+  # next call, attachment_gen(), always serializes the struct's CURRENT
+  # (already-bumped) field onto the wire. The *sequence_id handed back to
+  # rcl/rclpy was therefore always one behind whatever sequence number
+  # actually went out in the request -- and therefore one behind whatever
+  # the eventual reply's echoed request_id.sequence_number reports.
+  # rclpy's Client.call_async() keys its pending-request dict by
+  # *sequence_id, so every single reply's sequence number looked up a
+  # request that was never registered: a plain KeyError, silently
+  # swallowed by executors.py's `except KeyError: pass`, so the caller's
+  # future never resolves -- confirmed live, root-caused by adding
+  # temporary diagnostics at every step of the request/response path
+  # (send, wait-set attach, deserialize, sequence numbers on both ends)
+  # until the exact mismatch (sent seq=0, echoed-back seq=1) was directly
+  # observed. This is completely general -- every rclpy service client on
+  # this RMW was affected, not just this project's TypeDescriptionService
+  # investigation that found it. Fix: read *sequence_id back from the
+  # struct field *after* incrementing, so it matches exactly what
+  # attachment_gen() is about to embed. Verified live end-to-end: a
+  # client's future now resolves with the real deserialized response.
+  # Upstream PR: https://github.com/esol-community/rmw_zenoh_pico/pull/11
+  #
+  # 35 -> 36: real QoS event/matching support. Every publisher/subscription
+  # already declared its own liveliness token (name/type/QoS encoded into
+  # the key -- zenoh_pico_liveliness.c's generate_liveliness()/
+  # qos_to_keyexpr()); nothing ever subscribed to *other* peers' tokens to
+  # discover them ("the gid_cache is not implemented", the upstream code's
+  # own comment). New src/zenoh_pico/zenoh_pico_graph_cache.c adds that
+  # other half: one session-wide liveliness subscriber under the same
+  # "@ros2_lv" admin space, decoding each discovered publisher's/
+  # subscription's topic+QoS and matching it against this session's own
+  # local entities on the same topic (reliability/durability compatibility
+  # only -- deadline/lifespan/liveliness deliberately out of scope).
+  # Registered from rmw_create_publisher()/rmw_create_subscription(),
+  # unregistered on destroy. Drives the existing (already-correct, just
+  # previously unreachable) rmw_take_event()/EventStatus machinery in
+  # rmw_event.c for RMW_EVENT_{REQUESTED,OFFERED}_QOS_INCOMPATIBLE and
+  # RMW_EVENT_{SUBSCRIPTION,PUBLICATION}_MATCHED, and implements
+  # rmw_publisher_count_matched_subscriptions()/
+  # rmw_subscription_count_matched_publishers() (previously
+  # RMW_RET_UNSUPPORTED stubs) via a new
+  # get_rmw_zenoh_pico_event_current_count() accessor.
+  #
+  # Along the way, found and fixed three real, previously-dormant upstream
+  # bugs this feature is the first thing to ever actually exercise (all
+  # three were unreachable while _support_event[] was empty/degenerate,
+  # per the build-34 and earlier history above):
+  #   1. rmw_event.c's support_event_type() read `#ifndef EVENT_TABLE_SIZE`
+  #      around its lookup loop -- but that macro is unconditionally
+  #      defined by the very header the file includes, so the condition
+  #      was always false and the loop was preprocessed out entirely.
+  #      support_event_type() therefore always returned -1 (every event
+  #      type "unsupported"), silently no-op'ing every
+  #      add_rmw_zenoh_pico_event_total()/_current()/take_event_status()
+  #      call project-wide, for every event type, not just the new ones.
+  #      Same bug, same fix, in event_condition_check() further down
+  #      (used by rmw_wait()'s event-ready gating).
+  #   2. rmw_wait.c's second events-handling loop (the "detach" pass) was
+  #      a nested `for` loop shadowing its own index variable -- a stray
+  #      duplicate of the identical loop header -- whose body ended with
+  #      `return true;`. rmw_wait() returns `rmw_ret_t`, not `bool`: `true`
+  #      is 1, which is RMW_RET_ERROR here, so the first ready event made
+  #      the whole call fail ("Error from rmw_wait(): 1 error not set", no
+  #      message ever set to go with it). Dormant for the same reason as
+  #      bug 1 (no event was ever real enough to reach "ready"). Fixed to
+  #      match the subscriptions/services/clients loops right below it:
+  #      record readiness in `wait_result`, null out entries that aren't
+  #      ready, no early return.
+  #   3. rmw_event.c's data_callback_init()/data_callback_set() zeroed a
+  #      DataEventManager's event_status with `sizeof(EventStatus)` (one
+  #      entry) instead of `sizeof(data_callback->event_status)` (the
+  #      whole EVENT_TABLE_SIZE-entry array) -- only slot 0 ever got
+  #      zeroed. Harmless while the two previously-enabled event types
+  #      were both pure lifetime total_count-only incident counters (a
+  #      stray nonzero start was hard to notice); real once current_count
+  #      needed a genuine zero start for
+  #      rmw_publisher_count_matched_subscriptions()/
+  #      rmw_subscription_count_matched_publishers() to mean anything.
+  #
+  # Also added EventStatus.last_policy_kind (a real rmw_qos_policy_kind_t,
+  # set by the graph cache's update_match_events() before an incompatible
+  # event goes live, defaulted to RMW_QOS_POLICY_INVALID otherwise) and
+  # wired it into rmw_take_event()'s two incompatible-QoS cases: this
+  # field used to be left unset entirely, and rclpy's own default
+  # incompatible-QoS callback (event_handler.py's
+  # _default_incompatible_qos_callback -> qos.py's
+  # qos_policy_name_from_kind()) reads it unconditionally once such an
+  # event is taken, raising ValueError on whatever uninitialized garbage
+  # happened to be there instead of a real value.
+  #
+  # Verified live end-to-end (two local publisher/subscription pairs,
+  # deliberately QoS-compatible and QoS-incompatible, matched via this
+  # session's own liveliness self-discovery over the real zenohd/WebSocket
+  # transport): rmw_publisher_count_matched_subscriptions()/
+  # rmw_subscription_count_matched_publishers() correctly report 1 once a
+  # complementary peer is discovered, correctly drop back to 0 once that
+  # peer is destroyed (the current_count decrement path,
+  # sub_rmw_zenoh_pico_event_current()), and rclpy's default
+  # incompatible-QoS callback logs a real warning instead of crashing.
+  #
+  # 36 -> 37: root-caused and fixed the two gaps build 36 left open (both
+  # turned out to share ONE real, previously-unknown cause -- a genuine
+  # bug 4 in this file's own rmw_wait.c, not an rclpy/rcl-side limitation
+  # as build 36 had assumed):
+  #
+  # Bug 4 -- rmw_wait.c treated `events->events[i]` as if it were already
+  # a `DataEventManager*` (the same value `rmw_event->data` holds). It
+  # isn't: rcl's own rcl_wait_set_add_event() (rcl/src/rcl/wait.c)
+  # explicitly overwrites that array slot with the `rmw_event_t*` handle
+  # itself, one line after its own SET_ADD_RMW() macro had written
+  # `rmw_handle->data` there --
+  #   wait_set->impl->rmw_events.events[current_index] = rmw_handle;
+  # -- and every other rmw implementation agrees this is the real
+  # contract: rmw_fastrtps_shared_cpp's own rmw_wait.cpp does
+  # `static_cast(events->events[i])` and only reads
+  # `->data` after that cast (confirmed directly against both repos' own
+  # "rolling" branch sources). Casting the wrong thing to
+  # `DataEventManager*` reinterprets an unrelated `rmw_event_t`'s bytes
+  # (implementation_identifier/data/event_type) as
+  # total_count/current_count/changed/etc; a real pointer's bytes almost
+  # never happen to zero out the `changed` bool, so every registered
+  # event looked permanently "changed" from the moment it was created,
+  # regardless of anything graph_cache.c ever did. This is exactly what
+  # build 36 partially diagnosed as "gap B" (a DataEventManager address
+  # that matched nothing this patch ever initialized) without yet finding
+  # the real cause -- confirmed here by instrumenting every real
+  # DataEventManager ever constructed and showing rmw_wait.c was reading
+  # from a stable, valid, but *completely different* address the whole
+  # time. Fixed in both `_check_and_attach_condition()` and rmw_wait()'s
+  # own detach pass: `(DataEventManager *)((rmw_event_t *)events->events[i])->data`
+  # instead of casting `events->events[i]` directly.
+  #
+  # This single fix also resolved build 36's "gap A" (the rclpy
+  # `_WorkTracker`/threading.Condition crash in executors.py's async
+  # event-dispatch path): that crash was a downstream symptom, not a
+  # separate bug -- an event that never legitimately quiesces (because
+  # `changed` was being read from garbage that happened to look
+  # permanently true) kept re-triggering rclpy's coroutine dispatch for
+  # the same handler far more aggressively than any real event ever
+  # would, which is what actually corrupted `_WorkTracker`'s state.
+  # Verified live: 300+ spin_once() ticks with two real publisher/
+  # subscription pairs and rclpy's *default* (unmodified,
+  # use_default_callbacks left at its default True) event callbacks
+  # active throughout -- zero crashes, zero spurious warnings.
+  #
+  # One more real bug found and fixed alongside it while verifying: even
+  # after the events[]->data fix, a publisher/subscription with more than
+  # one registered rmw_event_t sharing the same DataEventManager (e.g.
+  # the default OFFERED_QOS_INCOMPATIBLE handler on an entity whose
+  # MATCHED status genuinely changes) had every sibling handle reported
+  # "ready" whenever *any* type on that shared manager changed --
+  # event_condition_check() checks per-manager, not per-specific-type, by
+  # design (it has to, since a manager can back several handles). But
+  # rmw_take_event() then unconditionally reported "taken" for whatever
+  # specific type the caller asked about, without checking whether *that
+  # type's own* `changed` flag was actually set -- so a real MATCHED
+  # change caused a spurious, single-shot OFFERED_QOS_INCOMPATIBLE
+  # "New subscription discovered ... requesting incompatible QoS,
+  # Last incompatible policy: INVALID" callback fire alongside the real
+  # one. Fixed by gating rmw_take_event() on its own event type's
+  # `changed` flag before the switch, returning `*taken = false`
+  # otherwise -- standard rmw_take_event() semantics (report nothing new
+  # when there's nothing new), matching what every other rmw
+  # implementation already does. Verified: the same 300+-tick run above
+  # produced zero spurious callback fires of any kind.
+  #
+  # Net effect: the `PublisherEventCallbacks(use_default_callbacks=False)`
+  # workaround build 36 needed on this project's own chatter_rclpy
+  # talker (purely to silence the then-unresolved spurious warning) is
+  # removed again -- rclpy's ordinary, fully-default event callbacks work
+  # correctly now, matched or not.
+  #
+  # 37 -> 38: implemented rmw_service_server_is_available(), previously an
+  # unconditional RMW_RET_UNSUPPORTED stub -- hit directly while testing
+  # rclpy's Client class this session: client.service_is_ready()/
+  # wait_for_service() both raise RCLError instead of returning False.
+  # Reuses the exact same liveliness-discovery graph cache
+  # (zenoh_pico_graph_cache.c) PR #12 already built for QoS matching:
+  # local Clients now register themselves the same way local Publishers/
+  # Subscriptions do, and the liveliness sample handler -- previously only
+  # recognizing "MP"/"MS" entity-type codes and explicitly bailing out on
+  # anything else, including on the (incorrect) assumption that service/
+  # client liveliness keys "have fewer segments" -- also recognizes "SS"
+  # (service) tokens now and matches them against local Clients by
+  # topic_name/topic_type, incrementing/decrementing a plain
+  # available_services counter on the client's own ZenohPicoServiceData
+  # (clamped at 0) instead of running the Publisher/Subscription-specific
+  # MATCHED/QOS_INCOMPATIBLE event logic, which doesn't apply here.
+  # Confirmed empirically that service/client liveliness keys DO carry the
+  # same topic_info segments as publisher/subscription ones (both go
+  # through zenoh_pico_generate_topic_info()) -- the stale comment
+  # claiming otherwise was simply wrong, conflating "service/client" with
+  # "plain node" (a real, shorter liveliness key, since a bare Node has no
+  # topic_info at all). Verified live: a client created before any
+  # matching service exists correctly reports service_is_ready()=False;
+  # creating the matching service flips it to True within a single tick;
+  # destroying that service flips it back to False.
+  build_number: 38
+ros2cli:
+  build_number: 26
+rosgraph_msgs:
+  # Same rosidl_generator_py NumPy fix as action_msgs above.
+  build_number: 26
+rosidl_cli:
+  build_number: 26
+rosidl_generator_py:
+  # Bump forces a new identity so rattler's cache can't serve the stale
+  # rosidl_generator_py_generate_interfaces.cmake that hard-required the
+  # Python3 NumPy component against the native $BUILD_PREFIX python (which
+  # never has numpy installed -- numpy is only ever a cross-compiled target
+  # package) -- see patch/ros-rolling-rosidl-generator-py.emscripten.patch.
+  build_number: 26
+rosidl_typesupport_microxrcedds_c:
+  # Bump forces a new identity so rattler's extraction cache can't serve stale
+  # content; also needed install(EXPORT ...) + rosidl_export_typesupport_targets().
+  #
+  # 27 -> 28: added patch/ros-rolling-rosidl-typesupport-microxrcedds-c.emscripten.patch,
+  # fixing a real heap buffer overflow in the generated `..._cdr_deserialize()`
+  # for any variable-length (unbounded) string field. Root-caused via
+  # rmw_zenoh_pico's own message-take path (see that package's build 29-31
+  # comments and ros-rolling-emscripten-zenoh/AGENTS.md): `rclpy` always
+  # constructs a fresh message via `..._String__init()` before `rmw_take()`,
+  # which allocates a 1-byte "empty string" buffer -- and this codegen's
+  # `AbstractString` deserialize branch calls
+  # `ucdr_deserialize_sequence_char(cdr, ros_message->data, capacity, &size)`
+  # using THAT tiny capacity. Reading micro-CDR's own source
+  # (src/c/types/sequence.c's `ucdr_deserialize_sequence_header` /
+  # src/c/types/array.c's `ucdr_buffer_to_array`) shows the capacity check
+  # only ever sets an out-of-band `cdr->error` flag -- it does NOT stop the
+  # subsequent unconditional `memcpy()` of the full incoming length into the
+  # destination, so any incoming string longer than the pre-allocated
+  # capacity (i.e. almost any non-empty string, since the default capacity
+  # is 1) overflows the destination heap allocation. This was never
+  # previously exposed because nothing on the wasm side of this project had
+  # ever reached `rmw_take()` before zenoh-pico's Z_FEATURE_LOCAL_SUBSCRIBER
+  # fix (same session) made same-session local pub/sub delivery work for the
+  # first time. Fix: peek the incoming length first (a side-effect-free
+  # `ucdrBuffer` struct copy -- it's a plain value type, no self-referential
+  # pointers) and `realloc()` the destination to fit BEFORE calling the real
+  # deserialize, for both a single string member and a sequence-of-strings
+  # member. This is the general, correct behavior every other RMW's
+  # typesupport already has for unbounded strings.
+  #
+  # 28 -> 29: fixed a sibling bug in the same deserialize function, one
+  # level above build 28's fix: an *unbounded sequence* member
+  # (e.g. `rcl_interfaces/GetParameters.Request`'s `string[] names`) has
+  # its own outer capacity separate from each individual string element's
+  # capacity -- how many String elements the sequence itself can hold, not
+  # how many bytes each one is. That outer check was `if (size >
+  # ros_message->names.capacity) { return 0; }`, with no code path that
+  # ever grows the sequence to fit -- and a freshly-constructed message
+  # (e.g. `rcl_take_request_with_info()`'s own `create_from_py()` building
+  # an empty destination request before the real wire size is known, the
+  # same as build 28's per-string case) always starts this capacity at 0.
+  # So *any* non-empty unbounded sequence failed to deserialize,
+  # unconditionally -- build 28's own per-element fix never even ran,
+  # since this outer check `return 0`'d before the loop containing it.
+  # Confirmed via byte-identical, correctly-formed wire data on both ends
+  # (hex-dumped) still failing `cdr_deserialize()`; a request built only
+  # from scalar fields (`lifecycle_msgs/ChangeState`) round-trips fine by
+  # contrast, isolating the bug to sequence-of-string specifically. Fixed
+  # by growing the destination with `rosidl_runtime_c__String__Sequence__
+  # fini()` + `__init(&seq, size)` (fini() is a safe no-op on an
+  # already-empty sequence, so this also correctly handles a reused,
+  # non-empty destination without leaking its old element buffers) --
+  # mirrors build 28's own realloc()-to-fit pattern, one level up. Scoped
+  # to sequence only, matching build 28's own scope; an analogous
+  # gap exists for sequence-of-namespaced-type (nested message arrays) but
+  # growing that destination needs the *other* message package's own
+  # generated `__Sequence__init()`, which this generated file doesn't
+  # currently link against -- left as a known, documented follow-up rather
+  # than risking a new link-time bug. Verified live: a real rclpy service
+  # request carrying `names=['foo', 'bar', 'baz']` (three elements) is
+  # correctly received and deserialized end-to-end.
+  #
+  # 29 -> 30: fixed the sequence-of-namespaced-type follow-up build 29's
+  # own note flagged: an unbounded sequence member (e.g.
+  # rcl_interfaces/GetParameters.Response's `ParameterValue[] values`, a
+  # nested-message array) has the exact same outer-capacity-never-grown
+  # bug build 29 fixed for sequence, and for the same reason --
+  # `if (size > ros_message->values.capacity) { return 0; }`, always true
+  # for a freshly-constructed (capacity 0) destination. Growing it
+  # *properly* would call the other message package's own generated
+  # `__Sequence__init()` (so each new element is correctly
+  # default-constructed) -- not available here, since this generated file
+  # deliberately never links directly against sibling message packages
+  # beyond their struct layout, reaching their (de)serialize only
+  # indirectly through the generic message_type_support_callbacks_t
+  # v-table, which has no "construct a default instance" entry. Fixed
+  # instead with a plain zero-filled `calloc()` (sized via
+  # `sizeof(*ros_message->values.data)`, a compile-time property of the
+  # pointee type that needs no literal type name and works even though
+  # `data` is NULL) -- equivalent to a proper per-element `__init()` for
+  # the overwhelming majority of message types, whose fields all default
+  # to their natural zero value. A destination that's already
+  # partially populated and still too small falls back to the previous
+  # `return 0` instead of growing, since properly releasing its existing
+  # elements' own sub-allocations needs that same unavailable fini().
+  # Verified live: a real rclpy service response carrying two real
+  # `ParameterValue` entries (`type=PARAMETER_STRING`/`string_value=
+  # 'hello'` and `type=PARAMETER_INTEGER`/`integer_value=42`) is received
+  # and deserialized correctly end-to-end by the client.
+  #
+  # THROWAWAY diagnostic build number, temporary -- do not ship. Testing a
+  # third sibling bug in this same deserialize function, more severe than
+  # the previous two: an unbounded sequence (e.g. `float64[]`)
+  # calls ucdr_deserialize_sequence_() with the destination's current
+  # (often 0) capacity -- but unlike the outer-capacity checks fixed in
+  # builds 29/30 (which safely `return 0`/bail before touching the
+  # buffer), THIS call's own internal capacity check
+  # (ucdr_deserialize_sequence_header(), micro-CDR's sequence.c) only sets
+  # an out-of-band error flag and does NOT stop the very next step -- an
+  # unconditional ucdr_deserialize_endian_array_() call
+  # (UCDR_DESERIALIZE_ARRAY_BYTE_N, micro-CDR's array.c) that
+  # memcpy()s/writes the FULL incoming length into the undersized
+  # destination regardless. This is a genuine heap buffer overflow, the
+  # exact same bug class as build 28's original string-content fix, just
+  # for numeric sequences instead of strings.
+  #
+  # 30 -> 31: fixed it, peek-then-grow just like build 28's string fix --
+  # a plain realloc() to `incoming_size * sizeof(element)` before calling
+  # the real deserialize. Simpler than the string/namespaced-type fixes:
+  # a BasicType element is a bare scalar with no sub-allocations of its
+  # own, and the real deserialize call fully overwrites every element up
+  # to the new size anyway, so there's no "fresh destination only"
+  # restriction here -- realloc() alone is correct for every case,
+  # including a reused, already-populated destination. Verified live: a
+  # real rclpy publisher/subscriber pair exchanging a
+  # `std_msgs/Float64MultiArray` with a 20-element `float64[] data` field
+  # (destination starting at capacity 0) delivers all 20 values correctly,
+  # no crash, no corruption.
+  build_number: 31
+rosidl_typesupport_microxrcedds_cpp:
+  # Also needed target_include_directories() wrapped in $.
+  build_number: 28
+sensor_msgs:
+  # Same rosidl_generator_py NumPy fix as action_msgs above.
+  build_number: 26
+service_msgs:
+  build_number: 26
+statistics_msgs:
+  build_number: 26
+std_msgs:
+  # Bumped 26 -> 27: forces a rebuild against the fixed
+  # rosidl_typesupport_microxrcedds_c (build 28, see that package's own
+  # pkg_additional_info.yaml entry) -- std_msgs/String's generated
+  # `_cdr_deserialize()` is CODEGEN'd at std_msgs's own build time from
+  # that package's .em template, so a stale std_msgs artifact would still
+  # carry the old, buggy (heap-overflowing) deserializer even after the
+  # template itself is fixed. Every other interface package with a string
+  # field has the same staleness and will need the same rebuild eventually
+  # -- std_msgs is fixed first here because it's what this project's own
+  # browser_test.html demo actually exercises (a plain std_msgs/String
+  # chatter topic).
+  #
+  # 27 -> 28: no patch change to this package itself -- forces a rebuild
+  # against rosidl_typesupport_microxrcedds_c's own build 31 (see that
+  # package's note) so Float64MultiArray's unbounded `float64[] data`
+  # field (the message used to find and verify that fix) is regenerated
+  # with the corrected deserialize code.
+  build_number: 28
+test_msgs:
+  build_number: 26
+type_description_interfaces:
+  build_number: 26
+unique_identifier_msgs:
+  build_number: 26
diff --git a/robostack.yaml b/robostack.yaml
index 6ed16d164..6d25b1d1d 100644
--- a/robostack.yaml
+++ b/robostack.yaml
@@ -132,7 +132,12 @@ geographiclib:
 geographiclib-tools:
   robostack: [geographiclib-cpp]
 git:
-  robostack: [git]
+  # No wasm32 conda package for git; it's a native VCS tool run during the build.
+  robostack:
+    linux: [git]
+    osx: [git]
+    win64: [git]
+    emscripten: []
 glslang-dev:
   robostack: [glslang]
 glut:
@@ -349,7 +354,11 @@ libglu-dev:
     osx: []
     win64: []
 libgmock-dev:
-  robostack: [gmock]
+  robostack:
+    linux: [gmock]
+    osx: [gmock]
+    win64: [gmock]
+    emscripten: []
 libgoogle-glog-dev:
   robostack: [glog]
 libgpgme-dev:
@@ -391,6 +400,7 @@ liblttng-ust-dev:
     linux: [lttng-ust]
     osx: []
     win64: []
+    emscripten: []
 liblz4:
   robostack: [lz4]
 liblz4-dev:
@@ -690,7 +700,12 @@ libxxf86vm:
 libyaml:
   robostack: [yaml]
 libyaml-dev:
-  robostack: [yaml]
+  # emscripten-forge publishes this under the newer name "libyaml", not "yaml".
+  robostack:
+    linux: [yaml]
+    osx: [yaml]
+    win64: [yaml]
+    emscripten: [libyaml]
 libzip-dev:
   robostack: [libzip]
 libzmq3-dev:
@@ -709,6 +724,10 @@ maven:
   robostack: [maven]
 meson:
   robostack: [meson]
+microcdr:
+  # Hand-written extra_recipes/microcdr package (eProsima/micro-CDR has no
+  # conda-forge/robostack package under this name).
+  robostack: [microcdr]
 mongodb:
   robostack: [mongodb]
 mosquitto:
@@ -742,7 +761,13 @@ openssl:
 pcre:
   robostack: [pcre]
 pkg-config:
-  robostack: [pkg-config]
+  robostack:
+    linux: [pkg-config]
+    osx: [pkg-config]
+    win64: [pkg-config]
+    # No wasm32 pkg-config binary; vinca's build template already adds a
+    # native one to the BUILD env for cross-compiling packages.
+    emscripten: []
 portaudio19-dev:
   robostack: [portaudio]
 postgresql:
@@ -1229,7 +1254,12 @@ sophus:
 spacenavd:
   robostack: [libspnav]
 spdlog:
-  robostack: [spdlog, fmt]
+  # No spdlog conda package for wasm32; falls back to spdlog_vendor's own source build.
+  robostack:
+    linux: [spdlog, fmt]
+    osx: [spdlog, fmt]
+    win64: [spdlog, fmt]
+    emscripten: []
 sqlite3:
   robostack: [sqlite 3.*]
 sshpass:
@@ -1286,11 +1316,26 @@ xsimd:
 xtensor:
   robostack: [xtensor ==0.24.7]
 yaml:
-  robostack: [yaml, yaml-cpp]
+  # emscripten-forge uses the name "libyaml" and publishes no yaml-cpp for wasm32
+  # (C++ consumers get it via the from-source yaml_cpp_vendor package instead).
+  robostack:
+    linux: [yaml, yaml-cpp]
+    osx: [yaml, yaml-cpp]
+    win64: [yaml, yaml-cpp]
+    emscripten: [libyaml]
 yaml-cpp:
-  robostack: [yaml-cpp]
+  # No yaml-cpp conda package for wasm32; falls back to yaml_cpp_vendor's own source build.
+  robostack:
+    linux: [yaml-cpp]
+    osx: [yaml-cpp]
+    win64: [yaml-cpp]
+    emscripten: []
 zbar:
   robostack: [zbar]
+zenohpico:
+  # emscripten-forge-4x also publishes its own newer, API-incompatible
+  # zenoh-pico; pin the version to force resolution to our own build.
+  robostack: ["zenoh-pico ==1.7.0"]
 zlib:
   robostack: [zlib]
 zziplib:
diff --git a/rosdistro_additional_recipes.yaml b/rosdistro_additional_recipes.yaml
index 24a775f98..e5dfa5025 100644
--- a/rosdistro_additional_recipes.yaml
+++ b/rosdistro_additional_recipes.yaml
@@ -402,6 +402,11 @@ mocap4r2_robot_gt_msgs:
   url: https://github.com/MOCAP4ROS2-Project/mocap4r2.git
   version: 0.0.7
   additional_folder: mocap4r2_robot_gt/mocap4r2_robot_gt_msgs
+rmw_zenoh_pico:
+  rev: 54e20a460c9533d279e07a581d0e69e647d60a0e
+  url: https://github.com/esol-community/rmw_zenoh_pico.git
+  version: 0.0.0
+  additional_folder: rmw_zenoh_pico
 roboplan_ros_cpp:
   tag: release/rolling/roboplan_ros_cpp/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
@@ -422,6 +427,33 @@ roboplan_ros_visualization:
   tag: release/rolling/roboplan_ros_visualization/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
   version: 0.6.1
+rosidl_typesupport_microxrcedds_c:
+  # Fork branch (PR micro-ROS/rosidl_typesupport_microxrcedds#83, open) --
+  # fixes ament_cmake_ros_core dependency/CMake export-set wiring (same as
+  # the old local patch, now upstreamed here instead) plus the missing C++
+  # service/action Event-message typesupport (see the _cpp entry below for
+  # why that one matters; this C-side package doesn't need it, its own
+  # generator already handled Event messages correctly).
+  rev: 8e69408bb799853cae12272acaed113e7ca347ec
+  url: https://github.com/Tobias-Fischer/rosidl_typesupport_microxrcedds.git
+  version: 6.0.0
+  additional_folder: rosidl_typesupport_microxrcedds_c
+rosidl_typesupport_microxrcedds_cpp:
+  # Same fork/PR as the C entry above. The Event-message fix here is load-
+  # bearing: rosidl_typesupport_cpp's dispatch code always calls
+  # get_message_type_support_handle<...Event>() for every service/action,
+  # and this backend's C++ generator never emitted that overload -- any
+  # service-bearing package (action_msgs, and everything that depends on
+  # it, which is nearly everything via rosidl_default_generators) failed
+  # to compile with "use of undeclared identifier
+  # ..._get_message_type_support_handle__action_msgs__srv__CancelGoal_Event"
+  # as soon as this backend was forced as the sole C++ typesupport
+  # (VINCA_EMSCRIPTEN_STATIC_TYPESUPPORT_CPP, required for rmw_zenoh_pico
+  # compatibility -- see build-emscripten task's own comment).
+  rev: 8e69408bb799853cae12272acaed113e7ca347ec
+  url: https://github.com/Tobias-Fischer/rosidl_typesupport_microxrcedds.git
+  version: 6.0.0
+  additional_folder: rosidl_typesupport_microxrcedds_cpp
 rqt_mocap4r2_control:
   tag: 0.0.7
   url: https://github.com/MOCAP4ROS2-Project/mocap4r2.git
@@ -435,3 +467,9 @@ rviz_visual_tools:  # temp addition
   tag: release/rolling/rviz_visual_tools/4.1.4-4
   url: https://github.com/ros2-gbp/rviz_visual_tools-release
   version: 4.1.4
+
+# zenoh-pico wasm32 RMW experiment (rmw_zenoh_pico + its microxrcedds
+# typesupport chain). Not part of the official rosdistro -- pinned by git
+# rev. zenoh-pico and microcdr are plain CMake C libraries with no
+# package.xml at all, so they're hand-written recipes under extra_recipes/
+# instead of being listed here.
diff --git a/rosdistro_snapshot.yaml b/rosdistro_snapshot.yaml
index fab9643ad..a2cea4b27 100644
--- a/rosdistro_snapshot.yaml
+++ b/rosdistro_snapshot.yaml
@@ -1,6341 +1,22988 @@
-# Snapshot generated by vinca-snapshot on 2026-08-24T12:02:07Z UTC for distro rolling
+# Snapshot generated by vinca-snapshot on 2026-09-11T11:21:57Z UTC for distro rolling
 acado_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  repository: https://gitlab.com/autowarefoundation/autoware.auto/acado_vendor
   tag: release/rolling/acado_vendor/1.0.0-7
   url: https://github.com/ros2-gbp/acado_vendor-release.git
   version: 1.0.0
 ackermann_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/ackermann_msgs
   tag: release/rolling/ackermann_msgs/2.0.2-6
   url: https://github.com/ros2-gbp/ackermann_msgs-release.git
   version: 2.0.2
 ackermann_nlmpc:
+  dependencies:
+  - ackermann_msgs
+  - ackermann_nlmpc_msgs
+  - ament_pep257
+  - geometry_msgs
+  - nav_msgs
+  - std_msgs
+  repository: https://git.ime.uni-luebeck.de/public-projects/asl/ackermann_nlmpc
   tag: release/rolling/ackermann_nlmpc/1.0.3-2
   url: https://github.com/ros2-gbp/ackmerann_nlmpc-release.git
   version: 1.0.3
 ackermann_nlmpc_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://git.ime.uni-luebeck.de/public-projects/asl/ackermann_nlmpc
   tag: release/rolling/ackermann_nlmpc_msgs/1.0.3-2
   url: https://github.com/ros2-gbp/ackmerann_nlmpc-release.git
   version: 1.0.3
 ackermann_steering_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  - steering_controllers_library
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/ackermann_steering_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 action_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_core_generators
+  - rosidl_core_runtime
+  - service_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/action_msgs/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 action_tutorials_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  repository: https://github.com/ros2/demos
   tag: release/rolling/action_tutorials_cpp/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 action_tutorials_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  repository: https://github.com/ros2/demos
   tag: release/rolling/action_tutorials_py/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 actuator_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/rudislabs/actuator_msgs
   tag: release/rolling/actuator_msgs/0.0.1-4
   url: https://github.com/ros2-gbp/actuator_msgs-release.git
   version: 0.0.1
 admittance_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - angles
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - hardware_interface_testing
+  - kinematics_interface
+  - kinematics_interface_kdl
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_kdl
+  - tf2_ros
+  - trajectory_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/admittance_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 agni_tf_tools:
+  dependencies:
+  - ament_cmake
+  - angles
+  - geometry_msgs
+  - interactive_markers
+  - pluginlib
+  - rclcpp
+  - rviz_common
+  - rviz_default_plugins
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/ubi-agni/agni_tf_tools
   tag: release/rolling/agni_tf_tools/1.0.2-1
   url: https://github.com/ros2-gbp/agni_tf_tools-release.git
   version: 1.0.2
 ament_acceleration:
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ros-acceleration/ament_acceleration
   tag: release/rolling/ament_acceleration/0.2.0-5
   url: https://github.com/ros2-gbp/ament_acceleration-release.git
   version: 0.2.0
 ament_black:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/botsandus/ament_black
   tag: release/rolling/ament_black/0.2.7-1
   url: https://github.com/ros2-gbp/ament_black-release.git
   version: 0.2.7
 ament_clang_format:
-  tag: release/rolling/ament_clang_format/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_clang_format/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_clang_tidy:
-  tag: release/rolling/ament_clang_tidy/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_clang_tidy/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake:
-  tag: release/rolling/ament_cmake/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_export_definitions
+  - ament_cmake_export_dependencies
+  - ament_cmake_export_include_directories
+  - ament_cmake_export_libraries
+  - ament_cmake_export_link_flags
+  - ament_cmake_export_targets
+  - ament_cmake_gen_version_h
+  - ament_cmake_libraries
+  - ament_cmake_python
+  - ament_cmake_target_dependencies
+  - ament_cmake_test
+  - ament_cmake_version
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_auto:
-  tag: release/rolling/ament_cmake_auto/2.9.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_auto/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_black:
+  dependencies:
+  - ament_black
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_xmllint
+  repository: https://github.com/botsandus/ament_black
   tag: release/rolling/ament_cmake_black/0.2.7-1
   url: https://github.com/ros2-gbp/ament_black-release.git
   version: 0.2.7
 ament_cmake_catch2:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_test
+  repository: https://github.com/open-rmf/ament_cmake_catch2
   tag: release/rolling/ament_cmake_catch2/1.5.0-2
   url: https://github.com/ros2-gbp/ament_cmake_catch2-release.git
   version: 1.5.0
 ament_cmake_clang_format:
-  tag: release/rolling/ament_cmake_clang_format/0.21.1-1
+  dependencies:
+  - ament_clang_format
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_clang_format/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_clang_tidy:
-  tag: release/rolling/ament_cmake_clang_tidy/0.21.1-1
+  dependencies:
+  - ament_clang_tidy
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_clang_tidy/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_copyright:
-  tag: release/rolling/ament_cmake_copyright/0.21.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_copyright
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_copyright/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_core:
-  tag: release/rolling/ament_cmake_core/2.9.1-1
+  dependencies:
+  - ament_package
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_core/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_cppcheck:
-  tag: release/rolling/ament_cmake_cppcheck/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cppcheck
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_cppcheck/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_cpplint:
-  tag: release/rolling/ament_cmake_cpplint/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cpplint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_cpplint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_export_definitions:
-  tag: release/rolling/ament_cmake_export_definitions/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_export_definitions/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_export_dependencies:
-  tag: release/rolling/ament_cmake_export_dependencies/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_libraries
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_export_dependencies/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_export_include_directories:
-  tag: release/rolling/ament_cmake_export_include_directories/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_export_include_directories/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_export_libraries:
-  tag: release/rolling/ament_cmake_export_libraries/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_export_libraries/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_export_link_flags:
-  tag: release/rolling/ament_cmake_export_link_flags/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_export_link_flags/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_export_targets:
-  tag: release/rolling/ament_cmake_export_targets/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_export_libraries
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_export_targets/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_flake8:
-  tag: release/rolling/ament_cmake_flake8/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_flake8
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_flake8/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_gen_version_h:
-  tag: release/rolling/ament_cmake_gen_version_h/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_gtest
+  - ament_package
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_gen_version_h/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_gmock:
-  tag: release/rolling/ament_cmake_gmock/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_gtest
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_gmock/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_google_benchmark:
-  tag: release/rolling/ament_cmake_google_benchmark/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_export_dependencies
+  - ament_cmake_python
+  - ament_cmake_test
+  - google_benchmark_vendor
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_google_benchmark/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_gtest:
-  tag: release/rolling/ament_cmake_gtest/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_gtest/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_include_directories:
-  tag: release/rolling/ament_cmake_include_directories/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_include_directories/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_libraries:
-  tag: release/rolling/ament_cmake_libraries/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_libraries/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_lint_cmake:
-  tag: release/rolling/ament_cmake_lint_cmake/0.21.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_test
+  - ament_lint_cmake
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_lint_cmake/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_mypy:
-  tag: release/rolling/ament_cmake_mypy/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_mypy
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_mypy/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_pclint:
-  tag: release/rolling/ament_cmake_pclint/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_pclint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_pclint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_pep257:
-  tag: release/rolling/ament_cmake_pep257/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_pep257
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_pep257/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_pycodestyle:
-  tag: release/rolling/ament_cmake_pycodestyle/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_pycodestyle
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_pycodestyle/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_pyflakes:
-  tag: release/rolling/ament_cmake_pyflakes/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_pyflakes
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_pyflakes/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_pytest:
-  tag: release/rolling/ament_cmake_pytest/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_pytest/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_python:
-  tag: release/rolling/ament_cmake_python/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_python/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rmw_test_fixture_implementation
+  repository: https://github.com/ros2/ament_cmake_ros
   tag: release/rolling/ament_cmake_ros/0.16.0-1
   url: https://github.com/ros2-gbp/ament_cmake_ros-release.git
   version: 0.16.0
 ament_cmake_ros_core:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_export_dependencies
+  - ament_cmake_export_targets
+  - ament_cmake_libraries
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/ament_cmake_ros
   tag: release/rolling/ament_cmake_ros_core/0.16.0-1
   url: https://github.com/ros2-gbp/ament_cmake_ros-release.git
   version: 0.16.0
 ament_cmake_target_dependencies:
-  tag: release/rolling/ament_cmake_target_dependencies/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_include_directories
+  - ament_cmake_libraries
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_target_dependencies/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_test:
-  tag: release/rolling/ament_cmake_test/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_python
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_test/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_uncrustify:
-  tag: release/rolling/ament_cmake_uncrustify/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_uncrustify
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_uncrustify/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cmake_vendor_package:
-  tag: release/rolling/ament_cmake_vendor_package/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_export_dependencies
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_vendor_package/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_version:
-  tag: release/rolling/ament_cmake_version/2.9.1-1
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ament/ament_cmake
+  tag: release/rolling/ament_cmake_version/2.9.2-1
   url: https://github.com/ros2-gbp/ament_cmake-release.git
-  version: 2.9.1
+  version: 2.9.2
 ament_cmake_xmllint:
-  tag: release/rolling/ament_cmake_xmllint/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cmake_xmllint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_copyright:
-  tag: release/rolling/ament_copyright/0.21.1-1
+  dependencies:
+  - ament_flake8
+  - ament_lint
+  - ament_pep257
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_copyright/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cppcheck:
-  tag: release/rolling/ament_cppcheck/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_pycodestyle
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cppcheck/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_cpplint:
-  tag: release/rolling/ament_cpplint/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_cpplint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_download:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/samsung-ros/ament_download
   tag: release/rolling/ament_download/0.0.5-6
   url: https://github.com/ros2-gbp/ament_download-release.git
   version: 0.0.5
 ament_flake8:
-  tag: release/rolling/ament_flake8/0.21.1-1
+  dependencies:
+  - ament_lint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_flake8/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_index_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ament/ament_index
   tag: release/rolling/ament_index_cpp/1.14.2-1
   url: https://github.com/ros2-gbp/ament_index-release.git
   version: 1.14.2
 ament_index_python:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ament/ament_index
   tag: release/rolling/ament_index_python/1.14.2-1
   url: https://github.com/ros2-gbp/ament_index-release.git
   version: 1.14.2
 ament_lint:
-  tag: release/rolling/ament_lint/0.21.1-1
+  dependencies: []
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_lint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_lint_auto:
-  tag: release/rolling/ament_lint_auto/0.21.1-1
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_test
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_lint_auto/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_lint_cmake:
-  tag: release/rolling/ament_lint_cmake/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_lint_cmake/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_lint_common:
-  tag: release/rolling/ament_lint_common/0.21.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_export_dependencies
+  - ament_cmake_flake8
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_lint_common/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_mypy:
-  tag: release/rolling/ament_mypy/0.21.1-1
+  dependencies:
+  - ament_flake8
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_mypy/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_nodl:
-  tag: release/rolling/ament_nodl/0.1.0-7
-  url: https://github.com/ros2-gbp/ament_nodl-release.git
-  version: 0.1.0
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - ros2nodl
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/ament_nodl/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
 ament_package:
+  dependencies: []
+  repository: https://github.com/ament/ament_package
   tag: release/rolling/ament_package/0.19.1-1
   url: https://github.com/ros2-gbp/ament_package-release.git
   version: 0.19.1
 ament_pclint:
-  tag: release/rolling/ament_pclint/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_pclint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_pep257:
-  tag: release/rolling/ament_pep257/0.21.1-1
+  dependencies:
+  - ament_flake8
+  - ament_lint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_pep257/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_pycodestyle:
-  tag: release/rolling/ament_pycodestyle/0.21.1-1
+  dependencies:
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_pycodestyle/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_pyflakes:
-  tag: release/rolling/ament_pyflakes/0.21.1-1
+  dependencies:
+  - ament_pycodestyle
+  - ament_xmllint
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_pyflakes/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_uncrustify:
-  tag: release/rolling/ament_uncrustify/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_pycodestyle
+  - ament_xmllint
+  - uncrustify_vendor
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_uncrustify/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 ament_vitis:
+  dependencies:
+  - ament_acceleration
+  - ament_cmake_core
+  - ament_cmake_ros
+  repository: https://github.com/ros-acceleration/ament_vitis
   tag: release/rolling/ament_vitis/0.10.1-5
   url: https://github.com/ros2-gbp/ament_vitis-release.git
   version: 0.10.1
 ament_xmllint:
-  tag: release/rolling/ament_xmllint/0.21.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_lint
+  - ament_pep257
+  repository: https://github.com/ament/ament_lint
+  tag: release/rolling/ament_xmllint/0.21.2-1
   url: https://github.com/ros2-gbp/ament_lint-release.git
-  version: 0.21.1
+  version: 0.21.2
 angles:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  repository: https://github.com/ros/angles
   tag: release/rolling/angles/1.16.1-2
   url: https://github.com/ros2-gbp/angles-release.git
   version: 1.16.1
 apex_test_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_cmake_pclint
+  - ament_lint_auto
+  - ament_lint_common
+  - osrf_testing_tools_cpp
+  repository: https://gitlab.com/ApexAI/apex_test_tools
   tag: release/rolling/apex_test_tools/0.0.2-9
   url: https://github.com/ros2-gbp/apex_test_tools-release.git
   version: 0.0.2
 apriltag:
+  dependencies: []
+  repository: https://github.com/AprilRobotics/apriltag
   tag: release/rolling/apriltag/3.4.5-2
   url: https://github.com/ros2-gbp/apriltag-release.git
   version: 3.4.5
 apriltag_detector:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_lint_auto
+  - ament_lint_common
+  - apriltag_msgs
+  - cv_bridge
+  - image_transport
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  repository: https://github.com/ros-misc-utilities/apriltag_detector
   tag: release/rolling/apriltag_detector/3.0.4-2
   url: https://github.com/ros2-gbp/apriltag_detector-release.git
   version: 3.0.4
 apriltag_detector_mit:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - apriltag_detector
+  - apriltag_mit
+  - apriltag_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  repository: https://github.com/ros-misc-utilities/apriltag_detector
   tag: release/rolling/apriltag_detector_mit/3.0.4-2
   url: https://github.com/ros2-gbp/apriltag_detector-release.git
   version: 3.0.4
 apriltag_detector_umich:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - apriltag
+  - apriltag_detector
+  - apriltag_msgs
+  - pluginlib
+  - rclcpp
+  - ros_environment
+  - sensor_msgs
+  repository: https://github.com/ros-misc-utilities/apriltag_detector
   tag: release/rolling/apriltag_detector_umich/3.0.4-2
   url: https://github.com/ros2-gbp/apriltag_detector-release.git
   version: 3.0.4
 apriltag_draw:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_lint_auto
+  - ament_lint_common
+  - apriltag_msgs
+  - cv_bridge
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  repository: https://github.com/ros-misc-utilities/apriltag_detector
   tag: release/rolling/apriltag_draw/3.0.4-2
   url: https://github.com/ros2-gbp/apriltag_detector-release.git
   version: 3.0.4
 apriltag_mit:
+  dependencies: []
+  repository: https://github.com/ros-misc-utilities/apriltag_mit
   tag: release/rolling/apriltag_mit/1.0.3-2
   url: https://github.com/ros2-gbp/apriltag_mit-release.git
   version: 1.0.3
 apriltag_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/christianrauch/apriltag_msgs
   tag: release/rolling/apriltag_msgs/2.0.2-1
   url: https://github.com/ros2-gbp/apriltag_msgs-release.git
   version: 2.0.2
 apriltag_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_cppcheck
+  - ament_lint_auto
+  - apriltag
+  - apriltag_msgs
+  - camera_ros
+  - cv_bridge
+  - image_proc
+  - image_transport
+  - image_transport_plugins
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2_ros
+  repository: https://github.com/christianrauch/apriltag_ros
   tag: release/rolling/apriltag_ros/3.4.0-1
   url: https://github.com/ros2-gbp/apriltag_ros-release.git
   version: 3.4.0
 apriltag_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_lint_auto
+  - ament_lint_common
+  - apriltag_detector
+  - apriltag_draw
+  - apriltag_msgs
+  - rclcpp
+  - ros_environment
+  - rosbag2_transport
+  repository: https://github.com/ros-misc-utilities/apriltag_detector
   tag: release/rolling/apriltag_tools/3.0.4-2
   url: https://github.com/ros2-gbp/apriltag_detector-release.git
   version: 3.0.4
 ardrone_sdk:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/vtalpaert/ardrone-ros2
   tag: release/rolling/ardrone_sdk/2.0.3-2
   url: https://github.com/ros2-gbp/ardrone_ros-release.git
   version: 2.0.3
 ardrone_sumo:
+  dependencies:
+  - ament_cmake
+  - ardrone_sdk
+  - cv_bridge
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/vtalpaert/ardrone-ros2
   tag: release/rolling/ardrone_sumo/2.0.3-2
   url: https://github.com/ros2-gbp/ardrone_ros-release.git
   version: 2.0.3
 aruco:
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  repository: https://github.com/pal-robotics/aruco_ros
   tag: release/rolling/aruco/5.0.5-2
   url: https://github.com/ros2-gbp/aruco_ros-release.git
   version: 5.0.5
 aruco_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/pal-robotics/aruco_ros
   tag: release/rolling/aruco_msgs/5.0.5-2
   url: https://github.com/ros2-gbp/aruco_ros-release.git
   version: 5.0.5
 aruco_opencv:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cpplint
+  - ament_cmake_lint_cmake
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - aruco_opencv_msgs
+  - cv_bridge
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/fictionlab/ros_aruco_opencv
   tag: release/rolling/aruco_opencv/7.0.0-1
   url: https://github.com/ros2-gbp/aruco_opencv-release.git
   version: 7.0.0
 aruco_opencv_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_lint_auto
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/fictionlab/ros_aruco_opencv
   tag: release/rolling/aruco_opencv_msgs/7.0.0-1
   url: https://github.com/ros2-gbp/aruco_opencv-release.git
   version: 7.0.0
 aruco_ros:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - aruco
+  - aruco_msgs
+  - cv_bridge
+  - geometry_msgs
+  - image_transport
+  - rclcpp
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/pal-robotics/aruco_ros
   tag: release/rolling/aruco_ros/5.0.5-2
   url: https://github.com/ros2-gbp/aruco_ros-release.git
   version: 5.0.5
 asio_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-drivers/transport_drivers
   tag: release/rolling/asio_cmake_module/1.2.0-4
   url: https://github.com/ros2-gbp/transport_drivers-release.git
   version: 1.2.0
 async_web_server_cpp:
+  dependencies:
+  - ament_cmake_ros
+  - launch_testing
+  repository: https://github.com/fkie/async_web_server_cpp
   tag: release/rolling/async_web_server_cpp/2.0.2-1
   url: https://github.com/ros2-gbp/async_web_server_cpp-release.git
   version: 2.0.2
 at_sonde_ros_driver:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/ma-shangao/at_sonde_ros_driver
   tag: release/rolling/at_sonde_ros_driver/1.0.0-2
   url: https://github.com/ros2-gbp/at_sonde_ros_driver-release.git
   version: 1.0.0
 audio_capture:
+  dependencies:
+  - ament_cmake
+  - audio_common_msgs
+  - diagnostic_updater
+  - launch_xml
+  - rclcpp
+  - rclcpp_components
+  repository: https://github.com/ros-drivers/audio_common
   tag: release/rolling/audio_capture/0.4.0-2
   url: https://github.com/ros2-gbp/audio_common-release.git
   version: 0.4.0
 audio_common:
+  dependencies:
+  - ament_cmake
+  - audio_capture
+  - audio_common_msgs
+  - audio_play
+  - sound_play
+  - sound_play_msgs
+  repository: https://github.com/ros-drivers/audio_common
   tag: release/rolling/audio_common/0.4.0-2
   url: https://github.com/ros2-gbp/audio_common-release.git
   version: 0.4.0
 audio_common_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/audio_common
   tag: release/rolling/audio_common_msgs/0.4.0-2
   url: https://github.com/ros2-gbp/audio_common-release.git
   version: 0.4.0
 audio_play:
+  dependencies:
+  - ament_cmake
+  - audio_common_msgs
+  - launch_xml
+  - rclcpp
+  - rclcpp_components
+  repository: https://github.com/ros-drivers/audio_common
   tag: release/rolling/audio_play/0.4.0-2
   url: https://github.com/ros2-gbp/audio_common-release.git
   version: 0.4.0
 auto_apms_behavior_tree:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_python
+  - auto_apms_behavior_tree_core
+  - auto_apms_interfaces
+  - auto_apms_util
+  - generate_parameter_library
+  - geometry_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rclpy
+  - ros2cli
+  - ros2param
+  - std_srvs
+  - tf2_geometry_msgs
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_behavior_tree/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 auto_apms_behavior_tree_core:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_index_cpp
+  - ament_index_python
+  - auto_apms_util
+  - behaviortree_cpp
+  - example_interfaces
+  - rclcpp
+  - rclcpp_action
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_behavior_tree_core/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 auto_apms_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - auto_apms_behavior_tree
+  - auto_apms_interfaces
+  - auto_apms_mission
+  - auto_apms_ros2behavior
+  - auto_apms_util
+  - rclcpp_components
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_examples/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 auto_apms_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - rosidl_default_generators
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_interfaces/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 auto_apms_mission:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - auto_apms_behavior_tree
+  - auto_apms_util
+  - rclcpp_components
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_mission/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 auto_apms_ros2behavior:
+  dependencies:
+  - ament_copyright
+  - ament_index_python
+  - auto_apms_behavior_tree
+  - auto_apms_interfaces
+  - rcl_interfaces
+  - rclpy
+  - ros2cli
+  - ros2param
+  - ros2run
+  - std_srvs
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_ros2behavior/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 auto_apms_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_index_cpp
+  - ament_index_python
+  - auto_apms_interfaces
+  - generate_parameter_library
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rcpputils
+  - yaml_cpp_vendor
+  repository: https://github.com/AutoAPMS/auto-apms
   tag: release/rolling/auto_apms_util/1.5.1-2
   url: https://github.com/ros2-gbp/autoapms-release.git
   version: 1.5.1
 automatika_embodied_agents:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - automatika_ros_sugar
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/automatika-robotics/ros-agents
   tag: release/rolling/automatika_embodied_agents/0.7.4-1
   url: https://github.com/ros2-gbp/automatika_embodied_agents-release.git
   version: 0.7.4
 automatika_ros_sugar:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_python
+  - ament_lint_auto
+  - builtin_interfaces
+  - geometry_msgs
+  - launch
+  - launch_testing
+  - lifecycle_msgs
+  - nav_msgs
+  - rclcpp
+  - rclpy
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - tf2_ros
+  repository: https://github.com/automatika-robotics/ros-sugar
   tag: release/rolling/automatika_ros_sugar/0.7.1-1
   url: https://github.com/ros2-gbp/automatika_ros_sugar-release.git
   version: 0.7.1
 automotive_autonomy_msgs:
+  dependencies:
+  - ament_cmake
+  - automotive_navigation_msgs
+  - automotive_platform_msgs
+  - ros_environment
+  repository: https://github.com/astuff/automotive_autonomy_msgs
   tag: release/rolling/automotive_autonomy_msgs/3.0.4-6
   url: https://github.com/ros2-gbp/automotive_autonomy_msgs-release.git
   version: 3.0.4
 automotive_navigation_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/automotive_autonomy_msgs
   tag: release/rolling/automotive_navigation_msgs/3.0.4-6
   url: https://github.com/ros2-gbp/automotive_autonomy_msgs-release.git
   version: 3.0.4
 automotive_platform_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/automotive_autonomy_msgs
   tag: release/rolling/automotive_platform_msgs/3.0.4-6
   url: https://github.com/ros2-gbp/automotive_autonomy_msgs-release.git
   version: 3.0.4
 autoware_adapi_v1_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geographic_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - shape_msgs
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_adapi_msgs
   tag: release/rolling/autoware_adapi_v1_msgs/1.9.1-1
   url: https://github.com/ros2-gbp/autoware_adapi_msgs-release.git
   version: 1.9.1
 autoware_adapi_version_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/autowarefoundation/autoware_adapi_msgs
   tag: release/rolling/autoware_adapi_version_msgs/1.9.1-1
   url: https://github.com/ros2-gbp/autoware_adapi_msgs-release.git
   version: 1.9.1
 autoware_auto_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://gitlab.com/autowarefoundation/autoware.auto/autoware_auto_msgs
   tag: release/rolling/autoware_auto_msgs/1.0.0-7
   url: https://github.com/ros2-gbp/autoware_auto_msgs-release.git
   version: 1.0.0
 autoware_cmake:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_lint_common
+  - ros_environment
+  repository: https://github.com/autowarefoundation/autoware_cmake
   tag: release/rolling/autoware_cmake/1.4.0-1
   url: https://github.com/ros2-gbp/autoware_cmake-release.git
   version: 1.4.0
 autoware_common_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_common_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_control_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_control_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_internal_debug_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_internal_msgs
   tag: release/rolling/autoware_internal_debug_msgs/1.12.1-2
   url: https://github.com/ros2-gbp/autoware_internal_msgs-release.git
   version: 1.12.1
 autoware_internal_localization_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_common_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_internal_msgs
   tag: release/rolling/autoware_internal_localization_msgs/1.12.1-2
   url: https://github.com/ros2-gbp/autoware_internal_msgs-release.git
   version: 1.12.1
 autoware_internal_metric_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/autowarefoundation/autoware_internal_msgs
   tag: release/rolling/autoware_internal_metric_msgs/1.12.1-2
   url: https://github.com/ros2-gbp/autoware_internal_msgs-release.git
   version: 1.12.1
 autoware_internal_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_internal_debug_msgs
+  - autoware_internal_metric_msgs
+  - autoware_internal_perception_msgs
+  - autoware_internal_planning_msgs
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_internal_msgs
   tag: release/rolling/autoware_internal_msgs/1.12.1-2
   url: https://github.com/ros2-gbp/autoware_internal_msgs-release.git
   version: 1.12.1
 autoware_internal_perception_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_perception_msgs
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_internal_msgs
   tag: release/rolling/autoware_internal_perception_msgs/1.12.1-2
   url: https://github.com/ros2-gbp/autoware_internal_msgs-release.git
   version: 1.12.1
 autoware_internal_planning_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_common_msgs
+  - autoware_perception_msgs
+  - autoware_planning_msgs
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_internal_msgs
   tag: release/rolling/autoware_internal_planning_msgs/1.12.1-2
   url: https://github.com/ros2-gbp/autoware_internal_msgs-release.git
   version: 1.12.1
 autoware_lanelet2_extension:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_ros
+  - autoware_cmake
+  - autoware_map_msgs
+  - autoware_planning_msgs
+  - geometry_msgs
+  - lanelet2_core
+  - lanelet2_io
+  - lanelet2_maps
+  - lanelet2_projection
+  - lanelet2_routing
+  - lanelet2_traffic_rules
+  - lanelet2_validation
+  - rclcpp
+  - tf2
+  - tf2_geometry_msgs
+  - visualization_msgs
+  repository: https://github.com/autowarefoundation/autoware_lanelet2_extension
   tag: release/rolling/autoware_lanelet2_extension/1.1.0-1
   url: https://github.com/ros2-gbp/autoware_lanelet2_extension-release.git
   version: 1.1.0
 autoware_lanelet2_extension_python:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_ros
+  - autoware_cmake
+  - autoware_lanelet2_extension
+  - geometry_msgs
+  - lanelet2_core
+  - lanelet2_io
+  - lanelet2_projection
+  - lanelet2_python
+  - lanelet2_routing
+  - lanelet2_traffic_rules
+  - lanelet2_validation
+  - python_cmake_module
+  - rclcpp
+  repository: https://github.com/autowarefoundation/autoware_lanelet2_extension
   tag: release/rolling/autoware_lanelet2_extension_python/1.1.0-1
   url: https://github.com/ros2-gbp/autoware_lanelet2_extension-release.git
   version: 1.1.0
 autoware_lint_common:
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_cppcheck
+  - ament_cmake_export_dependencies
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_xmllint
+  repository: https://github.com/autowarefoundation/autoware_cmake
   tag: release/rolling/autoware_lint_common/1.4.0-1
   url: https://github.com/ros2-gbp/autoware_cmake-release.git
   version: 1.4.0
 autoware_localization_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_common_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_localization_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_map_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - geographic_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_map_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_msgs:
+  dependencies:
+  - ament_cmake
+  - autoware_common_msgs
+  - autoware_control_msgs
+  - autoware_localization_msgs
+  - autoware_map_msgs
+  - autoware_perception_msgs
+  - autoware_planning_msgs
+  - autoware_sensing_msgs
+  - autoware_simulation_msgs
+  - autoware_system_msgs
+  - autoware_v2x_msgs
+  - autoware_vehicle_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_perception_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_perception_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_planning_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_common_msgs
+  - builtin_interfaces
+  - geometry_msgs
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_planning_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_sensing_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_sensing_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_simulation_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_perception_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_simulation_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_system_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_common_msgs
+  - builtin_interfaces
+  - diagnostic_msgs
+  - geometry_msgs
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_system_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_utils:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_internal_debug_msgs
+  - autoware_internal_msgs
+  - autoware_internal_planning_msgs
+  - autoware_lint_common
+  - autoware_perception_msgs
+  - autoware_planning_msgs
+  - autoware_utils_debug
+  - autoware_utils_diagnostics
+  - autoware_utils_geometry
+  - autoware_utils_logging
+  - autoware_utils_math
+  - autoware_utils_pcl
+  - autoware_utils_rclcpp
+  - autoware_utils_system
+  - autoware_utils_tf
+  - autoware_utils_uuid
+  - autoware_utils_visualization
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_debug:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_ros
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_internal_debug_msgs
+  - autoware_internal_msgs
+  - autoware_lint_common
+  - autoware_utils_system
+  - diagnostic_msgs
+  - rclcpp
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_debug/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_diagnostics:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_ros
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - diagnostic_msgs
+  - diagnostic_updater
+  - rclcpp
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_diagnostics/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_geometry:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_internal_planning_msgs
+  - autoware_lint_common
+  - autoware_utils_math
+  - autoware_utils_system
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_geometry/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_logging:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_ros
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - logging_demo
+  - rclcpp
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_logging/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_math:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_math/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_pcl:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - autoware_utils_tf
+  - pcl_conversions
+  - pcl_ros
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_pcl/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_rclcpp:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_rclcpp/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_system:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - rclcpp
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_system/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_tf:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_ros
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - autoware_utils_geometry
+  - geometry_msgs
+  - rclcpp
+  - tf2_ros
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_tf/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_uuid:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - unique_identifier_msgs
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_uuid/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_utils_visualization:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - autoware_cmake
+  - autoware_lint_common
+  - rclcpp
+  - visualization_msgs
+  repository: https://github.com/autowarefoundation/autoware_utils
   tag: release/rolling/autoware_utils_visualization/1.7.2-1
   url: https://github.com/ros2-gbp/autoware_utils-release.git
   version: 1.7.2
 autoware_v2x_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_v2x_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 autoware_vehicle_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - autoware_planning_msgs
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/autowarefoundation/autoware_msgs
   tag: release/rolling/autoware_vehicle_msgs/1.12.0-1
   url: https://github.com/ros2-gbp/autoware_msgs-release.git
   version: 1.12.0
 avt_vimba_camera:
+  dependencies:
+  - ament_cmake_auto
+  - camera_info_manager
+  - diagnostic_msgs
+  - diagnostic_updater
+  - image_proc
+  - image_transport
+  - message_filters
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - stereo_image_proc
+  repository: https://github.com/astuff/avt_vimba_camera
   tag: release/rolling/avt_vimba_camera/2001.1.0-6
   url: https://github.com/ros2-gbp/avt_vimba_camera-release.git
   version: 2001.1.0
 aws_sdk_cpp_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/wep21/aws_sdk_cpp_vendor
   tag: release/rolling/aws_sdk_cpp_vendor/0.2.1-3
   url: https://github.com/ros2-gbp/aws_sdk_cpp_vendor-release.git
   version: 0.2.1
 backward_ros:
+  dependencies: []
+  repository: https://github.com/pal-robotics/backward_ros
   tag: release/rolling/backward_ros/1.0.8-4
   url: https://github.com/ros2-gbp/backward_ros-release.git
   version: 1.0.8
 bag2_to_image:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rosbag2_cpp
+  - rosbag2_storage
+  - sensor_msgs
+  repository: https://github.com/wep21/bag2_to_image
   tag: release/rolling/bag2_to_image/0.1.2-2
   url: https://github.com/ros2-gbp/bag2_to_image-release.git
   version: 0.1.2
 battery_state_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/battery_state_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 battery_state_rviz_overlay:
+  dependencies:
+  - ament_cmake
+  - rclcpp
+  - rviz_2d_overlay_msgs
+  - sensor_msgs
+  repository: https://github.com/ipa320/ros_battery_monitoring
   tag: release/rolling/battery_state_rviz_overlay/1.2.0-2
   url: https://github.com/ros2-gbp/ros_battery_monitoring-release.git
   version: 1.2.0
 behaviortree_cpp:
-  tag: release/rolling/behaviortree_cpp/4.10.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - rclcpp
+  - ros_environment
+  repository: https://github.com/BehaviorTree/BehaviorTree.CPP
+  tag: release/rolling/behaviortree_cpp/4.10.0-2
   url: https://github.com/ros2-gbp/behaviortree_cpp_v4-release.git
   version: 4.10.0
 bicycle_steering_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  - steering_controllers_library
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/bicycle_steering_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 bno055:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - example_interfaces
+  - rclpy
+  - std_msgs
+  repository: https://github.com/flynneva/bno055
   tag: release/rolling/bno055/0.5.0-3
   url: https://github.com/ros2-gbp/bno055-release.git
   version: 0.5.0
 bond:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros/bond_core
   tag: release/rolling/bond/4.4.0-2
   url: https://github.com/ros2-gbp/bond_core-release.git
   version: 4.4.0
 bond_core:
+  dependencies:
+  - ament_cmake
+  - bond
+  - bondcpp
+  - smclib
+  repository: https://github.com/ros/bond_core
   tag: release/rolling/bond_core/4.4.0-2
   url: https://github.com/ros2-gbp/bond_core-release.git
   version: 4.4.0
 bondcpp:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - bond
+  - rclcpp
+  - rclcpp_lifecycle
+  - smclib
+  repository: https://github.com/ros/bond_core
   tag: release/rolling/bondcpp/4.4.0-2
   url: https://github.com/ros2-gbp/bond_core-release.git
   version: 4.4.0
 bondpy:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - bond
+  - rclpy
+  - smclib
+  repository: https://github.com/ros/bond_core
   tag: release/rolling/bondpy/4.4.0-2
   url: https://github.com/ros2-gbp/bond_core-release.git
   version: 4.4.0
 boost_geometry_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_lint_auto
+  - geometry_msgs
+  - ouxt_common
+  - rclcpp
+  repository: https://github.com/OUXT-Polaris/boost_geometry_util
   tag: release/rolling/boost_geometry_util/0.0.1-5
   url: https://github.com/ros2-gbp/boost_geometry_util-release.git
   version: 0.0.1
+boost_plugin_loader:
+  dependencies:
+  - ros_industrial_cmake_boilerplate
+  repository: https://github.com/tesseract-robotics/boost_plugin_loader
+  tag: release/rolling/boost_plugin_loader/0.4.5-1
+  url: https://github.com/ros2-gbp/boost_plugin_loader-release.git
+  version: 0.4.5
 boost_sml_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/nobleo/boost_sml_vendor
   tag: release/rolling/boost_sml_vendor/1.1.13-2
   url: https://github.com/ros2-gbp/boost_sml_vendor-release.git
   version: 1.1.13
 broll:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - sensor_msgs
+  repository: https://github.com/ros-tooling/rosbag2_broll
   tag: release/rolling/broll/0.1.0-2
   url: https://github.com/ros2-gbp/rosbag2_broll-release.git
   version: 0.1.0
 builtin_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_core_generators
+  - rosidl_core_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/builtin_interfaces/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 camera_calibration:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - cv_bridge
+  - image_geometry
+  - message_filters
+  - rclpy
+  - sensor_msgs
+  - std_srvs
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/camera_calibration/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 camera_calibration_parsers:
-  tag: release/rolling/camera_calibration_parsers/7.0.3-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - sensor_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/ros-perception/image_common
+  tag: release/rolling/camera_calibration_parsers/7.0.4-1
   url: https://github.com/ros2-gbp/image_common-release.git
-  version: 7.0.3
+  version: 7.0.4
 camera_info_manager:
-  tag: release/rolling/camera_info_manager/7.0.3-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_calibration_parsers
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcpputils
+  - sensor_msgs
+  repository: https://github.com/ros-perception/image_common
+  tag: release/rolling/camera_info_manager/7.0.4-1
   url: https://github.com/ros2-gbp/image_common-release.git
-  version: 7.0.3
+  version: 7.0.4
 camera_info_manager_py:
-  tag: release/rolling/camera_info_manager_py/7.0.3-1
+  dependencies:
+  - ament_cmake_mypy
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - sensor_msgs
+  repository: https://github.com/ros-perception/image_common
+  tag: release/rolling/camera_info_manager_py/7.0.4-1
   url: https://github.com/ros2-gbp/image_common-release.git
-  version: 7.0.3
+  version: 7.0.4
 camera_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_cppcheck
+  - ament_cmake_flake8
+  - ament_cmake_lint_cmake
+  - ament_cmake_mypy
+  - ament_cmake_pep257
+  - ament_cmake_pyflakes
+  - ament_cmake_xmllint
+  - ament_index_python
+  - ament_lint_auto
+  - camera_info_manager
+  - cv_bridge
+  - diagnostic_msgs
+  - image_view
+  - libcamera
+  - rclcpp
+  - rclcpp_components
+  - ros2launch
+  - sensor_msgs
+  repository: https://github.com/christianrauch/camera_ros
   tag: release/rolling/camera_ros/0.7.0-1
   url: https://github.com/ros2-gbp/camera_ros-release.git
   version: 0.7.0
 can_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-industrial/ros_canopen
   tag: release/rolling/can_msgs/2.0.0-6
   url: https://github.com/ros2-gbp/ros_canopen-release.git
   version: 2.0.0
 canopen:
+  dependencies:
+  - ament_cmake
+  - canopen_402_driver
+  - canopen_base_driver
+  - canopen_core
+  - canopen_interfaces
+  - canopen_proxy_driver
+  - lely_core_libraries
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_402_driver:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - canopen_base_driver
+  - canopen_core
+  - canopen_interfaces
+  - canopen_proxy_driver
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_402_driver/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_base_driver:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - canopen_core
+  - canopen_interfaces
+  - diagnostic_updater
+  - lely_core_libraries
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_base_driver/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_core:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - canopen_interfaces
+  - lely_core_libraries
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - yaml_cpp_vendor
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_core/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_fake_slaves:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - lely_core_libraries
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_fake_slaves/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_interfaces/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_master_driver:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - canopen_core
+  - canopen_interfaces
+  - lely_core_libraries
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_master_driver/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_proxy_driver:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - canopen_base_driver
+  - canopen_core
+  - canopen_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_proxy_driver/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_ros2_control:
+  dependencies:
+  - ament_cmake
+  - canopen_402_driver
+  - canopen_core
+  - canopen_proxy_driver
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - ros2_control_test_assets
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_ros2_control/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_ros2_controllers:
+  dependencies:
+  - ament_cmake
+  - canopen_402_driver
+  - canopen_interfaces
+  - canopen_proxy_driver
+  - controller_interface
+  - controller_manager
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_ros2_controllers/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_tests:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - canopen_402_driver
+  - canopen_core
+  - canopen_fake_slaves
+  - canopen_proxy_driver
+  - canopen_ros2_controllers
+  - controller_manager
+  - forward_command_controller
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - lely_core_libraries
+  - robot_state_publisher
+  - xacro
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_tests/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 canopen_utils:
+  dependencies:
+  - ament_lint_auto
+  - canopen_interfaces
+  - lifecycle_msgs
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/canopen_utils/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 cartographer:
+  dependencies: []
+  repository: https://github.com/ros2/cartographer
   tag: release/rolling/cartographer/2.0.9004-2
   url: https://github.com/ros2-gbp/cartographer-release.git
   version: 2.0.9004
 cartographer_ros:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - cartographer
+  - cartographer_ros_msgs
+  - geometry_msgs
+  - launch
+  - nav_msgs
+  - pcl_conversions
+  - rclcpp
+  - robot_state_publisher
+  - ros_environment
+  - rosbag2_cpp
+  - rosbag2_storage
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_msgs
+  - tf2_ros
+  - urdf
+  - visualization_msgs
+  repository: https://github.com/ros2/cartographer_ros
   tag: release/rolling/cartographer_ros/2.0.9003-2
   url: https://github.com/ros2-gbp/cartographer_ros-release.git
   version: 2.0.9003
 cartographer_ros_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros2/cartographer_ros
   tag: release/rolling/cartographer_ros_msgs/2.0.9003-2
   url: https://github.com/ros2-gbp/cartographer_ros-release.git
   version: 2.0.9003
 cartographer_rviz:
+  dependencies:
+  - ament_cmake
+  - cartographer
+  - cartographer_ros
+  - cartographer_ros_msgs
+  - pluginlib
+  - rclcpp
+  - rviz_common
+  - rviz_ogre_vendor
+  - rviz_rendering
+  repository: https://github.com/ros2/cartographer_ros
   tag: release/rolling/cartographer_rviz/2.0.9003-2
   url: https://github.com/ros2-gbp/cartographer_ros-release.git
   version: 2.0.9003
 cascade_lifecycle_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - lifecycle_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/fmrico/cascade_lifecycle
   tag: release/rolling/cascade_lifecycle_msgs/2.0.4-2
   url: https://github.com/ros2-gbp/cascade_lifecycle-release.git
   version: 2.0.4
 catch_ros2:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - ros2launch
+  - std_srvs
+  repository: https://github.com/ngmor/catch_ros2
   tag: release/rolling/catch_ros2/0.2.3-2
   url: https://github.com/ros2-gbp/catch_ros2-release.git
   version: 0.2.3
 chained_filter_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - controller_interface
+  - controller_manager
+  - filters
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/chained_filter_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 chomp_motion_planner:
-  tag: release/rolling/chomp_motion_planner/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_common
+  - moveit_core
+  - rclcpp
+  - rsl
+  - trajectory_msgs
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/chomp_motion_planner/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 class_loader:
-  tag: release/rolling/class_loader/3.0.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - console_bridge_vendor
+  - rcpputils
+  repository: https://github.com/ros/class_loader
+  tag: release/rolling/class_loader/3.0.2-1
   url: https://github.com/ros2-gbp/class_loader-release.git
-  version: 3.0.1
+  version: 3.0.2
 classic_bags:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - builtin_interfaces
+  - rclcpp
+  - rclpy
+  - rosbag2_cpp
+  - rosbag2_py
+  - rosbag2_storage
+  - rosbag2_storage_mcap
+  - rosbag2_storage_sqlite3
+  - rosidl_runtime_py
+  - std_msgs
+  repository: https://github.com/MetroRobots/classic_bags
   tag: release/rolling/classic_bags/0.4.0-2
   url: https://github.com/ros2-gbp/classic_bags-release.git
   version: 0.4.0
 clips_executive:
+  dependencies:
+  - ament_cmake
+  - cx_ament_index_plugin
+  - cx_bringup
+  - cx_clips_env_manager
+  - cx_config_plugin
+  - cx_example_plugin
+  - cx_executive_plugin
+  - cx_file_load_plugin
+  - cx_msgs
+  - cx_plugin
+  - cx_protobuf_plugin
+  - cx_ros_comm_gen
+  - cx_ros_msgs_plugin
+  - cx_tf2_pose_tracker_plugin
+  - cx_utils
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/clips_executive/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 clips_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/carologistics/clips_vendor
   tag: release/rolling/clips_vendor/6.4.4-1
   url: https://github.com/ros2-gbp/clips_vendor-release.git
   version: 6.4.4
 cm_topic_hardware_component:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - hardware_interface
+  - pal_statistics_msgs
+  - rclcpp
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/topic_based_hardware_interfaces
   tag: release/rolling/cm_topic_hardware_component/1.1.0-1
   url: https://github.com/ros2-gbp/topic_based_hardware-release.git
   version: 1.1.0
 coal:
+  dependencies:
+  - eigenpy
+  repository: https://github.com/coal-library/coal
   tag: release/rolling/coal/3.0.3-2
   url: https://github.com/ros2-gbp/coal-release.git
   version: 3.0.3
 coin_d4_driver:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  - sensor_msgs
+  repository: https://github.com/ROBOTIS-GIT/coin_d4_driver
   tag: release/rolling/coin_d4_driver/1.0.1-2
   url: https://github.com/ros2-gbp/coin_d4_driver-release.git
   version: 1.0.1
 color_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - std_msgs
+  repository: https://github.com/MetroRobots/color_util
   tag: release/rolling/color_util/1.1.0-2
   url: https://github.com/ros2-gbp/color_util-release.git
   version: 1.1.0
 common_interfaces:
-  tag: release/rolling/common_interfaces/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - diagnostic_msgs
+  - geometry_msgs
+  - nav_msgs
+  - sensor_msgs
+  - shape_msgs
+  - std_msgs
+  - std_srvs
+  - stereo_msgs
+  - trajectory_msgs
+  - visualization_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/common_interfaces/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 compass_conversions:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - angles
+  - compass_interfaces
+  - cras_cpp_common
+  - cras_lint
+  - geometry_msgs
+  - magnetic_model
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ctu-vras/compass
   tag: release/rolling/compass_conversions/4.0.1-1
   url: https://github.com/ros2-gbp/compass-release.git
   version: 4.0.1
 compass_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - cras_cpp_common
+  - cras_lint
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ctu-vras/compass
   tag: release/rolling/compass_interfaces/4.0.1-1
   url: https://github.com/ros2-gbp/compass-release.git
   version: 4.0.1
 composition:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rmw_implementation_cmake
+  repository: https://github.com/ros2/demos
   tag: release/rolling/composition/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 composition_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rcl_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/composition_interfaces/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 compressed_depth_image_transport:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - image_transport
+  - pluginlib
+  - rcl_interfaces
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/ros-perception/image_transport_plugins
   tag: release/rolling/compressed_depth_image_transport/7.0.1-1
   url: https://github.com/ros2-gbp/image_transport_plugins-release.git
   version: 7.0.1
 compressed_image_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - image_transport
+  repository: https://github.com/ros-perception/image_transport_plugins
   tag: release/rolling/compressed_image_transport/7.0.1-1
   url: https://github.com/ros2-gbp/image_transport_plugins-release.git
   version: 7.0.1
 console_bridge_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  repository: https://github.com/ros2/console_bridge_vendor
   tag: release/rolling/console_bridge_vendor/1.10.0-1
   url: https://github.com/ros2-gbp/console_bridge_vendor-release.git
   version: 1.10.0
 control_box_rst:
+  dependencies: []
+  repository: https://github.com/rst-tu-dortmund/control_box_rst
   tag: release/rolling/control_box_rst/0.0.7-6
   url: https://github.com/ros2-gbp/control_box_rst-release.git
   version: 0.0.7
 control_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - diagnostic_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - trajectory_msgs
+  repository: https://github.com/ros-controls/control_msgs
   tag: release/rolling/control_msgs/6.10.0-1
   url: https://github.com/ros2-gbp/control_msgs-release.git
   version: 6.10.0
 control_toolbox:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - filters
+  - generate_parameter_library
+  - geometry_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcutils
+  - realtime_tools
+  - ros2_control_cmake
+  - rsl
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-controls/control_toolbox
   tag: release/rolling/control_toolbox/6.4.0-1
   url: https://github.com/ros2-gbp/control_toolbox-release.git
   version: 6.4.0
 controller_interface:
-  tag: release/rolling/controller_interface/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gmock
+  - geometry_msgs
+  - hardware_interface
+  - pal_statistics
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/controller_interface/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 controller_manager:
-  tag: release/rolling/controller_manager/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gmock
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - backward_ros
+  - controller_interface
+  - controller_manager_msgs
+  - diagnostic_msgs
+  - diagnostic_updater
+  - example_interfaces
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - libstatistics_collector
+  - lifecycle_msgs
+  - pluginlib
+  - rcl_interfaces
+  - rclcpp
+  - rclpy
+  - realtime_tools
+  - robot_state_publisher
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - ros2param
+  - ros2pkg
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/controller_manager/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 controller_manager_msgs:
-  tag: release/rolling/controller_manager_msgs/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - lifecycle_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/controller_manager_msgs/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 cras_bag_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_cmake_ros
+  - builtin_interfaces
+  - cras_lint
+  - cv_bridge
+  - rclpy
+  - rosbag2_py
+  - rosidl_runtime_py
+  - sensor_msgs
+  - tf2_msgs
+  repository: https://github.com/ctu-vras/ros-utils
   tag: release/rolling/cras_bag_tools/4.0.2-1
   url: https://github.com/ros2-gbp/cras_ros_utils-release.git
   version: 4.0.2
 cras_cpp_common:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - backward_ros
+  - builtin_interfaces
+  - cras_lint
+  - filters
+  - geometry_msgs
+  - rcl
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rmw
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - urdf
+  repository: https://github.com/ctu-vras/ros-utils
   tag: release/rolling/cras_cpp_common/4.0.2-1
   url: https://github.com/ros2-gbp/cras_ros_utils-release.git
   version: 4.0.2
 cras_lint:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_test
+  - ament_lint_common
+  repository: https://github.com/ctu-vras/ros-utils
   tag: release/rolling/cras_lint/4.0.2-1
   url: https://github.com/ros2-gbp/cras_ros_utils-release.git
   version: 4.0.2
 cras_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ctu-vras/cras_msgs
   tag: release/rolling/cras_msgs/2.0.1-2
   url: https://github.com/ros2-gbp/cras_msgs-release.git
   version: 2.0.1
 cras_topic_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - cras_cpp_common
+  - cras_lint
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  - topic_tools
+  repository: https://github.com/ctu-vras/ros-utils
   tag: release/rolling/cras_topic_tools/4.0.2-1
   url: https://github.com/ros2-gbp/cras_ros_utils-release.git
   version: 4.0.2
 crazyflie:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - crazyflie_description
+  - crazyflie_interfaces
+  - crazyflie_server_cpp
+  - geometry_msgs
+  - rclcpp
+  - rclpy
+  - sensor_msgs
+  - std_srvs
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_description:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_description/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - crazyflie_py
+  - geometry_msgs
+  - nav_msgs
+  - rclpy
+  - sensor_msgs
+  - tf2_ros
+  - tf_transformations
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_examples/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_interfaces/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - crazyflie_interfaces
+  - rclpy
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_py/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_server_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - crazyflie_interfaces
+  - geometry_msgs
+  - motion_capture_tracking_interfaces
+  - nav_msgs
+  - rclcpp
+  - ros_environment
+  - sensor_msgs
+  - std_srvs
+  - tf2_ros
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_server_cpp/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_server_py:
+  dependencies:
+  - ament_flake8
+  - ament_pep257
+  - crazyflie_interfaces
+  - geometry_msgs
+  - motion_capture_tracking_interfaces
+  - nav_msgs
+  - rcl_interfaces
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_ros
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_server_py/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crazyflie_sim:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - crazyflie_interfaces
+  - rclpy
+  repository: https://github.com/IMRCLab/crazyswarm2
   tag: release/rolling/crazyflie_sim/1.0.7-1
   url: https://github.com/ros2-gbp/crazyswarm2-release.git
   version: 1.0.7
 crocoddyl:
+  dependencies:
+  - ament_cmake
+  - eigenpy
+  - jrl_cmakemodules
+  - pinocchio
+  repository: https://github.com/loco-3d/crocoddyl
   tag: release/rolling/crocoddyl/3.2.1-1
   url: https://github.com/ros2-gbp/crocoddyl-release.git
   version: 3.2.1
 crx_kinematics:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - moveit_core
+  - pluginlib
+  - tf2_eigen
+  repository: https://github.com/danielcranston/crx_kinematics
   tag: release/rolling/crx_kinematics/1.0.0-2
   url: https://github.com/ros2-gbp/crx_kinematics-release.git
   version: 1.0.0
 cuda_buffer:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - cuda_buffer_backend_msgs
+  - rcutils
+  - rmw
+  - rosidl_buffer
+  repository: https://github.com/ros2/rosidl_buffer_backends
   tag: release/rolling/cuda_buffer/0.1.2-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends-release.git
   version: 0.1.2
 cuda_buffer_backend:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - cuda_buffer
+  - cuda_buffer_backend_msgs
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rosidl_buffer_backend
+  - rosidl_buffer_backend_registry
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_cpp
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros2/rosidl_buffer_backends
   tag: release/rolling/cuda_buffer_backend/0.1.2-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends-release.git
   version: 0.1.2
 cuda_buffer_backend_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rosidl_buffer_backends
   tag: release/rolling/cuda_buffer_backend_msgs/0.1.2-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends-release.git
   version: 0.1.2
 cudnn_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  repository: https://github.com/tier4/cudnn_cmake_module
   tag: release/rolling/cudnn_cmake_module/0.0.1-6
   url: https://github.com/ros2-gbp/cudnn_cmake_module-release.git
   version: 0.0.1
 cv_bridge:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - python_cmake_module
+  - rclcpp
+  - rcpputils
+  - sensor_msgs
+  repository: https://github.com/ros-perception/vision_opencv
   tag: release/rolling/cv_bridge/4.1.0-2
   url: https://github.com/ros2-gbp/vision_opencv-release.git
   version: 4.1.0
 cx_ament_index_plugin:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_ament_index_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_bringup:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cx_ament_index_plugin
+  - cx_clips_env_manager
+  - cx_config_plugin
+  - cx_example_plugin
+  - cx_executive_plugin
+  - cx_file_load_plugin
+  - cx_protobuf_plugin
+  - cx_ros_comm_gen
+  - cx_ros_msgs_plugin
+  - example_interfaces
+  - launch_ros
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_bringup/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_clips_env_manager:
+  dependencies:
+  - ament_cmake
+  - bond
+  - bondcpp
+  - clips_vendor
+  - cx_msgs
+  - cx_plugin
+  - lifecycle_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_clips_env_manager/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_config_plugin:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - yaml_cpp_vendor
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_config_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_example_plugin:
+  dependencies:
+  - ament_cmake
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_example_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_executive_plugin:
+  dependencies:
+  - ament_cmake
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_executive_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_file_load_plugin:
+  dependencies:
+  - ament_cmake
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_file_load_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_msgs/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_plugin:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - clips_vendor
+  - cx_utils
+  - pluginlib
+  - rclcpp_lifecycle
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_protobuf_plugin:
+  dependencies:
+  - ament_cmake
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - protobuf_comm
+  - rclcpp
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_protobuf_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_ros_comm_gen:
+  dependencies:
+  - ament_cmake
+  - ament_index_python
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rosidl_runtime_py
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_ros_comm_gen/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_ros_msgs_plugin:
+  dependencies:
+  - ament_cmake
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - rclcpp
+  - rcutils
+  - rosidl_typesupport_cpp
+  - rosidl_typesupport_introspection_cpp
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_ros_msgs_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_ros_param_plugin:
+  dependencies:
+  - ament_cmake
+  - cx_plugin
+  - cx_utils
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_ros_param_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_tf2_pose_tracker_plugin:
+  dependencies:
+  - ament_cmake
+  - clips_vendor
+  - cx_plugin
+  - cx_utils
+  - geometry_msgs
+  - pluginlib
+  - tf2_ros
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_tf2_pose_tracker_plugin/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_tutorial_agents:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cx_bringup
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_tutorial_agents/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cx_utils:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - clips_vendor
+  - rclcpp
+  repository: https://github.com/carologistics/clips_executive
   tag: release/rolling/cx_utils/0.1.3-2
   url: https://github.com/ros2-gbp/clips_executive-release.git
   version: 0.1.3
 cyclonedds:
+  dependencies:
+  - iceoryx_hoofs
+  - iceoryx_posh
+  repository: https://github.com/eclipse-cyclonedds/cyclonedds
   tag: release/rolling/cyclonedds/11.0.1-3
   url: https://github.com/ros2-gbp/cyclonedds-release.git
   version: 11.0.1
 data_tamer_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - data_tamer_msgs
+  - gtest_vendor
+  - mcap_vendor
+  - rclcpp
+  - rclcpp_lifecycle
+  repository: https://github.com/PickNikRobotics/data_tamer
   tag: release/rolling/data_tamer_cpp/1.0.3-2
   url: https://github.com/ros2-gbp/data_tamer-release.git
   version: 1.0.3
 data_tamer_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/PickNikRobotics/data_tamer
   tag: release/rolling/data_tamer_msgs/1.0.3-2
   url: https://github.com/ros2-gbp/data_tamer-release.git
   version: 1.0.3
 data_tamer_tools:
-  tag: release/rolling/data_tamer_tools/0.4.0-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_index_cpp
+  - ament_lint
+  - data_tamer_cpp
+  - data_tamer_msgs
+  - foxglove_sdk_vendor
+  - geographic_msgs
+  - geometry_msgs
+  - mcap_vendor
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - rosidl_default_generators
+  - sensor_msgs
+  - tf2_msgs
+  - visualization_msgs
+  repository: https://gitlab.com/jlack/data_tamer_tools
+  tag: release/rolling/data_tamer_tools/0.11.0-1
   url: https://github.com/ros2-gbp/data_tamer_tools-release.git
-  version: 0.4.0
+  version: 0.11.0
 delphi_esr_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/delphi_esr_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 delphi_mrr_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/delphi_mrr_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 delphi_srr_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/delphi_srr_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 demo_nodes_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - launch_xml
+  - rcl
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rcpputils
+  - rcutils
+  - rmw
+  repository: https://github.com/ros2/demos
   tag: release/rolling/demo_nodes_cpp/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 demo_nodes_cpp_native:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_components
+  - rmw_fastrtps_cpp
+  repository: https://github.com/ros2/demos
   tag: release/rolling/demo_nodes_cpp_native/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 demo_nodes_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rcl_interfaces
+  - rclpy
+  repository: https://github.com/ros2/demos
   tag: release/rolling/demo_nodes_py/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 depth_image_proc:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - cv_bridge
+  - image_geometry
+  - image_proc
+  - image_transport
+  - message_filters
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - stereo_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_ros
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/depth_image_proc/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 depthimage_to_laserscan:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - image_geometry
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-perception/depthimage_to_laserscan
   tag: release/rolling/depthimage_to_laserscan/2.5.1-3
   url: https://github.com/ros2-gbp/depthimage_to_laserscan-release.git
   version: 2.5.1
 derived_object_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - shape_msgs
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/derived_object_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 desktop:
+  dependencies:
+  - action_tutorials_cpp
+  - action_tutorials_py
+  - ament_cmake
+  - angles
+  - composition
+  - demo_nodes_cpp
+  - demo_nodes_cpp_native
+  - demo_nodes_py
+  - depthimage_to_laserscan
+  - dummy_map_server
+  - dummy_robot_bringup
+  - dummy_sensors
+  - examples_rclcpp_minimal_action_client
+  - examples_rclcpp_minimal_action_server
+  - examples_rclcpp_minimal_client
+  - examples_rclcpp_minimal_composition
+  - examples_rclcpp_minimal_publisher
+  - examples_rclcpp_minimal_service
+  - examples_rclcpp_minimal_subscriber
+  - examples_rclcpp_minimal_timer
+  - examples_rclcpp_multithreaded_executor
+  - examples_rclpy_executors
+  - examples_rclpy_minimal_action_client
+  - examples_rclpy_minimal_action_server
+  - examples_rclpy_minimal_client
+  - examples_rclpy_minimal_publisher
+  - examples_rclpy_minimal_service
+  - examples_rclpy_minimal_subscriber
+  - image_tools
+  - intra_process_demo
+  - joy
+  - lifecycle
+  - logging_demo
+  - pcl_conversions
+  - pendulum_control
+  - pendulum_msgs
+  - quality_of_service_demo_cpp
+  - quality_of_service_demo_py
+  - ros_base
+  - rqt_common_plugins
+  - rviz2
+  - rviz_default_plugins
+  - teleop_twist_joy
+  - teleop_twist_keyboard
+  - tlsf
+  - tlsf_cpp
+  - topic_monitor
+  - turtlesim
+  repository: https://github.com/ros2/variants
   tag: release/rolling/desktop/0.13.0-2
   url: https://github.com/ros2-gbp/variants-release.git
   version: 0.13.0
 desktop_full:
+  dependencies:
+  - ament_cmake
+  - desktop
+  - perception
+  - ros_gz_sim_demos
+  - simulation
+  repository: https://github.com/ros2/variants
   tag: release/rolling/desktop_full/0.13.0-2
   url: https://github.com/ros2-gbp/variants-release.git
   version: 0.13.0
 diagnostic_aggregator:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - launch_pytest
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - pluginlib
+  - rcl_interfaces
+  - rclcpp
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros/diagnostics
   tag: release/rolling/diagnostic_aggregator/4.5.7-1
   url: https://github.com/ros2-gbp/diagnostics-release.git
   version: 4.5.7
 diagnostic_common_diagnostics:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - diagnostic_updater
+  - launch_testing_ament_cmake
+  - rclpy
+  repository: https://github.com/ros/diagnostics
   tag: release/rolling/diagnostic_common_diagnostics/4.5.7-1
   url: https://github.com/ros2-gbp/diagnostics-release.git
   version: 4.5.7
 diagnostic_msgs:
-  tag: release/rolling/diagnostic_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/diagnostic_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 diagnostic_remote_logging:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - rclcpp_components
+  repository: https://github.com/ros/diagnostics
   tag: release/rolling/diagnostic_remote_logging/4.5.7-1
   url: https://github.com/ros2-gbp/diagnostics-release.git
   version: 4.5.7
 diagnostic_updater:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - launch
+  - launch_testing
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_lifecycle
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros/diagnostics
   tag: release/rolling/diagnostic_updater/4.5.7-1
   url: https://github.com/ros2-gbp/diagnostics-release.git
   version: 4.5.7
 diagnostics:
+  dependencies:
+  - ament_cmake
+  - diagnostic_aggregator
+  - diagnostic_common_diagnostics
+  - diagnostic_remote_logging
+  - diagnostic_updater
+  - self_test
+  repository: https://github.com/ros/diagnostics
   tag: release/rolling/diagnostics/4.5.7-1
   url: https://github.com/ros2-gbp/diagnostics-release.git
   version: 4.5.7
 diff_drive_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - hardware_interface_testing
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcpputils
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - tf2
+  - tf2_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/diff_drive_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 domain_coordinator:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ros2/ament_cmake_ros
   tag: release/rolling/domain_coordinator/0.16.0-1
   url: https://github.com/ros2-gbp/ament_cmake_ros-release.git
   version: 0.16.0
 draco_point_cloud_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - point_cloud_interfaces
+  - point_cloud_transport
+  - rclcpp
+  - rcpputils
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-perception/point_cloud_transport_plugins
   tag: release/rolling/draco_point_cloud_transport/7.0.0-1
   url: https://github.com/ros2-gbp/point_cloud_transport_plugins-release.git
   version: 7.0.0
 dual_arm_panda_moveit_config:
+  dependencies:
+  - ament_cmake
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - moveit_resources_panda_description
+  - robot_state_publisher
+  - topic_tools
+  - xacro
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/dual_arm_panda_moveit_config/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 dual_laser_merger:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_copyright
+  - ament_cpplint
+  - ament_flake8
+  - ament_lint_auto
+  - ament_lint_common
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - laser_geometry
+  - message_filters
+  - pcl_conversions
+  - pcl_ros
+  - rclcpp
+  - rclcpp_components
+  - tf2
+  - tf2_ros
+  - tf2_sensor_msgs
+  repository: https://github.com/pradyum/dual_laser_merger
   tag: release/rolling/dual_laser_merger/0.0.1-2
   url: https://github.com/ros2-gbp/dual_laser_merger-release.git
   version: 0.0.1
 dummy_map_server:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - nav_msgs
+  - rclcpp
+  repository: https://github.com/ros2/demos
   tag: release/rolling/dummy_map_server/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 dummy_robot_bringup:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - dummy_map_server
+  - dummy_sensors
+  - launch
+  - launch_ros
+  - robot_state_publisher
+  - rviz2
+  repository: https://github.com/ros2/demos
   tag: release/rolling/dummy_robot_bringup/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 dummy_sensors:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/dummy_sensors/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 dynamixel_hardware:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - dynamixel_workbench_toolbox
+  - hardware_interface
+  - lifecycle_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  repository: https://github.com/dynamixel-community/dynamixel_hardware
   tag: release/rolling/dynamixel_hardware/0.6.1-1
   url: https://github.com/ros2-gbp/dynamixel_hardware-release.git
   version: 0.6.1
 dynamixel_hardware_interface:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - dynamixel_interfaces
+  - dynamixel_sdk
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - realtime_tools
+  - std_srvs
+  repository: https://github.com/ROBOTIS-GIT/dynamixel_hardware_interface
   tag: release/rolling/dynamixel_hardware_interface/1.5.1-2
   url: https://github.com/ros2-gbp/dynamixel_hardware_interface-release.git
   version: 1.5.1
 dynamixel_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/dynamixel_interfaces
   tag: release/rolling/dynamixel_interfaces/1.0.1-2
   url: https://github.com/ros2-gbp/dynamixel_interfaces-release.git
   version: 1.0.1
 dynamixel_sdk:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  repository: https://github.com/ROBOTIS-GIT/DynamixelSDK
   tag: release/rolling/dynamixel_sdk/4.0.3-2
   url: https://github.com/ros2-gbp/dynamixel_sdk-release.git
   version: 4.0.3
 dynamixel_sdk_custom_interfaces:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ROBOTIS-GIT/DynamixelSDK
   tag: release/rolling/dynamixel_sdk_custom_interfaces/4.0.3-2
   url: https://github.com/ros2-gbp/dynamixel_sdk-release.git
   version: 4.0.3
 dynamixel_sdk_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - dynamixel_sdk
+  - dynamixel_sdk_custom_interfaces
+  - rclcpp
+  - rclpy
+  repository: https://github.com/ROBOTIS-GIT/DynamixelSDK
   tag: release/rolling/dynamixel_sdk_examples/4.0.3-2
   url: https://github.com/ros2-gbp/dynamixel_sdk-release.git
   version: 4.0.3
 dynamixel_workbench:
+  dependencies:
+  - ament_cmake
+  - dynamixel_workbench_toolbox
+  repository: https://github.com/ROBOTIS-GIT/dynamixel-workbench
   tag: release/rolling/dynamixel_workbench/2.2.5-2
   url: https://github.com/ros2-gbp/dynamixel_workbench-release.git
   version: 2.2.5
 dynamixel_workbench_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/dynamixel-workbench-msgs
   tag: release/rolling/dynamixel_workbench_msgs/2.1.0-2
   url: https://github.com/ros2-gbp/dynamixel_workbench_msgs-release.git
   version: 2.1.0
 dynamixel_workbench_toolbox:
+  dependencies:
+  - ament_cmake
+  - dynamixel_sdk
+  repository: https://github.com/ROBOTIS-GIT/dynamixel-workbench
   tag: release/rolling/dynamixel_workbench_toolbox/2.2.5-2
   url: https://github.com/ros2-gbp/dynamixel_workbench-release.git
   version: 2.2.5
 ecl_build:
+  dependencies:
+  - ament_cmake
+  - ecl_license
+  repository: https://github.com/stonier/ecl_tools
   tag: release/rolling/ecl_build/1.0.3-5
   url: https://github.com/ros2-gbp/ecl_tools-release.git
   version: 1.0.3
 ecl_command_line:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_license
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_command_line/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_concepts:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_license
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_concepts/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_config:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_config/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_console:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_console/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_containers:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_converters
+  - ecl_errors
+  - ecl_exceptions
+  - ecl_formatters
+  - ecl_license
+  - ecl_mpl
+  - ecl_type_traits
+  - ecl_utilities
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_containers/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_converters:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_concepts
+  - ecl_config
+  - ecl_errors
+  - ecl_exceptions
+  - ecl_license
+  - ecl_mpl
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_converters/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_converters_lite:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_config
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_converters_lite/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_core:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_command_line
+  - ecl_concepts
+  - ecl_containers
+  - ecl_converters
+  - ecl_core_apps
+  - ecl_devices
+  - ecl_eigen
+  - ecl_exceptions
+  - ecl_formatters
+  - ecl_geometry
+  - ecl_ipc
+  - ecl_linear_algebra
+  - ecl_math
+  - ecl_mpl
+  - ecl_sigslots
+  - ecl_statistics
+  - ecl_streams
+  - ecl_threads
+  - ecl_time
+  - ecl_type_traits
+  - ecl_utilities
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_core/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_core_apps:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_command_line
+  - ecl_config
+  - ecl_containers
+  - ecl_converters
+  - ecl_devices
+  - ecl_errors
+  - ecl_exceptions
+  - ecl_formatters
+  - ecl_geometry
+  - ecl_ipc
+  - ecl_license
+  - ecl_linear_algebra
+  - ecl_sigslots
+  - ecl_streams
+  - ecl_threads
+  - ecl_time_lite
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_core_apps/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_devices:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_containers
+  - ecl_errors
+  - ecl_license
+  - ecl_mpl
+  - ecl_threads
+  - ecl_type_traits
+  - ecl_utilities
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_devices/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_eigen:
+  dependencies:
+  - ament_cmake_ros
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_eigen/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_errors:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_errors/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_exceptions:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_license
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_exceptions/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_filesystem:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_license
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_filesystem/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_formatters:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_converters
+  - ecl_exceptions
+  - ecl_license
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_formatters/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_geometry:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_containers
+  - ecl_exceptions
+  - ecl_formatters
+  - ecl_license
+  - ecl_linear_algebra
+  - ecl_math
+  - ecl_mpl
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_geometry/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_io:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_io/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_ipc:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_exceptions
+  - ecl_license
+  - ecl_threads
+  - ecl_time
+  - ecl_time_lite
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_ipc/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_license:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/stonier/ecl_tools
   tag: release/rolling/ecl_license/1.0.3-5
   url: https://github.com/ros2-gbp/ecl_tools-release.git
   version: 1.0.3
 ecl_linear_algebra:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_converters
+  - ecl_eigen
+  - ecl_exceptions
+  - ecl_formatters
+  - ecl_license
+  - ecl_math
+  - sophus
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_linear_algebra/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_lite:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_config
+  - ecl_converters_lite
+  - ecl_errors
+  - ecl_io
+  - ecl_sigslots_lite
+  - ecl_time_lite
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_lite/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_manipulators:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_exceptions
+  - ecl_formatters
+  - ecl_geometry
+  - ecl_license
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_manipulators/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_math:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_license
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_math/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_mobile_robot:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_errors
+  - ecl_formatters
+  - ecl_geometry
+  - ecl_license
+  - ecl_linear_algebra
+  - ecl_math
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_mobile_robot/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_mpl:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_license
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_mpl/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_sigslots:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_license
+  - ecl_threads
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_sigslots/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_sigslots_lite:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_sigslots_lite/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_statistics:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_license
+  - ecl_linear_algebra
+  - ecl_mpl
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_statistics/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_streams:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_concepts
+  - ecl_converters
+  - ecl_devices
+  - ecl_errors
+  - ecl_license
+  - ecl_time
+  - ecl_type_traits
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_streams/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_threads:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_concepts
+  - ecl_config
+  - ecl_errors
+  - ecl_exceptions
+  - ecl_license
+  - ecl_time
+  - ecl_utilities
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_threads/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_time:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_exceptions
+  - ecl_license
+  - ecl_time_lite
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_time/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_time_lite:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_config
+  - ecl_errors
+  - ecl_license
+  repository: https://github.com/stonier/ecl_lite
   tag: release/rolling/ecl_time_lite/1.2.0-5
   url: https://github.com/ros2-gbp/ecl_lite-release.git
   version: 1.2.0
 ecl_tools:
+  dependencies:
+  - ament_cmake
+  - ecl_build
+  - ecl_license
+  repository: https://github.com/stonier/ecl_tools
   tag: release/rolling/ecl_tools/1.0.3-5
   url: https://github.com/ros2-gbp/ecl_tools-release.git
   version: 1.0.3
 ecl_type_traits:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_config
+  - ecl_license
+  - ecl_mpl
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_type_traits/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 ecl_utilities:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ecl_build
+  - ecl_concepts
+  - ecl_license
+  - ecl_mpl
+  repository: https://github.com/stonier/ecl_core
   tag: release/rolling/ecl_utilities/1.2.1-5
   url: https://github.com/ros2-gbp/ecl_core-release.git
   version: 1.2.1
 eigen3_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  repository: https://github.com/ros2/eigen3_cmake_module
   tag: release/rolling/eigen3_cmake_module/0.6.0-1
   url: https://github.com/ros2-gbp/eigen3_cmake_module-release.git
   version: 0.6.0
 eigen_stl_containers:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros/eigen_stl_containers
   tag: release/rolling/eigen_stl_containers/1.1.0-2
   url: https://github.com/ros2-gbp/eigen_stl_containers-release.git
   version: 1.1.0
 eigenpy:
+  dependencies:
+  - jrl_cmakemodules
+  repository: https://github.com/stack-of-tasks/eigenpy
   tag: release/rolling/eigenpy/3.13.0-1
   url: https://github.com/ros2-gbp/eigenpy-release.git
   version: 3.13.0
 eiquadprog:
+  dependencies:
+  - ament_cmake
+  - jrl_cmakemodules
+  repository: https://github.com/stack-of-tasks/eiquadprog
   tag: release/rolling/eiquadprog/1.3.2-1
   url: https://github.com/ros2-gbp/eiquadprog-release.git
   version: 1.3.2
 event_camera_codecs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - event_camera_msgs
+  - rclcpp
+  - ros_environment
+  - rosbag2_cpp
+  repository: https://github.com/ros-event-camera/event_camera_codecs
   tag: release/rolling/event_camera_codecs/3.0.0-2
   url: https://github.com/ros2-gbp/event_camera_codecs-release.git
   version: 3.0.0
 event_camera_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-event-camera/event_camera_msgs
   tag: release/rolling/event_camera_msgs/2.0.1-2
   url: https://github.com/ros2-gbp/event_camera_msgs-release.git
   version: 2.0.1
 event_camera_py:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - event_camera_codecs
+  - event_camera_msgs
+  - pybind11_vendor
+  - python_cmake_module
+  - rclpy
+  - ros_environment
+  - rosbag2_py
+  - rosbag2_storage_default_plugins
+  - rosbag2_storage_mcap
+  - rosidl_runtime_py
+  - rpyutils
+  repository: https://github.com/ros-event-camera/event_camera_py
   tag: release/rolling/event_camera_py/3.0.0-2
   url: https://github.com/ros2-gbp/event_camera_py-release.git
   version: 3.0.0
 event_camera_renderer:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - event_camera_codecs
+  - event_camera_msgs
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  repository: https://github.com/ros-event-camera/event_camera_renderer
   tag: release/rolling/event_camera_renderer/3.0.0-2
   url: https://github.com/ros2-gbp/event_camera_renderer-release.git
   version: 3.0.0
 event_camera_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_black
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_cmake_test
+  - ament_lint_auto
+  - ament_lint_common
+  - event_camera_codecs
+  - event_camera_msgs
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - rosbag2_cpp
+  - rosbag2_storage
+  - sensor_msgs
+  repository: https://github.com/ros-event-camera/event_camera_tools
   tag: release/rolling/event_camera_tools/3.1.5-1
   url: https://github.com/ros2-gbp/event_camera_tools-release.git
   version: 3.1.5
 event_image_reconstruction_fibar:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_black
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - event_camera_codecs
+  - event_camera_msgs
+  - fibar_lib
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - rosbag2_cpp
+  - rosbag2_transport
+  - sensor_msgs
+  repository: https://github.com/ros-event-camera/event_image_reconstruction_fibar
   tag: release/rolling/event_image_reconstruction_fibar/3.0.4-2
   url: https://github.com/ros2-gbp/event_image_reconstruction_fibar-release.git
   version: 3.0.4
 eventdispatch_python:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  repository: https://github.com/cyan-at/ros2_eventdispatch
   tag: release/rolling/eventdispatch_python/0.2.29-1
   url: https://github.com/ros2-gbp/ros2_eventdispatch-release.git
   version: 0.2.29
 eventdispatch_ros2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - eventdispatch_python
+  - eventdispatch_ros2_interfaces
+  - rclcpp
+  - rclpy
+  repository: https://github.com/cyan-at/ros2_eventdispatch
   tag: release/rolling/eventdispatch_ros2/0.2.29-1
   url: https://github.com/ros2-gbp/ros2_eventdispatch-release.git
   version: 0.2.29
 eventdispatch_ros2_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/cyan-at/ros2_eventdispatch
   tag: release/rolling/eventdispatch_ros2_interfaces/0.2.29-1
   url: https://github.com/ros2-gbp/ros2_eventdispatch-release.git
   version: 0.2.29
 example_interfaces:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/example_interfaces
   tag: release/rolling/example_interfaces/0.15.0-1
   url: https://github.com/ros2-gbp/example_interfaces-release.git
   version: 0.15.0
 examples_rclcpp_async_client:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_async_client/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_cbg_executor:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_cbg_executor/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_action_client:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  - rclcpp_action
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_action_client/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_action_server:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  - rclcpp_action
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_action_server/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_client:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_client/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_composition:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_composition/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_publisher:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_publisher/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_service:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_service/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_subscriber:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_subscriber/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_minimal_timer:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_minimal_timer/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_multithreaded_executor:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_multithreaded_executor/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclcpp_wait_set:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclcpp_wait_set/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_executors:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_executors/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_guard_conditions:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_guard_conditions/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_minimal_action_client:
+  dependencies:
+  - action_msgs
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_minimal_action_client/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_minimal_action_server:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_minimal_action_server/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_minimal_client:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_minimal_client/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_minimal_publisher:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_minimal_publisher/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_minimal_service:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_minimal_service/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_minimal_subscriber:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_minimal_subscriber/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_rclpy_pointcloud_publisher:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - sensor_msgs
+  - sensor_msgs_py
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/examples_rclpy_pointcloud_publisher/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 examples_tf2_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - launch_ros
+  - rclpy
+  - sensor_msgs
+  - tf2_ros_py
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/examples_tf2_py/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 executive_smach:
+  dependencies:
+  - ament_cmake
+  - smach
+  - smach_msgs
+  - smach_ros
+  repository: https://github.com/ros/executive_smach
   tag: release/rolling/executive_smach/3.0.3-3
   url: https://github.com/ros2-gbp/executive_smach-release.git
   version: 3.0.3
 fastcdr:
+  dependencies: []
+  repository: https://github.com/eProsima/Fast-CDR
   tag: release/rolling/fastcdr/2.3.6-1
   url: https://github.com/ros2-gbp/fastcdr-release.git
   version: 2.3.6
 fastdds:
+  dependencies:
+  - fastcdr
+  - foonathan_memory_vendor
+  repository: https://github.com/eProsima/Fast-DDS
   tag: release/rolling/fastdds/3.6.2-1
   url: https://github.com/ros2-gbp/fastdds-release.git
   version: 3.6.2
 feetech_ros2_driver:
+  dependencies:
+  - ament_cmake
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/ros-physical-ai/feetech_ros2_driver
   tag: release/rolling/feetech_ros2_driver/0.2.1-2
   url: https://github.com/ros2-gbp/feetech_ros2_driver-release.git
   version: 0.2.1
 ffmpeg_encoder_decoder:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - ffmpeg_image_transport_msgs
+  - rclcpp
+  - ros_environment
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-misc-utilities/ffmpeg_encoder_decoder
   tag: release/rolling/ffmpeg_encoder_decoder/3.0.1-2
   url: https://github.com/ros2-gbp/ffmpeg_encoder_decoder-release.git
   version: 3.0.1
 ffmpeg_image_transport:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_black
+  - ament_cmake_clang_format
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ffmpeg_encoder_decoder
+  - ffmpeg_image_transport_msgs
+  - image_transport
+  - pluginlib
+  - rclcpp
+  - rcutils
+  - ros_environment
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-misc-utilities/ffmpeg_image_transport
   tag: release/rolling/ffmpeg_image_transport/3.0.4-1
   url: https://github.com/ros2-gbp/ffmpeg_image_transport-release.git
   version: 3.0.4
 ffmpeg_image_transport_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-misc-utilities/ffmpeg_image_transport_msgs
   tag: release/rolling/ffmpeg_image_transport_msgs/1.3.0-1
   url: https://github.com/ros2-gbp/ffmpeg_image_transport_msgs-release.git
   version: 1.3.0
 ffmpeg_image_transport_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_black
+  - ament_cmake_clang_format
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - ffmpeg_encoder_decoder
+  - ffmpeg_image_transport_msgs
+  - rclcpp
+  - rcutils
+  - ros_environment
+  - rosbag2_cpp
+  - rosbag2_storage
+  - sensor_msgs
+  repository: https://github.com/ros-misc-utilities/ffmpeg_image_transport_tools
   tag: release/rolling/ffmpeg_image_transport_tools/3.0.1-2
   url: https://github.com/ros2-gbp/ffmpeg_image_transport_tools-release.git
   version: 3.0.1
 ffw:
+  dependencies:
+  - ament_cmake
+  - ffw_bringup
+  - ffw_description
+  - ffw_joint_trajectory_command_broadcaster
+  - ffw_joystick_controller
+  - ffw_moveit_config
+  - ffw_robot_manager
+  - ffw_spring_actuator_controller
+  - ffw_swerve_drive_controller
+  - ffw_teleop
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_bringup:
+  dependencies:
+  - dynamixel_hardware_interface
+  - ffw_description
+  - gz_ros2_control
+  - image_transport_plugins
+  - rclpy
+  - robot_state_publisher
+  - ros2_control
+  - ros2_controllers
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_sim
+  - rviz2
+  - xacro
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_bringup/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_description:
+  dependencies:
+  - ament_cmake
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - robot_state_publisher
+  - rviz2
+  - urdf
+  - xacro
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_description/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_joint_trajectory_command_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - builtin_interfaces
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcutils
+  - realtime_tools
+  - ros2_control_test_assets
+  - sensor_msgs
+  - trajectory_msgs
+  - urdf
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_joint_trajectory_command_broadcaster/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_joystick_controller:
+  dependencies:
+  - ament_cmake
+  - controller_interface
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_joystick_controller/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - moveit_configs_utils
+  - moveit_kinematics
+  - moveit_planners
+  - moveit_ros_move_group
+  - moveit_ros_visualization
+  - moveit_setup_assistant
+  - moveit_simple_controller_manager
+  - robot_state_publisher
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - tf2_ros
+  - xacro
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_moveit_config/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_robot_manager:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - controller_interface
+  - dynamixel_hardware_interface
+  - dynamixel_interfaces
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - ros2_control_cmake
+  - sensor_msgs
+  - std_srvs
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_robot_manager/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_spring_actuator_controller:
+  dependencies:
+  - ament_cmake
+  - controller_interface
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - urdf
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_spring_actuator_controller/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_swerve_drive_controller:
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - hardware_interface_testing
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcpputils
+  - realtime_tools
+  - ros2_control_test_assets
+  - sensor_msgs
+  - std_srvs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_msgs
+  - visualization_msgs
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_swerve_drive_controller/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 ffw_teleop:
+  dependencies:
+  - rclpy
+  repository: https://github.com/ROBOTIS-GIT/ai_worker
   tag: release/rolling/ffw_teleop/1.1.14-2
   url: https://github.com/ros2-gbp/ai_worker-release.git
   version: 1.1.14
 fibar_lib:
+  dependencies: []
+  repository: https://github.com/ros-event-camera/fibar_lib
   tag: release/rolling/fibar_lib/1.0.2-2
   url: https://github.com/ros2-gbp/fibar_lib-release.git
   version: 1.0.2
 fields2cover:
-  tag: release/rolling/fields2cover/2.0.0-17
+  dependencies:
+  - ortools_vendor
+  repository: https://github.com/Fields2Cover/fields2cover
+  tag: release/rolling/fields2cover/2.1.0-1
   url: https://github.com/ros2-gbp/fields2cover-release.git
-  version: 2.0.0
+  version: 2.1.0
 filters:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_gtest
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/ros/filters
   tag: release/rolling/filters/2.2.2-2
   url: https://github.com/ros2-gbp/filters-release.git
   version: 2.2.2
 fkie_message_filters:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - image_transport
+  - rclcpp
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - std_msgs
+  - tf2_ros
+  repository: https://github.com/fkie/message_filters
   tag: release/rolling/fkie_message_filters/3.4.0-1
   url: https://github.com/ros2-gbp/fkie_message_filters-release.git
   version: 3.4.0
 flex_sync:
+  dependencies:
+  - ament_clang_format
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_components
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-misc-utilities/flex_sync
   tag: release/rolling/flex_sync/2.0.1-2
   url: https://github.com/ros2-gbp/flex_sync-release.git
   version: 2.0.1
 flexbe_behavior_engine:
+  dependencies:
+  - ament_cmake
+  - flexbe_core
+  - flexbe_input
+  - flexbe_mirror
+  - flexbe_msgs
+  - flexbe_onboard
+  - flexbe_states
+  - flexbe_testing
+  - flexbe_widget
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_behavior_engine/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_core:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - flexbe_msgs
+  - launch_ros
+  - launch_testing
+  - rclpy
+  - std_msgs
+  - std_srvs
+  - tf2_ros_py
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_core/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_input:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - flexbe_core
+  - flexbe_msgs
+  - rclpy
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_input/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_mirror:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - flexbe_core
+  - flexbe_msgs
+  - rclpy
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_mirror/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_msgs/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_onboard:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - flexbe_core
+  - flexbe_msgs
+  - flexbe_states
+  - launch_ros
+  - launch_testing
+  - rclpy
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_onboard/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_states:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - flexbe_core
+  - flexbe_msgs
+  - flexbe_testing
+  - geometry_msgs
+  - rclpy
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_states/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_testing:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - flexbe_core
+  - flexbe_msgs
+  - launch_ros
+  - launch_testing
+  - rclpy
+  - std_msgs
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_testing/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flexbe_widget:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - flexbe_core
+  - flexbe_mirror
+  - flexbe_msgs
+  - flexbe_onboard
+  - launch_ros
+  - rclpy
+  - std_msgs
+  repository: https://github.com/flexbe/flexbe_behavior_engine
   tag: release/rolling/flexbe_widget/4.1.4-1
   url: https://github.com/ros2-gbp/flexbe_behavior_engine-release.git
   version: 4.1.4
 flir_camera_description:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - robot_state_publisher
+  - urdf
+  - xacro
+  repository: https://github.com/ros-drivers/flir_camera_driver
   tag: release/rolling/flir_camera_description/3.0.5-1
   url: https://github.com/ros2-gbp/flir_camera_driver-release.git
   version: 3.0.5
 flir_camera_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/flir_camera_driver
   tag: release/rolling/flir_camera_msgs/3.0.5-1
   url: https://github.com/ros2-gbp/flir_camera_driver-release.git
   version: 3.0.5
 fluent_rviz:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - geometry_msgs
+  - ouxt_lint_common
+  - rclcpp
+  - std_msgs
+  - visualization_msgs
+  repository: https://github.com/ForteFibre/FluentRviz
   tag: release/rolling/fluent_rviz/0.0.3-5
   url: https://github.com/ros2-gbp/fluent_rviz-release.git
   version: 0.0.3
 foonathan_memory_vendor:
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_xmllint
+  repository: https://github.com/eProsima/foonathan_memory_vendor
   tag: release/rolling/foonathan_memory_vendor/1.3.1-3
   url: https://github.com/ros2-gbp/foonathan_memory_vendor-release.git
   version: 1.3.1
 force_torque_sensor_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - controller_interface
+  - controller_manager
+  - filters
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/force_torque_sensor_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 forward_command_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/forward_command_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 four_wheel_steering_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/four_wheel_steering_msgs
   tag: release/rolling/four_wheel_steering_msgs/2.0.1-6
   url: https://github.com/ros2-gbp/four_wheel_steering_msgs-release.git
   version: 2.0.1
 foxglove_bridge:
-  tag: release/rolling/foxglove_bridge/3.4.3-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - ament_lint_auto
+  - geometry_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rcpputils
+  - rcutils
+  - resource_retriever
+  - ros_environment
+  - rosgraph_msgs
+  - rosidl_typesupport_introspection_cpp
+  - rosx_introspection
+  - sensor_msgs
+  - service_msgs
+  - std_msgs
+  - std_srvs
+  - test_msgs
+  repository: https://github.com/foxglove/foxglove-sdk
+  tag: release/rolling/foxglove_bridge/3.5.0-2
   url: https://github.com/ros2-gbp/foxglove_bridge-release.git
-  version: 3.4.3
+  version: 3.5.0
 foxglove_compressed_video_transport:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - ffmpeg_encoder_decoder
+  - foxglove_msgs
+  - image_transport
+  - pluginlib
+  - rclcpp
+  - rcutils
+  - ros_environment
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-misc-utilities/foxglove_compressed_video_transport
   tag: release/rolling/foxglove_compressed_video_transport/3.0.3-1
   url: https://github.com/ros2-gbp/foxglove_compressed_video_transport-release.git
   version: 3.0.3
 foxglove_msgs:
-  tag: release/rolling/foxglove_msgs/3.4.3-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/foxglove/foxglove-sdk
+  tag: release/rolling/foxglove_msgs/3.5.0-2
   url: https://github.com/ros2-gbp/foxglove_bridge-release.git
-  version: 3.4.3
+  version: 3.5.0
 foxglove_sdk_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://gitlab.com/jlack/foxglove_sdk_vendor
   tag: release/rolling/foxglove_sdk_vendor/0.3.0-1
   url: https://github.com/ros2-gbp/foxglove_sdk_vendor-release.git
   version: 0.3.0
 franka_inria_inverse_dynamics_solver:
+  dependencies:
+  - ament_cmake
+  - inverse_dynamics_solver
+  - pluginlib
+  repository: https://github.com/unisa-acg/inverse-dynamics-solver
   tag: release/rolling/franka_inria_inverse_dynamics_solver/6.0.1-4
   url: https://github.com/ros2-gbp/inverse_dynamics_solver-release.git
   version: 6.0.1
 frequency_cam:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - event_camera_codecs
+  - event_camera_msgs
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - rosbag2_cpp
+  - std_msgs
+  repository: https://github.com/ros-event-camera/frequency_cam
   tag: release/rolling/frequency_cam/3.1.2-1
   url: https://github.com/ros2-gbp/frequency_cam-release.git
   version: 3.1.2
 fuse:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - fuse_constraints
+  - fuse_core
+  - fuse_doc
+  - fuse_graphs
+  - fuse_models
+  - fuse_msgs
+  - fuse_optimizers
+  - fuse_publishers
+  - fuse_variables
+  - fuse_viz
+  - gtest_vendor
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_constraints:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_core
+  - fuse_graphs
+  - fuse_variables
+  - geometry_msgs
+  - gtest_vendor
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_constraints/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_core:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_msgs
+  - geometry_msgs
+  - gtest_vendor
+  - launch
+  - launch_pytest
+  - pluginlib
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_core/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_doc:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - gtest_vendor
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_doc/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_graphs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_core
+  - gtest_vendor
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_graphs/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_loss:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_core
+  - gtest_vendor
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_loss/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_models:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_constraints
+  - fuse_core
+  - fuse_graphs
+  - fuse_msgs
+  - fuse_publishers
+  - fuse_variables
+  - geometry_msgs
+  - gtest_vendor
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_srvs
+  - tf2
+  - tf2_2d
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_models/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - gtest_vendor
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_msgs/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_optimizers:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_updater
+  - fuse_constraints
+  - fuse_core
+  - fuse_graphs
+  - fuse_models
+  - fuse_msgs
+  - fuse_variables
+  - geometry_msgs
+  - gtest_vendor
+  - launch
+  - launch_pytest
+  - launch_ros
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - std_srvs
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_optimizers/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_publishers:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_constraints
+  - fuse_core
+  - fuse_graphs
+  - fuse_msgs
+  - fuse_variables
+  - geometry_msgs
+  - gtest_vendor
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_publishers/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_tutorials:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_constraints
+  - fuse_core
+  - fuse_models
+  - fuse_optimizers
+  - fuse_publishers
+  - fuse_variables
+  - gtest_vendor
+  - nav_msgs
+  - rclcpp
+  - rviz2
+  - sensor_msgs
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_tutorials/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_variables:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_core
+  - fuse_graphs
+  - gtest_vendor
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_variables/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 fuse_viz:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - fuse_constraints
+  - fuse_core
+  - fuse_msgs
+  - fuse_variables
+  - geometry_msgs
+  - gtest_vendor
+  - rviz_common
+  - rviz_rendering
+  - tf2_geometry_msgs
+  repository: https://github.com/locusrobotics/fuse
   tag: release/rolling/fuse_viz/1.3.4-1
   url: https://github.com/ros2-gbp/fuse-release.git
   version: 1.3.4
 game_controller_spl:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - game_controller_spl_interfaces
+  - rclpy
+  repository: https://github.com/ros-sports/game_controller_spl
   tag: release/rolling/game_controller_spl/5.0.0-3
   url: https://github.com/ros2-gbp/game_controller_spl-release.git
   version: 5.0.0
 game_controller_spl_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-sports/game_controller_spl
   tag: release/rolling/game_controller_spl_interfaces/5.0.0-3
   url: https://github.com/ros2-gbp/game_controller_spl-release.git
   version: 5.0.0
 generate_parameter_library:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - generate_parameter_library_py
+  - rclcpp
+  - rclcpp_lifecycle
+  - rclpy
+  - rsl
+  - tcb_span
+  repository: https://github.com/PickNikRobotics/generate_parameter_library
   tag: release/rolling/generate_parameter_library/1.3.0-1
   url: https://github.com/ros2-gbp/generate_parameter_library-release.git
   version: 1.3.0
 generate_parameter_library_py:
+  dependencies: []
+  repository: https://github.com/PickNikRobotics/generate_parameter_library
   tag: release/rolling/generate_parameter_library_py/1.3.0-1
   url: https://github.com/ros2-gbp/generate_parameter_library-release.git
   version: 1.3.0
 geodesy:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - angles
+  - geographic_msgs
+  - geometry_msgs
+  - sensor_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/ros-geographic-info/geographic_info
   tag: release/rolling/geodesy/1.0.7-4
   url: https://github.com/ros2-gbp/geographic_info-release.git
   version: 1.0.7
 geographic_info:
+  dependencies:
+  - ament_cmake
+  - geodesy
+  - geographic_msgs
+  repository: https://github.com/ros-geographic-info/geographic_info
   tag: release/rolling/geographic_info/1.0.7-4
   url: https://github.com/ros2-gbp/geographic_info-release.git
   version: 1.0.7
 geographic_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - unique_identifier_msgs
+  repository: https://github.com/ros-geographic-info/geographic_info
   tag: release/rolling/geographic_msgs/1.0.7-4
   url: https://github.com/ros2-gbp/geographic_info-release.git
   version: 1.0.7
 geometric_shapes:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_cmake
+  - console_bridge_vendor
+  - eigen3_cmake_module
+  - eigen_stl_containers
+  - geometry_msgs
+  - random_numbers
+  - rclcpp
+  - resource_retriever
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - shape_msgs
+  - visualization_msgs
+  repository: https://github.com/ros-planning/geometric_shapes
   tag: release/rolling/geometric_shapes/2.3.4-1
   url: https://github.com/ros2-gbp/geometric_shapes-release.git
   version: 2.3.4
 geometry2:
+  dependencies:
+  - ament_cmake
+  - tf2
+  - tf2_bullet
+  - tf2_eigen
+  - tf2_eigen_kdl
+  - tf2_geometry_msgs
+  - tf2_kdl
+  - tf2_msgs
+  - tf2_py
+  - tf2_ros
+  - tf2_sensor_msgs
+  - tf2_tools
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/geometry2/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 geometry_msgs:
-  tag: release/rolling/geometry_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/geometry_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 geometry_tutorials:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros/geometry_tutorials
   tag: release/rolling/geometry_tutorials/0.7.0-2
   url: https://github.com/ros2-gbp/geometry_tutorials-release.git
   version: 0.7.0
 gmock_vendor:
+  dependencies:
+  - gtest_vendor
+  repository: https://github.com/ament/googletest
   tag: release/rolling/gmock_vendor/1.17.0-2
   url: https://github.com/ros2-gbp/googletest-release.git
   version: 1.17.0
 google_benchmark_vendor:
+  dependencies: []
+  repository: https://github.com/ament/google_benchmark_vendor
   tag: release/rolling/google_benchmark_vendor/0.8.0-1
   url: https://github.com/ros2-gbp/google_benchmark_vendor-release.git
   version: 0.8.0
 gpio_controllers:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/gpio_controllers/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 gps_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/gps_umd
   tag: release/rolling/gps_msgs/3.1.1-1
   url: https://github.com/ros2-gbp/gps_umd-release.git
   version: 3.1.1
 gps_sensor_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/gps_sensor_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 gps_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - gps_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/swri-robotics/gps_umd
   tag: release/rolling/gps_tools/3.1.1-1
   url: https://github.com/ros2-gbp/gps_umd-release.git
   version: 3.1.1
 gps_umd:
+  dependencies:
+  - ament_cmake
+  - gps_msgs
+  - gps_tools
+  - gpsd_client
+  repository: https://github.com/swri-robotics/gps_umd
   tag: release/rolling/gps_umd/3.1.1-1
   url: https://github.com/ros2-gbp/gps_umd-release.git
   version: 3.1.1
 gpsd_client:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - gps_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/swri-robotics/gps_umd
   tag: release/rolling/gpsd_client/3.1.1-1
   url: https://github.com/ros2-gbp/gps_umd-release.git
   version: 3.1.1
 graph_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_cmake
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/PickNikRobotics/graph_msgs
   tag: release/rolling/graph_msgs/0.2.1-1
   url: https://github.com/ros2-gbp/graph_msgs-release.git
   version: 0.2.1
 grasping_msgs:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - moveit_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - shape_msgs
+  - std_msgs
+  repository: https://github.com/mikeferguson/grasping_msgs
   tag: release/rolling/grasping_msgs/0.5.0-2
   url: https://github.com/ros2-gbp/grasping_msgs-release.git
   version: 0.5.0
 grbl_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/flynneva/grbl_msgs
   tag: release/rolling/grbl_msgs/0.0.2-9
   url: https://github.com/ros2-gbp/grbl_msgs-release.git
   version: 0.0.2
 grbl_ros:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - grbl_msgs
+  - rclpy
+  - std_msgs
+  repository: https://github.com/flynneva/grbl_ros
   tag: release/rolling/grbl_ros/0.0.16-7
   url: https://github.com/ros2-gbp/grbl_ros-release.git
   version: 0.0.16
 greenwave_monitor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_flake8
+  - ament_lint_auto
+  - ament_lint_common
+  - ament_pep257
+  - diagnostic_msgs
+  - greenwave_monitor_interfaces
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rclcpp
+  - rclpy
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/NVIDIA-ISAAC-ROS/greenwave_monitor
   tag: release/rolling/greenwave_monitor/1.0.0-3
   url: https://github.com/ros2-gbp/greenwave_monitor-release.git
   version: 1.0.0
 greenwave_monitor_interfaces:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/NVIDIA-ISAAC-ROS/greenwave_monitor
   tag: release/rolling/greenwave_monitor_interfaces/1.0.0-3
   url: https://github.com/ros2-gbp/greenwave_monitor-release.git
   version: 1.0.0
 gscam:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_calibration_parsers
+  - camera_info_manager
+  - class_loader
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/gscam
   tag: release/rolling/gscam/2.0.4-2
   url: https://github.com/ros2-gbp/gscam-release.git
   version: 2.0.4
 gstreamer_ros_babel_fish:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/StefanFabian/gstreamer_ros_babel_fish
   tag: release/rolling/gstreamer_ros_babel_fish/1.26.40-2
   url: https://github.com/ros2-gbp/gstreamer_ros_babel_fish-release.git
   version: 1.26.40
 gtest_vendor:
+  dependencies: []
+  repository: https://github.com/ament/googletest
   tag: release/rolling/gtest_vendor/1.17.0-2
   url: https://github.com/ros2-gbp/googletest-release.git
   version: 1.17.0
 gtsam:
+  dependencies: []
+  repository: https://github.com/borglab/gtsam
   tag: release/rolling/gtsam/4.3.0-4
   url: https://github.com/ros2-gbp/gtsam-release.git
   version: 4.3.0
 gtsam2mrpt_serial:
+  dependencies:
+  - gtsam
+  - mola_common
+  - mrpt_libbase
+  - mrpt_libmath
+  - mrpt_libposes
+  repository: https://github.com/MRPT/gtsam2mrpt_serial
   tag: release/rolling/gtsam2mrpt_serial/0.2.0-2
   url: https://github.com/ros2-gbp/gtsam2mrpt_serial-release.git
   version: 0.2.0
 gz_cmake_vendor:
-  tag: release/rolling/gz_cmake_vendor/0.5.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  repository: https://github.com/gazebo-release/gz_cmake_vendor
+  tag: release/rolling/gz_cmake_vendor/0.5.2-1
   url: https://github.com/ros2-gbp/gz_cmake_vendor-release.git
-  version: 0.5.1
+  version: 0.5.2
 gz_common_vendor:
-  tag: release/rolling/gz_common_vendor/0.4.2-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_math_vendor
+  - gz_utils_vendor
+  - spdlog_vendor
+  repository: https://github.com/gazebo-release/gz_common_vendor
+  tag: release/rolling/gz_common_vendor/0.4.3-1
   url: https://github.com/ros2-gbp/gz_common_vendor-release.git
-  version: 0.4.2
+  version: 0.4.3
 gz_dartsim_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  repository: https://github.com/gazebo-release/gz_dartsim_vendor
   tag: release/rolling/gz_dartsim_vendor/0.1.3-2
   url: https://github.com/ros2-gbp/gz_dartsim_vendor-release.git
   version: 0.1.3
 gz_fuel_tools_vendor:
-  tag: release/rolling/gz_fuel_tools_vendor/0.4.0-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_common_vendor
+  - gz_math_vendor
+  - gz_msgs_vendor
+  - gz_tools_vendor
+  - gz_utils_vendor
+  repository: https://github.com/gazebo-release/gz_fuel_tools_vendor
+  tag: release/rolling/gz_fuel_tools_vendor/0.4.1-1
   url: https://github.com/ros2-gbp/gz_fuel_tools_vendor-release.git
-  version: 0.4.0
+  version: 0.4.1
 gz_gui_vendor:
-  tag: release/rolling/gz_gui_vendor/0.4.0-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_common_vendor
+  - gz_math_vendor
+  - gz_msgs_vendor
+  - gz_plugin_vendor
+  - gz_rendering_vendor
+  - gz_tools_vendor
+  - gz_transport_vendor
+  - gz_utils_vendor
+  repository: https://github.com/gazebo-release/gz_gui_vendor
+  tag: release/rolling/gz_gui_vendor/0.4.1-1
   url: https://github.com/ros2-gbp/gz_gui_vendor-release.git
-  version: 0.4.0
-gz_launch_vendor:
-  tag: release/rolling/gz_launch_vendor/0.4.1-1
-  url: https://github.com/ros2-gbp/gz_launch_vendor-release.git
   version: 0.4.1
 gz_math_vendor:
-  tag: release/rolling/gz_math_vendor/0.5.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_utils_vendor
+  repository: https://github.com/gazebo-release/gz_math_vendor
+  tag: release/rolling/gz_math_vendor/0.5.2-1
   url: https://github.com/ros2-gbp/gz_math_vendor-release.git
-  version: 0.5.1
+  version: 0.5.2
 gz_msgs_vendor:
-  tag: release/rolling/gz_msgs_vendor/0.4.1-2
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_math_vendor
+  - gz_tools_vendor
+  repository: https://github.com/gazebo-release/gz_msgs_vendor
+  tag: release/rolling/gz_msgs_vendor/0.4.2-1
   url: https://github.com/ros2-gbp/gz_msgs_vendor-release.git
-  version: 0.4.1
+  version: 0.4.2
 gz_ogre_next_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - gz_cmake_vendor
+  repository: https://github.com/gazebo-release/gz_ogre_next_vendor
   tag: release/rolling/gz_ogre_next_vendor/0.2.1-1
   url: https://github.com/ros2-gbp/gz_ogre_next_vendor-release.git
   version: 0.2.1
 gz_physics_vendor:
-  tag: release/rolling/gz_physics_vendor/0.5.2-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_common_vendor
+  - gz_dartsim_vendor
+  - gz_math_vendor
+  - gz_plugin_vendor
+  - gz_utils_vendor
+  - sdformat_vendor
+  repository: https://github.com/gazebo-release/gz_physics_vendor
+  tag: release/rolling/gz_physics_vendor/0.5.3-1
   url: https://github.com/ros2-gbp/gz_physics_vendor-release.git
-  version: 0.5.2
+  version: 0.5.3
 gz_plugin_vendor:
-  tag: release/rolling/gz_plugin_vendor/0.4.0-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_tools_vendor
+  - gz_utils_vendor
+  repository: https://github.com/gazebo-release/gz_plugin_vendor
+  tag: release/rolling/gz_plugin_vendor/0.4.1-1
   url: https://github.com/ros2-gbp/gz_plugin_vendor-release.git
-  version: 0.4.0
+  version: 0.4.1
 gz_rendering_vendor:
-  tag: release/rolling/gz_rendering_vendor/0.5.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_common_vendor
+  - gz_math_vendor
+  - gz_ogre_next_vendor
+  - gz_plugin_vendor
+  - gz_utils_vendor
+  repository: https://github.com/gazebo-release/gz_rendering_vendor
+  tag: release/rolling/gz_rendering_vendor/0.5.2-1
   url: https://github.com/ros2-gbp/gz_rendering_vendor-release.git
-  version: 0.5.1
+  version: 0.5.2
 gz_ros2_control:
-  tag: release/rolling/gz_ros2_control/4.0.0-1
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - gz_plugin_vendor
+  - gz_sim_vendor
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - yaml_cpp_vendor
+  repository: https://github.com/ros-controls/gz_ros2_control
+  tag: release/rolling/gz_ros2_control/4.0.1-1
   url: https://github.com/ros2-gbp/ign_ros2_control-release.git
-  version: 4.0.0
+  version: 4.0.1
 gz_ros2_control_demos:
-  tag: release/rolling/gz_ros2_control_demos/4.0.0-1
+  dependencies:
+  - ackermann_steering_controller
+  - ament_cmake
+  - ament_index_python
+  - control_msgs
+  - control_toolbox
+  - diff_drive_controller
+  - force_torque_sensor_broadcaster
+  - forward_command_controller
+  - geometry_msgs
+  - gz_ros2_control
+  - gz_sim_vendor
+  - hardware_interface
+  - imu_sensor_broadcaster
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - launch
+  - launch_ros
+  - mecanum_drive_controller
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_lifecycle
+  - robot_state_publisher
+  - ros2_control_cmake
+  - ros2controlcli
+  - ros2launch
+  - ros_gz_bridge
+  - ros_gz_sim
+  - std_msgs
+  - tricycle_controller
+  - xacro
+  repository: https://github.com/ros-controls/gz_ros2_control
+  tag: release/rolling/gz_ros2_control_demos/4.0.1-1
   url: https://github.com/ros2-gbp/ign_ros2_control-release.git
-  version: 4.0.0
+  version: 4.0.1
 gz_sensors_vendor:
-  tag: release/rolling/gz_sensors_vendor/0.4.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_common_vendor
+  - gz_math_vendor
+  - gz_msgs_vendor
+  - gz_rendering_vendor
+  - gz_tools_vendor
+  - gz_transport_vendor
+  - gz_utils_vendor
+  - sdformat_vendor
+  repository: https://github.com/gazebo-release/gz_sensors_vendor
+  tag: release/rolling/gz_sensors_vendor/0.4.2-1
   url: https://github.com/ros2-gbp/gz_sensors_vendor-release.git
-  version: 0.4.1
+  version: 0.4.2
 gz_sim_vendor:
-  tag: release/rolling/gz_sim_vendor/0.5.2-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_common_vendor
+  - gz_fuel_tools_vendor
+  - gz_gui_vendor
+  - gz_math_vendor
+  - gz_msgs_vendor
+  - gz_physics_vendor
+  - gz_plugin_vendor
+  - gz_rendering_vendor
+  - gz_sensors_vendor
+  - gz_tools_vendor
+  - gz_transport_vendor
+  - gz_utils_vendor
+  - sdformat_vendor
+  repository: https://github.com/gazebo-release/gz_sim_vendor
+  tag: release/rolling/gz_sim_vendor/0.5.3-1
   url: https://github.com/ros2-gbp/gz_sim_vendor-release.git
-  version: 0.5.2
+  version: 0.5.3
 gz_tools_vendor:
-  tag: release/rolling/gz_tools_vendor/0.3.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  repository: https://github.com/gazebo-release/gz_tools_vendor
+  tag: release/rolling/gz_tools_vendor/0.3.2-1
   url: https://github.com/ros2-gbp/gz_tools_vendor-release.git
-  version: 0.3.1
+  version: 0.3.2
 gz_transport_vendor:
-  tag: release/rolling/gz_transport_vendor/0.4.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_math_vendor
+  - gz_msgs_vendor
+  - gz_tools_vendor
+  - gz_utils_vendor
+  - zenoh_cpp_vendor
+  repository: https://github.com/gazebo-release/gz_transport_vendor
+  tag: release/rolling/gz_transport_vendor/0.4.2-1
   url: https://github.com/ros2-gbp/gz_transport_vendor-release.git
-  version: 0.4.1
+  version: 0.4.2
 gz_utils_vendor:
-  tag: release/rolling/gz_utils_vendor/0.5.0-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - spdlog_vendor
+  repository: https://github.com/gazebo-release/gz_utils_vendor
+  tag: release/rolling/gz_utils_vendor/0.5.1-1
   url: https://github.com/ros2-gbp/gz_utils_vendor-release.git
-  version: 0.5.0
+  version: 0.5.1
 hardware_interface:
-  tag: release/rolling/hardware_interface/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - joint_limits
+  - lifecycle_msgs
+  - pal_statistics
+  - pluginlib
+  - rclcpp_lifecycle
+  - rcpputils
+  - rcutils
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sdformat_urdf
+  - urdf
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/hardware_interface/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 hardware_interface_testing:
-  tag: release/rolling/hardware_interface_testing/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - control_msgs
+  - hardware_interface
+  - lifecycle_msgs
+  - pluginlib
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/hardware_interface_testing/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 hash_library_vendor:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/tier4/hash_library_vendor
   tag: release/rolling/hash_library_vendor/0.1.1-7
   url: https://github.com/ros2-gbp/hash_library_vendor-release.git
   version: 0.1.1
 hatchbed_common:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cpplint
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/hatchbed/hatchbed_common
   tag: release/rolling/hatchbed_common/0.1.8-1
   url: https://github.com/ros2-gbp/hatchbed_common-release.git
   version: 0.1.8
 heaphook:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - tlsf
+  repository: https://github.com/tier4/heaphook
   tag: release/rolling/heaphook/0.1.1-3
   url: https://github.com/ros2-gbp/heaphook-release.git
   version: 0.1.1
 hebi_cpp_api:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/HebiRobotics/hebi_cpp_api_ros
   tag: release/rolling/hebi_cpp_api/3.16.0-2
   url: https://github.com/ros2-gbp/hebi_cpp_api-release.git
   version: 3.16.0
 hls_lfcd_lds_driver:
+  dependencies:
+  - ament_cmake
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/ROBOTIS-GIT/hls_lfcd_lds_driver
   tag: release/rolling/hls_lfcd_lds_driver/2.1.1-2
   url: https://github.com/ros2-gbp/hls_lfcd_lds_driver-release.git
   version: 2.1.1
 hri:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - geometry_msgs
+  - hri_msgs
+  - magic_enum
+  - rclcpp
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/ros4hri/libhri
   tag: release/rolling/hri/2.9.0-2
   url: https://github.com/ros2-gbp/libhri-release.git
   version: 2.9.0
 hri_actions_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros4hri/hri_actions_msgs
   tag: release/rolling/hri_actions_msgs/2.5.0-2
   url: https://github.com/ros2-gbp/hri_actions_msgs-release.git
   version: 2.5.0
 hri_msgs:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  repository: https://github.com/ros4hri/hri_msgs
   tag: release/rolling/hri_msgs/2.3.2-2
   url: https://github.com/ros2-gbp/hri_msgs-release.git
   version: 2.3.2
 hri_rviz:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - hri
+  - hri_msgs
+  - rclcpp
+  - rcpputils
+  - rviz_common
+  - rviz_default_plugins
+  - rviz_ogre_vendor
+  - sensor_msgs
+  repository: https://github.com/ros4hri/hri_rviz
   tag: release/rolling/hri_rviz/2.3.0-2
   url: https://github.com/ros2-gbp/hri_rviz-release.git
   version: 2.3.0
 human_description:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - launch_pal
+  - launch_param_builder
+  - launch_ros
+  - launch_testing_ament_cmake
+  - robot_state_publisher
+  - urdf_test
+  - xacro
+  repository: https://github.com/ros4hri/human_description
   tag: release/rolling/human_description/2.0.2-2
   url: https://github.com/ros2-gbp/human_description-release.git
   version: 2.0.2
 ibeo_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/ibeo_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 iceoryx_binding_c:
+  dependencies:
+  - iceoryx_hoofs
+  - iceoryx_posh
+  repository: https://github.com/eclipse-iceoryx/iceoryx
   tag: release/rolling/iceoryx_binding_c/2.0.6-1
   url: https://github.com/ros2-gbp/iceoryx-release.git
   version: 2.0.6
 iceoryx_hoofs:
+  dependencies: []
+  repository: https://github.com/eclipse-iceoryx/iceoryx
   tag: release/rolling/iceoryx_hoofs/2.0.6-1
   url: https://github.com/ros2-gbp/iceoryx-release.git
   version: 2.0.6
 iceoryx_introspection:
+  dependencies:
+  - iceoryx_hoofs
+  - iceoryx_posh
+  repository: https://github.com/eclipse-iceoryx/iceoryx
   tag: release/rolling/iceoryx_introspection/2.0.6-1
   url: https://github.com/ros2-gbp/iceoryx-release.git
   version: 2.0.6
 iceoryx_posh:
+  dependencies:
+  - iceoryx_hoofs
+  repository: https://github.com/eclipse-iceoryx/iceoryx
   tag: release/rolling/iceoryx_posh/2.0.6-1
   url: https://github.com/ros2-gbp/iceoryx-release.git
   version: 2.0.6
 ifm3d_core:
+  dependencies:
+  - cv_bridge
   tag: release/rolling/ifm3d_core/0.18.0-10
   url: https://github.com/ros2-gbp/ifm3d-release.git
   version: 0.18.0
 image_common:
-  tag: release/rolling/image_common/7.0.3-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_calibration_parsers
+  - camera_info_manager
+  - image_transport
+  repository: https://github.com/ros-perception/image_common
+  tag: release/rolling/image_common/7.0.4-1
   url: https://github.com/ros2-gbp/image_common-release.git
-  version: 7.0.3
+  version: 7.0.4
 image_geometry:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros
+  - sensor_msgs
+  repository: https://github.com/ros-perception/vision_opencv
   tag: release/rolling/image_geometry/4.1.0-2
   url: https://github.com/ros2-gbp/vision_opencv-release.git
   version: 4.1.0
 image_pipeline:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - camera_calibration
+  - depth_image_proc
+  - image_proc
+  - image_publisher
+  - image_rotate
+  - image_view
+  - stereo_image_proc
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/image_pipeline/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 image_proc:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_calibration_parsers
+  - cv_bridge
+  - geometry_msgs
+  - image_geometry
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tracetools_image_pipeline
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/image_proc/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 image_publisher:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_info_manager
+  - cv_bridge
+  - image_transport
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/image_publisher/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 image_rotate:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - cv_bridge
+  - geometry_msgs
+  - image_transport
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/image_rotate/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 image_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_components
+  - rmw_implementation_cmake
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/image_tools/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 image_transport:
-  tag: release/rolling/image_transport/7.0.3-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  repository: https://github.com/ros-perception/image_common
+  tag: release/rolling/image_transport/7.0.4-1
   url: https://github.com/ros2-gbp/image_common-release.git
-  version: 7.0.3
+  version: 7.0.4
 image_transport_plugins:
+  dependencies:
+  - ament_cmake
+  - compressed_depth_image_transport
+  - compressed_image_transport
+  - theora_image_transport
+  - zstd_image_transport
+  repository: https://github.com/ros-perception/image_transport_plugins
   tag: release/rolling/image_transport_plugins/7.0.1-1
   url: https://github.com/ros2-gbp/image_transport_plugins-release.git
   version: 7.0.1
 image_transport_py:
-  tag: release/rolling/image_transport_py/7.0.3-1
+  dependencies:
+  - ament_cmake_python
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - image_transport
+  - rclcpp
+  - rpyutils
+  - sensor_msgs
+  repository: https://github.com/ros-perception/image_common
+  tag: release/rolling/image_transport_py/7.0.4-1
   url: https://github.com/ros2-gbp/image_common-release.git
-  version: 7.0.3
+  version: 7.0.4
 image_view:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_calibration_parsers
+  - cv_bridge
+  - image_transport
+  - message_filters
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - sensor_msgs
+  - std_srvs
+  - stereo_msgs
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/image_view/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 imu_complementary_filter:
-  tag: release/rolling/imu_complementary_filter/2.2.4-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - geometry_msgs
+  - message_filters
+  - rclcpp
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/CCNYRoboticsLab/imu_tools
+  tag: release/rolling/imu_complementary_filter/2.2.5-1
   url: https://github.com/ros2-gbp/imu_tools-release.git
-  version: 2.2.4
+  version: 2.2.5
 imu_filter_madgwick:
-  tag: release/rolling/imu_filter_madgwick/2.2.4-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - builtin_interfaces
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/CCNYRoboticsLab/imu_tools
+  tag: release/rolling/imu_filter_madgwick/2.2.5-1
   url: https://github.com/ros2-gbp/imu_tools-release.git
-  version: 2.2.4
+  version: 2.2.5
 imu_pipeline:
+  dependencies:
+  - ament_cmake
+  - imu_processors
+  - imu_transformer
+  repository: https://github.com/ros-perception/imu_pipeline
   tag: release/rolling/imu_pipeline/0.6.1-2
   url: https://github.com/ros2-gbp/imu_pipeline-release.git
   version: 0.6.1
 imu_processors:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cpplint
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2_ros
+  repository: https://github.com/ros-perception/imu_pipeline
   tag: release/rolling/imu_processors/0.6.1-2
   url: https://github.com/ros2-gbp/imu_pipeline-release.git
   version: 0.6.1
 imu_sensor_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/imu_sensor_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 imu_tools:
-  tag: release/rolling/imu_tools/2.2.4-2
+  dependencies:
+  - ament_cmake
+  - imu_complementary_filter
+  - imu_filter_madgwick
+  - rviz_imu_plugin
+  repository: https://github.com/CCNYRoboticsLab/imu_tools
+  tag: release/rolling/imu_tools/2.2.5-1
   url: https://github.com/ros2-gbp/imu_tools-release.git
-  version: 2.2.4
+  version: 2.2.5
 imu_transformer:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - geometry_msgs
+  - message_filters
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2_geometry_msgs
+  - tf2_ros
+  - tf2_sensor_msgs
+  repository: https://github.com/ros-perception/imu_pipeline
   tag: release/rolling/imu_transformer/0.6.1-2
   url: https://github.com/ros2-gbp/imu_pipeline-release.git
   version: 0.6.1
+int2dds_ffi_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/IntellectusCorp/rmw_int2dds
+  tag: release/rolling/int2dds_ffi_vendor/0.1.5-1
+  url: https://github.com/ros2-gbp/rmw_int2dds-release.git
+  version: 0.1.5
 interactive_markers:
-  tag: release/rolling/interactive_markers/2.9.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rclcpp
+  - rclpy
+  - rcutils
+  - rmw
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - visualization_msgs
+  repository: https://github.com/ros-visualization/interactive_markers
+  tag: release/rolling/interactive_markers/2.9.2-1
   url: https://github.com/ros2-gbp/interactive_markers-release.git
-  version: 2.9.1
+  version: 2.9.2
 intra_process_demo:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rmw_implementation_cmake
+  - sensor_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/intra_process_demo/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 inverse_dynamics_solver:
+  dependencies:
+  - ament_cmake
+  - pluginlib
+  - rclcpp
+  - rosbag2_cpp
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - sensor_msgs
+  - urdf
+  repository: https://github.com/unisa-acg/inverse-dynamics-solver
   tag: release/rolling/inverse_dynamics_solver/6.0.1-4
   url: https://github.com/ros2-gbp/inverse_dynamics_solver-release.git
   version: 6.0.1
 io_context:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - asio_cmake_module
+  - rclcpp
+  - std_msgs
+  - udp_msgs
+  repository: https://github.com/ros-drivers/transport_drivers
   tag: release/rolling/io_context/1.2.0-4
   url: https://github.com/ros2-gbp/transport_drivers-release.git
   version: 1.2.0
 irobot_create_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/iRobotEducation/irobot_create_msgs
   tag: release/rolling/irobot_create_msgs/2.1.0-4
   url: https://github.com/ros2-gbp/irobot_create_msgs-release.git
   version: 2.1.0
 jacro:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_index_python
+  - std_msgs
+  repository: https://github.com/JafarAbdi/jacro
   tag: release/rolling/jacro/0.2.0-3
   url: https://github.com/ros2-gbp/jacro-release.git
   version: 0.2.0
 joint_limits:
-  tag: release/rolling/joint_limits/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gmock
+  - backward_ros
+  - generate_parameter_library
+  - launch_ros
+  - launch_testing_ament_cmake
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - trajectory_msgs
+  - urdf
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/joint_limits/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 joint_state_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - builtin_interfaces
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  - urdf
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/joint_state_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 joint_state_publisher:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2topic
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros/joint_state_publisher
   tag: release/rolling/joint_state_publisher/2.4.3-1
   url: https://github.com/ros2-gbp/joint_state_publisher-release.git
   version: 2.4.3
 joint_state_publisher_gui:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - joint_state_publisher
+  - python_qt_binding
+  - rclpy
+  repository: https://github.com/ros/joint_state_publisher
   tag: release/rolling/joint_state_publisher_gui/2.4.3-1
   url: https://github.com/ros2-gbp/joint_state_publisher-release.git
   version: 2.4.3
 joint_state_topic_hardware_interface:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_ros
+  - angles
+  - control_msgs
+  - controller_manager
+  - forward_command_controller
+  - hardware_interface
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - rclcpp
+  - rclpy
+  - robot_state_publisher
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  - topic_tools
+  - xacro
+  repository: https://github.com/ros-controls/topic_based_hardware_interfaces
   tag: release/rolling/joint_state_topic_hardware_interface/1.1.0-1
   url: https://github.com/ros2-gbp/topic_based_hardware-release.git
   version: 1.1.0
 joint_trajectory_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - angles
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - rsl
+  - trajectory_msgs
+  - urdf
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/joint_trajectory_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 joy:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - sdl2_vendor
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/joystick_drivers
   tag: release/rolling/joy/3.3.0-3
   url: https://github.com/ros2-gbp/joystick_drivers-release.git
   version: 3.3.0
 joy_linux:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - diagnostic_updater
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/joystick_drivers
   tag: release/rolling/joy_linux/3.3.0-3
   url: https://github.com/ros2-gbp/joystick_drivers-release.git
   version: 3.3.0
 joy_teleop:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - control_msgs
+  - example_interfaces
+  - geometry_msgs
+  - launch_ros
+  - launch_testing
+  - rclpy
+  - rosidl_runtime_py
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - teleop_tools_msgs
+  - test_msgs
+  - trajectory_msgs
+  repository: https://github.com/ros-teleop/teleop_tools
   tag: release/rolling/joy_teleop/2.0.0-2
   url: https://github.com/ros2-gbp/teleop_tools-release.git
   version: 2.0.0
 joy_tester:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - rclpy
+  - sensor_msgs
+  repository: https://github.com/joshnewans/joy_tester
   tag: release/rolling/joy_tester/0.0.2-4
   url: https://github.com/ros2-gbp/joy_tester-release.git
   version: 0.0.2
 jrl_cmakemodules:
+  dependencies: []
+  repository: https://github.com/jrl-umi3218/jrl-cmakemodules
   tag: release/rolling/jrl_cmakemodules/2.3.0-1
   url: https://github.com/ros2-gbp/jrl_cmakemodules-release.git
   version: 2.3.0
 kartech_linear_actuator_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/kartech_linear_actuator_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 kdl_inverse_dynamics_solver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - inverse_dynamics_solver
+  - kdl_parser
+  - pluginlib
+  - rclcpp
+  - ros_testing
+  - ur_description
+  repository: https://github.com/unisa-acg/inverse-dynamics-solver
   tag: release/rolling/kdl_inverse_dynamics_solver/6.0.1-4
   url: https://github.com/ros2-gbp/inverse_dynamics_solver-release.git
   version: 6.0.1
 kdl_parser:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - rcutils
+  - urdf
+  - urdfdom_headers
+  repository: https://github.com/ros/kdl_parser
   tag: release/rolling/kdl_parser/3.1.0-1
   url: https://github.com/ros2-gbp/kdl_parser-release.git
   version: 3.1.0
 kdl_parser_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - python_orocos_kdl_vendor
+  - urdfdom_py
+  repository: https://github.com/ros/kdl_parser_py
   tag: release/rolling/kdl_parser_py/3.0.0-2
   url: https://github.com/ros2-gbp/kdl_parser_py-release.git
   version: 3.0.0
 key_teleop:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - geometry_msgs
+  - rclpy
+  repository: https://github.com/ros-teleop/teleop_tools
   tag: release/rolling/key_teleop/2.0.0-2
   url: https://github.com/ros2-gbp/teleop_tools-release.git
   version: 2.0.0
 keyboard_handler:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-tooling/keyboard_handler
   tag: release/rolling/keyboard_handler/0.6.0-1
   url: https://github.com/ros2-gbp/keyboard_handler-release.git
   version: 0.6.0
 kinematics_interface:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/kinematics_interface
   tag: release/rolling/kinematics_interface/2.4.2-1
   url: https://github.com/ros2-gbp/kinematics_interface-release.git
   version: 2.4.2
 kinematics_interface_kdl:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - eigen3_cmake_module
+  - kdl_parser
+  - kinematics_interface
+  - pluginlib
+  - ros2_control_cmake
+  - tf2_eigen_kdl
+  repository: https://github.com/ros-controls/kinematics_interface
   tag: release/rolling/kinematics_interface_kdl/2.4.2-1
   url: https://github.com/ros2-gbp/kinematics_interface-release.git
   version: 2.4.2
 kinematics_interface_pinocchio:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - eigen3_cmake_module
+  - kinematics_interface
+  - pinocchio
+  - pluginlib
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/kinematics_interface
   tag: release/rolling/kinematics_interface_pinocchio/2.4.2-1
   url: https://github.com/ros2-gbp/kinematics_interface-release.git
   version: 2.4.2
 kinova_gen3_6dof_robotiq_2f_85_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - joint_trajectory_controller
+  - kortex_description
+  - moveit_configs_utils
+  - moveit_kinematics
+  - moveit_planners
+  - moveit_ros_move_group
+  - moveit_ros_visualization
+  - moveit_ros_warehouse
+  - moveit_setup_assistant
+  - moveit_simple_controller_manager
+  - picknik_reset_fault_controller
+  - picknik_twist_controller
+  - robot_state_publisher
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - tf2_ros
+  - xacro
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kinova_gen3_6dof_robotiq_2f_85_moveit_config/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 kinova_gen3_7dof_robotiq_2f_85_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - joint_trajectory_controller
+  - kortex_description
+  - moveit_configs_utils
+  - moveit_kinematics
+  - moveit_planners
+  - moveit_ros_move_group
+  - moveit_ros_visualization
+  - moveit_ros_warehouse
+  - moveit_setup_assistant
+  - moveit_simple_controller_manager
+  - picknik_reset_fault_controller
+  - picknik_twist_controller
+  - robot_state_publisher
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - tf2_ros
+  - xacro
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kinova_gen3_7dof_robotiq_2f_85_moveit_config/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 kinova_gen3_lite_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - kortex_description
+  - moveit_configs_utils
+  - moveit_kinematics
+  - moveit_planners
+  - moveit_ros_move_group
+  - moveit_ros_visualization
+  - moveit_ros_warehouse
+  - moveit_setup_assistant
+  - moveit_simple_controller_manager
+  - picknik_reset_fault_controller
+  - picknik_twist_controller
+  - robot_state_publisher
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - tf2_ros
+  - xacro
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kinova_gen3_lite_moveit_config/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 kitti_metrics_eval:
+  dependencies:
+  - mola_common
+  - mrpt_libmath
+  - mrpt_libposes
+  - mrpt_libtclap
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/kitti_metrics_eval/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 kobuki_core:
+  dependencies:
+  - ament_cmake_ros
+  - ecl_build
+  - ecl_command_line
+  - ecl_config
+  - ecl_console
+  - ecl_converters
+  - ecl_devices
+  - ecl_geometry
+  - ecl_mobile_robot
+  - ecl_sigslots
+  - ecl_threads
+  - ecl_time
+  repository: https://github.com/kobuki-base/kobuki_core
   tag: release/rolling/kobuki_core/1.4.0-4
   url: https://github.com/ros2-gbp/kobuki_core-release.git
   version: 1.4.0
 kobuki_ros_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/kobuki-base/kobuki_ros_interfaces
   tag: release/rolling/kobuki_ros_interfaces/1.0.0-5
   url: https://github.com/ros2-gbp/kobuki_ros_interfaces-release.git
   version: 1.0.0
 kobuki_velocity_smoother:
+  dependencies:
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_ros
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ecl_build
+  - geometry_msgs
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - nav_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - ros2test
+  repository: https://github.com/kobuki-base/kobuki_velocity_smoother
   tag: release/rolling/kobuki_velocity_smoother/0.15.1-2
   url: https://github.com/ros2-gbp/kobuki_velocity_smoother-release.git
   version: 0.15.1
 kompass:
+  dependencies:
+  - automatika_ros_sugar
+  - kompass_interfaces
+  repository: https://github.com/automatika-robotics/kompass
   tag: release/rolling/kompass/0.6.0-1
   url: https://github.com/ros2-gbp/kompass-release.git
   version: 0.6.0
 kompass_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/automatika-robotics/kompass
   tag: release/rolling/kompass_interfaces/0.6.0-1
   url: https://github.com/ros2-gbp/kompass-release.git
   version: 0.6.0
 kortex_api:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kortex_api/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 kortex_bringup:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - controller_manager
+  - joint_state_broadcaster
+  - joint_state_publisher
+  - joint_trajectory_controller
+  - kortex_description
+  - kortex_driver
+  - launch
+  - launch_ros
+  - parallel_gripper_controller
+  - rclpy
+  - robotiq_description
+  - ros_gz_bridge
+  - ros_gz_sim
+  - rviz2
+  - urdf
+  - xacro
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kortex_bringup/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 kortex_description:
+  dependencies:
+  - ament_cmake
+  - gz_ros2_control
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - joint_trajectory_controller
+  - parallel_gripper_controller
+  - picknik_reset_fault_controller
+  - picknik_twist_controller
+  - robot_state_publisher
+  - robotiq_description
+  - rviz2
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kortex_description/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 kortex_driver:
+  dependencies:
+  - ament_cmake
+  - hardware_interface
+  - kortex_api
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/Kinovarobotics/ros2_kortex
   tag: release/rolling/kortex_driver/0.2.5-2
   url: https://github.com/ros2-gbp/ros2_kortex-release.git
   version: 0.2.5
 lanelet2:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - lanelet2_examples
+  - lanelet2_io
+  - lanelet2_maps
+  - lanelet2_matching
+  - lanelet2_projection
+  - lanelet2_python
+  - lanelet2_routing
+  - lanelet2_traffic_rules
+  - lanelet2_validation
+  - ros_environment
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_core:
+  dependencies:
+  - ament_cmake_core
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_core/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_examples:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - lanelet2_io
+  - lanelet2_matching
+  - lanelet2_projection
+  - lanelet2_python
+  - lanelet2_routing
+  - lanelet2_traffic_rules
+  - mrt_cmake_modules
+  - ros2cli
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_examples/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_io:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_io/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_maps:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_maps/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_matching:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - lanelet2_io
+  - lanelet2_maps
+  - lanelet2_projection
+  - lanelet2_traffic_rules
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_matching/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_projection:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_io
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_projection/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_python:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - lanelet2_io
+  - lanelet2_matching
+  - lanelet2_projection
+  - lanelet2_routing
+  - lanelet2_traffic_rules
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_python/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_routing:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - lanelet2_traffic_rules
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_routing/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_traffic_rules:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_traffic_rules/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 lanelet2_validation:
+  dependencies:
+  - ament_cmake_core
+  - lanelet2_core
+  - lanelet2_io
+  - lanelet2_maps
+  - lanelet2_projection
+  - lanelet2_routing
+  - lanelet2_traffic_rules
+  - mrt_cmake_modules
+  repository: https://github.com/fzi-forschungszentrum-informatik/lanelet2
   tag: release/rolling/lanelet2_validation/1.2.1-7
   url: https://github.com/ros2-gbp/lanelet2-release.git
   version: 1.2.1
 laser_filters:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - angles
+  - diagnostic_msgs
+  - diagnostic_updater
+  - filters
+  - laser_geometry
+  - launch_testing_ament_cmake
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_kdl
+  - tf2_ros
+  repository: https://github.com/ros-perception/laser_filters
   tag: release/rolling/laser_filters/2.3.2-2
   url: https://github.com/ros2-gbp/laser_filters-release.git
   version: 2.3.2
 laser_geometry:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - rclcpp
+  - rclpy
+  - sensor_msgs
+  - sensor_msgs_py
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/ros-perception/laser_geometry
   tag: release/rolling/laser_geometry/3.0.1-1
   url: https://github.com/ros2-gbp/laser_geometry-release.git
   version: 3.0.1
 laser_proc:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-perception/laser_proc
   tag: release/rolling/laser_proc/1.0.3-2
   url: https://github.com/ros2-gbp/laser_proc-release.git
   version: 1.0.3
 laser_segmentation:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - slg_msgs
+  - visualization_msgs
+  repository: https://github.com/ajtudela/laser_segmentation
   tag: release/rolling/laser_segmentation/3.0.2-2
   url: https://github.com/ros2-gbp/laser_segmentation-release.git
   version: 3.0.2
 launch:
-  tag: release/rolling/launch/3.10.0-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ros2/launch
+  tag: release/rolling/launch/3.10.1-1
   url: https://github.com/ros2-gbp/launch-release.git
-  version: 3.10.0
+  version: 3.10.1
 launch_frontend_py:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_mypy
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_copyright
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  repository: https://github.com/ros-tooling/launch_frontend_py
   tag: release/rolling/launch_frontend_py/0.1.0-3
   url: https://github.com/ros2-gbp/launch_frontend_py-release.git
   version: 0.1.0
 launch_pal:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - launch
+  - launch_ros
+  repository: https://github.com/pal-robotics/launch_pal
   tag: release/rolling/launch_pal/0.20.3-2
   url: https://github.com/ros2-gbp/launch_pal-release.git
   version: 0.20.3
 launch_param_builder:
+  dependencies:
+  - ament_copyright
+  - ament_index_python
+  - rclpy
+  - xacro
+  repository: https://github.com/PickNikRobotics/launch_param_builder
   tag: release/rolling/launch_param_builder/0.1.1-4
   url: https://github.com/ros2-gbp/launch_param_builder-release.git
   version: 0.1.1
 launch_pytest:
-  tag: release/rolling/launch_pytest/3.10.0-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_testing
+  repository: https://github.com/ros2/launch
+  tag: release/rolling/launch_pytest/3.10.1-1
   url: https://github.com/ros2-gbp/launch-release.git
-  version: 3.10.0
+  version: 3.10.1
 launch_ros:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - composition_interfaces
+  - launch
+  - lifecycle_msgs
+  - rclpy
+  repository: https://github.com/ros2/launch_ros
   tag: release/rolling/launch_ros/0.30.1-1
   url: https://github.com/ros2-gbp/launch_ros-release.git
   version: 0.30.1
 launch_system_modes:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - launch
+  - osrf_pycommon
+  - rclpy
+  - system_modes_msgs
+  repository: https://github.com/micro-ROS/system_modes
   tag: release/rolling/launch_system_modes/0.9.0-6
   url: https://github.com/ros2-gbp/system_modes-release.git
   version: 0.9.0
 launch_testing:
-  tag: release/rolling/launch_testing/3.10.0-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_xml
+  - launch_yaml
+  repository: https://github.com/ros2/launch
+  tag: release/rolling/launch_testing/3.10.1-1
   url: https://github.com/ros2-gbp/launch-release.git
-  version: 3.10.0
+  version: 3.10.1
 launch_testing_ament_cmake:
-  tag: release/rolling/launch_testing_ament_cmake/3.10.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_test
+  - launch_testing
+  repository: https://github.com/ros2/launch
+  tag: release/rolling/launch_testing_ament_cmake/3.10.1-1
   url: https://github.com/ros2-gbp/launch-release.git
-  version: 3.10.0
+  version: 3.10.1
 launch_testing_examples:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - demo_nodes_cpp
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rcl_interfaces
+  - rclpy
+  - ros2bag
+  - std_msgs
+  repository: https://github.com/ros2/examples
   tag: release/rolling/launch_testing_examples/0.22.0-1
   url: https://github.com/ros2-gbp/examples-release.git
   version: 0.22.0
 launch_testing_ros:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch_ros
+  - launch_testing
+  - rclpy
+  - rmw_test_fixture_implementation
+  - std_msgs
+  repository: https://github.com/ros2/launch_ros
   tag: release/rolling/launch_testing_ros/0.30.1-1
   url: https://github.com/ros2-gbp/launch_ros-release.git
   version: 0.30.1
 launch_xml:
-  tag: release/rolling/launch_xml/3.10.0-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  repository: https://github.com/ros2/launch
+  tag: release/rolling/launch_xml/3.10.1-1
   url: https://github.com/ros2-gbp/launch-release.git
-  version: 3.10.0
+  version: 3.10.1
 launch_yaml:
-  tag: release/rolling/launch_yaml/3.10.0-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  repository: https://github.com/ros2/launch
+  tag: release/rolling/launch_yaml/3.10.1-1
   url: https://github.com/ros2-gbp/launch-release.git
-  version: 3.10.0
+  version: 3.10.1
 ld08_driver:
+  dependencies:
+  - ament_cmake
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/ROBOTIS-GIT/ld08_driver
   tag: release/rolling/ld08_driver/1.1.4-2
   url: https://github.com/ros2-gbp/ld08_driver-release.git
   version: 1.1.4
 lely_core_libraries:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-industrial/ros2_canopen
   tag: release/rolling/lely_core_libraries/0.3.4-1
   url: https://github.com/ros2-gbp/ros2_canopen-release.git
   version: 0.3.4
 leo:
+  dependencies:
+  - ament_cmake
+  - leo_description
+  - leo_msgs
+  - leo_teleop
+  repository: https://github.com/LeoRover/leo_common-ros2
   tag: release/rolling/leo/3.2.0-2
   url: https://github.com/ros2-gbp/leo_common-release.git
   version: 3.2.0
 leo_bringup:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_black
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_index_python
+  - ament_lint_auto
+  - geometry_msgs
+  - image_proc
+  - launch
+  - launch_ros
+  - leo_description
+  - leo_filters
+  - leo_fw
+  - leo_msgs
+  - rclpy
+  - robot_state_publisher
+  - rosapi
+  - rosbridge_server
+  - sensor_msgs
+  - tf_transformations
+  - web_video_server
+  - xacro
+  repository: https://github.com/LeoRover/leo_robot-ros2
   tag: release/rolling/leo_bringup/2.6.1-1
   url: https://github.com/ros2-gbp/leo_robot-release.git
   version: 2.6.1
 leo_description:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - robot_state_publisher
+  - xacro
+  repository: https://github.com/LeoRover/leo_common-ros2
   tag: release/rolling/leo_description/3.2.0-2
   url: https://github.com/ros2-gbp/leo_common-release.git
   version: 3.2.0
 leo_desktop:
+  dependencies:
+  - ament_cmake
+  - leo
+  - leo_viz
+  repository: https://github.com/LeoRover/leo_desktop-ros2
   tag: release/rolling/leo_desktop/3.0.0-3
   url: https://github.com/ros2-gbp/leo_desktop-release.git
   version: 3.0.0
 leo_filters:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - generate_parameter_library
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_srvs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/LeoRover/leo_robot-ros2
   tag: release/rolling/leo_filters/2.6.1-1
   url: https://github.com/ros2-gbp/leo_robot-release.git
   version: 2.6.1
 leo_fw:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_black
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_mypy
+  - ament_cmake_pep257
+  - ament_cmake_python
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_index_python
+  - ament_lint_auto
+  - geometry_msgs
+  - leo_msgs
+  - nav_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - ros2cli
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/LeoRover/leo_robot-ros2
   tag: release/rolling/leo_fw/2.6.1-1
   url: https://github.com/ros2-gbp/leo_robot-release.git
   version: 2.6.1
 leo_gz_bringup:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_black
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_mypy
+  - ament_cmake_xmllint
+  - ament_index_python
+  - ament_lint_auto
+  - launch
+  - launch_ros
+  - leo_description
+  - leo_gz_plugins
+  - leo_gz_worlds
+  - robot_state_publisher
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_sim
+  - xacro
+  repository: https://github.com/LeoRover/leo_simulator-ros2
   tag: release/rolling/leo_gz_bringup/2.0.2-2
   url: https://github.com/ros2-gbp/leo_simulator-release.git
   version: 2.0.2
 leo_gz_plugins:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cpplint
+  - ament_cmake_lint_cmake
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - gz_plugin_vendor
+  - gz_sim_vendor
+  repository: https://github.com/LeoRover/leo_simulator-ros2
   tag: release/rolling/leo_gz_plugins/2.0.2-2
   url: https://github.com/ros2-gbp/leo_simulator-release.git
   version: 2.0.2
 leo_gz_worlds:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  repository: https://github.com/LeoRover/leo_simulator-ros2
   tag: release/rolling/leo_gz_worlds/2.0.2-2
   url: https://github.com/ros2-gbp/leo_simulator-release.git
   version: 2.0.2
 leo_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/LeoRover/leo_common-ros2
   tag: release/rolling/leo_msgs/3.2.0-2
   url: https://github.com/ros2-gbp/leo_common-release.git
   version: 3.2.0
 leo_robot:
+  dependencies:
+  - ament_cmake
+  - leo
+  - leo_bringup
+  - leo_filters
+  - leo_fw
+  repository: https://github.com/LeoRover/leo_robot-ros2
   tag: release/rolling/leo_robot/2.6.1-1
   url: https://github.com/ros2-gbp/leo_robot-release.git
   version: 2.6.1
 leo_simulator:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - leo_gz_bringup
+  - leo_gz_plugins
+  - leo_gz_worlds
+  repository: https://github.com/LeoRover/leo_simulator-ros2
   tag: release/rolling/leo_simulator/2.0.2-2
   url: https://github.com/ros2-gbp/leo_simulator-release.git
   version: 2.0.2
 leo_teleop:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - joy_linux
+  - teleop_twist_joy
+  - teleop_twist_keyboard
+  repository: https://github.com/LeoRover/leo_common-ros2
   tag: release/rolling/leo_teleop/3.2.0-2
   url: https://github.com/ros2-gbp/leo_common-release.git
   version: 3.2.0
 leo_viz:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - leo_description
+  - rviz2
+  repository: https://github.com/LeoRover/leo_desktop-ros2
   tag: release/rolling/leo_viz/3.0.0-3
   url: https://github.com/ros2-gbp/leo_desktop-release.git
   version: 3.0.0
 lgsvl_msgs:
+  dependencies:
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/lgsvl/lgsvl_msgs
   tag: release/rolling/lgsvl_msgs/0.0.4-5
   url: https://github.com/ros2-gbp/lgsvl_msgs-release.git
   version: 0.0.4
 libcaer_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_xmllint
+  - camera_info_manager
+  - event_camera_msgs
+  - image_transport
+  - libcaer_vendor
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  - std_srvs
+  repository: https://github.com/ros-event-camera/libcaer_driver
   tag: release/rolling/libcaer_driver/1.5.6-1
   url: https://github.com/ros2-gbp/libcaer_driver-release.git
   version: 1.5.6
 libcaer_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ros-event-camera/libcaer_vendor
   tag: release/rolling/libcaer_vendor/2.0.0-2
   url: https://github.com/ros2-gbp/libcaer_vendor-release.git
   version: 2.0.0
 libcamera:
+  dependencies: []
+  repository: https://git.libcamera.org/libcamera/libcamera
   tag: release/rolling/libcamera/0.7.2-1
   url: https://github.com/ros2-gbp/libcamera-release.git
   version: 0.7.2
 libg2o:
+  dependencies:
+  - ament_cmake
   tag: release/rolling/libg2o/2020.5.29-6
   url: https://github.com/ros2-gbp/libg2o-release.git
   version: 2020.5.29
 libmavconn:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - mavlink
+  repository: https://github.com/mavlink/mavros
   tag: release/rolling/libmavconn/2.15.1-1
   url: https://github.com/ros2-gbp/mavros-release.git
   version: 2.15.1
 libphidget22:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/libphidget22/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 librealsense2:
-  tag: release/rolling/librealsense2/2.58.3-2
+  dependencies: []
+  repository: https://github.com/IntelRealSense/librealsense
+  tag: release/rolling/librealsense2/2.58.4-1
   url: https://github.com/ros2-gbp/librealsense2-release.git
-  version: 2.58.3
+  version: 2.58.4
 libstatistics_collector:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - performance_test_fixture
+  - rcl
+  - rcpputils
+  - rcutils
+  - rmw
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - statistics_msgs
+  - std_msgs
+  repository: https://github.com/ros-tooling/libstatistics_collector
   tag: release/rolling/libstatistics_collector/3.0.0-1
   url: https://github.com/ros2-gbp/libstatistics_collector-release.git
   version: 3.0.0
 libtorch_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rosidl_buffer_backends
   tag: release/rolling/libtorch_vendor/0.1.2-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends-release.git
   version: 0.1.2
 libyaml_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  repository: https://github.com/ros2/libyaml_vendor
   tag: release/rolling/libyaml_vendor/1.9.0-1
   url: https://github.com/ros2-gbp/libyaml_vendor-release.git
   version: 1.9.0
 lifecycle:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros_testing
+  repository: https://github.com/ros2/demos
   tag: release/rolling/lifecycle/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 lifecycle_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/lifecycle_msgs/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 lifecycle_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - lifecycle
+  - lifecycle_msgs
+  - rclpy
+  - ros_testing
+  repository: https://github.com/ros2/demos
   tag: release/rolling/lifecycle_py/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 linear_feedback_controller:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_python
+  - ament_lint_auto
+  - control_toolbox
+  - controller_interface
+  - generate_parameter_library
+  - gmock_vendor
+  - gtest_vendor
+  - hardware_interface
+  - jrl_cmakemodules
+  - linear_feedback_controller_msgs
+  - message_filters
+  - nav_msgs
+  - pal_statistics
+  - pinocchio
+  - pluginlib
+  - rcl
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - rosidl_dynamic_typesupport
+  - sensor_msgs
+  repository: https://github.com/loco-3d/linear-feedback-controller
   tag: release/rolling/linear_feedback_controller/4.0.4-1
   url: https://github.com/ros2-gbp/linear-feedback-controller-release.git
   version: 4.0.4
 linear_feedback_controller_msgs:
-  tag: release/rolling/linear_feedback_controller_msgs/1.2.2-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_gtest
+  - ament_cmake_pep257
+  - ament_cmake_pytest
+  - ament_cmake_uncrustify
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - jrl_cmakemodules
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - tf2_eigen
+  repository: https://github.com/loco-3d/linear-feedback-controller-msgs
+  tag: release/rolling/linear_feedback_controller_msgs/1.3.0-1
   url: https://github.com/ros2-gbp/linear-feedback-controller-msgs-release.git
-  version: 1.2.2
+  version: 1.3.0
 linux_isolate_process:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  repository: https://github.com/adityapande-1995/linux_isolate_process
   tag: release/rolling/linux_isolate_process/0.0.2-3
   url: https://github.com/ros2-gbp/linux_isolate_process-release.git
   version: 0.0.2
 live555_vendor:
+  dependencies: []
+  repository: https://github.com/fkie/live555_vendor
   tag: release/rolling/live555_vendor/0.20251106.0-2
   url: https://github.com/ros2-gbp/live555_vendor-release.git
   version: 0.20251106.0
 log_view:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rcl_interfaces
+  - rclcpp
+  - rosbag2_cpp
+  - rosgraph_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/hatchbed/log_view
   tag: release/rolling/log_view/0.5.0-1
   url: https://github.com/ros2-gbp/log_view-release.git
   version: 0.5.0
 logging_demo:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rmw_implementation_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/demos
   tag: release/rolling/logging_demo/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 lttngpy:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - rpyutils
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/lttngpy/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 lz4_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/lz4_cmake_module/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 magic_enum:
+  dependencies: []
+  repository: https://github.com/Neargye/magic_enum
   tag: release/rolling/magic_enum/0.9.8-1
   url: https://github.com/ros2-gbp/magic_enum-release.git
   version: 0.9.8
 magnetic_model:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - angles
+  - cras_cpp_common
+  - cras_lint
+  - geometry_msgs
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/ctu-vras/compass
   tag: release/rolling/magnetic_model/4.0.1-1
   url: https://github.com/ros2-gbp/compass-release.git
   version: 4.0.1
 magnetometer_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/magnetometer_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 magnetometer_compass:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - angles
+  - builtin_interfaces
+  - compass_conversions
+  - compass_interfaces
+  - cras_cpp_common
+  - cras_lint
+  - geometry_msgs
+  - magnetometer_pipeline
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - tf2_sensor_msgs
+  repository: https://github.com/ctu-vras/compass
   tag: release/rolling/magnetometer_compass/4.0.1-1
   url: https://github.com/ros2-gbp/compass-release.git
   version: 4.0.1
 magnetometer_pipeline:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_cmake_ros
+  - cras_cpp_common
+  - cras_lint
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_eigen
+  repository: https://github.com/ctu-vras/compass
   tag: release/rolling/magnetometer_pipeline/4.0.1-1
   url: https://github.com/ros2-gbp/compass-release.git
   version: 4.0.1
 map_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-planning/navigation_msgs
   tag: release/rolling/map_msgs/2.6.1-1
   url: https://github.com/ros2-gbp/navigation_msgs-release.git
   version: 2.6.1
 mapviz:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - image_transport
+  - mapviz_interfaces
+  - pluginlib
+  - rclcpp
+  - rqt_gui
+  - rqt_gui_cpp
+  - std_srvs
+  - swri_math_util
+  - swri_transform_util
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/swri-robotics/mapviz
   tag: release/rolling/mapviz/4.0.3-1
   url: https://github.com/ros2-gbp/mapviz-release.git
   version: 4.0.3
 mapviz_interfaces:
+  dependencies:
+  - builtin_interfaces
+  - marti_common_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/swri-robotics/mapviz
   tag: release/rolling/mapviz_interfaces/4.0.3-1
   url: https://github.com/ros2-gbp/mapviz-release.git
   version: 4.0.3
 mapviz_plugins:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - cv_bridge
+  - geometry_msgs
+  - gps_msgs
+  - image_transport
+  - map_msgs
+  - mapviz
+  - marti_common_msgs
+  - marti_nav_msgs
+  - marti_sensor_msgs
+  - marti_visualization_msgs
+  - pluginlib
+  - qt_gui_cpp
+  - rclcpp
+  - rclcpp_action
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - stereo_msgs
+  - swri_image_util
+  - swri_math_util
+  - swri_route_util
+  - swri_transform_util
+  - tf2
+  - urdf
+  - visualization_msgs
+  repository: https://github.com/swri-robotics/mapviz
   tag: release/rolling/mapviz_plugins/4.0.3-1
   url: https://github.com/ros2-gbp/mapviz-release.git
   version: 4.0.3
 marine_acoustic_msgs:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/apl-ocean-engineering/marine_msgs
   tag: release/rolling/marine_acoustic_msgs/2.1.0-2
   url: https://github.com/ros2-gbp/marine_msgs-release.git
   version: 2.1.0
 marine_sensor_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/apl-ocean-engineering/marine_msgs
   tag: release/rolling/marine_sensor_msgs/2.1.0-2
   url: https://github.com/ros2-gbp/marine_msgs-release.git
   version: 2.1.0
 marker_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/marker_msgs
   tag: release/rolling/marker_msgs/0.0.8-2
   url: https://github.com/ros2-gbp/marker_msgs-release.git
   version: 0.0.8
 marti_can_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_can_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_common_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_common_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_dbw_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_dbw_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_introspection_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_introspection_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_nav_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - geographic_msgs
+  - geometry_msgs
+  - marti_common_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_nav_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_perception_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_perception_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_sensor_msgs:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_sensor_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_status_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_status_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 marti_visualization_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  repository: https://github.com/swri-robotics/marti_messages
   tag: release/rolling/marti_visualization_msgs/1.6.1-2
   url: https://github.com/ros2-gbp/marti_messages-release.git
   version: 1.6.1
 mavlink:
-  tag: release/rolling/mavlink/2026.8.8-1
+  dependencies:
+  - ament_cmake
+  - ros_environment
+  tag: release/rolling/mavlink/2026.9.9-1
   url: https://github.com/ros2-gbp/mavlink-gbp-release.git
-  version: 2026.8.8
+  version: 2026.9.9
 mavros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_google_benchmark
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - angles
+  - diagnostic_msgs
+  - diagnostic_updater
+  - eigen3_cmake_module
+  - eigen_stl_containers
+  - geographic_msgs
+  - geometry_msgs
+  - libmavconn
+  - mavlink
+  - mavros_msgs
+  - message_filters
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - rcpputils
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_eigen
+  - tf2_ros
+  - trajectory_msgs
+  repository: https://github.com/mavlink/mavros
   tag: release/rolling/mavros/2.15.1-1
   url: https://github.com/ros2-gbp/mavros-release.git
   version: 2.15.1
 mavros_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - geometry_msgs
+  - mavros
+  - mavros_msgs
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - trajectory_msgs
+  repository: https://github.com/mavlink/mavros
   tag: release/rolling/mavros_examples/2.15.1-1
   url: https://github.com/ros2-gbp/mavros-release.git
   version: 2.15.1
 mavros_extras:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - angles
+  - diagnostic_msgs
+  - diagnostic_updater
+  - eigen3_cmake_module
+  - eigen_stl_containers
+  - geographic_msgs
+  - geometry_msgs
+  - libmavconn
+  - mavlink
+  - mavros
+  - mavros_msgs
+  - message_filters
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - rcpputils
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_eigen
+  - tf2_ros
+  - trajectory_msgs
+  - urdf
+  - visualization_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/mavlink/mavros
   tag: release/rolling/mavros_extras/2.15.1-1
   url: https://github.com/ros2-gbp/mavros-release.git
   version: 2.15.1
 mavros_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geographic_msgs
+  - geometry_msgs
+  - rcl_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  repository: https://github.com/mavlink/mavros
   tag: release/rolling/mavros_msgs/2.15.1-1
   url: https://github.com/ros2-gbp/mavros-release.git
   version: 2.15.1
 mcap_vendor:
+  dependencies:
+  - ament_cmake
+  - lz4_cmake_module
+  - zstd_cmake_module
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/mcap_vendor/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 mecanum_drive_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - hardware_interface_testing
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcpputils
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/mecanum_drive_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 menge_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/open-rmf/menge_vendor
   tag: release/rolling/menge_vendor/1.3.0-2
   url: https://github.com/ros2-gbp/menge_vendor-release.git
   version: 1.3.0
 message_filters:
-  tag: release/rolling/message_filters/8.0.2-1
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rclcpp
+  - rclcpp_lifecycle
+  - rclpy
+  - rcutils
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros2/message_filters
+  tag: release/rolling/message_filters/8.0.3-1
   url: https://github.com/ros2-gbp/ros2_message_filters-release.git
-  version: 8.0.2
+  version: 8.0.3
 message_tf_frame_transformer:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - rclcpp
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - tf2_sensor_msgs
+  repository: https://github.com/ika-rwth-aachen/message_tf_frame_transformer
   tag: release/rolling/message_tf_frame_transformer/1.1.3-3
   url: https://github.com/ros2-gbp/message_tf_frame_transformer-release.git
   version: 1.1.3
 metavision_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_xmllint
+  - event_camera_msgs
+  - openeb_vendor
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - std_srvs
+  repository: https://github.com/ros-event-camera/metavision_driver
   tag: release/rolling/metavision_driver/3.0.0-2
   url: https://github.com/ros2-gbp/metavision_driver-release.git
   version: 3.0.0
 micro_ros_diagnostic_bridge:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - micro_ros_diagnostic_msgs
+  - osrf_testing_tools_cpp
+  - rclcpp
+  - ros_environment
+  repository: https://github.com/micro-ROS/micro_ros_diagnostics
   tag: release/rolling/micro_ros_diagnostic_bridge/0.3.0-6
   url: https://github.com/ros2-gbp/micro_ros_diagnostics-release.git
   version: 0.3.0
 micro_ros_diagnostic_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/micro-ROS/micro_ros_diagnostics
   tag: release/rolling/micro_ros_diagnostic_msgs/0.3.0-6
   url: https://github.com/ros2-gbp/micro_ros_diagnostics-release.git
   version: 0.3.0
 micro_ros_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/micro-ROS/micro_ros_msgs
   tag: release/rolling/micro_ros_msgs/1.0.0-5
   url: https://github.com/ros2-gbp/micro_ros_msgs-release.git
   version: 1.0.0
 microstrain_inertial_description:
+  dependencies:
+  - ament_cmake
+  - xacro
+  repository: https://github.com/LORD-MicroStrain/microstrain_inertial
   tag: release/rolling/microstrain_inertial_description/4.9.0-1
   url: https://github.com/ros2-gbp/microstrain_inertial-release.git
   version: 4.9.0
 microstrain_inertial_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_target_dependencies
+  - ament_cpplint
+  - diagnostic_aggregator
+  - diagnostic_updater
+  - geometry_msgs
+  - lifecycle_msgs
+  - microstrain_inertial_msgs
+  - nav_msgs
+  - nmea_msgs
+  - rclcpp_lifecycle
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - rtcm_msgs
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/LORD-MicroStrain/microstrain_inertial
   tag: release/rolling/microstrain_inertial_driver/4.9.0-1
   url: https://github.com/ros2-gbp/microstrain_inertial-release.git
   version: 4.9.0
 microstrain_inertial_examples:
+  dependencies:
+  - ament_cmake
+  - microstrain_inertial_driver
+  - rviz2
+  - rviz_imu_plugin
+  - sensor_msgs
+  - tf2_ros
+  repository: https://github.com/LORD-MicroStrain/microstrain_inertial
   tag: release/rolling/microstrain_inertial_examples/4.9.0-1
   url: https://github.com/ros2-gbp/microstrain_inertial-release.git
   version: 4.9.0
 microstrain_inertial_msgs:
+  dependencies:
+  - geometry_msgs
+  - rosidl_default_generators
+  - std_msgs
+  repository: https://github.com/LORD-MicroStrain/microstrain_inertial
   tag: release/rolling/microstrain_inertial_msgs/4.9.0-1
   url: https://github.com/ros2-gbp/microstrain_inertial-release.git
   version: 4.9.0
 microstrain_inertial_rqt:
+  dependencies:
+  - geometry_msgs
+  - microstrain_inertial_msgs
+  - nav_msgs
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  - std_msgs
+  repository: https://github.com/LORD-MicroStrain/microstrain_inertial
   tag: release/rolling/microstrain_inertial_rqt/4.9.0-1
   url: https://github.com/ros2-gbp/microstrain_inertial-release.git
   version: 4.9.0
 mimick_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/mimick_vendor
   tag: release/rolling/mimick_vendor/0.10.0-1
   url: https://github.com/ros2-gbp/mimick_vendor-release.git
   version: 0.10.0
 mobileye_560_660_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/mobileye_560_660_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 mola:
+  dependencies:
+  - mola_bridge_ros2
+  - mola_demos
+  - mola_input_rawlog
+  - mola_input_rosbag2
+  - mola_input_video
+  - mola_kernel
+  - mola_launcher
+  - mola_metric_maps
+  - mola_pose_list
+  - mola_relocalization
+  - mola_traj_tools
+  - mola_viz
+  - mola_yaml
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_academic_datasets:
+  dependencies:
+  - kitti_metrics_eval
+  - mola_input_euroc_dataset
+  - mola_input_kitti360_dataset
+  - mola_input_kitti_dataset
+  - mola_input_mulran_dataset
+  - mola_input_paris_luco_dataset
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/mola_academic_datasets/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 mola_bridge_ros2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_cmake
+  - diagnostic_msgs
+  - geographic_msgs
+  - geometry_msgs
+  - gps_msgs
+  - mola_common
+  - mola_kernel
+  - mola_msgs
+  - mrpt_libmaps
+  - mrpt_libros_bridge
+  - mrpt_nav_interfaces
+  - nav_msgs
+  - rclcpp
+  - ros_environment
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_bridge_ros2/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_common:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_common
+  - ros_environment
+  repository: https://github.com/MOLAorg/mola_common
   tag: release/rolling/mola_common/0.6.1-1
   url: https://github.com/ros2-gbp/mola_common-release.git
   version: 0.6.1
 mola_demos:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ros_environment
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_demos/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_georeferencing:
+  dependencies:
+  - gtsam
+  - mola_common
+  - mola_gtsam_factors
+  - mola_yaml
+  - mp2p_icp
+  - mrpt_libmaps
+  - mrpt_libtclap
+  repository: https://github.com/MOLAorg/mola_state_estimation
   tag: release/rolling/mola_georeferencing/2.4.2-1
   url: https://github.com/ros2-gbp/mola_state_estimation-release.git
   version: 2.4.2
 mola_gnss_to_markers:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_libobs
+  - mrpt_nav_interfaces
+  - rclcpp
+  - std_msgs
+  - visualization_msgs
+  repository: https://github.com/MOLAorg/mola_gnss_to_markers
   tag: release/rolling/mola_gnss_to_markers/0.1.2-2
   url: https://github.com/ros2-gbp/mola_gnss_to_markers-release.git
   version: 0.1.2
 mola_gtsam_factors:
+  dependencies:
+  - gtsam
+  - mola_common
+  - mrpt_libposes
+  repository: https://github.com/MOLAorg/mola_state_estimation
   tag: release/rolling/mola_gtsam_factors/2.4.2-1
   url: https://github.com/ros2-gbp/mola_state_estimation-release.git
   version: 2.4.2
 mola_imu_preintegration:
-  tag: release/rolling/mola_imu_preintegration/1.17.1-1
+  dependencies:
+  - mola_common
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola_imu_preintegration
+  tag: release/rolling/mola_imu_preintegration/2.0.0-1
   url: https://github.com/ros2-gbp/mola_imu_preintegration-release.git
-  version: 1.17.1
+  version: 2.0.0
 mola_input_euroc_dataset:
+  dependencies:
+  - mola_common
+  - mola_kernel
+  - mrpt_libmath
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/mola_input_euroc_dataset/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 mola_input_kitti360_dataset:
+  dependencies:
+  - mola_common
+  - mola_kernel
+  - mrpt_libmaps
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/mola_input_kitti360_dataset/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 mola_input_kitti_dataset:
+  dependencies:
+  - mola_common
+  - mola_kernel
+  - mrpt_libmaps
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/mola_input_kitti_dataset/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 mola_input_lidar_bin_dataset:
+  dependencies:
+  - mola_common
+  - mola_kernel
+  - mrpt_libmaps
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_input_lidar_bin_dataset/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_input_mulran_dataset:
+  dependencies:
+  - mola_common
+  - mola_kernel
+  - mrpt_libmaps
+  - mrpt_libposes
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/mola_input_mulran_dataset/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 mola_input_ouster:
+  dependencies:
+  - mola_kernel
+  - mola_yaml
+  - mrpt_libmaps
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola_input_ouster
   tag: release/rolling/mola_input_ouster/0.1.0-1
   url: https://github.com/ros2-gbp/mola_input_ouster-release.git
   version: 0.1.0
 mola_input_paris_luco_dataset:
+  dependencies:
+  - mola_common
+  - mola_kernel
+  - mrpt_libmaps
+  repository: https://github.com/MOLAorg/mola_academic_datasets
   tag: release/rolling/mola_input_paris_luco_dataset/3.0.0-2
   url: https://github.com/ros2-gbp/mola_academic_datasets-release.git
   version: 3.0.0
 mola_input_rawlog:
+  dependencies:
+  - mola_kernel
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_input_rawlog/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_input_rosbag1:
+  dependencies:
+  - geometry_msgs
+  - mola_common
+  - mola_kernel
+  - mrpt_libmaps
+  - mrpt_libobs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/MOLAorg/mola_input_rosbag1
   tag: release/rolling/mola_input_rosbag1/0.4.0-1
   url: https://github.com/ros2-gbp/mola_input_rosbag1-release.git
   version: 0.4.0
 mola_input_rosbag2:
+  dependencies:
+  - cv_bridge
+  - gps_msgs
+  - mola_kernel
+  - mrpt_libobs
+  - mrpt_libros_bridge
+  - rosbag2_cpp
+  - sensor_msgs
+  - tf2_geometry_msgs
+  - tf2_msgs
+  - tf2_ros
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_input_rosbag2/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_input_video:
+  dependencies:
+  - mola_kernel
+  - mrpt_libhwdrivers
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_input_video/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_kernel:
+  dependencies:
+  - mola_common
+  - mola_yaml
+  - mrpt_libmaps
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_kernel/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_launcher:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pep257
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mola_kernel
+  - mrpt_libbase
+  - ros_environment
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_launcher/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_lidar_odometry:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_cmake
+  - mola_bridge_ros2
+  - mola_common
+  - mola_imu_preintegration
+  - mola_input_kitti360_dataset
+  - mola_input_kitti_dataset
+  - mola_input_mulran_dataset
+  - mola_input_paris_luco_dataset
+  - mola_input_rawlog
+  - mola_input_rosbag2
+  - mola_kernel
+  - mola_launcher
+  - mola_metric_maps
+  - mola_pose_list
+  - mola_state_estimation_simple
+  - mola_state_estimation_smoother
+  - mola_test_datasets
+  - mola_viz
+  - mola_viz_imgui
+  - mola_yaml
+  - mp2p_icp
+  - mrpt_libmaps
+  - ros_environment
+  - rosbag2_storage_mcap
+  repository: https://github.com/MOLAorg/mola_lidar_odometry
   tag: release/rolling/mola_lidar_odometry/3.2.0-1
   url: https://github.com/ros2-gbp/mola_lidar_odometry-release.git
   version: 3.2.0
 mola_metric_maps:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_common
+  - mola_common
+  - mola_kernel
+  - mp2p_icp
+  - mrpt_libmaps
+  - nanoflann_vendor
+  - ros_environment
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_metric_maps/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - mrpt_msgs
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_msgs/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_pose_list:
+  dependencies:
+  - mola_common
+  - mrpt_libmaps
+  - mrpt_libposes
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_pose_list/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_relocalization:
+  dependencies:
+  - mola_common
+  - mola_pose_list
+  - mola_test_datasets
+  - mp2p_icp
+  - mrpt_libmaps
+  - mrpt_libobs
+  - mrpt_libslam
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_relocalization/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_sm_loop_closure:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - gtsam
+  - mola_common
+  - mola_georeferencing
+  - mola_gtsam_factors
+  - mola_metric_maps
+  - mola_pose_list
+  - mola_relocalization
+  - mola_test_datasets
+  - mola_yaml
+  - mp2p_icp
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libtclap
+  - ros_environment
+  repository: https://github.com/MOLAorg/mola_sm_loop_closure
   tag: release/rolling/mola_sm_loop_closure/1.2.2-1
   url: https://github.com/ros2-gbp/mola_sm_loop_closure-release.git
   version: 1.2.2
 mola_state_estimation:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_cmake
+  - mola_state_estimation_simple
+  - mola_state_estimation_smoother
+  repository: https://github.com/MOLAorg/mola_state_estimation
   tag: release/rolling/mola_state_estimation/2.4.2-1
   url: https://github.com/ros2-gbp/mola_state_estimation-release.git
   version: 2.4.2
 mola_state_estimation_simple:
+  dependencies:
+  - mola_common
+  - mola_imu_preintegration
+  - mola_kernel
+  - mrpt_libobs
+  repository: https://github.com/MOLAorg/mola_state_estimation
   tag: release/rolling/mola_state_estimation_simple/2.4.2-1
   url: https://github.com/ros2-gbp/mola_state_estimation-release.git
   version: 2.4.2
 mola_state_estimation_smoother:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_xmllint
+  - geometry_msgs
+  - gtsam
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - mola_bridge_ros2
+  - mola_common
+  - mola_gtsam_factors
+  - mola_imu_preintegration
+  - mola_kernel
+  - mola_launcher
+  - mrpt_libobs
+  - nav_msgs
+  - rclpy
+  - ros_environment
+  - sensor_msgs
+  - tf2_ros
+  repository: https://github.com/MOLAorg/mola_state_estimation
   tag: release/rolling/mola_state_estimation_smoother/2.4.2-1
   url: https://github.com/ros2-gbp/mola_state_estimation-release.git
   version: 2.4.2
 mola_test_datasets:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ros_environment
+  repository: https://github.com/MOLAorg/mola_test_datasets
   tag: release/rolling/mola_test_datasets/0.5.0-1
   url: https://github.com/ros2-gbp/mola_test_datasets-release.git
   version: 0.5.0
 mola_traj_tools:
+  dependencies:
+  - mola_common
+  - mrpt_libposes
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_traj_tools/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_viz:
+  dependencies:
+  - mola_kernel
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libopengl
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_viz/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_viz_imgui:
+  dependencies:
+  - mola_kernel
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libobs
+  - mrpt_libopengl
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_viz_imgui/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 mola_yaml:
+  dependencies:
+  - mola_common
+  - mrpt_libbase
+  repository: https://github.com/MOLAorg/mola
   tag: release/rolling/mola_yaml/3.2.0-1
   url: https://github.com/ros2-gbp/mola-release.git
   version: 3.2.0
 motion_capture_tracking:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - motion_capture_tracking_interfaces
+  - rclcpp
+  - sensor_msgs
+  - tf2_ros
+  repository: https://github.com/IMRCLab/motion_capture_tracking
   tag: release/rolling/motion_capture_tracking/1.0.9-1
   url: https://github.com/ros2-gbp/motion_capture_tracking-release.git
   version: 1.0.9
 motion_capture_tracking_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/IMRCLab/motion_capture_tracking
   tag: release/rolling/motion_capture_tracking_interfaces/1.0.9-1
   url: https://github.com/ros2-gbp/motion_capture_tracking-release.git
   version: 1.0.9
 motion_primitives_controllers:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/motion_primitives_controllers/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 mouse_teleop:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - rclpy
+  repository: https://github.com/ros-teleop/teleop_tools
   tag: release/rolling/mouse_teleop/2.0.0-2
   url: https://github.com/ros2-gbp/teleop_tools-release.git
   version: 2.0.0
 moveit:
-  tag: release/rolling/moveit/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_core
+  - moveit_planners
+  - moveit_plugins
+  - moveit_ros
+  - moveit_setup_assistant
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_common:
-  tag: release/rolling/moveit_common/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - backward_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_common/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_configs_utils:
-  tag: release/rolling/moveit_configs_utils/2.15.0-1
+  dependencies:
+  - ament_index_python
+  - launch
+  - launch_param_builder
+  - launch_ros
+  - srdfdom
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_configs_utils/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_core:
-  tag: release/rolling/moveit_core/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_google_benchmark
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - angles
+  - common_interfaces
+  - eigen3_cmake_module
+  - eigen_stl_containers
+  - generate_parameter_library
+  - geometric_shapes
+  - geometry_msgs
+  - google_benchmark_vendor
+  - kdl_parser
+  - launch_testing_ament_cmake
+  - moveit_common
+  - moveit_msgs
+  - moveit_resources_panda_moveit_config
+  - moveit_resources_pr2_description
+  - octomap_msgs
+  - orocos_kdl_vendor
+  - osqp_vendor
+  - pluginlib
+  - random_numbers
+  - rcl_interfaces
+  - rclcpp
+  - rclpy
+  - rsl
+  - ruckig
+  - sensor_msgs
+  - shape_msgs
+  - srdfdom
+  - std_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_kdl
+  - trajectory_msgs
+  - urdf
+  - urdfdom
+  - urdfdom_headers
+  - visualization_msgs
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_core/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_hybrid_planning:
-  tag: release/rolling/moveit_hybrid_planning/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - controller_manager
+  - forward_command_controller
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_msgs
+  - moveit_planners_ompl
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - moveit_simple_controller_manager
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - robot_state_publisher
+  - ros_testing
+  - rviz2
+  - std_msgs
+  - std_srvs
+  - tf2_ros
+  - trajectory_msgs
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_hybrid_planning/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_kinematics:
-  tag: release/rolling/moveit_kinematics/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - class_loader
+  - generate_parameter_library
+  - launch_param_builder
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_msgs
+  - moveit_resources_fanuc_description
+  - moveit_resources_fanuc_moveit_config
+  - moveit_resources_panda_description
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_planning
+  - orocos_kdl_vendor
+  - pluginlib
+  - ros_testing
+  - rsl
+  - tf2
+  - tf2_kdl
+  - urdfdom
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_kinematics/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_cmake
+  - geometry_msgs
+  - object_recognition_msgs
+  - octomap_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - shape_msgs
+  - std_msgs
+  - trajectory_msgs
+  repository: https://github.com/ros-planning/moveit_msgs
   tag: release/rolling/moveit_msgs/2.7.2-1
   url: https://github.com/ros2-gbp/moveit_msgs-release.git
   version: 2.7.2
 moveit_planners:
-  tag: release/rolling/moveit_planners/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_planners_chomp
+  - moveit_planners_ompl
+  - moveit_planners_stomp
+  - pilz_industrial_motion_planner
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_planners/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_planners_chomp:
-  tag: release/rolling/moveit_planners_chomp/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - chomp_motion_planner
+  - moveit_common
+  - moveit_core
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_planners_chomp/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_planners_ompl:
-  tag: release/rolling/moveit_planners_ompl/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - eigen3_cmake_module
+  - moveit_common
+  - moveit_core
+  - moveit_msgs
+  - moveit_resources_fanuc_moveit_config
+  - moveit_resources_panda_moveit_config
+  - moveit_resources_pr2_description
+  - moveit_ros_planning
+  - ompl
+  - pluginlib
+  - rclcpp
+  - tf2_eigen
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_planners_ompl/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_planners_stomp:
-  tag: release/rolling/moveit_planners_stomp/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - generate_parameter_library
+  - moveit_common
+  - moveit_core
+  - rsl
+  - std_msgs
+  - stomp
+  - tf2_eigen
+  - visualization_msgs
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_planners_stomp/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_plugins:
-  tag: release/rolling/moveit_plugins/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_simple_controller_manager
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_plugins/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_py:
-  tag: release/rolling/moveit_py/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_index_python
+  - geometry_msgs
+  - moveit_core
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - octomap_msgs
+  - rclcpp
+  - rclpy
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_py/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_resources:
+  dependencies:
+  - ament_cmake
+  - joint_state_publisher
+  - moveit_resources_fanuc_description
+  - moveit_resources_fanuc_moveit_config
+  - moveit_resources_panda_description
+  - moveit_resources_panda_moveit_config
+  - moveit_resources_pr2_description
+  - robot_state_publisher
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/moveit_resources/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 moveit_resources_fanuc_description:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/moveit_resources_fanuc_description/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 moveit_resources_fanuc_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - moveit_resources_fanuc_description
+  - robot_state_publisher
+  - ros2cli_common_extensions
+  - tf2_ros
+  - xacro
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/moveit_resources_fanuc_moveit_config/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 moveit_resources_panda_description:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/moveit_resources_panda_description/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 moveit_resources_panda_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - moveit_resources_panda_description
+  - parallel_gripper_controller
+  - robot_state_publisher
+  - ros2cli_common_extensions
+  - topic_tools
+  - xacro
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/moveit_resources_panda_moveit_config/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 moveit_resources_pr2_description:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-planning/moveit_resources
   tag: release/rolling/moveit_resources_pr2_description/3.2.0-1
   url: https://github.com/ros2-gbp/moveit_resources-release.git
   version: 3.2.0
 moveit_resources_prbt_ikfast_manipulator_plugin:
-  tag: release/rolling/moveit_resources_prbt_ikfast_manipulator_plugin/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - generate_parameter_library
+  - moveit_core
+  - pluginlib
+  - rclcpp
+  - tf2_eigen
+  - tf2_eigen_kdl
+  - tf2_geometry_msgs
+  - tf2_kdl
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_resources_prbt_ikfast_manipulator_plugin/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_resources_prbt_moveit_config:
-  tag: release/rolling/moveit_resources_prbt_moveit_config/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - joint_state_publisher
+  - moveit_resources_prbt_ikfast_manipulator_plugin
+  - moveit_resources_prbt_support
+  - moveit_ros_move_group
+  - robot_state_publisher
+  - rviz2
+  - xacro
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_resources_prbt_moveit_config/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_resources_prbt_pg70_support:
-  tag: release/rolling/moveit_resources_prbt_pg70_support/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_resources_prbt_ikfast_manipulator_plugin
+  - moveit_resources_prbt_moveit_config
+  - moveit_resources_prbt_support
+  - xacro
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_resources_prbt_pg70_support/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_resources_prbt_support:
-  tag: release/rolling/moveit_resources_prbt_support/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - xacro
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_resources_prbt_support/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros:
-  tag: release/rolling/moveit_ros/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_ros_benchmarks
+  - moveit_ros_move_group
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - moveit_ros_robot_interaction
+  - moveit_ros_visualization
+  - moveit_ros_warehouse
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_benchmarks:
-  tag: release/rolling/moveit_ros_benchmarks/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - launch_param_builder
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_ros_planning
+  - moveit_ros_warehouse
+  - pluginlib
+  - rclcpp
+  - tf2_eigen
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_benchmarks/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_control_interface:
-  tag: release/rolling/moveit_ros_control_interface/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - controller_manager_msgs
+  - moveit_common
+  - moveit_core
+  - moveit_simple_controller_manager
+  - pluginlib
+  - rclcpp_action
+  - trajectory_msgs
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_control_interface/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_move_group:
-  tag: release/rolling/moveit_ros_move_group/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_kinematics
+  - moveit_resources_fanuc_moveit_config
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_occupancy_map_monitor
+  - moveit_ros_planning
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - ros_testing
+  - std_srvs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_move_group/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_occupancy_map_monitor:
-  tag: release/rolling/moveit_ros_occupancy_map_monitor/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - eigen3_cmake_module
+  - geometric_shapes
+  - moveit_common
+  - moveit_core
+  - moveit_msgs
+  - pluginlib
+  - rclcpp
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_occupancy_map_monitor/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_perception:
-  tag: release/rolling/moveit_ros_perception/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  - image_transport
+  - message_filters
+  - moveit_common
+  - moveit_core
+  - moveit_msgs
+  - moveit_ros_occupancy_map_monitor
+  - moveit_ros_planning
+  - object_recognition_msgs
+  - pluginlib
+  - rclcpp
+  - sensor_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  - urdf
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_perception/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_planning:
-  tag: release/rolling/moveit_ros_planning/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - eigen3_cmake_module
+  - generate_parameter_library
+  - launch_testing_ament_cmake
+  - message_filters
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_msgs
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_occupancy_map_monitor
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - ros_testing
+  - srdfdom
+  - std_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_msgs
+  - tf2_ros
+  - urdf
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_planning/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_planning_interface:
-  tag: release/rolling/moveit_ros_planning_interface/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - eigen3_cmake_module
+  - geometry_msgs
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_msgs
+  - moveit_resources_fanuc_moveit_config
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_move_group
+  - moveit_ros_planning
+  - moveit_ros_warehouse
+  - moveit_simple_controller_manager
+  - rclcpp
+  - rclcpp_action
+  - rclpy
+  - ros_testing
+  - rviz2
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_planning_interface/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_robot_interaction:
-  tag: release/rolling/moveit_ros_robot_interaction/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - interactive_markers
+  - moveit_common
+  - moveit_core
+  - moveit_ros_planning
+  - rclcpp
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_robot_interaction/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_tests:
-  tag: release/rolling/moveit_ros_tests/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_planners_chomp
+  - moveit_planners_ompl
+  - moveit_planners_stomp
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_move_group
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - moveit_simple_controller_manager
+  - pilz_industrial_motion_planner
+  - rclcpp
+  - ros_testing
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_tests/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_trajectory_cache:
-  tag: release/rolling/moveit_ros_trajectory_cache/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_uncrustify
+  - geometry_msgs
+  - launch_pytest
+  - launch_testing_ament_cmake
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_planners_ompl
+  - moveit_resources
+  - moveit_ros
+  - moveit_ros_planning_interface
+  - rclcpp
+  - rclcpp_action
+  - rmf_utils
+  - robot_state_publisher
+  - ros2_control
+  - tf2_ros
+  - trajectory_msgs
+  - warehouse_ros_sqlite
+  - xacro
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_trajectory_cache/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_visualization:
-  tag: release/rolling/moveit_ros_visualization/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - class_loader
+  - geometric_shapes
+  - interactive_markers
+  - moveit_common
+  - moveit_ros_planning_interface
+  - moveit_ros_robot_interaction
+  - moveit_ros_warehouse
+  - object_recognition_msgs
+  - pluginlib
+  - rclcpp
+  - rclpy
+  - rviz2
+  - tf2_eigen
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_visualization/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_ros_warehouse:
-  tag: release/rolling/moveit_ros_warehouse/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_common
+  - moveit_core
+  - moveit_ros_planning
+  - rclcpp
+  - tf2_eigen
+  - tf2_ros
+  - warehouse_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_ros_warehouse/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_runtime:
-  tag: release/rolling/moveit_runtime/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - moveit_core
+  - moveit_planners
+  - moveit_plugins
+  - moveit_ros_move_group
+  - moveit_ros_perception
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - moveit_ros_warehouse
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_runtime/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_servo:
-  tag: release/rolling/moveit_servo/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - control_msgs
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - joy
+  - launch_param_builder
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_msgs
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - moveit_ros_visualization
+  - pluginlib
+  - realtime_tools
+  - robot_state_publisher
+  - ros_testing
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_eigen
+  - tf2_ros
+  - trajectory_msgs
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_servo/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_setup_app_plugins:
-  tag: release/rolling/moveit_setup_app_plugins/2.15.0-1
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_index_cpp
+  - moveit_configs_utils
+  - moveit_ros_visualization
+  - moveit_setup_framework
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_setup_app_plugins/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_setup_assistant:
-  tag: release/rolling/moveit_setup_assistant/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - moveit_configs_utils
+  - moveit_resources_panda_moveit_config
+  - moveit_setup_app_plugins
+  - moveit_setup_controllers
+  - moveit_setup_core_plugins
+  - moveit_setup_framework
+  - moveit_setup_srdf_plugins
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_setup_assistant/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_setup_controllers:
-  tag: release/rolling/moveit_setup_controllers/2.15.0-1
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_index_cpp
+  - moveit_configs_utils
+  - moveit_resources_fanuc_moveit_config
+  - moveit_resources_panda_moveit_config
+  - moveit_setup_framework
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_setup_controllers/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_setup_core_plugins:
-  tag: release/rolling/moveit_setup_core_plugins/2.15.0-1
+  dependencies:
+  - ament_cmake_ros
+  - ament_index_cpp
+  - moveit_ros_visualization
+  - moveit_setup_framework
+  - pluginlib
+  - rclcpp
+  - srdfdom
+  - urdf
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_setup_core_plugins/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_setup_framework:
-  tag: release/rolling/moveit_setup_framework/2.15.0-1
+  dependencies:
+  - ament_cmake_ros
+  - ament_index_cpp
+  - moveit_common
+  - moveit_core
+  - moveit_ros_planning
+  - moveit_ros_visualization
+  - pluginlib
+  - rclcpp
+  - rviz_common
+  - rviz_rendering
+  - srdfdom
+  - urdf
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_setup_framework/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_setup_srdf_plugins:
-  tag: release/rolling/moveit_setup_srdf_plugins/2.15.0-1
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - moveit_resources_fanuc_description
+  - moveit_setup_framework
+  - pluginlib
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_setup_srdf_plugins/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_simple_controller_manager:
-  tag: release/rolling/moveit_simple_controller_manager/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - control_msgs
+  - moveit_common
+  - moveit_core
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/moveit_simple_controller_manager/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 moveit_task_constructor_capabilities:
-  tag: release/rolling/moveit_task_constructor_capabilities/0.1.6-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - controller_manager
+  - launch_testing
+  - launch_testing_ament_cmake
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_move_group
+  - moveit_ros_planning
+  - moveit_task_constructor_core
+  - moveit_task_constructor_msgs
+  - pluginlib
+  - rclcpp_action
+  - std_msgs
+  repository: https://github.com/moveit/moveit_task_constructor
+  tag: release/rolling/moveit_task_constructor_capabilities/0.2.0-1
   url: https://github.com/ros2-gbp/moveit_task_constructor-release.git
-  version: 0.1.6
+  version: 0.2.0
 moveit_task_constructor_core:
-  tag: release/rolling/moveit_task_constructor_core/0.1.6-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - geometry_msgs
+  - launch_testing_ament_cmake
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_planners_ompl
+  - moveit_py
+  - moveit_resources_fanuc_moveit_config
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - moveit_task_constructor_msgs
+  - py_binding_tools
+  - rclcpp
+  - rviz_marker_tools
+  - tf2_eigen
+  - visualization_msgs
+  repository: https://github.com/moveit/moveit_task_constructor
+  tag: release/rolling/moveit_task_constructor_core/0.2.0-1
   url: https://github.com/ros2-gbp/moveit_task_constructor-release.git
-  version: 0.1.6
+  version: 0.2.0
 moveit_task_constructor_demo:
-  tag: release/rolling/moveit_task_constructor_demo/0.1.6-1
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - generate_parameter_library
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_resources_panda_moveit_config
+  - moveit_ros_planning_interface
+  - moveit_task_constructor_capabilities
+  - moveit_task_constructor_core
+  - moveit_task_constructor_visualization
+  - py_binding_tools
+  repository: https://github.com/moveit/moveit_task_constructor
+  tag: release/rolling/moveit_task_constructor_demo/0.2.0-1
   url: https://github.com/ros2-gbp/moveit_task_constructor-release.git
-  version: 0.1.6
+  version: 0.2.0
 moveit_task_constructor_msgs:
-  tag: release/rolling/moveit_task_constructor_msgs/0.1.6-1
+  dependencies:
+  - ament_cmake
+  - moveit_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - visualization_msgs
+  repository: https://github.com/moveit/moveit_task_constructor
+  tag: release/rolling/moveit_task_constructor_msgs/0.2.0-1
   url: https://github.com/ros2-gbp/moveit_task_constructor-release.git
-  version: 0.1.6
+  version: 0.2.0
 moveit_task_constructor_visualization:
-  tag: release/rolling/moveit_task_constructor_visualization/0.1.6-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - libyaml_vendor
+  - moveit_core
+  - moveit_ros_visualization
+  - moveit_task_constructor_core
+  - moveit_task_constructor_msgs
+  - rclcpp
+  - rviz2
+  repository: https://github.com/moveit/moveit_task_constructor
+  tag: release/rolling/moveit_task_constructor_visualization/0.2.0-1
   url: https://github.com/ros2-gbp/moveit_task_constructor-release.git
-  version: 0.1.6
+  version: 0.2.0
 moveit_visual_tools:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - geometric_shapes
+  - geometry_msgs
+  - graph_msgs
+  - interactive_markers
+  - moveit_common
+  - moveit_core
+  - moveit_msgs
+  - moveit_ros_planning
+  - rclcpp
+  - rviz_visual_tools
+  - std_msgs
+  - tf2_eigen
+  - tf2_ros
+  - trajectory_msgs
+  - visualization_msgs
+  repository: https://github.com/ros-planning/moveit_visual_tools
   tag: release/rolling/moveit_visual_tools/4.2.0-1
   url: https://github.com/ros2-gbp/moveit_visual_tools-release.git
   version: 4.2.0
 mp2p_icp:
-  tag: release/rolling/mp2p_icp/2.13.0-1
+  dependencies:
+  - mp2p_icp_core
+  - mp2p_icp_viz
+  repository: https://github.com/MOLAorg/mp2p_icp
+  tag: release/rolling/mp2p_icp/2.14.0-1
   url: https://github.com/ros2-gbp/mp2p_icp-release.git
-  version: 2.13.0
+  version: 2.14.0
 mp2p_icp_core:
-  tag: release/rolling/mp2p_icp_core/2.13.0-1
+  dependencies:
+  - mola_common
+  - mola_imu_preintegration
+  - mrpt_libbase
+  - mrpt_libmaps
+  - mrpt_libobs
+  - mrpt_libposes
+  - ros_environment
+  repository: https://github.com/MOLAorg/mp2p_icp
+  tag: release/rolling/mp2p_icp_core/2.14.0-1
   url: https://github.com/ros2-gbp/mp2p_icp-release.git
-  version: 2.13.0
+  version: 2.14.0
 mp2p_icp_viz:
-  tag: release/rolling/mp2p_icp_viz/2.13.0-1
+  dependencies:
+  - mola_common
+  - mp2p_icp_core
+  - mrpt_libgui
+  - ros_environment
+  repository: https://github.com/MOLAorg/mp2p_icp
+  tag: release/rolling/mp2p_icp_viz/2.14.0-1
   url: https://github.com/ros2-gbp/mp2p_icp-release.git
-  version: 2.13.0
+  version: 2.14.0
 mp_units_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/nobleo/mp_units_vendor
   tag: release/rolling/mp_units_vendor/2.5.0-3
   url: https://github.com/ros2-gbp/mp_units_vendor-release.git
   version: 2.5.0
 mqtt_client:
+  dependencies:
+  - ament_cmake
+  - mqtt_client_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rcpputils
+  - rosx_introspection
+  - std_msgs
+  repository: https://github.com/ika-rwth-aachen/mqtt_client
   tag: release/rolling/mqtt_client/2.5.0-1
   url: https://github.com/ros2-gbp/mqtt_client-release.git
   version: 2.5.0
 mqtt_client_interfaces:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ika-rwth-aachen/mqtt_client
   tag: release/rolling/mqtt_client_interfaces/2.5.0-1
   url: https://github.com/ros2-gbp/mqtt_client-release.git
   version: 2.5.0
 mrpt_apps:
+  dependencies:
+  - ament_cmake
+  - mrpt_libapps
+  - mrpt_libnav
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_apps/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_apps_cli:
+  dependencies:
+  - mrpt_common
+  - mrpt_libapps_cli
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_apps_cli/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_apps_gui:
+  dependencies:
+  - mrpt_common
+  - mrpt_graphslam
+  - mrpt_kinematics
+  - mrpt_libapps_gui
+  - mrpt_nav
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_apps_gui/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_bayes:
+  dependencies:
+  - mrpt_common
+  - mrpt_config
+  - mrpt_math
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_bayes/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_common:
+  dependencies: []
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_common/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_comms:
+  dependencies:
+  - mrpt_common
+  - mrpt_io
+  - mrpt_poses
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_comms/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_config:
+  dependencies:
+  - mrpt_common
+  - mrpt_expr
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_config/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_containers:
+  dependencies:
+  - mrpt_common
+  - mrpt_core
+  - mrpt_typemeta
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_containers/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_core:
+  dependencies:
+  - mrpt_common
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_core/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_data:
+  dependencies: []
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_data/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_examples_cpp:
+  dependencies:
+  - mrpt_common
+  - mrpt_data
+  - mrpt_graphslam
+  - mrpt_gui
+  - mrpt_imgui
+  - mrpt_libapps_cli
+  - mrpt_libapps_gui
+  - mrpt_nav
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_examples_cpp/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_expr:
+  dependencies:
+  - mrpt_common
+  - mrpt_system
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_expr/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_generic_sensor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_msgs
+  - mrpt_sensorlib
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_generic_sensor/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_graphs:
+  dependencies:
+  - mrpt_common
+  - mrpt_io
+  - mrpt_poses
+  - mrpt_viz
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_graphs/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_graphslam:
+  dependencies:
+  - mrpt_gui
+  - mrpt_slam
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_graphslam/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_gui:
+  dependencies:
+  - mrpt_opengl
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_gui/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_hwdrivers:
+  dependencies:
+  - mrpt_comms
+  - mrpt_maps
+  - mrpt_viz
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_hwdrivers/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_img:
+  dependencies:
+  - mrpt_common
+  - mrpt_config
+  - mrpt_io
+  - mrpt_math
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_img/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_imgui:
+  dependencies:
+  - mrpt_opengl
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_imgui/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_io:
+  dependencies:
+  - mrpt_common
+  - mrpt_system
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_io/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_kinematics:
+  dependencies:
+  - mrpt_common
+  - mrpt_viz
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_kinematics/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_libapps:
+  dependencies:
+  - mrpt_libgui
+  - mrpt_libhwdrivers
+  - mrpt_libmaps
+  - mrpt_libslam
+  - mrpt_libtclap
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libapps/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libapps_cli:
+  dependencies:
+  - mrpt_hwdrivers
+  - mrpt_slam
+  - mrpt_topography
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_libapps_cli/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_libapps_gui:
+  dependencies:
+  - mrpt_gui
+  - mrpt_libapps_cli
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_libapps_gui/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_libbase:
+  dependencies:
+  - nanoflann_vendor
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libbase/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libgui:
+  dependencies:
+  - mrpt_libopengl
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libgui/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libhwdrivers:
+  dependencies:
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libslam
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libhwdrivers/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libmaps:
+  dependencies:
+  - mrpt_libobs
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libmaps/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libmath:
+  dependencies:
+  - mrpt_libbase
+  - nanoflann_vendor
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libmath/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libnav:
+  dependencies:
+  - mrpt_libmaps
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libnav/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libobs:
+  dependencies:
+  - mrpt_libopengl
+  - mrpt_libposes
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libobs/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libopengl:
+  dependencies:
+  - mrpt_libbase
+  - mrpt_libposes
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libopengl/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libposes:
+  dependencies:
+  - mrpt_libbase
+  - mrpt_libmath
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libposes/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libros_bridge:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - cv_bridge
+  - geometry_msgs
+  - gps_msgs
+  - mrpt_libmaps
+  - mrpt_libobs
+  - nav_msgs
+  - ros_environment
+  - rosbag2_cpp
+  - sensor_msgs
+  - std_msgs
+  - stereo_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/MRPT/mrpt_ros_bridge
   tag: release/rolling/mrpt_libros_bridge/3.5.3-1
   url: https://github.com/ros2-gbp/mrpt_ros_bridge-release.git
   version: 3.5.3
 mrpt_libslam:
+  dependencies:
+  - mrpt_libmaps
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libslam/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_libtclap:
+  dependencies:
+  - mrpt_libbase
+  - nanoflann_vendor
+  repository: https://github.com/MRPT/mrpt_ros
   tag: release/rolling/mrpt_libtclap/2.15.21-1
   url: https://github.com/ros2-gbp/mrpt_ros-release.git
   version: 2.15.21
 mrpt_map_server:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mp2p_icp
+  - mrpt_libmaps
+  - mrpt_libobs
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - mrpt_nav_interfaces
+  - rclcpp_components
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_map_server/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_maps:
+  dependencies:
+  - mrpt_graphs
+  - mrpt_obs
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_maps/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_math:
+  dependencies:
+  - mrpt_common
+  - mrpt_io
+  - mrpt_random
+  - mrpt_serialization
+  - mrpt_system
+  - nanoflann_vendor
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_math/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cppcheck
+  - ament_cpplint
+  - ament_lint_auto
+  - ament_lint_cmake
+  - ament_lint_common
+  - geometry_msgs
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/mrpt-ros-pkg/mrpt_msgs
   tag: release/rolling/mrpt_msgs/0.6.0-2
   url: https://github.com/ros2-gbp/mrpt_msgs-release.git
   version: 0.6.0
 mrpt_msgs_bridge:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - geometry_msgs
+  - mrpt_libobs
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - rclcpp
+  - ros_environment
+  - tf2
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_msgs_bridge/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_nav:
+  dependencies:
+  - mrpt_kinematics
+  - mrpt_maps
+  - mrpt_viz
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_nav/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_nav_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - geometry_msgs
+  - mrpt_msgs
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_nav_interfaces/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_navigation:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_map_server
+  - mrpt_msgs_bridge
+  - mrpt_nav_interfaces
+  - mrpt_pf_localization
+  - mrpt_pointcloud_pipeline
+  - mrpt_reactivenav2d
+  - mrpt_tps_astar_planner
+  - mrpt_tutorials
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_navigation/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_obs:
+  dependencies:
+  - mrpt_common
+  - mrpt_tfest
+  - mrpt_viz
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_obs/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_opengl:
+  dependencies:
+  - mrpt_img
+  - mrpt_poses
+  - mrpt_viz
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_opengl/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_path_planning:
+  dependencies:
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libnav
+  - mrpt_libtclap
+  - mvsim
+  repository: https://github.com/MRPT/mrpt_path_planning
   tag: release/rolling/mrpt_path_planning/1.0.1-1
   url: https://github.com/ros2-gbp/mrpt_path_planning-release.git
   version: 1.0.1
 mrpt_pf_localization:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mola_relocalization
+  - mp2p_icp
+  - mrpt_libgui
+  - mrpt_libros_bridge
+  - mrpt_libslam
+  - mrpt_msgs
+  - mrpt_msgs_bridge
+  - mrpt_tutorials
+  - nav_msgs
+  - pose_cov_ops
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_pf_localization/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_pointcloud_pipeline:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mp2p_icp
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libobs
+  - mrpt_libros_bridge
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_pointcloud_pipeline/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_poses:
+  dependencies:
+  - mrpt_bayes
+  - mrpt_common
+  - mrpt_io
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_poses/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_random:
+  dependencies:
+  - mrpt_common
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_random/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_reactivenav2d:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - geometry_msgs
+  - mrpt_libnav
+  - mrpt_libros_bridge
+  - mrpt_nav_interfaces
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - stereo_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_reactivenav2d/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_rtti:
+  dependencies:
+  - mrpt_common
+  - mrpt_core
+  - mrpt_typemeta
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_rtti/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_sensor_bumblebee_stereo:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_libhwdrivers
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - mrpt_sensorlib
+  - rclcpp_components
+  - ros_environment
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_sensor_bumblebee_stereo/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_sensor_gnss_nmea:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_libhwdrivers
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - mrpt_sensorlib
+  - nmea_msgs
+  - rclcpp_components
+  - ros_environment
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_sensor_gnss_nmea/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_sensor_gnss_novatel:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_libhwdrivers
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - mrpt_sensorlib
+  - novatel_oem6_msgs
+  - rclcpp_components
+  - ros_environment
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_sensor_gnss_novatel/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_sensor_imu_taobotics:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_libhwdrivers
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - mrpt_sensorlib
+  - rclcpp_components
+  - ros_environment
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_sensor_imu_taobotics/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_sensorlib:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - diagnostic_updater
+  - mrpt_libhwdrivers
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - rclcpp_components
+  - ros_environment
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_sensorlib/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_sensors:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_generic_sensor
+  - mrpt_sensor_bumblebee_stereo
+  - mrpt_sensor_gnss_nmea
+  - mrpt_sensor_gnss_novatel
+  - mrpt_sensor_imu_taobotics
+  - mrpt_sensorlib
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/mrpt_sensors/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 mrpt_serialization:
+  dependencies:
+  - mrpt_common
+  - mrpt_rtti
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_serialization/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_slam:
+  dependencies:
+  - mrpt_maps
+  - mrpt_topography
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_slam/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_system:
+  dependencies:
+  - mrpt_common
+  - mrpt_containers
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_system/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_tfest:
+  dependencies:
+  - mrpt_common
+  - mrpt_poses
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_tfest/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_topography:
+  dependencies:
+  - mrpt_common
+  - mrpt_math
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_topography/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_tps_astar_planner:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libnav
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - mrpt_nav_interfaces
+  - mrpt_path_planning
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_tps_astar_planner/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_tutorials:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - mvsim
+  - teleop_twist_keyboard
+  repository: https://github.com/mrpt-ros-pkg/mrpt_navigation
   tag: release/rolling/mrpt_tutorials/2.5.0-1
   url: https://github.com/ros2-gbp/mrpt_navigation-release.git
   version: 2.5.0
 mrpt_typemeta:
+  dependencies:
+  - mrpt_common
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_typemeta/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrpt_viz:
+  dependencies:
+  - mrpt_common
+  - mrpt_img
+  - mrpt_poses
+  repository: https://github.com/MRPT/mrpt
   tag: release/rolling/mrpt_viz/3.1.3-1
   url: https://github.com/ros2-gbp/mrpt3-release.git
   version: 3.1.3
 mrt_cmake_modules:
+  dependencies:
+  - ament_cmake_core
+  - gtest_vendor
+  - ros_environment
+  repository: https://github.com/KIT-MRT/mrt_cmake_modules
   tag: release/rolling/mrt_cmake_modules/1.0.11-2
   url: https://github.com/ros2-gbp/mrt_cmake_modules-release.git
   version: 1.0.11
 mujoco_3d_lidar:
-  tag: release/rolling/mujoco_3d_lidar/0.1.0-2
+  dependencies:
+  - ament_cmake
+  - mujoco_vendor
+  repository: https://github.com/ros-controls/mujoco_ros2_control
+  tag: release/rolling/mujoco_3d_lidar/0.1.2-1
   url: https://github.com/ros2-gbp/mujoco_ros2_control-release.git
-  version: 0.1.0
+  version: 0.1.2
 mujoco_ros2_control:
-  tag: release/rolling/mujoco_ros2_control/0.1.0-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_cpp
+  - ament_index_python
+  - backward_ros
+  - control_toolbox
+  - controller_manager
+  - geometry_msgs
+  - hardware_interface
+  - mujoco_ros2_control_msgs
+  - mujoco_ros2_control_plugins
+  - mujoco_vendor
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2pkg
+  - rosgraph_msgs
+  - sensor_msgs
+  - std_msgs
+  - transmission_interface
+  - urdfdom_py
+  repository: https://github.com/ros-controls/mujoco_ros2_control
+  tag: release/rolling/mujoco_ros2_control/0.1.2-1
   url: https://github.com/ros2-gbp/mujoco_ros2_control-release.git
-  version: 0.1.0
+  version: 0.1.2
 mujoco_ros2_control_demos:
-  tag: release/rolling/mujoco_ros2_control_demos/0.1.0-2
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - forward_command_controller
+  - joint_state_broadcaster
+  - launch
+  - launch_ros
+  - mujoco_ros2_control
+  - mujoco_ros2_control_msgs
+  - pose_broadcaster
+  - robot_state_publisher
+  - rviz2
+  - xacro
+  repository: https://github.com/ros-controls/mujoco_ros2_control
+  tag: release/rolling/mujoco_ros2_control_demos/0.1.2-1
   url: https://github.com/ros2-gbp/mujoco_ros2_control-release.git
-  version: 0.1.0
+  version: 0.1.2
 mujoco_ros2_control_msgs:
-  tag: release/rolling/mujoco_ros2_control_msgs/0.1.0-2
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-controls/mujoco_ros2_control
+  tag: release/rolling/mujoco_ros2_control_msgs/0.1.2-1
   url: https://github.com/ros2-gbp/mujoco_ros2_control-release.git
-  version: 0.1.0
+  version: 0.1.2
 mujoco_ros2_control_plugins:
-  tag: release/rolling/mujoco_ros2_control_plugins/0.1.0-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - backward_ros
+  - geometry_msgs
+  - mujoco_3d_lidar
+  - mujoco_ros2_control_msgs
+  - mujoco_vendor
+  - pluginlib
+  - rclcpp
+  - realtime_tools
+  - ros2_control_cmake
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - visualization_msgs
+  repository: https://github.com/ros-controls/mujoco_ros2_control
+  tag: release/rolling/mujoco_ros2_control_plugins/0.1.2-1
   url: https://github.com/ros2-gbp/mujoco_ros2_control-release.git
-  version: 0.1.0
+  version: 0.1.2
 mujoco_vendor:
-  tag: release/rolling/mujoco_vendor/0.0.9-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/pal-robotics/mujoco_vendor
+  tag: release/rolling/mujoco_vendor/0.1.0-1
   url: https://github.com/ros2-gbp/mujoco_vendor-release.git
-  version: 0.0.9
+  version: 0.1.0
 multires_image:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - gps_msgs
+  - mapviz
+  - mapviz_interfaces
+  - marti_common_msgs
+  - pluginlib
+  - qt_gui_cpp
+  - rclcpp
+  - rclpy
+  - swri_math_util
+  - swri_transform_util
+  - tf2
+  repository: https://github.com/swri-robotics/mapviz
   tag: release/rolling/multires_image/4.0.3-1
   url: https://github.com/ros2-gbp/mapviz-release.git
   version: 4.0.3
 mvsim:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_common
+  - mrpt_libgui
+  - mrpt_libmaps
+  - mrpt_libposes
+  - mrpt_libros_bridge
+  - mrpt_libtclap
+  - nav_msgs
+  - ros2launch
+  - ros_environment
+  - sensor_msgs
+  - stereo_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - visualization_msgs
+  repository: https://github.com/MRPT/mvsim
   tag: release/rolling/mvsim/1.4.0-1
   url: https://github.com/ros2-gbp/mvsim-release.git
   version: 1.4.0
 nanoeigenpy:
+  dependencies: []
+  repository: https://github.com/Simple-Robotics/nanoeigenpy
   tag: release/rolling/nanoeigenpy/0.5.0-2
   url: https://github.com/ros2-gbp/nanoeigenpy-release.git
   version: 0.5.0
 nanoflann_vendor:
+  dependencies: []
+  repository: https://github.com/jlblancoc/nanoflann
   tag: release/rolling/nanoflann_vendor/1.12.1-1
   url: https://github.com/ros2-gbp/nanoflann-release.git
   version: 1.12.1
 nao_button_sim:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - nao_lola_sensor_msgs
+  repository: https://github.com/ijnek/nao_button_sim
   tag: release/rolling/nao_button_sim/1.0.1-2
   url: https://github.com/ros2-gbp/nao_button_sim-release.git
   version: 1.0.1
 nao_command_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ijnek/nao_interfaces
   tag: release/rolling/nao_command_msgs/1.0.0-3
   url: https://github.com/ros2-gbp/nao_interfaces-release.git
   version: 1.0.0
 nao_lola:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - nao_command_msgs
+  - nao_sensor_msgs
+  - rclcpp
+  repository: https://github.com/ros-sports/nao_lola
   tag: release/rolling/nao_lola/1.3.0-2
   url: https://github.com/ros2-gbp/nao_lola-release.git
   version: 1.3.0
 nao_lola_client:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - nao_lola_command_msgs
+  - nao_lola_sensor_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-sports/nao_lola
   tag: release/rolling/nao_lola_client/1.3.0-2
   url: https://github.com/ros2-gbp/nao_lola-release.git
   version: 1.3.0
 nao_lola_command_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-sports/nao_lola
   tag: release/rolling/nao_lola_command_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/nao_lola-release.git
   version: 1.3.0
 nao_lola_sensor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-sports/nao_lola
   tag: release/rolling/nao_lola_sensor_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/nao_lola-release.git
   version: 1.3.0
 nao_sensor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ijnek/nao_interfaces
   tag: release/rolling/nao_sensor_msgs/1.0.0-3
   url: https://github.com/ros2-gbp/nao_interfaces-release.git
   version: 1.0.0
 nav2_minimal_tb3_sim:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - robot_state_publisher
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_interfaces
+  - ros_gz_sim
+  - xacro
+  repository: https://github.com/ros-navigation/nav2_minimal_turtlebot_simulation
   tag: release/rolling/nav2_minimal_tb3_sim/1.3.0-1
   url: https://github.com/ros2-gbp/nav2_minimal_turtlebot_simulation-release.git
   version: 1.3.0
 nav2_minimal_tb4_description:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - joint_state_publisher
+  - robot_state_publisher
+  - urdf
+  - xacro
+  repository: https://github.com/ros-navigation/nav2_minimal_turtlebot_simulation
   tag: release/rolling/nav2_minimal_tb4_description/1.3.0-1
   url: https://github.com/ros2-gbp/nav2_minimal_turtlebot_simulation-release.git
   version: 1.3.0
 nav2_minimal_tb4_sim:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - nav2_minimal_tb4_description
+  - robot_state_publisher
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_interfaces
+  - ros_gz_sim
+  - xacro
+  repository: https://github.com/ros-navigation/nav2_minimal_turtlebot_simulation
   tag: release/rolling/nav2_minimal_tb4_sim/1.3.0-1
   url: https://github.com/ros2-gbp/nav2_minimal_turtlebot_simulation-release.git
   version: 1.3.0
 nav_msgs:
-  tag: release/rolling/nav_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/nav_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 ndcurves:
+  dependencies:
+  - ament_cmake
+  - eigenpy
+  - jrl_cmakemodules
+  - pinocchio
+  repository: https://github.com/loco-3d/ndcurves
   tag: release/rolling/ndcurves/2.3.0-1
   url: https://github.com/ros2-gbp/ndcurves-release.git
   version: 2.3.0
 neobotix_usboard_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/astuff/astuff_sensor_msgs
   tag: release/rolling/neobotix_usboard_msgs/4.0.0-4
   url: https://github.com/ros2-gbp/astuff_sensor_msgs-release.git
   version: 4.0.0
 network_bridge:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - pluginlib
+  - rclcpp
+  - std_msgs
+  - tf2_msgs
+  - tf2_ros
+  repository: https://github.com/brow1633/network_bridge
   tag: release/rolling/network_bridge/3.0.0-2
   url: https://github.com/ros2-gbp/network_bridge-release.git
   version: 3.0.0
 nlohmann_json_schema_validator_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/open-rmf/nlohmann_json_schema_validator_vendor
   tag: release/rolling/nlohmann_json_schema_validator_vendor/0.5.0-2
   url: https://github.com/ros2-gbp/nlohmann_json_schema_validator_vendor-release.git
   version: 0.5.0
 nmea_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/nmea_msgs
   tag: release/rolling/nmea_msgs/2.1.0-3
   url: https://github.com/ros2-gbp/nmea_msgs-release.git
   version: 2.1.0
 nmea_navsat_driver:
+  dependencies:
+  - geometry_msgs
+  - nmea_msgs
+  - rclpy
+  - sensor_msgs
+  - tf_transformations
+  repository: https://github.com/ros-drivers/nmea_navsat_driver
   tag: release/rolling/nmea_navsat_driver/2.0.1-3
   url: https://github.com/ros2-gbp/nmea_navsat_driver-release.git
   version: 2.0.1
 nobleo_socketcan_bridge:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - can_msgs
+  - diagnostic_msgs
+  - diagnostic_updater
+  - rclcpp
+  - rclcpp_components
+  repository: https://github.com/nobleo/nobleo_socketcan_bridge
   tag: release/rolling/nobleo_socketcan_bridge/1.0.4-2
   url: https://github.com/ros2-gbp/nobleo_socketcan_bridge-release.git
   version: 1.0.4
-nodl_python:
-  tag: release/rolling/nodl_python/0.3.1-5
+nodl:
+  dependencies:
+  - ament_cmake
+  - ament_nodl
+  - nodl_common_interfaces
+  - nodl_generator_cpp
+  - nodl_schema
+  - ros2nodl
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
+nodl_common_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_nodl
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl_common_interfaces/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
+nodl_conformance:
+  dependencies:
+  - nodl_schema
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl_conformance/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
+nodl_docgen:
+  dependencies:
+  - nodl_schema
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl_docgen/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
+nodl_generator_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - generate_parameter_library
+  - generate_parameter_library_py
+  - nodl_schema
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl_generator_cpp/2.0.3-1
   url: https://github.com/ros2-gbp/nodl-release.git
-  version: 0.3.1
+  version: 2.0.3
+nodl_observe:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - builtin_interfaces
+  - example_interfaces
+  - rcl_action
+  - rcl_interfaces
+  - rclcpp
+  - rclpy
+  - rmw
+  - rmw_cyclonedds_cpp
+  - rmw_fastrtps_cpp
+  - rmw_implementation_cmake
+  - rmw_zenoh_cpp
+  - ros_environment
+  - rosgraph_msgs
+  - rosidl_runtime_py
+  - std_msgs
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl_observe/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
+nodl_schema:
+  dependencies:
+  - ament_index_python
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/nodl_schema/2.0.3-1
+  url: https://github.com/ros2-gbp/nodl-release.git
+  version: 2.0.3
 nodl_to_policy:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_lint_auto
+  - ament_mypy
+  - ament_pep257
+  - ament_pycodestyle
+  - ros2cli
+  - ros2nodl
+  - ros2run
+  - ros_testing
+  - sros2
+  - test_msgs
+  repository: https://github.com/osrf/nodl_to_policy
   tag: release/rolling/nodl_to_policy/1.0.0-5
   url: https://github.com/ros2-gbp/nodl_to_policy-release.git
   version: 1.0.0
 novatel_gps_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - ament_lint_auto
+  - diagnostic_msgs
+  - diagnostic_updater
+  - gps_msgs
+  - nav_msgs
+  - novatel_gps_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - swri_math_util
+  - swri_serial_util
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/swri-robotics/novatel_gps_driver
   tag: release/rolling/novatel_gps_driver/5.0.0-1
   url: https://github.com/ros2-gbp/novatel_gps_driver-release.git
   version: 5.0.0
 novatel_gps_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/swri-robotics/novatel_gps_driver
   tag: release/rolling/novatel_gps_msgs/5.0.0-1
   url: https://github.com/ros2-gbp/novatel_gps_driver-release.git
   version: 5.0.0
 novatel_oem6_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/mrpt-ros-pkg/mrpt_sensors
   tag: release/rolling/novatel_oem6_msgs/0.3.0-1
   url: https://github.com/ros2-gbp/mrpt_sensors-release.git
   version: 0.3.0
 ntpd_driver:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/vooon/ntpd_driver
   tag: release/rolling/ntpd_driver/2.3.0-2
   url: https://github.com/ros2-gbp/ntpd_driver-release.git
   version: 2.3.0
 ntrip_client:
+  dependencies:
+  - nmea_msgs
+  - rclpy
+  - rtcm_msgs
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/LORD-MicroStrain/ntrip_client
   tag: release/rolling/ntrip_client/1.4.1-2
   url: https://github.com/ros2-gbp/ntrip_client-release.git
   version: 1.4.1
 ntrip_client_node:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_uncrustify
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rtcm_msgs
+  - std_msgs
+  repository: https://github.com/aussierobots/ublox_dgnss
   tag: release/rolling/ntrip_client_node/0.7.6-1
   url: https://github.com/ros2-gbp/ublox_dgnss-release.git
   version: 0.7.6
 object_recognition_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - shape_msgs
+  - std_msgs
+  repository: https://github.com/wg-perception/object_recognition_msgs
   tag: release/rolling/object_recognition_msgs/2.0.0-5
   url: https://github.com/ros2-gbp/object_recognition_msgs-release.git
   version: 2.0.0
 octomap_mapping:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - octomap_server
+  repository: https://github.com/OctoMap/octomap_mapping
   tag: release/rolling/octomap_mapping/2.3.1-2
   url: https://github.com/ros2-gbp/octomap_mapping-release.git
   version: 2.3.1
 octomap_msgs:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/octomap/octomap_msgs
   tag: release/rolling/octomap_msgs/2.0.1-2
   url: https://github.com/ros2-gbp/octomap_msgs-release.git
   version: 2.0.1
 octomap_ros:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - octomap_msgs
+  - sensor_msgs
+  - tf2
+  repository: https://github.com/OctoMap/octomap_ros
   tag: release/rolling/octomap_ros/0.4.5-2
   url: https://github.com/ros2-gbp/octomap_ros-release.git
   version: 0.4.5
 octomap_rviz_plugins:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - octomap_msgs
+  - rclcpp
+  - rviz_common
+  - rviz_default_plugins
+  - rviz_rendering
+  repository: https://github.com/OctoMap/octomap_rviz_plugins
   tag: release/rolling/octomap_rviz_plugins/2.2.0-2
   url: https://github.com/ros2-gbp/octomap_rviz_plugins-release.git
   version: 2.2.0
 octomap_server:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - message_filters
+  - nav_msgs
+  - octomap_msgs
+  - octomap_ros
+  - pcl_conversions
+  - pcl_ros
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/OctoMap/octomap_mapping
   tag: release/rolling/octomap_server/2.3.1-2
   url: https://github.com/ros2-gbp/octomap_mapping-release.git
   version: 2.3.1
 odom_to_tf_ros2:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/gstavrinos/odom_to_tf_ros2
   tag: release/rolling/odom_to_tf_ros2/1.0.8-2
   url: https://github.com/ros2-gbp/odom_to_tf_ros2-release.git
   version: 1.0.8
 odri_master_board_sdk:
+  dependencies: []
   tag: release/rolling/odri_master_board_sdk/1.0.7-3
   url: https://github.com/ros2-gbp/odri_master_board_sdk-release.git
   version: 1.0.7
 off_highway_can:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - can_msgs
+  - diagnostic_updater
+  - rclcpp
+  - ros2_socketcan_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_can/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_general_purpose_radar:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - can_msgs
+  - off_highway_can
+  - off_highway_general_purpose_radar_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_general_purpose_radar/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_general_purpose_radar_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_general_purpose_radar_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_mm7p10:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - can_msgs
+  - off_highway_can
+  - off_highway_mm7p10_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_mm7p10/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_mm7p10_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_mm7p10_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_premium_radar:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - asio_cmake_module
+  - diagnostic_updater
+  - io_context
+  - off_highway_premium_radar_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_premium_radar/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_premium_radar_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_premium_radar_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_premium_radar_sample:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - asio_cmake_module
+  - diagnostic_updater
+  - io_context
+  - off_highway_premium_radar_sample_msgs
+  - pcl_conversions
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_premium_radar_sample/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_premium_radar_sample_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_premium_radar_sample_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_radar:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - can_msgs
+  - off_highway_can
+  - off_highway_radar_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_radar/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_radar_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_radar_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_sensor_drivers:
+  dependencies:
+  - ament_cmake
+  - off_highway_can
+  - off_highway_general_purpose_radar
+  - off_highway_general_purpose_radar_msgs
+  - off_highway_premium_radar
+  - off_highway_premium_radar_msgs
+  - off_highway_premium_radar_sample
+  - off_highway_premium_radar_sample_msgs
+  - off_highway_radar
+  - off_highway_radar_msgs
+  - off_highway_uss
+  - off_highway_uss_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_sensor_drivers/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_sensor_drivers_examples:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - nav_msgs
+  - off_highway_premium_radar
+  - off_highway_radar
+  - rclcpp
+  - rclcpp_components
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_sensor_drivers_examples/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_uss:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - can_msgs
+  - off_highway_can
+  - off_highway_uss_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_uss/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 off_highway_uss_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/bosch-engineering/off_highway_sensor_drivers
   tag: release/rolling/off_highway_uss_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/off_highway_sensor_drivers-release.git
   version: 1.3.0
 om_gravity_compensation_controller:
+  dependencies:
+  - ament_cmake
+  - angles
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - generate_parameter_library
+  - hardware_interface
+  - kdl_parser
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - rsl
+  - urdf
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/om_gravity_compensation_controller/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 om_joint_trajectory_command_broadcaster:
+  dependencies:
+  - ament_cmake
+  - backward_ros
+  - builtin_interfaces
+  - control_msgs
+  - controller_interface
+  - generate_parameter_library
+  - pluginlib
+  - rclcpp_lifecycle
+  - rcutils
+  - realtime_tools
+  - sensor_msgs
+  - trajectory_msgs
+  - urdf
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/om_joint_trajectory_command_broadcaster/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 om_spring_actuator_controller:
+  dependencies:
+  - ament_cmake
+  - controller_interface
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - urdf
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/om_spring_actuator_controller/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 omni_wheel_drive_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - tf2
+  - tf2_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/omni_wheel_drive_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 ompl:
-  tag: release/rolling/ompl/2.0.1-3
+  dependencies: []
+  repository: https://github.com/ompl/ompl
+  tag: release/rolling/ompl/2.0.2-1
   url: https://github.com/ros2-gbp/ompl-release.git
-  version: 2.0.1
+  version: 2.0.2
 onnxruntime_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ros-controls/onnxruntime_vendor
   tag: release/rolling/onnxruntime_vendor/0.1.0-2
   url: https://github.com/ros2-gbp/onnxruntime_vendor-release.git
   version: 0.1.0
 open3d_vendor:
+  dependencies: []
+  repository: https://github.com/christian-rauch/open3d_colcon
   tag: release/rolling/open3d_vendor/0.19.0-2
   url: https://github.com/ros2-gbp/open3d_vendor-release.git
   version: 0.19.0
 open_manipulator:
+  dependencies:
+  - ament_cmake
+  - om_gravity_compensation_controller
+  - om_joint_trajectory_command_broadcaster
+  - om_spring_actuator_controller
+  - open_manipulator_bringup
+  - open_manipulator_collision
+  - open_manipulator_description
+  - open_manipulator_gui
+  - open_manipulator_moveit_config
+  - open_manipulator_playground
+  - open_manipulator_teleop
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_bringup:
+  dependencies:
+  - dynamixel_hardware_interface
+  - gz_ros2_control
+  - open_manipulator_description
+  - rclpy
+  - robot_state_publisher
+  - ros2_control
+  - ros2_controllers
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_sim
+  - rviz2
+  - xacro
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_bringup/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_collision:
+  dependencies:
+  - ament_cmake
+  - kdl_parser
+  - rclcpp
+  - sensor_msgs
+  - std_msgs
+  - urdf
+  - visualization_msgs
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_collision/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_description:
+  dependencies:
+  - ament_cmake
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - robot_state_publisher
+  - rviz2
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_description/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_gui:
+  dependencies:
+  - ament_cmake
+  - eigen3_cmake_module
+  - geometry_msgs
+  - moveit_core
+  - moveit_msgs
+  - moveit_ros_planning
+  - moveit_ros_planning_interface
+  - rclcpp
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_gui/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_moveit_config:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - moveit_configs_utils
+  - moveit_kinematics
+  - moveit_planners
+  - moveit_ros_move_group
+  - moveit_ros_visualization
+  - moveit_ros_warehouse
+  - moveit_setup_assistant
+  - moveit_simple_controller_manager
+  - open_manipulator_description
+  - robot_state_publisher
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - tf2_ros
+  - warehouse_ros_sqlite
+  - xacro
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_moveit_config/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_playground:
+  dependencies:
+  - ament_cmake
+  - moveit_ros_planning_interface
+  - rclcpp
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_playground/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 open_manipulator_teleop:
+  dependencies:
+  - control_msgs
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - trajectory_msgs
+  repository: https://github.com/ROBOTIS-GIT/open_manipulator
   tag: release/rolling/open_manipulator_teleop/4.1.2-2
   url: https://github.com/ros2-gbp/open_manipulator-release.git
   version: 4.1.2
 openeb_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ros-event-camera/openeb_vendor
   tag: release/rolling/openeb_vendor/2.0.3-1
   url: https://github.com/ros2-gbp/openeb_vendor-release.git
   version: 2.0.3
 openni2_camera:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - camera_info_manager
+  - depth_image_proc
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/openni2_camera
   tag: release/rolling/openni2_camera/2.3.0-2
   url: https://github.com/ros2-gbp/openni2_camera-release.git
   version: 2.3.0
 orocos_kdl_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  repository: https://github.com/ros2/orocos_kdl_vendor
   tag: release/rolling/orocos_kdl_vendor/0.8.0-2
   url: https://github.com/ros2-gbp/orocos_kdl_vendor-release.git
   version: 0.8.0
 ortools_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  repository: https://github.com/Fields2Cover/ortools_vendor
   tag: release/rolling/ortools_vendor/9.9.1-5
   url: https://github.com/ros2-gbp/ortools_vendor-release.git
   version: 9.9.1
 osqp_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - ros_environment
+  repository: https://github.com/moveit/osqp_vendor
   tag: release/rolling/osqp_vendor/1.0.0-1
   url: https://github.com/ros2-gbp/osqp_vendor-release.git
   version: 1.0.0
 osrf_pycommon:
+  dependencies: []
+  repository: https://github.com/osrf/osrf_pycommon
   tag: release/rolling/osrf_pycommon/2.1.7-2
   url: https://github.com/ros2-gbp/osrf_pycommon-release.git
   version: 2.1.7
 osrf_testing_tools_cpp:
+  dependencies: []
+  repository: https://github.com/osrf/osrf_testing_tools_cpp
   tag: release/rolling/osrf_testing_tools_cpp/2.3.1-1
   url: https://github.com/ros2-gbp/osrf_testing_tools_cpp-release.git
   version: 2.3.1
 ouster_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - class_loader
+  - cv_bridge
+  - geometry_msgs
+  - launch
+  - launch_ros
+  - ouster_sensor_msgs
+  - pcl_conversions
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_eigen
+  - tf2_ros
+  repository: https://github.com/ouster-lidar/ouster-ros
   tag: release/rolling/ouster_ros/0.15.1-1
   url: https://github.com/ros2-gbp/ouster-ros-release.git
   version: 0.15.1
 ouster_sensor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ouster-lidar/ouster-ros
   tag: release/rolling/ouster_sensor_msgs/0.15.1-1
   url: https://github.com/ros2-gbp/ouster-ros-release.git
   version: 0.15.1
 ouxt_common:
+  dependencies:
+  - ament_cmake
+  - ouxt_lint_common
+  repository: https://github.com/OUXT-Polaris/ouxt_common
   tag: release/rolling/ouxt_common/0.0.8-5
   url: https://github.com/ros2-gbp/ouxt_common-release.git
   version: 0.0.8
 ouxt_lint_common:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_copyright
+  - ament_cmake_pep257
+  - ament_cmake_xmllint
+  repository: https://github.com/OUXT-Polaris/ouxt_common
   tag: release/rolling/ouxt_lint_common/0.0.8-5
   url: https://github.com/ros2-gbp/ouxt_common-release.git
   version: 0.0.8
 pal_statistics:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - pal_statistics_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  - rclpy
+  repository: https://github.com/pal-robotics/pal_statistics
   tag: release/rolling/pal_statistics/2.8.2-1
   url: https://github.com/ros2-gbp/pal_statistics-release.git
   version: 2.8.2
 pal_statistics_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/pal-robotics/pal_statistics
   tag: release/rolling/pal_statistics_msgs/2.8.2-1
   url: https://github.com/ros2-gbp/pal_statistics-release.git
   version: 2.8.2
 pal_urdf_utils:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - realsense2_description
+  - xacro
+  repository: https://github.com/pal-robotics/pal_urdf_utils
   tag: release/rolling/pal_urdf_utils/2.9.2-1
   url: https://github.com/ros2-gbp/pal_urdf_utils-release.git
   version: 2.9.2
 pangolin:
+  dependencies: []
+  repository: https://github.com/stevenlovegrove/Pangolin
   tag: release/rolling/pangolin/0.9.6-1
   url: https://github.com/ros2-gbp/Pangolin-release.git
   version: 0.9.6
 parallel_gripper_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/parallel_gripper_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 parameter_expression:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_clang_format
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - std_msgs
+  repository: https://github.com/ForteFibre/parameter_expression
   tag: release/rolling/parameter_expression/0.0.2-2
   url: https://github.com/ros2-gbp/parameter_expression-release.git
   version: 0.0.2
 pcl_conversions:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - message_filters
+  - pcl_msgs
+  - rclcpp
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-perception/perception_pcl
   tag: release/rolling/pcl_conversions/2.10.0-1
   url: https://github.com/ros2-gbp/perception_pcl-release.git
   version: 2.10.0
 pcl_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-perception/pcl_msgs
   tag: release/rolling/pcl_msgs/1.0.0-9
   url: https://github.com/ros2-gbp/pcl_msgs-release.git
   version: 1.0.0
 pcl_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - pcl_conversions
+  - rclcpp
+  - rclcpp_components
+  - rosbag2_transport
+  - sensor_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  - visualization_msgs
+  repository: https://github.com/ros-perception/perception_pcl
   tag: release/rolling/pcl_ros/2.10.0-1
   url: https://github.com/ros2-gbp/perception_pcl-release.git
   version: 2.10.0
 pendulum_control:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - pendulum_msgs
+  - rclcpp
+  - rmw_implementation_cmake
+  - ros2run
+  - rttest
+  - tlsf_cpp
+  repository: https://github.com/ros2/demos
   tag: release/rolling/pendulum_control/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 pendulum_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/demos
   tag: release/rolling/pendulum_msgs/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 perception:
+  dependencies:
+  - ament_cmake
+  - image_common
+  - image_pipeline
+  - image_transport_plugins
+  - laser_filters
+  - laser_geometry
+  - perception_pcl
+  - ros_base
+  - vision_opencv
+  repository: https://github.com/ros2/variants
   tag: release/rolling/perception/0.13.0-2
   url: https://github.com/ros2-gbp/variants-release.git
   version: 0.13.0
 perception_pcl:
+  dependencies:
+  - ament_cmake
+  - pcl_conversions
+  - pcl_msgs
+  - pcl_ros
+  repository: https://github.com/ros-perception/perception_pcl
   tag: release/rolling/perception_pcl/2.10.0-1
   url: https://github.com/ros2-gbp/perception_pcl-release.git
   version: 2.10.0
 performance_test:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rmw_implementation
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://gitlab.com/ApexAI/performance_test
   tag: release/rolling/performance_test/2.3.0-3
   url: https://github.com/ros2-gbp/performance_test-release.git
   version: 2.3.0
 performance_test_fixture:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_export_dependencies
+  - ament_cmake_export_targets
+  - ament_cmake_google_benchmark
+  - ament_cmake_test
+  - ament_lint_auto
+  - ament_lint_common
+  - google_benchmark_vendor
+  - osrf_testing_tools_cpp
+  repository: https://github.com/ros2/performance_test_fixture
   tag: release/rolling/performance_test_fixture/0.5.0-1
   url: https://github.com/ros2-gbp/performance_test_fixture-release.git
   version: 0.5.0
 persist_parameter_server:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - launch_ros
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rmw
+  - rmw_implementation_cmake
+  - std_msgs
+  - std_srvs
+  - yaml_cpp_vendor
+  repository: https://github.com/fujitatomoya/ros2_persist_parameter_server
   tag: release/rolling/persist_parameter_server/4.0.0-2
   url: https://github.com/ros2-gbp/persist_parameter_server-release.git
   version: 4.0.0
 pfs:
+  dependencies: []
+  repository: https://github.com/dtrugman/pfs
   tag: release/rolling/pfs/0.15.0-1
   url: https://github.com/ros2-gbp/pfs-release.git
   version: 0.15.0
 phidgets_accelerometer:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_accelerometer/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_analog_inputs:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_analog_inputs/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_analog_outputs:
+  dependencies:
+  - ament_cmake_ros
+  - phidgets_api
+  - phidgets_msgs
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_analog_outputs/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_api:
+  dependencies:
+  - ament_cmake_ros
+  - libphidget22
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_api/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_digital_inputs:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_digital_inputs/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_digital_outputs:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - phidgets_msgs
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_digital_outputs/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_drivers:
+  dependencies:
+  - ament_cmake
+  - libphidget22
+  - phidgets_accelerometer
+  - phidgets_analog_inputs
+  - phidgets_api
+  - phidgets_digital_inputs
+  - phidgets_digital_outputs
+  - phidgets_gyroscope
+  - phidgets_high_speed_encoder
+  - phidgets_ik
+  - phidgets_magnetometer
+  - phidgets_motors
+  - phidgets_msgs
+  - phidgets_spatial
+  - phidgets_temperature
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_drivers/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_gyroscope:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_gyroscope/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_high_speed_encoder:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - phidgets_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_high_speed_encoder/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_ik:
+  dependencies:
+  - ament_cmake
+  - launch
+  - phidgets_analog_inputs
+  - phidgets_digital_inputs
+  - phidgets_digital_outputs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_ik/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_magnetometer:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_magnetometer/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_motors:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - phidgets_msgs
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_motors/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_msgs/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_spatial:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_spatial/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_stepper:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - phidgets_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_stepper/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 phidgets_temperature:
+  dependencies:
+  - ament_cmake_ros
+  - launch
+  - phidgets_api
+  - rclcpp
+  - rclcpp_components
+  - std_msgs
+  repository: https://github.com/ros-drivers/phidgets_drivers
   tag: release/rolling/phidgets_temperature/2.4.0-2
   url: https://github.com/ros2-gbp/phidgets_drivers-release.git
   version: 2.4.0
 pick_ik:
+  dependencies:
+  - ament_cmake_ros
+  - generate_parameter_library
+  - moveit_core
+  - moveit_resources_panda_moveit_config
+  - pluginlib
+  - rclcpp
+  - rsl
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_kdl
+  repository: https://github.com/PickNikRobotics/pick_ik
   tag: release/rolling/pick_ik/1.1.3-1
   url: https://github.com/ros2-gbp/pick_ik-release.git
   version: 1.1.3
 picknik_ament_copyright:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
   tag: release/rolling/picknik_ament_copyright/0.0.2-5
   url: https://github.com/ros2-gbp/picknik_ament_copyright-release.git
   version: 0.0.2
 pid_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - angles
+  - backward_ros
+  - control_msgs
+  - control_toolbox
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/pid_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 pilz_industrial_motion_planner:
-  tag: release/rolling/pilz_industrial_motion_planner/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - eigen3_cmake_module
+  - generate_parameter_library
+  - geometry_msgs
+  - launch_param_builder
+  - moveit_common
+  - moveit_configs_utils
+  - moveit_core
+  - moveit_msgs
+  - moveit_resources_panda_moveit_config
+  - moveit_resources_prbt_moveit_config
+  - moveit_resources_prbt_pg70_support
+  - moveit_resources_prbt_support
+  - moveit_ros_move_group
+  - moveit_ros_planning
+  - orocos_kdl_vendor
+  - pilz_industrial_motion_planner_testutils
+  - pluginlib
+  - rclcpp
+  - ros_testing
+  - tf2
+  - tf2_eigen
+  - tf2_eigen_kdl
+  - tf2_geometry_msgs
+  - tf2_kdl
+  - tf2_ros
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/pilz_industrial_motion_planner/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 pilz_industrial_motion_planner_testutils:
-  tag: release/rolling/pilz_industrial_motion_planner_testutils/2.15.0-1
+  dependencies:
+  - ament_cmake
+  - eigen3_cmake_module
+  - moveit_common
+  - moveit_core
+  - moveit_msgs
+  - rclcpp
+  - tf2_eigen
+  repository: https://github.com/ros-planning/moveit2
+  tag: release/rolling/pilz_industrial_motion_planner_testutils/2.15.1-1
   url: https://github.com/ros2-gbp/moveit2-release.git
-  version: 2.15.0
+  version: 2.15.1
 pinocchio:
+  dependencies:
+  - coal
+  - eigenpy
+  - jrl_cmakemodules
+  - ros_environment
+  - urdfdom
+  repository: https://github.com/stack-of-tasks/pinocchio
   tag: release/rolling/pinocchio/4.1.0-1
   url: https://github.com/ros2-gbp/pinocchio-release.git
   version: 4.1.0
 play_motion2:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - controller_manager_msgs
+  - hardware_interface
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - launch
+  - launch_ros
+  - launch_testing_ament_cmake
+  - lifecycle_msgs
+  - moveit_ros_planning_interface
+  - play_motion2_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - realtime_tools
+  - robot_state_publisher
+  - sensor_msgs
+  - std_msgs
+  - trajectory_msgs
+  - xacro
+  repository: https://github.com/pal-robotics/play_motion2
   tag: release/rolling/play_motion2/1.8.4-2
   url: https://github.com/ros2-gbp/play_motion2-release.git
   version: 1.8.4
 play_motion2_cli:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - play_motion2
+  - rclpy
+  - ros2cli
+  repository: https://github.com/pal-robotics/play_motion2
   tag: release/rolling/play_motion2_cli/1.8.4-2
   url: https://github.com/ros2-gbp/play_motion2-release.git
   version: 1.8.4
 play_motion2_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/pal-robotics/play_motion2
   tag: release/rolling/play_motion2_msgs/1.8.4-2
   url: https://github.com/ros2-gbp/play_motion2-release.git
   version: 1.8.4
 play_motion_builder:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - play_motion2
+  - play_motion2_msgs
+  - play_motion_builder_msgs
+  - rclcpp
+  - rclcpp_action
+  - sensor_msgs
+  repository: https://github.com/pal-robotics/play_motion_builder
   tag: release/rolling/play_motion_builder/1.4.1-2
   url: https://github.com/ros2-gbp/play_motion_builder-release.git
   version: 1.4.1
 play_motion_builder_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/pal-robotics/play_motion_builder
   tag: release/rolling/play_motion_builder_msgs/1.4.1-2
   url: https://github.com/ros2-gbp/play_motion_builder-release.git
   version: 1.4.1
 plotjuggler:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - data_tamer_cpp
+  repository: https://github.com/facontidavide/PlotJuggler
   tag: release/rolling/plotjuggler/3.17.2-1
   url: https://github.com/ros2-gbp/plotjuggler-release.git
   version: 3.17.2
 plotjuggler_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/facontidavide/plotjuggler_msgs
   tag: release/rolling/plotjuggler_msgs/0.2.3-5
   url: https://github.com/ros2-gbp/plotjuggler_msgs-release.git
   version: 0.2.3
 plotjuggler_ros:
+  dependencies:
+  - ament_cmake
+  - plotjuggler
+  - plotjuggler_msgs
+  - rclcpp
+  - rcpputils
+  - rosbag2_transport
+  - tf2_msgs
+  - tf2_ros
+  repository: https://github.com/PlotJuggler/plotjuggler-ros-plugins
   tag: release/rolling/plotjuggler_ros/2.3.1-2
   url: https://github.com/ros2-gbp/plotjuggler-ros-plugins-release.git
   version: 2.3.1
 pluginlib:
-  tag: release/rolling/pluginlib/6.0.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - rcpputils
+  - rcutils
+  repository: https://github.com/ros/pluginlib
+  tag: release/rolling/pluginlib/6.0.2-1
   url: https://github.com/ros2-gbp/pluginlib-release.git
-  version: 6.0.1
+  version: 6.0.2
 point_cloud_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-perception/point_cloud_transport_plugins
   tag: release/rolling/point_cloud_interfaces/7.0.0-1
   url: https://github.com/ros2-gbp/point_cloud_transport_plugins-release.git
   version: 7.0.0
 point_cloud_msg_wrapper:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - sensor_msgs
+  repository: https://gitlab.com/ApexAI/point_cloud_msg_wrapper
   tag: release/rolling/point_cloud_msg_wrapper/1.0.7-5
   url: https://github.com/ros2-gbp/point_cloud_msg_wrapper-release.git
   version: 1.0.7
 point_cloud_transport:
-  tag: release/rolling/point_cloud_transport/6.0.2-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rcpputils
+  - rmw
+  - sensor_msgs
+  repository: https://github.com/ros-perception/point_cloud_transport
+  tag: release/rolling/point_cloud_transport/6.0.3-1
   url: https://github.com/ros2-gbp/point_cloud_transport-release.git
-  version: 6.0.2
+  version: 6.0.3
 point_cloud_transport_plugins:
+  dependencies:
+  - ament_cmake
+  - draco_point_cloud_transport
+  - point_cloud_interfaces
+  - zlib_point_cloud_transport
+  - zstd_point_cloud_transport
+  repository: https://github.com/ros-perception/point_cloud_transport_plugins
   tag: release/rolling/point_cloud_transport_plugins/7.0.0-1
   url: https://github.com/ros2-gbp/point_cloud_transport_plugins-release.git
   version: 7.0.0
 point_cloud_transport_py:
-  tag: release/rolling/point_cloud_transport_py/6.0.2-1
+  dependencies:
+  - ament_cmake_python
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - pluginlib
+  - point_cloud_transport
+  - rclcpp
+  - rclpy
+  - rpyutils
+  - sensor_msgs
+  repository: https://github.com/ros-perception/point_cloud_transport
+  tag: release/rolling/point_cloud_transport_py/6.0.3-1
   url: https://github.com/ros2-gbp/point_cloud_transport-release.git
-  version: 6.0.2
+  version: 6.0.3
 point_cloud_transport_tutorial:
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - point_cloud_transport
+  - point_cloud_transport_plugins
+  - rclcpp
+  - rosbag2_cpp
+  - sensor_msgs
+  repository: https://github.com/ros-perception/point_cloud_transport_tutorial
   tag: release/rolling/point_cloud_transport_tutorial/0.0.9-2
   url: https://github.com/ros2-gbp/point_cloud_transport_tutorial-release.git
   version: 0.0.9
 pointcloud_to_laserscan:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - laser_geometry
+  - launch
+  - launch_ros
+  - message_filters
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2
+  - tf2_ros
+  - tf2_sensor_msgs
+  repository: https://github.com/ros-perception/pointcloud_to_laserscan
   tag: release/rolling/pointcloud_to_laserscan/2.1.0-2
   url: https://github.com/ros2-gbp/pointcloud_to_laserscan-release.git
   version: 2.1.0
 polygon_demos:
+  dependencies:
+  - ament_cmake
+  - angles
+  - color_util
+  - geometry_msgs
+  - polygon_msgs
+  - polygon_rviz_plugins
+  - polygon_utils
+  - rclcpp
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  repository: https://github.com/MetroRobots/polygon_ros
   tag: release/rolling/polygon_demos/1.3.0-2
   url: https://github.com/ros2-gbp/polygon_ros-release.git
   version: 1.3.0
 polygon_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/MetroRobots/polygon_ros
   tag: release/rolling/polygon_msgs/1.3.0-2
   url: https://github.com/ros2-gbp/polygon_ros-release.git
   version: 1.3.0
 polygon_rviz_plugins:
+  dependencies:
+  - ament_cmake_ros
+  - color_util
+  - geometry_msgs
+  - pluginlib
+  - polygon_msgs
+  - polygon_utils
+  - rviz_common
+  - std_msgs
+  repository: https://github.com/MetroRobots/polygon_ros
   tag: release/rolling/polygon_rviz_plugins/1.3.0-2
   url: https://github.com/ros2-gbp/polygon_ros-release.git
   version: 1.3.0
 polygon_utils:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - geometry_msgs
+  - polygon_msgs
+  repository: https://github.com/MetroRobots/polygon_ros
   tag: release/rolling/polygon_utils/1.3.0-2
   url: https://github.com/ros2-gbp/polygon_ros-release.git
   version: 1.3.0
 pose_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - tf2_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/pose_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 pose_cov_ops:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - geometry_msgs
+  - mrpt_libposes
+  - mrpt_libros_bridge
+  - nav_msgs
+  - rclcpp
+  - ros_environment
+  - sensor_msgs
+  - std_msgs
+  - stereo_msgs
+  - tf2
+  repository: https://github.com/mrpt-ros-pkg/pose_cov_ops
   tag: release/rolling/pose_cov_ops/0.4.0-2
   url: https://github.com/ros2-gbp/pose_cov_ops-release.git
   version: 0.4.0
 protobuf_comm:
+  dependencies: []
+  repository: https://github.com/fawkesrobotics/protobuf_comm
   tag: release/rolling/protobuf_comm/0.9.4-1
   url: https://github.com/ros2-gbp/protobuf_comm-release.git
   version: 0.9.4
 proxsuite:
+  dependencies: []
+  repository: https://github.com/Simple-Robotics/proxsuite
   tag: release/rolling/proxsuite/0.7.3-1
   url: https://github.com/ros2-gbp/proxsuite-release.git
   version: 0.7.3
 py_binding_tools:
-  tag: release/rolling/py_binding_tools/2.1.3-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - geometry_msgs
+  - rclcpp
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros-planning/py_binding_tools
+  tag: release/rolling/py_binding_tools/2.1.4-1
   url: https://github.com/ros2-gbp/py_binding_tools-release.git
-  version: 2.1.3
+  version: 2.1.4
 py_trees:
-  tag: release/rolling/py_trees/2.5.0-1
+  dependencies: []
+  repository: https://github.com/splintered-reality/py_trees
+  tag: release/rolling/py_trees/2.6.0-1
   url: https://github.com/ros2-gbp/py_trees-release.git
-  version: 2.5.0
+  version: 2.6.0
 py_trees_js:
+  dependencies: []
+  repository: https://github.com/splintered-reality/py_trees_js
   tag: release/rolling/py_trees_js/0.6.7-1
   url: https://github.com/ros2-gbp/py_trees_js-release.git
   version: 0.6.7
 py_trees_ros:
-  tag: release/rolling/py_trees_ros/2.5.0-1
+  dependencies:
+  - geometry_msgs
+  - py_trees
+  - py_trees_ros_interfaces
+  - rcl_interfaces
+  - rclpy
+  - ros2topic
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_ros_py
+  - unique_identifier_msgs
+  repository: https://github.com/splintered-reality/py_trees_ros
+  tag: release/rolling/py_trees_ros/2.6.0-1
   url: https://github.com/ros2-gbp/py_trees_ros-release.git
-  version: 2.5.0
+  version: 2.6.0
 py_trees_ros_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - diagnostic_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - unique_identifier_msgs
+  repository: https://github.com/splintered-reality/py_trees_ros_interfaces
   tag: release/rolling/py_trees_ros_interfaces/2.1.2-1
   url: https://github.com/ros2-gbp/py_trees_ros_interfaces-release.git
   version: 2.1.2
 py_trees_ros_tutorials:
-  tag: release/rolling/py_trees_ros_tutorials/2.5.0-1
+  dependencies:
+  - action_msgs
+  - geometry_msgs
+  - launch
+  - launch_ros
+  - py_trees
+  - py_trees_ros
+  - py_trees_ros_interfaces
+  - rcl_interfaces
+  - rclpy
+  - ros2launch
+  - ros2param
+  - ros2run
+  - ros2service
+  - ros2topic
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/splintered-reality/py_trees_ros_tutorials
+  tag: release/rolling/py_trees_ros_tutorials/2.6.0-1
   url: https://github.com/ros2-gbp/py_trees_ros_tutorials-release.git
-  version: 2.5.0
+  version: 2.6.0
 py_trees_ros_viewer:
+  dependencies:
+  - py_trees_js
+  - py_trees_ros_interfaces
+  - rclpy
+  - unique_identifier_msgs
+  repository: https://github.com/splintered-reality/py_trees_ros_viewer
   tag: release/rolling/py_trees_ros_viewer/0.3.0-1
   url: https://github.com/ros2-gbp/py_trees_ros_viewer-release.git
   version: 0.3.0
 pybind11_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ros2/pybind11_vendor
   tag: release/rolling/pybind11_vendor/3.3.1-2
   url: https://github.com/ros2-gbp/pybind11_vendor-release.git
   version: 3.3.1
 pyhri:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - cv_bridge
+  - geometry_msgs
+  - hri
+  - hri_msgs
+  - pybind11_vendor
+  - rclcpp
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - tf2_ros_py
+  repository: https://github.com/ros4hri/libhri
   tag: release/rolling/pyhri/2.9.0-2
   url: https://github.com/ros2-gbp/libhri-release.git
   version: 2.9.0
 pymoveit2:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_python
+  - control_msgs
+  - geometry_msgs
+  - moveit_msgs
+  - rclpy
+  - sensor_msgs
+  - shape_msgs
+  - std_srvs
+  - trajectory_msgs
+  repository: https://github.com/AndrejOrsula/pymoveit2
   tag: release/rolling/pymoveit2/4.2.0-2
   url: https://github.com/ros2-gbp/pymoveit2-release.git
   version: 4.2.0
 python_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/python_cmake_module
   tag: release/rolling/python_cmake_module/0.12.0-2
   url: https://github.com/ros2-gbp/python_cmake_module-release.git
   version: 0.12.0
 python_mrpt:
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  - mrpt_libapps
+  - mrpt_libgui
+  - mrpt_libnav
+  - mrpt_libslam
+  - rclcpp
+  - ros_environment
+  - rosbag2_storage
+  repository: https://github.com/MRPT/python_mrpt_ros
   tag: release/rolling/python_mrpt/2.15.3-2
   url: https://github.com/ros2-gbp/python_mrpt_ros-release.git
   version: 2.15.3
 python_orocos_kdl_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - orocos_kdl_vendor
+  - pybind11_vendor
+  repository: https://github.com/ros2/orocos_kdl_vendor
   tag: release/rolling/python_orocos_kdl_vendor/0.8.0-2
   url: https://github.com/ros2-gbp/orocos_kdl_vendor-release.git
   version: 0.8.0
 python_qt_binding:
-  tag: release/rolling/python_qt_binding/2.6.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-visualization/python_qt_binding
+  tag: release/rolling/python_qt_binding/2.6.2-1
   url: https://github.com/ros2-gbp/python_qt_binding-release.git
-  version: 2.6.1
+  version: 2.6.2
 qml6_ros2_plugin:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - ament_lint_auto
+  - example_interfaces
+  - image_transport
+  - rclcpp
+  - ros_babel_fish
+  - ros_babel_fish_test_msgs
+  - std_srvs
+  - tf2_ros
+  repository: https://github.com/StefanFabian/qml6_ros2_plugin
   tag: release/rolling/qml6_ros2_plugin/4.26.42-2
   url: https://github.com/ros2-gbp/qml6_ros2_plugin-release.git
   version: 4.26.42
 qml_ros2_plugin:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - ament_lint_auto
+  - example_interfaces
+  - image_transport
+  - rclcpp
+  - ros_babel_fish
+  - ros_babel_fish_test_msgs
+  - std_srvs
+  - tf2_ros
+  repository: https://github.com/StefanFabian/qml_ros2_plugin
   tag: release/rolling/qml_ros2_plugin/3.26.30-2
   url: https://github.com/ros2-gbp/qml_ros2_plugin-release.git
   version: 3.26.30
 qpoases_vendor:
+  dependencies:
+  - ament_cmake_auto
+  repository: https://github.com/Autoware-AI/qpoases_vendor
   tag: release/rolling/qpoases_vendor/3.2.3-5
   url: https://github.com/ros2-gbp/qpoases_vendor-release.git
   version: 3.2.3
 qt_dotgraph:
-  tag: release/rolling/qt_dotgraph/3.0.2-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  repository: https://github.com/ros-visualization/qt_gui_core
+  tag: release/rolling/qt_dotgraph/3.0.3-1
   url: https://github.com/ros2-gbp/qt_gui_core-release.git
-  version: 3.0.2
+  version: 3.0.3
 qt_gui:
-  tag: release/rolling/qt_gui/3.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - python_qt_binding
+  - tango_icons_vendor
+  repository: https://github.com/ros-visualization/qt_gui_core
+  tag: release/rolling/qt_gui/3.0.3-1
   url: https://github.com/ros2-gbp/qt_gui_core-release.git
-  version: 3.0.2
+  version: 3.0.3
 qt_gui_app:
-  tag: release/rolling/qt_gui_app/3.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - qt_gui
+  repository: https://github.com/ros-visualization/qt_gui_core
+  tag: release/rolling/qt_gui_app/3.0.3-1
   url: https://github.com/ros2-gbp/qt_gui_core-release.git
-  version: 3.0.2
+  version: 3.0.3
 qt_gui_core:
-  tag: release/rolling/qt_gui_core/3.0.2-1
+  dependencies:
+  - ament_cmake
+  - qt_dotgraph
+  - qt_gui
+  - qt_gui_app
+  - qt_gui_cpp
+  - qt_gui_py_common
+  repository: https://github.com/ros-visualization/qt_gui_core
+  tag: release/rolling/qt_gui_core/3.0.3-1
   url: https://github.com/ros2-gbp/qt_gui_core-release.git
-  version: 3.0.2
+  version: 3.0.3
 qt_gui_cpp:
-  tag: release/rolling/qt_gui_cpp/3.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - python_qt_binding
+  - qt_gui
+  repository: https://github.com/ros-visualization/qt_gui_core
+  tag: release/rolling/qt_gui_cpp/3.0.3-1
   url: https://github.com/ros2-gbp/qt_gui_core-release.git
-  version: 3.0.2
+  version: 3.0.3
 qt_gui_py_common:
-  tag: release/rolling/qt_gui_py_common/3.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - python_qt_binding
+  repository: https://github.com/ros-visualization/qt_gui_core
+  tag: release/rolling/qt_gui_py_common/3.0.3-1
   url: https://github.com/ros2-gbp/qt_gui_core-release.git
-  version: 3.0.2
+  version: 3.0.3
 quality_of_service_demo_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch
+  - launch_ros
+  - launch_testing
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rmw
+  - rmw_implementation_cmake
+  - sensor_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/quality_of_service_demo_cpp/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 quality_of_service_demo_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  - sensor_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/quality_of_service_demo_py/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 r2r_spl_7:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - rclpy
+  - splsm_7_conversion
+  repository: https://github.com/ros-sports/r2r_spl
   tag: release/rolling/r2r_spl_7/3.0.1-4
   url: https://github.com/ros2-gbp/r2r_spl-release.git
   version: 3.0.1
 radar_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - std_msgs
+  - unique_identifier_msgs
   tag: release/rolling/radar_msgs/0.2.2-4
   url: https://github.com/ros2-gbp/radar_msgs-release.git
   version: 0.2.2
 random_numbers:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_lint_auto
+  - ament_lint_cmake
+  repository: https://github.com/ros-planning/random_numbers
   tag: release/rolling/random_numbers/2.0.5-1
   url: https://github.com/ros2-gbp/random_numbers-release.git
   version: 2.0.5
 range_sensor_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - sensor_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/range_sensor_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 raspimouse:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - lifecycle_msgs
+  - nav_msgs
+  - raspimouse_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/rt-net/raspimouse2
   tag: release/rolling/raspimouse/2.0.0-2
   url: https://github.com/ros2-gbp/raspimouse2-release.git
   version: 2.0.0
 raspimouse_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/rt-net/raspimouse2
   tag: release/rolling/raspimouse_msgs/2.0.0-2
   url: https://github.com/ros2-gbp/raspimouse2-release.git
   version: 2.0.0
 rc_common_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/roboception/rc_common_msgs_ros2
   tag: release/rolling/rc_common_msgs/0.5.3-6
   url: https://github.com/ros2-gbp/rc_common_msgs_ros2-release.git
   version: 0.5.3
 rc_dynamics_api:
+  dependencies: []
+  repository: https://github.com/roboception/rc_dynamics_api
   tag: release/rolling/rc_dynamics_api/0.10.5-2
   url: https://github.com/ros2-gbp/rc_dynamics_api-release.git
   version: 0.10.5
 rc_genicam_api:
+  dependencies: []
+  repository: https://github.com/roboception/rc_genicam_api
   tag: release/rolling/rc_genicam_api/2.8.6-1
   url: https://github.com/ros2-gbp/rc_genicam_api-release.git
   version: 2.8.6
 rc_genicam_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - diagnostic_updater
+  - image_transport
+  - rc_common_msgs
+  - rc_genicam_api
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - stereo_msgs
+  repository: https://github.com/roboception/rc_genicam_driver_ros2
   tag: release/rolling/rc_genicam_driver/0.4.0-2
   url: https://github.com/ros2-gbp/rc_genicam_driver_ros2-release.git
   version: 0.4.0
 rc_reason_clients:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - geometry_msgs
+  - rc_reason_msgs
+  - rclpy
+  - ros2pkg
+  - tf2_msgs
+  - visualization_msgs
+  repository: https://github.com/roboception/rc_reason_clients_ros2
   tag: release/rolling/rc_reason_clients/0.5.0-2
   url: https://github.com/ros2-gbp/rc_reason_clients-release.git
   version: 0.5.0
 rc_reason_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - geometry_msgs
+  - rc_common_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - shape_msgs
+  - std_msgs
+  repository: https://github.com/roboception/rc_reason_clients_ros2
   tag: release/rolling/rc_reason_msgs/0.5.0-2
   url: https://github.com/ros2-gbp/rc_reason_clients-release.git
   version: 0.5.0
 rcdiscover:
+  dependencies: []
+  repository: https://github.com/roboception/rcdiscover
   tag: release/rolling/rcdiscover/2.1.2-1
   url: https://github.com/ros2-gbp/rcdiscover-release.git
   version: 2.1.2
 rcl:
-  tag: release/rolling/rcl/10.5.1-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - libyaml_vendor
+  - mimick_vendor
+  - osrf_testing_tools_cpp
+  - rcl_interfaces
+  - rcl_logging_implementation
+  - rcl_logging_interface
+  - rcl_logging_spdlog
+  - rcl_yaml_param_parser
+  - rcutils
+  - rmw
+  - rmw_implementation
+  - rmw_implementation_cmake
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - service_msgs
+  - test_msgs
+  - tracetools
+  - type_description_interfaces
+  repository: https://github.com/ros2/rcl
+  tag: release/rolling/rcl/10.5.2-1
   url: https://github.com/ros2-gbp/rcl-release.git
-  version: 10.5.1
+  version: 10.5.2
 rcl_action:
-  tag: release/rolling/rcl_action/10.5.1-1
+  dependencies:
+  - action_msgs
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - osrf_testing_tools_cpp
+  - rcl
+  - rcutils
+  - rmw
+  - rmw_implementation_cmake
+  - rosidl_runtime_c
+  - test_msgs
+  repository: https://github.com/ros2/rcl
+  tag: release/rolling/rcl_action/10.5.2-1
   url: https://github.com/ros2-gbp/rcl-release.git
-  version: 10.5.1
+  version: 10.5.2
 rcl_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/rcl_interfaces/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 rcl_lifecycle:
-  tag: release/rolling/rcl_lifecycle/10.5.1-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - lifecycle_msgs
+  - osrf_testing_tools_cpp
+  - rcl
+  - rcutils
+  - rmw
+  - rosidl_runtime_c
+  - tracetools
+  repository: https://github.com/ros2/rcl
+  tag: release/rolling/rcl_lifecycle/10.5.2-1
   url: https://github.com/ros2-gbp/rcl-release.git
-  version: 10.5.1
+  version: 10.5.2
 rcl_logging_implementation:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rcl_logging_interface
+  - rcl_logging_noop
+  - rcl_logging_spdlog
+  - rcpputils
+  - rcutils
+  repository: https://github.com/ros2/rcl_logging
   tag: release/rolling/rcl_logging_implementation/3.5.0-1
   url: https://github.com/ros2-gbp/rcl_logging-release.git
   version: 3.5.0
 rcl_logging_interface:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rcpputils
+  - rcutils
+  repository: https://github.com/ros2/rcl_logging
   tag: release/rolling/rcl_logging_interface/3.5.0-1
   url: https://github.com/ros2-gbp/rcl_logging-release.git
   version: 3.5.0
 rcl_logging_noop:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rcl_logging_interface
+  - rcutils
+  repository: https://github.com/ros2/rcl_logging
   tag: release/rolling/rcl_logging_noop/3.5.0-1
   url: https://github.com/ros2-gbp/rcl_logging-release.git
   version: 3.5.0
 rcl_logging_spdlog:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  - rcl_logging_interface
+  - rcpputils
+  - rcutils
+  - spdlog_vendor
+  repository: https://github.com/ros2/rcl_logging
   tag: release/rolling/rcl_logging_spdlog/3.5.0-1
   url: https://github.com/ros2-gbp/rcl_logging-release.git
   version: 3.5.0
 rcl_logging_syslog:
-  tag: release/rolling/rcl_logging_syslog/0.1.2-2
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  - rcl_logging_interface
+  - rcpputils
+  - rcutils
+  repository: https://github.com/fujitatomoya/rcl_logging_syslog
+  tag: release/rolling/rcl_logging_syslog/0.2.0-2
   url: https://github.com/ros2-gbp/rcl_logging_syslog-release.git
-  version: 0.1.2
+  version: 0.2.0
 rcl_yaml_param_parser:
-  tag: release/rolling/rcl_yaml_param_parser/10.5.1-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - libyaml_vendor
+  - mimick_vendor
+  - osrf_testing_tools_cpp
+  - performance_test_fixture
+  - rcutils
+  - rmw
+  repository: https://github.com/ros2/rcl
+  tag: release/rolling/rcl_yaml_param_parser/10.5.2-1
   url: https://github.com/ros2-gbp/rcl-release.git
-  version: 10.5.1
+  version: 10.5.2
 rclc:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - launch_testing
+  - osrf_testing_tools_cpp
+  - rcl
+  - rcl_action
+  - rclcpp
+  - rclcpp_action
+  - rcutils
+  - rosidl_generator_c
+  - rosidl_typesupport_c
+  - std_msgs
+  - test_msgs
+  repository: https://github.com/ros2/rclc
   tag: release/rolling/rclc/6.3.0-2
   url: https://github.com/ros2-gbp/rclc-release.git
   version: 6.3.0
 rclc_examples:
+  dependencies:
+  - ament_cmake_ros
+  - example_interfaces
+  - lifecycle_msgs
+  - rcl
+  - rclc
+  - rclc_lifecycle
+  - rclc_parameter
+  - std_msgs
+  repository: https://github.com/ros2/rclc
   tag: release/rolling/rclc_examples/6.3.0-2
   url: https://github.com/ros2-gbp/rclc-release.git
   version: 6.3.0
 rclc_lifecycle:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - lifecycle_msgs
+  - osrf_testing_tools_cpp
+  - rcl_lifecycle
+  - rclc
+  - std_msgs
+  repository: https://github.com/ros2/rclc
   tag: release/rolling/rclc_lifecycle/6.3.0-2
   url: https://github.com/ros2-gbp/rclc-release.git
   version: 6.3.0
 rclc_parameter:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - example_interfaces
+  - osrf_testing_tools_cpp
+  - rcl
+  - rcl_interfaces
+  - rclc
+  - rclcpp
+  - rcutils
+  - rosidl_runtime_c
+  - std_msgs
+  repository: https://github.com/ros2/rclc
   tag: release/rolling/rclc_parameter/6.3.0-2
   url: https://github.com/ros2-gbp/rclc-release.git
   version: 6.3.0
 rclcpp:
-  tag: release/rolling/rclcpp/33.0.4-1
+  dependencies:
+  - ament_cmake_gen_version_h
+  - ament_cmake_google_benchmark
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - libstatistics_collector
+  - mimick_vendor
+  - performance_test_fixture
+  - rcl
+  - rcl_interfaces
+  - rcl_logging_interface
+  - rcl_yaml_param_parser
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_implementation_cmake
+  - rosgraph_msgs
+  - rosidl_default_generators
+  - rosidl_dynamic_typesupport
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_c
+  - rosidl_typesupport_cpp
+  - statistics_msgs
+  - test_msgs
+  - tracetools
+  repository: https://github.com/ros2/rclcpp
+  tag: release/rolling/rclcpp/33.1.0-1
   url: https://github.com/ros2-gbp/rclcpp-release.git
-  version: 33.0.4
+  version: 33.1.0
 rclcpp_action:
-  tag: release/rolling/rclcpp_action/33.0.4-1
+  dependencies:
+  - action_msgs
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - mimick_vendor
+  - performance_test_fixture
+  - rcl
+  - rcl_action
+  - rclcpp
+  - rcpputils
+  - rosidl_runtime_c
+  - test_msgs
+  repository: https://github.com/ros2/rclcpp
+  tag: release/rolling/rclcpp_action/33.1.0-1
   url: https://github.com/ros2-gbp/rclcpp-release.git
-  version: 33.0.4
+  version: 33.1.0
 rclcpp_cascade_lifecycle:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - cascade_lifecycle_msgs
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  repository: https://github.com/fmrico/cascade_lifecycle
   tag: release/rolling/rclcpp_cascade_lifecycle/2.0.4-2
   url: https://github.com/ros2-gbp/cascade_lifecycle-release.git
   version: 2.0.4
 rclcpp_components:
-  tag: release/rolling/rclcpp_components/33.0.4-1
+  dependencies:
+  - ament_cmake_google_benchmark
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - composition_interfaces
+  - rcl_interfaces
+  - rclcpp
+  - rcpputils
+  - rmw
+  repository: https://github.com/ros2/rclcpp
+  tag: release/rolling/rclcpp_components/33.1.0-1
   url: https://github.com/ros2-gbp/rclcpp-release.git
-  version: 33.0.4
+  version: 33.1.0
 rclcpp_lifecycle:
-  tag: release/rolling/rclcpp_lifecycle/33.0.4-1
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - lifecycle_msgs
+  - mimick_vendor
+  - performance_test_fixture
+  - rcl
+  - rcl_interfaces
+  - rcl_lifecycle
+  - rclcpp
+  - rcpputils
+  - rcutils
+  - rmw
+  - rosidl_typesupport_cpp
+  - test_msgs
+  repository: https://github.com/ros2/rclcpp
+  tag: release/rolling/rclcpp_lifecycle/33.1.0-1
   url: https://github.com/ros2-gbp/rclcpp-release.git
-  version: 33.0.4
+  version: 33.1.0
 rclpy:
-  tag: release/rolling/rclpy/11.0.2-1
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_mypy
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - lifecycle_msgs
+  - rcl
+  - rcl_action
+  - rcl_interfaces
+  - rcl_lifecycle
+  - rcl_logging_interface
+  - rcl_yaml_param_parser
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_implementation
+  - rmw_implementation_cmake
+  - rosgraph_msgs
+  - rosidl_generator_py
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rpyutils
+  - service_msgs
+  - test_msgs
+  - type_description_interfaces
+  - unique_identifier_msgs
+  repository: https://github.com/ros2/rclpy
+  tag: release/rolling/rclpy/11.0.3-1
   url: https://github.com/ros2-gbp/rclpy-release.git
-  version: 11.0.2
+  version: 11.0.3
 rclpy_cascade_lifecycle:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - cascade_lifecycle_msgs
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  repository: https://github.com/fmrico/cascade_lifecycle
   tag: release/rolling/rclpy_cascade_lifecycle/2.0.4-2
   url: https://github.com/ros2-gbp/cascade_lifecycle-release.git
   version: 2.0.4
 rclpy_message_converter:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - builtin_interfaces
+  - geometry_msgs
+  - rclpy
+  - rclpy_message_converter_msgs
+  - rosidl_default_generators
+  - rosidl_parser
+  - rosidl_runtime_py
+  - std_msgs
+  - std_srvs
+  - tf2_msgs
+  repository: https://github.com/DFKI-NI/rospy_message_converter
   tag: release/rolling/rclpy_message_converter/2.0.2-2
   url: https://github.com/ros2-gbp/rospy_message_converter-release.git
   version: 2.0.2
 rclpy_message_converter_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  repository: https://github.com/DFKI-NI/rospy_message_converter
   tag: release/rolling/rclpy_message_converter_msgs/2.0.2-2
   url: https://github.com/ros2-gbp/rospy_message_converter-release.git
   version: 2.0.2
 rcpputils:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros_core
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - rcutils
+  repository: https://github.com/ros2/rcpputils
   tag: release/rolling/rcpputils/2.15.1-1
   url: https://github.com/ros2-gbp/rcpputils-release.git
   version: 2.15.1
 rcss3d_agent:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rcss3d_agent_msgs
+  repository: https://github.com/ros-sports/rcss3d_agent
   tag: release/rolling/rcss3d_agent/0.4.1-4
   url: https://github.com/ros2-gbp/rcss3d_agent-release.git
   version: 0.4.1
 rcss3d_agent_basic:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp_components
+  - rcss3d_agent
+  repository: https://github.com/ros-sports/rcss3d_agent
   tag: release/rolling/rcss3d_agent_basic/0.4.1-4
   url: https://github.com/ros2-gbp/rcss3d_agent-release.git
   version: 0.4.1
 rcss3d_agent_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-sports/rcss3d_agent
   tag: release/rolling/rcss3d_agent_msgs/0.4.1-4
   url: https://github.com/ros2-gbp/rcss3d_agent-release.git
   version: 0.4.1
 rcss3d_agent_msgs_to_soccer_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rcss3d_agent_msgs
+  - soccer_vision_3d_msgs
+  repository: https://github.com/ros-sports/rcss3d_agent
   tag: release/rolling/rcss3d_agent_msgs_to_soccer_interfaces/0.4.1-4
   url: https://github.com/ros2-gbp/rcss3d_agent-release.git
   version: 0.4.1
 rcss3d_nao:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - nao_lola_command_msgs
+  - nao_lola_sensor_msgs
+  - rclcpp_components
+  - rcss3d_agent
+  - rcss3d_agent_msgs_to_soccer_interfaces
+  - sensor_msgs
+  - soccer_vision_3d_msgs
+  repository: https://github.com/ros-sports/rcss3d_nao
   tag: release/rolling/rcss3d_nao/1.2.0-3
   url: https://github.com/ros2-gbp/rcss3d_nao-release.git
   version: 1.2.0
 rcutils:
-  tag: release/rolling/rcutils/7.2.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - mimick_vendor
+  - osrf_testing_tools_cpp
+  - performance_test_fixture
+  repository: https://github.com/ros2/rcutils
+  tag: release/rolling/rcutils/7.2.2-1
   url: https://github.com/ros2-gbp/rcutils-release.git
-  version: 7.2.1
+  version: 7.2.2
 realsense2_camera:
-  tag: release/rolling/realsense2_camera/4.58.3-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - builtin_interfaces
+  - cv_bridge
+  - diagnostic_updater
+  - geometry_msgs
+  - image_transport
+  - launch_pytest
+  - launch_ros
+  - launch_testing
+  - librealsense2
+  - lifecycle_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - realsense2_camera_msgs
+  - ros2bag
+  - ros2topic
+  - ros_environment
+  - rosbag2_storage_default_plugins
+  - sensor_msgs
+  - sensor_msgs_py
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_ros
+  - tf2_ros_py
+  repository: https://github.com/IntelRealSense/realsense-ros
+  tag: release/rolling/realsense2_camera/4.58.4-1
   url: https://github.com/ros2-gbp/realsense-ros-release.git
-  version: 4.58.3
+  version: 4.58.4
 realsense2_camera_msgs:
-  tag: release/rolling/realsense2_camera_msgs/4.58.3-1
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/IntelRealSense/realsense-ros
+  tag: release/rolling/realsense2_camera_msgs/4.58.4-1
   url: https://github.com/ros2-gbp/realsense-ros-release.git
-  version: 4.58.3
+  version: 4.58.4
 realsense2_description:
-  tag: release/rolling/realsense2_description/4.58.3-1
+  dependencies:
+  - ament_cmake
+  - launch_ros
+  - rclcpp
+  - rclcpp_components
+  - realsense2_camera_msgs
+  - xacro
+  repository: https://github.com/IntelRealSense/realsense-ros
+  tag: release/rolling/realsense2_description/4.58.4-1
   url: https://github.com/ros2-gbp/realsense-ros-release.git
-  version: 4.58.3
+  version: 4.58.4
 realtime_tools:
-  tag: release/rolling/realtime_tools/5.2.0-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - test_msgs
+  repository: https://github.com/ros-controls/realtime_tools
+  tag: release/rolling/realtime_tools/5.3.0-1
   url: https://github.com/ros2-gbp/realtime_tools-release.git
-  version: 5.2.0
+  version: 5.3.0
 reductstore_agent:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - rclpy
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/reductstore/reductstore_agent
   tag: release/rolling/reductstore_agent/0.2.0-2
   url: https://github.com/ros2-gbp/reductstore_agent-release.git
   version: 0.2.0
 replay_testing:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - geometry_msgs
+  - launch
+  - rclpy
+  - ros2bag
+  - ros2run
+  - ros2topic
+  - rosbag2_py
+  - rosbag2_storage_mcap
+  repository: https://github.com/polymathrobotics/replay_testing
   tag: release/rolling/replay_testing/0.0.4-2
   url: https://github.com/ros2-gbp/replay_testing-release.git
   version: 0.0.4
 resource_retriever:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros/resource_retriever
   tag: release/rolling/resource_retriever/3.10.1-1
   url: https://github.com/ros2-gbp/resource_retriever-release.git
   version: 3.10.1
 resource_retriever_interfaces:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/resource_retriever_service
   tag: release/rolling/resource_retriever_interfaces/1.0.1-1
   url: https://github.com/ros2-gbp/resource_retriever_service-release.git
   version: 1.0.1
 resource_retriever_service:
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - resource_retriever_interfaces
+  repository: https://github.com/ros2/resource_retriever_service
   tag: release/rolling/resource_retriever_service/1.0.1-1
   url: https://github.com/ros2-gbp/resource_retriever_service-release.git
   version: 1.0.1
 resource_retriever_service_plugin:
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - resource_retriever
+  - resource_retriever_interfaces
+  repository: https://github.com/ros2/resource_retriever_service
   tag: release/rolling/resource_retriever_service_plugin/1.0.1-1
   url: https://github.com/ros2-gbp/resource_retriever_service-release.git
   version: 1.0.1
 rig_reconfigure:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - rclcpp
+  repository: https://github.com/teamspatzenhirn/rig_reconfigure
   tag: release/rolling/rig_reconfigure/1.6.1-1
   url: https://github.com/ros2-gbp/rig_reconfigure-release.git
   version: 1.6.1
 rko_lio:
-  tag: release/rolling/rko_lio/0.3.2-1
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - rosbag2_cpp
+  - rosbag2_py
+  - rosbag2_storage
+  - rosidl_runtime_py
+  - sensor_msgs
+  - sophus
+  - std_msgs
+  - tf2
+  - tf2_ros
+  - tf2_ros_py
+  repository: https://github.com/PRBonn/rko_lio
+  tag: release/rolling/rko_lio/0.4.0-1
   url: https://github.com/ros2-gbp/rko_lio-release.git
-  version: 0.3.2
+  version: 0.4.0
 rmf_api_msgs:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/open-rmf/rmf_api_msgs
   tag: release/rolling/rmf_api_msgs/0.5.0-2
   url: https://github.com/ros2-gbp/rmf_api_msgs-release.git
   version: 0.5.0
 rmf_battery:
+  dependencies:
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - eigen3_cmake_module
+  - rmf_traffic
+  - rmf_utils
+  repository: https://github.com/open-rmf/rmf_battery
   tag: release/rolling/rmf_battery/0.4.0-2
   url: https://github.com/ros2-gbp/rmf_battery-release.git
   version: 0.4.0
 rmf_building_map_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_building_map_msgs
   tag: release/rolling/rmf_building_map_msgs/1.5.0-2
   url: https://github.com/ros2-gbp/rmf_building_map_msgs-release.git
   version: 1.5.0
 rmf_building_map_tools:
+  dependencies:
+  - ament_index_python
+  - gz_fuel_tools_vendor
+  - rclpy
+  - rmf_building_map_msgs
+  - rmf_site_map_msgs
+  - std_msgs
+  repository: https://github.com/open-rmf/rmf_traffic_editor
   tag: release/rolling/rmf_building_map_tools/1.14.0-2
   url: https://github.com/ros2-gbp/rmf_traffic_editor-release.git
   version: 1.14.0
 rmf_building_sim_gz_plugins:
+  dependencies:
+  - ament_cmake
+  - gz_gui_vendor
+  - gz_msgs_vendor
+  - gz_plugin_vendor
+  - gz_rendering_vendor
+  - gz_sim_vendor
+  - gz_transport_vendor
+  - menge_vendor
+  - rclcpp
+  - rmf_door_msgs
+  - rmf_fleet_msgs
+  - rmf_lift_msgs
+  repository: https://github.com/open-rmf/rmf_simulation
   tag: release/rolling/rmf_building_sim_gz_plugins/2.6.1-2
   url: https://github.com/ros2-gbp/rmf_simulation-release.git
   version: 2.6.1
 rmf_charger_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_charger_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_charging_schedule:
+  dependencies:
+  - rclpy
+  - rmf_fleet_msgs
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_charging_schedule/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_cmake_uncrustify:
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_uncrustify
+  repository: https://github.com/open-rmf/rmf_cmake_uncrustify
   tag: release/rolling/rmf_cmake_uncrustify/1.2.0-6
   url: https://github.com/ros2-gbp/rmf_cmake_uncrustify-release.git
   version: 1.2.0
 rmf_demos:
+  dependencies:
+  - ament_cmake
+  - launch_xml
+  - rmf_building_map_tools
+  - rmf_demos_assets
+  - rmf_demos_fleet_adapter
+  - rmf_demos_maps
+  - rmf_demos_tasks
+  - rmf_fleet_adapter
+  - rmf_reservation_node
+  - rmf_task_ros2
+  - rmf_traffic_ros2
+  - rmf_visualization
+  - rviz2
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_demos_assets:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos_assets/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_demos_bridges:
+  dependencies:
+  - rmf_building_map_tools
+  - rmf_fleet_msgs
+  - rmf_site_map_msgs
+  - rmf_traffic_msgs
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos_bridges/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_demos_fleet_adapter:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - launch_xml
+  - rclpy
+  - rmf_fleet_adapter_python
+  - rmf_fleet_msgs
+  - rmf_task_msgs
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos_fleet_adapter/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_demos_gz:
+  dependencies:
+  - ament_cmake
+  - launch_xml
+  - rmf_building_sim_gz_plugins
+  - rmf_demos
+  - rmf_robot_sim_gz_plugins
+  - ros2launch
+  - ros_gz_bridge
+  - ros_gz_sim
+  - teleop_twist_keyboard
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos_gz/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_demos_maps:
+  dependencies:
+  - ament_cmake
+  - rmf_building_map_tools
+  - ros2run
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos_maps/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_demos_tasks:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - rmf_dispenser_msgs
+  - rmf_fleet_msgs
+  - rmf_lift_msgs
+  - rmf_task_msgs
+  repository: https://github.com/open-rmf/rmf_demos
   tag: release/rolling/rmf_demos_tasks/2.8.2-3
   url: https://github.com/ros2-gbp/rmf_demos-release.git
   version: 2.8.2
 rmf_dispenser_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_dispenser_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_door_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_door_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_fleet_adapter:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - backward_ros
+  - nlohmann_json_schema_validator_vendor
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rmf_api_msgs
+  - rmf_battery
+  - rmf_building_map_msgs
+  - rmf_dispenser_msgs
+  - rmf_door_msgs
+  - rmf_fleet_msgs
+  - rmf_ingestor_msgs
+  - rmf_lift_msgs
+  - rmf_reservation_msgs
+  - rmf_task
+  - rmf_task_msgs
+  - rmf_task_ros2
+  - rmf_task_sequence
+  - rmf_traffic
+  - rmf_traffic_ros2
+  - rmf_utils
+  - rmf_websocket
+  - std_msgs
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_fleet_adapter/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_fleet_adapter_python:
+  dependencies:
+  - ament_cmake_pytest
+  - rclpy
+  - rmf_fleet_adapter
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_fleet_adapter_python/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_fleet_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_fleet_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_ingestor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rmf_dispenser_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_ingestor_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_lift_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_lift_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_obstacle_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_obstacle_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_reservation_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_reservation_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_reservation_node:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rmf_building_map_msgs
+  - rmf_fleet_adapter
+  - rmf_reservation_msgs
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_reservation_node/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_robot_sim_common:
+  dependencies:
+  - ament_cmake
+  - eigen3_cmake_module
+  - geometry_msgs
+  - rclcpp
+  - rmf_building_map_msgs
+  - rmf_fleet_msgs
+  - tf2_ros
+  repository: https://github.com/open-rmf/rmf_simulation
   tag: release/rolling/rmf_robot_sim_common/2.6.1-2
   url: https://github.com/ros2-gbp/rmf_simulation-release.git
   version: 2.6.1
 rmf_robot_sim_gz_plugins:
+  dependencies:
+  - ament_cmake
+  - gz_msgs_vendor
+  - gz_plugin_vendor
+  - gz_rendering_vendor
+  - gz_sim_vendor
+  - gz_transport_vendor
+  - rclcpp
+  - rmf_building_map_msgs
+  - rmf_building_sim_gz_plugins
+  - rmf_dispenser_msgs
+  - rmf_fleet_msgs
+  - rmf_ingestor_msgs
+  - rmf_robot_sim_common
+  repository: https://github.com/open-rmf/rmf_simulation
   tag: release/rolling/rmf_robot_sim_gz_plugins/2.6.1-2
   url: https://github.com/ros2-gbp/rmf_simulation-release.git
   version: 2.6.1
 rmf_scheduler_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_scheduler_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_site_map_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_site_map_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_task:
+  dependencies:
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - rmf_battery
+  - rmf_utils
+  repository: https://github.com/open-rmf/rmf_task
   tag: release/rolling/rmf_task/2.9.0-2
   url: https://github.com/ros2-gbp/rmf_task-release.git
   version: 2.9.0
 rmf_task_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rmf_dispenser_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_task_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_task_ros2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - backward_ros
+  - nlohmann_json_schema_validator_vendor
+  - rclcpp
+  - rmf_api_msgs
+  - rmf_task_msgs
+  - rmf_traffic
+  - rmf_traffic_ros2
+  - rmf_utils
+  - rmf_websocket
+  - std_msgs
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_task_ros2/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_task_sequence:
+  dependencies:
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - nlohmann_json_schema_validator_vendor
+  - rmf_api_msgs
+  - rmf_task
+  repository: https://github.com/open-rmf/rmf_task
   tag: release/rolling/rmf_task_sequence/2.9.0-2
   url: https://github.com/ros2-gbp/rmf_task-release.git
   version: 2.9.0
 rmf_traffic:
+  dependencies:
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - eigen3_cmake_module
+  - rmf_utils
+  repository: https://github.com/open-rmf/rmf_traffic
   tag: release/rolling/rmf_traffic/3.7.0-2
   url: https://github.com/ros2-gbp/rmf_traffic-release.git
   version: 3.7.0
 rmf_traffic_editor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_uncrustify
+  - ament_index_cpp
+  - rmf_utils
+  repository: https://github.com/open-rmf/rmf_traffic_editor
   tag: release/rolling/rmf_traffic_editor/1.14.0-2
   url: https://github.com/ros2-gbp/rmf_traffic_editor-release.git
   version: 1.14.0
 rmf_traffic_editor_assets:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/open-rmf/rmf_traffic_editor
   tag: release/rolling/rmf_traffic_editor_assets/1.14.0-2
   url: https://github.com/ros2-gbp/rmf_traffic_editor-release.git
   version: 1.14.0
 rmf_traffic_editor_test_maps:
+  dependencies:
+  - ament_cmake
+  - rmf_building_map_tools
+  - ros2run
+  repository: https://github.com/open-rmf/rmf_traffic_editor
   tag: release/rolling/rmf_traffic_editor_test_maps/1.14.0-2
   url: https://github.com/ros2-gbp/rmf_traffic_editor-release.git
   version: 1.14.0
 rmf_traffic_examples:
+  dependencies:
+  - rmf_traffic
+  repository: https://github.com/open-rmf/rmf_traffic
   tag: release/rolling/rmf_traffic_examples/3.7.0-2
   url: https://github.com/ros2-gbp/rmf_traffic-release.git
   version: 3.7.0
 rmf_traffic_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_traffic_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmf_traffic_ros2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - backward_ros
+  - rclcpp
+  - rmf_building_map_msgs
+  - rmf_fleet_msgs
+  - rmf_reservation_msgs
+  - rmf_site_map_msgs
+  - rmf_traffic
+  - rmf_traffic_msgs
+  - rmf_utils
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_traffic_ros2/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_utils:
+  dependencies:
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  repository: https://github.com/open-rmf/rmf_utils
   tag: release/rolling/rmf_utils/1.7.0-2
   url: https://github.com/ros2-gbp/rmf_utils-release.git
   version: 1.7.0
 rmf_visualization:
+  dependencies:
+  - ament_cmake
+  - launch_xml
+  - rmf_visualization_building_systems
+  - rmf_visualization_fleet_states
+  - rmf_visualization_floorplans
+  - rmf_visualization_navgraphs
+  - rmf_visualization_obstacles
+  - rmf_visualization_rviz2_plugins
+  - rmf_visualization_schedule
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_building_systems:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - geometry_msgs
+  - rmf_building_map_msgs
+  - rmf_door_msgs
+  - rmf_lift_msgs
+  - rmf_visualization_msgs
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_building_systems/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_fleet_states:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rmf_fleet_msgs
+  - rmf_utils
+  - rmf_visualization_msgs
+  - visualization_msgs
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_fleet_states/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_floorplans:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - rmf_building_map_msgs
+  - rmf_utils
+  - rmf_visualization_msgs
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_floorplans/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_visualization_msgs
   tag: release/rolling/rmf_visualization_msgs/1.5.0-2
   url: https://github.com/ros2-gbp/rmf_visualization_msgs-release.git
   version: 1.5.0
 rmf_visualization_navgraphs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_components
+  - rmf_building_map_msgs
+  - rmf_fleet_msgs
+  - rmf_traffic
+  - rmf_traffic_ros2
+  - rmf_utils
+  - rmf_visualization_msgs
+  - visualization_msgs
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_navgraphs/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_obstacles:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_uncrustify
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_components
+  - rmf_obstacle_msgs
+  - rmf_utils
+  - rmf_visualization_msgs
+  - vision_msgs
+  - visualization_msgs
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_obstacles/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_rviz2_plugins:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_uncrustify
+  - pluginlib
+  - rclcpp
+  - resource_retriever
+  - rmf_door_msgs
+  - rmf_lift_msgs
+  - rmf_traffic_ros2
+  - rmf_utils
+  - rmf_visualization_msgs
+  - rviz_common
+  - rviz_default_plugins
+  - rviz_rendering
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_rviz2_plugins/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_visualization_schedule:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_uncrustify
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_components
+  - rmf_traffic
+  - rmf_traffic_msgs
+  - rmf_traffic_ros2
+  - rmf_utils
+  - rmf_visualization_msgs
+  - rosidl_default_generators
+  - visualization_msgs
+  repository: https://github.com/open-rmf/rmf_visualization
   tag: release/rolling/rmf_visualization_schedule/2.5.1-2
   url: https://github.com/ros2-gbp/rmf_visualization-release.git
   version: 2.5.1
 rmf_websocket:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_catch2
+  - ament_cmake_uncrustify
+  - nlohmann_json_schema_validator_vendor
+  - rclcpp
+  - rmf_utils
+  repository: https://github.com/open-rmf/rmf_ros2
   tag: release/rolling/rmf_websocket/2.12.0-2
   url: https://github.com/ros2-gbp/rmf_ros2-release.git
   version: 2.12.0
 rmf_workcell_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/open-rmf/rmf_internal_msgs
   tag: release/rolling/rmf_workcell_msgs/4.0.0-2
   url: https://github.com/ros2-gbp/rmf_internal_msgs-release.git
   version: 4.0.0
 rmw:
-  tag: release/rolling/rmw/7.11.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_ros_core
+  - ament_cmake_version
+  - ament_lint_auto
+  - ament_lint_common
+  - osrf_testing_tools_cpp
+  - rcutils
+  - rosidl_dynamic_typesupport
+  - rosidl_runtime_c
+  repository: https://github.com/ros2/rmw
+  tag: release/rolling/rmw/7.11.2-1
   url: https://github.com/ros2-gbp/rmw-release.git
-  version: 7.11.1
+  version: 7.11.2
 rmw_connextdds:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rmw_connextdds_common
+  repository: https://github.com/ros2/rmw_connextdds
   tag: release/rolling/rmw_connextdds/1.3.0-2
   url: https://github.com/ros2-gbp/rmw_connextdds-release.git
   version: 1.3.0
 rmw_connextdds_common:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rmw_security_common
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_fastrtps_c
+  - rosidl_typesupport_fastrtps_cpp
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  - rti_connext_dds_cmake_module
+  - tracetools
+  repository: https://github.com/ros2/rmw_connextdds
   tag: release/rolling/rmw_connextdds_common/1.3.0-2
   url: https://github.com/ros2-gbp/rmw_connextdds-release.git
   version: 1.3.0
 rmw_cyclonedds_cpp:
+  dependencies:
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - cyclonedds
+  - iceoryx_binding_c
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rmw_security_common
+  - rosidl_runtime_c
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  - tracetools
+  repository: https://github.com/ros2/rmw_cyclonedds
   tag: release/rolling/rmw_cyclonedds_cpp/4.2.1-1
   url: https://github.com/ros2-gbp/rmw_cyclonedds-release.git
   version: 4.2.1
 rmw_dds_common:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - osrf_testing_tools_cpp
+  - performance_test_fixture
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_security_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  repository: https://github.com/ros2/rmw_dds_common
   tag: release/rolling/rmw_dds_common/6.1.1-1
   url: https://github.com/ros2-gbp/rmw_dds_common-release.git
   version: 6.1.1
 rmw_desert:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rosidl_cmake
+  - rosidl_runtime_c
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  repository: https://github.com/signetlabdei/rmw_desert
   tag: release/rolling/rmw_desert/4.0.2-1
   url: https://github.com/ros2-gbp/rmw_desert-release.git
   version: 4.0.2
 rmw_fastrtps_cpp:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - fastdds
+  - osrf_testing_tools_cpp
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rmw_fastrtps_shared_cpp
+  - rosidl_buffer_backend_registry
+  - rosidl_dynamic_typesupport
+  - rosidl_dynamic_typesupport_fastrtps
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_fastrtps_c
+  - rosidl_typesupport_fastrtps_cpp
+  - test_msgs
+  - tracetools
+  repository: https://github.com/ros2/rmw_fastrtps
   tag: release/rolling/rmw_fastrtps_cpp/9.5.2-1
   url: https://github.com/ros2-gbp/rmw_fastrtps-release.git
   version: 9.5.2
 rmw_fastrtps_dynamic_cpp:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - fastdds
+  - osrf_testing_tools_cpp
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rmw_fastrtps_shared_cpp
+  - rosidl_buffer
+  - rosidl_runtime_c
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  - test_msgs
+  - tracetools
+  repository: https://github.com/ros2/rmw_fastrtps
   tag: release/rolling/rmw_fastrtps_dynamic_cpp/9.5.2-1
   url: https://github.com/ros2-gbp/rmw_fastrtps-release.git
   version: 9.5.2
 rmw_fastrtps_shared_cpp:
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - fastdds
+  - osrf_testing_tools_cpp
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rmw_security_common
+  - rosidl_buffer_backend_registry
+  - rosidl_dynamic_typesupport
+  - rosidl_runtime_c
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  - tracetools
+  repository: https://github.com/ros2/rmw_fastrtps
   tag: release/rolling/rmw_fastrtps_shared_cpp/9.5.2-1
   url: https://github.com/ros2-gbp/rmw_fastrtps-release.git
   version: 9.5.2
 rmw_implementation:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_connextdds
+  - rmw_cyclonedds_cpp
+  - rmw_fastrtps_cpp
+  - rmw_fastrtps_dynamic_cpp
+  - rmw_implementation_cmake
+  - rmw_zenoh_cpp
+  repository: https://github.com/ros2/rmw_implementation
   tag: release/rolling/rmw_implementation/3.2.1-1
   url: https://github.com/ros2-gbp/rmw_implementation-release.git
   version: 3.2.1
 rmw_implementation_cmake:
-  tag: release/rolling/rmw_implementation_cmake/7.11.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rmw
+  tag: release/rolling/rmw_implementation_cmake/7.11.2-1
   url: https://github.com/ros2-gbp/rmw-release.git
-  version: 7.11.1
+  version: 7.11.2
+rmw_int2dds_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_cmake_test
+  - ament_lint_auto
+  - ament_lint_common
+  - int2dds_ffi_vendor
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rosidl_dynamic_typesupport
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_c
+  - rosidl_typesupport_cpp
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  - std_msgs
+  repository: https://github.com/IntellectusCorp/rmw_int2dds
+  tag: release/rolling/rmw_int2dds_cpp/0.1.5-1
+  url: https://github.com/ros2-gbp/rmw_int2dds-release.git
+  version: 0.1.5
 rmw_security_common:
-  tag: release/rolling/rmw_security_common/7.11.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rcutils
+  - rmw
+  repository: https://github.com/ros2/rmw
+  tag: release/rolling/rmw_security_common/7.11.2-1
   url: https://github.com/ros2-gbp/rmw-release.git
-  version: 7.11.1
+  version: 7.11.2
 rmw_stats_shim:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosgraph_monitor_msgs
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_cpp
+  repository: https://github.com/ros-tooling/graph-monitor
   tag: release/rolling/rmw_stats_shim/0.2.3-2
   url: https://github.com/ros2-gbp/graph_monitor-release.git
   version: 0.2.3
 rmw_swiftdds_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - osrf_testing_tools_cpp
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_dds_common
+  - rosidl_dynamic_typesupport
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  - test_msgs
+  - tracetools
+  repository: https://github.com/greenstonesoft/rmw_swiftdds
   tag: release/rolling/rmw_swiftdds_cpp/1.0.1-1
   url: https://github.com/ros2-gbp/rmw_swiftdds-release.git
   version: 1.0.1
 rmw_test_fixture:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rmw
+  repository: https://github.com/ros2/ament_cmake_ros
   tag: release/rolling/rmw_test_fixture/0.16.0-1
   url: https://github.com/ros2-gbp/ament_cmake_ros-release.git
   version: 0.16.0
 rmw_test_fixture_implementation:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_implementation
+  - rmw_implementation_cmake
+  - rmw_test_fixture
+  - rpyutils
+  repository: https://github.com/ros2/ament_cmake_ros
   tag: release/rolling/rmw_test_fixture_implementation/0.16.0-1
   url: https://github.com/ros2-gbp/ament_cmake_ros-release.git
   version: 0.16.0
 rmw_zenoh_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_test_fixture
+  - rosidl_buffer_backend_registry
+  - rosidl_typesupport_fastrtps_c
+  - rosidl_typesupport_fastrtps_cpp
+  - tracetools
+  - zenoh_cpp_vendor
+  repository: https://github.com/ros2/rmw_zenoh
   tag: release/rolling/rmw_zenoh_cpp/0.12.0-1
   url: https://github.com/ros2-gbp/rmw_zenoh-release.git
   version: 0.12.0
 roboplan:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - pinocchio
+  - roboplan_example_models
+  - yaml_cpp_vendor
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_cartesian_planning:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - roboplan
+  - roboplan_example_models
+  - roboplan_oink
+  - roboplan_toppra
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_cartesian_planning/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_example_models:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_example_models/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - roboplan
+  - roboplan_cartesian_planning
+  - roboplan_example_models
+  - roboplan_oink
+  - roboplan_rrt
+  - roboplan_simple_ik
+  - roboplan_toppra
+  - xacro
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_examples/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_oink:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_python
+  - proxsuite
+  - roboplan
+  - roboplan_example_models
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_oink/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_ros_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - builtin_interfaces
+  - geometry_msgs
+  - pinocchio
+  - roboplan
+  - roboplan_example_models
+  - rosidl_generator_cpp
+  - sensor_msgs
+  - tf2_eigen
+  - trajectory_msgs
+  repository: https://github.com/open-planning/roboplan-ros
   tag: release/rolling/roboplan_ros_cpp/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
   version: 0.6.1
 roboplan_ros_examples:
+  dependencies:
+  - ament_cmake_python
+  - control_msgs
+  - rclpy
+  - roboplan
+  - sensor_msgs
+  - std_msgs
+  - visualization_msgs
+  repository: https://github.com/open-planning/roboplan-ros
   tag: release/rolling/roboplan_ros_examples/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
   version: 0.6.1
 roboplan_ros_franka:
+  dependencies:
+  - ament_cmake
+  - controller_manager
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - parallel_gripper_controller
+  - roboplan
+  - roboplan_example_models
+  - roboplan_ros_examples
+  - robot_state_publisher
+  - topic_tools
+  - xacro
+  repository: https://github.com/open-planning/roboplan-ros
   tag: release/rolling/roboplan_ros_franka/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
   version: 0.6.1
 roboplan_ros_py:
+  dependencies:
+  - builtin_interfaces
+  - rclpy
+  - roboplan
+  - roboplan_ros_cpp
+  - sensor_msgs
+  - trajectory_msgs
+  repository: https://github.com/open-planning/roboplan-ros
   tag: release/rolling/roboplan_ros_py/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
   version: 0.6.1
 roboplan_ros_visualization:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_index_cpp
+  - geometry_msgs
+  - interactive_markers
+  - rclcpp
+  - rclpy
+  - roboplan
+  - roboplan_ros_cpp
+  - roboplan_simple_ik
+  - rviz2
+  - sensor_msgs
+  - visualization_msgs
+  repository: https://github.com/open-planning/roboplan-ros
   tag: release/rolling/roboplan_ros_visualization/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan_ros-release.git
   version: 0.6.1
 roboplan_rrt:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - roboplan
+  - roboplan_example_models
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_rrt/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_simple_ik:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - roboplan
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_simple_ik/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 roboplan_toppra:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - roboplan
+  - roboplan_example_models
+  - toppra
+  repository: https://github.com/open-planning/roboplan
   tag: release/rolling/roboplan_toppra/0.6.1-1
   url: https://github.com/ros2-gbp/roboplan-release.git
   version: 0.6.1
 robot_arm_demo:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - libtorch_vendor
+  - rclcpp
+  - rclcpp_components
+  - tensor_msgs
+  - torch_conversions
+  repository: https://github.com/ros2/rosidl_buffer_backends_tutorials
   tag: release/rolling/robot_arm_demo/0.1.0-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends_tutorials-release.git
   version: 0.1.0
 robot_calibration:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - camera_calibration_parsers
+  - control_msgs
+  - cv_bridge
+  - geometric_shapes
+  - geometry_msgs
+  - kdl_parser
+  - launch
+  - launch_ros
+  - launch_testing
+  - moveit_msgs
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - robot_calibration_msgs
+  - rosbag2_cpp
+  - sensor_msgs
+  - std_msgs
+  - tf2_geometry_msgs
+  - tf2_ros
+  - tinyxml2_vendor
+  - visualization_msgs
+  repository: https://github.com/mikeferguson/robot_calibration
   tag: release/rolling/robot_calibration/0.10.1-2
   url: https://github.com/ros2-gbp/robot_calibration-release.git
   version: 0.10.1
 robot_calibration_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/mikeferguson/robot_calibration
   tag: release/rolling/robot_calibration_msgs/0.10.1-2
   url: https://github.com/ros2-gbp/robot_calibration-release.git
   version: 0.10.1
 robot_localization:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - angles
+  - builtin_interfaces
+  - diagnostic_msgs
+  - diagnostic_updater
+  - geographic_msgs
+  - geometry_msgs
+  - launch_ros
+  - launch_testing_ament_cmake
+  - message_filters
+  - nav_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  - yaml_cpp_vendor
+  repository: https://github.com/cra-ros-pkg/robot_localization
   tag: release/rolling/robot_localization/3.10.1-1
   url: https://github.com/ros2-gbp/robot_localization-release.git
   version: 3.10.1
 robot_state_publisher:
-  tag: release/rolling/robot_state_publisher/3.6.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - kdl_parser
+  - launch_ros
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - tf2_ros
+  - tf2_ros_py
+  - urdf
+  repository: https://github.com/ros/robot_state_publisher
+  tag: release/rolling/robot_state_publisher/3.6.2-1
   url: https://github.com/ros2-gbp/robot_state_publisher-release.git
-  version: 3.6.1
+  version: 3.6.2
 robotiq_controllers:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - controller_interface
+  - std_srvs
+  repository: https://github.com/PickNikRobotics/ros2_robotiq_gripper
   tag: release/rolling/robotiq_controllers/0.0.1-3
   url: https://github.com/ros2-gbp/ros2_robotiq_gripper-release.git
   version: 0.0.1
 robotiq_description:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - joint_state_publisher_gui
+  - launch
+  - launch_ros
+  - robot_state_publisher
+  - rviz2
+  - urdf
+  - xacro
+  repository: https://github.com/PickNikRobotics/ros2_robotiq_gripper
   tag: release/rolling/robotiq_description/0.0.1-3
   url: https://github.com/ros2-gbp/ros2_robotiq_gripper-release.git
   version: 0.0.1
 robotraconteur:
+  dependencies: []
+  repository: https://github.com/robotraconteur/robotraconteur
   tag: release/rolling/robotraconteur/1.2.8-1
   url: https://github.com/ros2-gbp/robotraconteur-release.git
   version: 1.2.8
 robotraconteur_companion:
+  dependencies:
+  - robotraconteur
+  repository: https://github.com/robotraconteur/robotraconteur_companion
   tag: release/rolling/robotraconteur_companion/0.4.3-1
   url: https://github.com/ros2-gbp/robotraconteur_companion-release.git
   version: 0.4.3
+robstride_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - can_msgs
+  - diagnostic_msgs
+  - rclcpp
+  repository: https://github.com/s2015-turtle/robstride_ros2
+  tag: release/rolling/robstride_driver/0.2.0-1
+  url: https://github.com/ros2-gbp/robstride_ros2-release.git
+  version: 0.2.0
+robstride_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_index_python
+  - controller_manager
+  - forward_command_controller
+  - joint_state_broadcaster
+  - launch
+  - launch_ros
+  - robot_state_publisher
+  - robstride_ros2_control
+  - ros2_socketcan
+  - xacro
+  repository: https://github.com/s2015-turtle/robstride_ros2
+  tag: release/rolling/robstride_examples/0.2.0-1
+  url: https://github.com/ros2-gbp/robstride_ros2-release.git
+  version: 0.2.0
+robstride_ros2:
+  dependencies:
+  - ament_cmake
+  - robstride_driver
+  - robstride_examples
+  - robstride_ros2_control
+  repository: https://github.com/s2015-turtle/robstride_ros2
+  tag: release/rolling/robstride_ros2/0.2.0-1
+  url: https://github.com/ros2-gbp/robstride_ros2-release.git
+  version: 0.2.0
+robstride_ros2_control:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - robstride_driver
+  - xacro
+  repository: https://github.com/s2015-turtle/robstride_ros2
+  tag: release/rolling/robstride_ros2_control/0.2.0-1
+  url: https://github.com/ros2-gbp/robstride_ros2-release.git
+  version: 0.2.0
 ros2_control:
-  tag: release/rolling/ros2_control/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - controller_interface
+  - controller_manager
+  - controller_manager_msgs
+  - hardware_interface
+  - joint_limits
+  - ros2_control_test_assets
+  - ros2controlcli
+  - transmission_interface
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/ros2_control/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 ros2_control_cmake:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-controls/ros2_control_cmake
   tag: release/rolling/ros2_control_cmake/1.0.0-2
   url: https://github.com/ros2-gbp/ros2_control_cmake-release.git
   version: 1.0.0
 ros2_control_test_assets:
-  tag: release/rolling/ros2_control_test_assets/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ros2_control_cmake
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/ros2_control_test_assets/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 ros2_controllers:
+  dependencies:
+  - ackermann_steering_controller
+  - admittance_controller
+  - ament_cmake
+  - battery_state_broadcaster
+  - bicycle_steering_controller
+  - chained_filter_controller
+  - diff_drive_controller
+  - force_torque_sensor_broadcaster
+  - forward_command_controller
+  - gpio_controllers
+  - gps_sensor_broadcaster
+  - imu_sensor_broadcaster
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - magnetometer_broadcaster
+  - mecanum_drive_controller
+  - motion_primitives_controllers
+  - omni_wheel_drive_controller
+  - parallel_gripper_controller
+  - pid_controller
+  - pose_broadcaster
+  - range_sensor_broadcaster
+  - state_interfaces_broadcaster
+  - steering_controllers_library
+  - tricycle_controller
+  - tricycle_steering_controller
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/ros2_controllers/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 ros2_controllers_test_nodes:
+  dependencies:
+  - launch_ros
+  - launch_testing_ros
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - trajectory_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/ros2_controllers_test_nodes/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 ros2_fmt_logger:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - backward_ros
+  - rclcpp
+  - rcutils
+  repository: https://github.com/nobleo/ros2_fmt_logger
   tag: release/rolling/ros2_fmt_logger/1.1.0-2
   url: https://github.com/ros2-gbp/ros2_fmt_logger-release.git
   version: 1.1.0
 ros2_snapshot:
+  dependencies:
+  - ament_index_python
+  - demo_nodes_py
+  - rclpy
+  - ros2cli
+  - ros2component
+  - ros2node
+  - ros2param
+  - ros2pkg
+  - ros2service
+  - std_srvs
+  repository: https://github.com/cnurobotics/ros2_snapshot
   tag: release/rolling/ros2_snapshot/0.0.7-2
   url: https://github.com/ros2-gbp/ros2_snapshot-release.git
   version: 0.0.7
 ros2_socketcan:
-  tag: release/rolling/ros2_socketcan/1.3.0-2
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - can_msgs
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - ros2_socketcan_msgs
+  repository: https://github.com/autowarefoundation/ros2_socketcan
+  tag: release/rolling/ros2_socketcan/1.4.0-1
   url: https://github.com/ros2-gbp/ros2_socketcan-release.git
-  version: 1.3.0
+  version: 1.4.0
 ros2_socketcan_msgs:
-  tag: release/rolling/ros2_socketcan_msgs/1.3.0-2
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/autowarefoundation/ros2_socketcan
+  tag: release/rolling/ros2_socketcan_msgs/1.4.0-1
   url: https://github.com/ros2-gbp/ros2_socketcan-release.git
-  version: 1.3.0
+  version: 1.4.0
 ros2acceleration:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - ros2cli
+  - rosidl_runtime_py
+  - test_msgs
+  repository: https://github.com/ros-acceleration/ros2acceleration
   tag: release/rolling/ros2acceleration/0.5.1-4
   url: https://github.com/ros2-gbp/ros2acceleration-release.git
   version: 0.5.1
 ros2action:
-  tag: release/rolling/ros2action/0.41.1-1
+  dependencies:
+  - action_msgs
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2cli
+  - rosidl_runtime_py
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2action/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2bag:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2cli
+  - rosbag2_py
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/ros2bag/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 ros2cli:
-  tag: release/rolling/ros2cli/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - rmw_test_fixture_implementation
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2cli/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2cli_common_extensions:
-  tag: release/rolling/ros2cli_common_extensions/0.6.0-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - launch_xml
+  - launch_yaml
+  - ros2action
+  - ros2cli
+  - ros2component
+  - ros2doctor
+  - ros2interface
+  - ros2launch
+  - ros2lifecycle
+  - ros2log
+  - ros2multicast
+  - ros2node
+  - ros2param
+  - ros2pkg
+  - ros2plugin
+  - ros2run
+  - ros2service
+  - ros2topic
+  - sros2
+  repository: https://github.com/ros2/ros2cli_common_extensions
+  tag: release/rolling/ros2cli_common_extensions/0.6.1-1
   url: https://github.com/ros2-gbp/ros2cli_common_extensions-release.git
-  version: 0.6.0
+  version: 0.6.1
 ros2cli_test_interfaces:
-  tag: release/rolling/ros2cli_test_interfaces/0.41.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2cli_test_interfaces/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2component:
-  tag: release/rolling/ros2component/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - composition_interfaces
+  - rcl_interfaces
+  - rclcpp_components
+  - rclpy
+  - ros2cli
+  - ros2node
+  - ros2param
+  - ros2pkg
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2component/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2controlcli:
-  tag: release/rolling/ros2controlcli/6.9.0-1
+  dependencies:
+  - control_msgs
+  - controller_manager
+  - controller_manager_msgs
+  - rcl_interfaces
+  - rclpy
+  - ros2cli
+  - ros2node
+  - ros2param
+  - rosidl_runtime_py
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/ros2controlcli/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 ros2doctor:
-  tag: release/rolling/ros2doctor/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2action
+  - ros2cli
+  - ros_environment
+  - std_msgs
+  - std_srvs
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2doctor/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2interface:
-  tag: release/rolling/ros2interface/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_testing
+  - launch_testing_ros
+  - ros2cli
+  - ros2cli_test_interfaces
+  - rosidl_adapter
+  - rosidl_runtime_py
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2interface/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2launch:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_xml
+  - launch_yaml
+  - ros2cli
+  - ros2pkg
+  repository: https://github.com/ros2/launch_ros
   tag: release/rolling/ros2launch/0.30.1-1
   url: https://github.com/ros2-gbp/launch_ros-release.git
   version: 0.30.1
 ros2launch_security:
-  tag: release/rolling/ros2launch_security/1.0.0-5
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - demo_nodes_py
+  - launch_ros
+  - nodl
+  - ros2launch
+  - sros2
+  repository: https://github.com/osrf/ros2launch_security
+  tag: release/rolling/ros2launch_security/1.0.2-1
   url: https://github.com/ros2-gbp/ros2launch_security-release.git
-  version: 1.0.0
+  version: 1.0.2
 ros2launch_security_examples:
-  tag: release/rolling/ros2launch_security_examples/1.0.0-5
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ament_nodl
+  - example_interfaces
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - nodl
+  - nodl_to_policy
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - ros2launch_security
+  - sensor_msgs
+  - sros2
+  repository: https://github.com/osrf/ros2launch_security
+  tag: release/rolling/ros2launch_security_examples/1.0.2-1
   url: https://github.com/ros2-gbp/ros2launch_security-release.git
-  version: 1.0.0
+  version: 1.0.2
 ros2lifecycle:
-  tag: release/rolling/ros2lifecycle/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - lifecycle_msgs
+  - rclpy
+  - ros2cli
+  - ros2lifecycle_test_fixtures
+  - ros2node
+  - ros2service
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2lifecycle/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2lifecycle_test_fixtures:
-  tag: release/rolling/ros2lifecycle_test_fixtures/0.41.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_lifecycle
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2lifecycle_test_fixtures/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
+ros2log:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rcl_interfaces
+  - rclpy
+  - ros2cli
+  - ros2node
+  - rosgraph_msgs
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2log/0.42.0-1
+  url: https://github.com/ros2-gbp/ros2cli-release.git
+  version: 0.42.0
 ros2multicast:
-  tag: release/rolling/ros2multicast/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - ros2cli
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2multicast/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2node:
-  tag: release/rolling/ros2node/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2cli
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2node/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2nodl:
-  tag: release/rolling/ros2nodl/0.3.1-5
+  dependencies:
+  - ament_index_python
+  - builtin_interfaces
+  - nodl_conformance
+  - nodl_observe
+  - nodl_schema
+  - rcl_interfaces
+  - rclpy
+  - ros2cli
+  - rosgraph_msgs
+  - rosidl_runtime_py
+  - std_msgs
+  repository: https://github.com/ros-tooling/nodl
+  tag: release/rolling/ros2nodl/2.0.3-1
   url: https://github.com/ros2-gbp/nodl-release.git
-  version: 0.3.1
+  version: 2.0.3
 ros2param:
-  tag: release/rolling/ros2param/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rcl_interfaces
+  - rclpy
+  - ros2cli
+  - ros2node
+  - ros2service
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2param/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2pkg:
-  tag: release/rolling/ros2pkg/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_testing
+  - launch_testing_ros
+  - ros2cli
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2pkg/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2plugin:
-  tag: release/rolling/ros2plugin/6.0.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - ros2cli
+  - ros2pkg
+  repository: https://github.com/ros/pluginlib
+  tag: release/rolling/ros2plugin/6.0.2-1
   url: https://github.com/ros2-gbp/pluginlib-release.git
-  version: 6.0.1
+  version: 6.0.2
 ros2run:
-  tag: release/rolling/ros2run/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - ros2cli
+  - ros2pkg
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2run/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2service:
-  tag: release/rolling/ros2service/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2cli
+  - rosidl_runtime_py
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2service/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2test:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - domain_coordinator
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - ros2cli
+  repository: https://github.com/ros2/ros_testing
   tag: release/rolling/ros2test/0.10.0-1
   url: https://github.com/ros2-gbp/ros_testing-release.git
   version: 0.10.0
 ros2topic:
-  tag: release/rolling/ros2topic/0.41.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - ros2cli
+  - rosgraph_msgs
+  - rosidl_runtime_py
+  - std_msgs
+  - test_msgs
+  repository: https://github.com/ros2/ros2cli
+  tag: release/rolling/ros2topic/0.42.0-1
   url: https://github.com/ros2-gbp/ros2cli-release.git
-  version: 0.41.1
+  version: 0.42.0
 ros2trace:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - ros2cli
+  - tracetools_trace
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/ros2trace/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 ros2trace_analysis:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - ros2cli
+  - tracetools_analysis
+  repository: https://github.com/ros-tracing/tracetools_analysis
   tag: release/rolling/ros2trace_analysis/3.1.0-2
   url: https://github.com/ros2-gbp/tracetools_analysis-release.git
   version: 3.1.0
 ros_babel_fish:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - example_interfaces
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_action
+  - rcpputils
+  - ros_babel_fish_test_msgs
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_cpp
+  - rosidl_typesupport_introspection_cpp
+  - std_msgs
+  repository: https://github.com/LOEWE-emergenCITY/ros2_babel_fish
   tag: release/rolling/ros_babel_fish/4.26.43-2
   url: https://github.com/ros2-gbp/ros_babel_fish-release.git
   version: 4.26.43
 ros_babel_fish_test_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/LOEWE-emergenCITY/ros2_babel_fish
   tag: release/rolling/ros_babel_fish_test_msgs/4.26.43-2
   url: https://github.com/ros2-gbp/ros_babel_fish-release.git
   version: 4.26.43
 ros_babel_fish_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - geometry_msgs
+  - rclcpp
+  - ros_babel_fish
+  - ros_babel_fish_test_msgs
+  - std_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/LOEWE-emergenCITY/ros2_babel_fish
   tag: release/rolling/ros_babel_fish_tools/4.26.43-2
   url: https://github.com/ros2-gbp/ros_babel_fish-release.git
   version: 4.26.43
 ros_base:
+  dependencies:
+  - ament_cmake
+  - geometry2
+  - kdl_parser
+  - robot_state_publisher
+  - ros_core
+  - rosbag2
+  - urdf
+  repository: https://github.com/ros2/variants
   tag: release/rolling/ros_base/0.13.0-2
   url: https://github.com/ros2-gbp/variants-release.git
   version: 0.13.0
 ros_core:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros
+  - ament_index_cpp
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - common_interfaces
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - launch_xml
+  - launch_yaml
+  - pluginlib
+  - rcl_lifecycle
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_lifecycle
+  - rclpy
+  - ros2cli_common_extensions
+  - ros2launch
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sros2
+  - sros2_cmake
+  repository: https://github.com/ros2/variants
   tag: release/rolling/ros_core/0.13.0-2
   url: https://github.com/ros2-gbp/variants-release.git
   version: 0.13.0
 ros_environment:
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ros/ros_environment
   tag: release/rolling/ros_environment/5.0.0-1
   url: https://github.com/ros2-gbp/ros_environment-release.git
   version: 5.0.0
 ros_gz:
-  tag: release/rolling/ros_gz/4.0.0-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_sim
+  - ros_gz_sim_demos
+  repository: https://github.com/gazebosim/ros_gz
+  tag: release/rolling/ros_gz/4.0.1-1
   url: https://github.com/ros2-gbp/ros_ign-release.git
-  version: 4.0.0
+  version: 4.0.1
 ros_gz_bridge:
-  tag: release/rolling/ros_gz_bridge/4.0.0-1
+  dependencies:
+  - actuator_msgs
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - gps_msgs
+  - gz_msgs_vendor
+  - gz_transport_vendor
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - marine_acoustic_msgs
+  - nav_msgs
+  - rclcpp
+  - rclcpp_components
+  - ros_gz_interfaces
+  - rosgraph_msgs
+  - rosidl_pycommon
+  - sensor_msgs
+  - std_msgs
+  - tf2_msgs
+  - trajectory_msgs
+  - vision_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/gazebosim/ros_gz
+  tag: release/rolling/ros_gz_bridge/4.0.1-1
   url: https://github.com/ros2-gbp/ros_ign-release.git
-  version: 4.0.0
+  version: 4.0.1
 ros_gz_image:
-  tag: release/rolling/ros_gz_image/4.0.0-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - gz_msgs_vendor
+  - gz_transport_vendor
+  - image_transport
+  - rclcpp
+  - ros_gz_bridge
+  - sensor_msgs
+  repository: https://github.com/gazebosim/ros_gz
+  tag: release/rolling/ros_gz_image/4.0.1-1
   url: https://github.com/ros2-gbp/ros_ign-release.git
-  version: 4.0.0
+  version: 4.0.1
 ros_gz_interfaces:
-  tag: release/rolling/ros_gz_interfaces/4.0.0-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rcl_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/gazebosim/ros_gz
+  tag: release/rolling/ros_gz_interfaces/4.0.1-1
   url: https://github.com/ros2-gbp/ros_ign-release.git
-  version: 4.0.0
+  version: 4.0.1
 ros_gz_sim:
-  tag: release/rolling/ros_gz_sim/4.0.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - gz_math_vendor
+  - gz_msgs_vendor
+  - gz_sim_vendor
+  - gz_transport_vendor
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rcpputils
+  - ros2pkg
+  - ros_gz_bridge
+  - ros_gz_interfaces
+  - simulation_interfaces
+  - std_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/gazebosim/ros_gz
+  tag: release/rolling/ros_gz_sim/4.0.1-1
   url: https://github.com/ros2-gbp/ros_ign-release.git
-  version: 4.0.0
+  version: 4.0.1
 ros_gz_sim_demos:
-  tag: release/rolling/ros_gz_sim_demos/4.0.0-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - gz_sim_vendor
+  - image_transport_plugins
+  - marine_acoustic_msgs
+  - robot_state_publisher
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_sim
+  - rqt_image_view
+  - rqt_plot
+  - rqt_topic
+  - rviz2
+  - rviz_imu_plugin
+  - sdformat_urdf
+  - tf2_ros
+  - xacro
+  repository: https://github.com/gazebosim/ros_gz
+  tag: release/rolling/ros_gz_sim_demos/4.0.1-1
   url: https://github.com/ros2-gbp/ros_ign-release.git
-  version: 4.0.0
+  version: 4.0.1
 ros_industrial_cmake_boilerplate:
+  dependencies: []
+  repository: https://github.com/ros-industrial/ros_industrial_cmake_boilerplate
   tag: release/rolling/ros_industrial_cmake_boilerplate/0.7.5-1
   url: https://github.com/ros2-gbp/ros_industrial_cmake_boilerplate-release.git
   version: 0.7.5
 ros_snapd_interfaces:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/canonical/ros_snapd_interfaces
   tag: release/rolling/ros_snapd_interfaces/0.0.1-1
   url: https://github.com/ros2-gbp/ros_snapd_interfaces-release.git
   version: 0.0.1
 ros_testing:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - ament_cmake_export_dependencies
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - ros2test
+  repository: https://github.com/ros2/ros_testing
   tag: release/rolling/ros_testing/0.10.0-1
   url: https://github.com/ros2-gbp/ros_testing-release.git
   version: 0.10.0
 ros_workspace:
+  dependencies:
+  - ament_cmake_core
+  - ament_package
+  repository: https://github.com/ros2/ros_workspace
   tag: release/rolling/ros_workspace/1.0.3-8
   url: https://github.com/ros2-gbp/ros_workspace-release.git
   version: 1.0.3
 rosapi:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_mypy
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - builtin_interfaces
+  - geometry_msgs
+  - rcl_interfaces
+  - rclpy
+  - rmw_dds_common
+  - ros2action
+  - ros2interface
+  - ros2node
+  - ros2service
+  - ros2topic
+  - rosapi_msgs
+  - rosbridge_library
+  - rosidl_adapter
+  - rosidl_runtime_py
+  - sensor_msgs
+  - shape_msgs
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosapi/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosapi_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosapi_msgs/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosbag2:
+  dependencies:
+  - ament_cmake
+  - ros2bag
+  - rosbag2_compression
+  - rosbag2_compression_zstd
+  - rosbag2_cpp
+  - rosbag2_py
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  - rosbag2_tests
+  - rosbag2_transport
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_compression:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rcpputils
+  - rcutils
+  - rosbag2_cpp
+  - rosbag2_storage
+  - rosbag2_test_common
+  - test_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_compression/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_compression_zstd:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rclcpp
+  - rcutils
+  - rosbag2_compression
+  - rosbag2_test_common
+  - zstd_cmake_module
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_compression_zstd/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rclcpp
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_implementation
+  - rmw_implementation_cmake
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  - rosbag2_test_msgdefs
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_cpp
+  - rosidl_typesupport_introspection_cpp
+  - std_msgs
+  - test_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_cpp/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_examples_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  - rosbag2_compression
+  - rosbag2_cpp
+  - rosbag2_transport
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_examples_cpp/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_examples_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - rclpy
+  - rosbag2_compression
+  - rosbag2_py
+  - rosidl_runtime_py
+  - std_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_examples_py/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_interfaces/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_performance_benchmarking:
+  dependencies:
+  - ament_cmake
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - launch_ros
+  - rclcpp
+  - rmw
+  - ros2bag
+  - ros2launch
+  - ros_testing
+  - rosbag2_compression
+  - rosbag2_cpp
+  - rosbag2_performance_benchmarking_msgs
+  - rosbag2_py
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  - sensor_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_performance_benchmarking/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_performance_benchmarking_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - rosidl_typesupport_cpp
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_performance_benchmarking_msgs/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_py:
+  dependencies:
+  - ament_cmake_python
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rcl_interfaces
+  - rclpy
+  - rosbag2_compression
+  - rosbag2_compression_zstd
+  - rosbag2_cpp
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  - rosbag2_test_msgdefs
+  - rosbag2_transport
+  - rosidl_runtime_py
+  - rpyutils
+  - std_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_py/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_storage:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rclcpp
+  - rcutils
+  - rmw
+  - rosbag2_test_common
+  - yaml_cpp_vendor
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_storage/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_storage_broll:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - broll
+  - pluginlib
+  - rclcpp
+  - rosbag2_cpp
+  - rosbag2_storage
+  - rosbag2_transport
+  - sensor_msgs
+  repository: https://github.com/ros-tooling/rosbag2_broll
   tag: release/rolling/rosbag2_storage_broll/0.1.0-2
   url: https://github.com/ros2-gbp/rosbag2_broll-release.git
   version: 0.1.0
 rosbag2_storage_default_plugins:
+  dependencies:
+  - ament_cmake
+  - rosbag2_storage_mcap
+  - rosbag2_storage_sqlite3
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_storage_default_plugins/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_storage_mcap:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_gmock
+  - ament_cmake_python
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - mcap_vendor
+  - pluginlib
+  - rcutils
+  - rosbag2_storage
+  - rosbag2_test_common
+  - std_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_storage_mcap/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_storage_sqlite3:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rcpputils
+  - rcutils
+  - rosbag2_storage
+  - rosbag2_test_common
+  - std_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_storage_sqlite3/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_test_common:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_action
+  - rcpputils
+  - rcutils
+  - test_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_test_common/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_test_msgdefs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_test_msgdefs/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_tests:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rcpputils
+  - ros2bag
+  - rosbag2_compression
+  - rosbag2_compression_zstd
+  - rosbag2_cpp
+  - rosbag2_interfaces
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  - rosbag2_transport
+  - std_msgs
+  - test_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_tests/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2_to_video:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - cv_bridge
+  - rclpy
+  - ros2bag
+  - rosbag2_py
+  - rosidl_runtime_py
+  repository: https://github.com/fictionlab/rosbag2_to_video
   tag: release/rolling/rosbag2_to_video/1.0.1-2
   url: https://github.com/ros2-gbp/rosbag2_to_video-release.git
   version: 1.0.1
 rosbag2_transport:
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_ros
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - composition_interfaces
+  - keyboard_handler
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rcpputils
+  - rcutils
+  - rmw
+  - rmw_implementation_cmake
+  - rosbag2_compression
+  - rosbag2_compression_zstd
+  - rosbag2_cpp
+  - rosbag2_interfaces
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - rosbag2_test_common
+  - test_msgs
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/rosbag2_transport/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 rosbag2rawlog:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - cv_bridge
+  - mrpt_libmaps
+  - mrpt_libros_bridge
+  - mrpt_msgs
+  - nav_msgs
+  - rosbag2_cpp
+  - sensor_msgs
+  - tf2_geometry_msgs
+  - tf2_msgs
+  - tf2_ros
+  repository: https://github.com/MRPT/mrpt_ros_bridge
   tag: release/rolling/rosbag2rawlog/3.5.3-1
   url: https://github.com/ros2-gbp/mrpt_ros_bridge-release.git
   version: 3.5.3
 rosbag_timing_inspector:
+  dependencies:
+  - ament_cmake
+  - rosbag2_cpp
+  - rosbag2_storage
+  repository: https://github.com/MOLAorg/rosbag_timing_inspector
   tag: release/rolling/rosbag_timing_inspector/1.0.2-1
   url: https://github.com/ros2-gbp/rosbag_timing_inspector-release.git
   version: 1.0.2
 rosbridge_library:
+  dependencies:
+  - action_msgs
+  - ament_cmake_mypy
+  - ament_cmake_python
+  - ament_cmake_ros
+  - builtin_interfaces
+  - control_msgs
+  - diagnostic_msgs
+  - example_interfaces
+  - geometry_msgs
+  - nav_msgs
+  - rcl_interfaces
+  - rclpy
+  - rosbridge_test_msgs
+  - rosidl_pycommon
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - stereo_msgs
+  - tf2_msgs
+  - trajectory_msgs
+  - visualization_msgs
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosbridge_library/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosbridge_msgs:
+  dependencies:
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosbridge_msgs/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosbridge_server:
+  dependencies:
+  - action_msgs
+  - ament_cmake_mypy
+  - ament_cmake_python
+  - ament_cmake_ros
+  - example_interfaces
+  - launch
+  - launch_ros
+  - launch_testing_ament_cmake
+  - rcl_interfaces
+  - rclpy
+  - rosapi
+  - rosbridge_library
+  - rosbridge_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosbridge_server/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosbridge_suite:
+  dependencies:
+  - ament_cmake
+  - rosapi
+  - rosbridge_library
+  - rosbridge_server
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosbridge_suite/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosbridge_test_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/RobotWebTools/rosbridge_suite
   tag: release/rolling/rosbridge_test_msgs/4.2.1-1
   url: https://github.com/ros2-gbp/rosbridge_suite-release.git
   version: 4.2.1
 rosgraph_monitor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_aggregator
+  - diagnostic_msgs
+  - diagnostic_updater
+  - generate_parameter_library
+  - launch_ros
+  - launch_testing_ament_cmake
+  - rclcpp
+  - rclcpp_components
+  - rmw_implementation
+  - rmw_stats_shim
+  - rosgraph_monitor_msgs
+  repository: https://github.com/ros-tooling/graph-monitor
   tag: release/rolling/rosgraph_monitor/0.2.3-2
   url: https://github.com/ros2-gbp/graph_monitor-release.git
   version: 0.2.3
 rosgraph_monitor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rcl_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-tooling/graph-monitor
   tag: release/rolling/rosgraph_monitor_msgs/0.2.3-2
   url: https://github.com/ros2-gbp/graph_monitor-release.git
   version: 0.2.3
 rosgraph_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rcl_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/rosgraph_msgs/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 rosidl_adapter:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - ament_cmake_mypy
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_cli
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_adapter/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_buffer:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_buffer/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_buffer_backend:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rmw
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_buffer_backend/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_buffer_backend_registry:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rmw
+  - rosidl_buffer
+  - rosidl_buffer_backend
+  - rosidl_runtime_cpp
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_buffer_backend_registry/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_buffer_py:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_buffer
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_buffer_py/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_cli:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_cli/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_cmake:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_pycommon
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_cmake/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_core_generators:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_generator_cpp
+  - rosidl_generator_py
+  - rosidl_generator_rs
+  - rosidl_typesupport_c
+  - rosidl_typesupport_cpp
+  - rosidl_typesupport_fastrtps_c
+  - rosidl_typesupport_fastrtps_cpp
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  repository: https://github.com/ros2/rosidl_core
   tag: release/rolling/rosidl_core_generators/0.5.0-1
   url: https://github.com/ros2-gbp/rosidl_core-release.git
   version: 0.5.0
 rosidl_core_runtime:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_buffer_py
+  - rosidl_generator_py
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_c
+  - rosidl_typesupport_cpp
+  - rosidl_typesupport_fastrtps_c
+  - rosidl_typesupport_fastrtps_cpp
+  - rosidl_typesupport_introspection_c
+  - rosidl_typesupport_introspection_cpp
+  repository: https://github.com/ros2/rosidl_core
   tag: release/rolling/rosidl_core_runtime/0.5.0-1
   url: https://github.com/ros2-gbp/rosidl_core-release.git
   version: 0.5.0
 rosidl_default_generators:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_core_generators
+  - service_msgs
+  repository: https://github.com/ros2/rosidl_defaults
   tag: release/rolling/rosidl_default_generators/1.9.0-1
   url: https://github.com/ros2-gbp/rosidl_defaults-release.git
   version: 1.9.0
 rosidl_default_runtime:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_core_runtime
+  - service_msgs
+  repository: https://github.com/ros2/rosidl_defaults
   tag: release/rolling/rosidl_default_runtime/1.9.0-1
   url: https://github.com/ros2-gbp/rosidl_defaults-release.git
   version: 1.9.0
 rosidl_dynamic_typesupport:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - rcutils
+  - rosidl_runtime_c
+  repository: https://github.com/ros2/rosidl_dynamic_typesupport
   tag: release/rolling/rosidl_dynamic_typesupport/0.5.0-1
   url: https://github.com/ros2-gbp/rosidl_dynamic_typesupport-release.git
   version: 0.5.0
 rosidl_dynamic_typesupport_fastrtps:
+  dependencies:
+  - ament_cmake_ros_core
+  - fastcdr
+  - fastdds
+  - rcpputils
+  - rcutils
+  - rosidl_dynamic_typesupport
+  repository: https://github.com/ros2/rosidl_dynamic_typesupport_fastrtps
   tag: release/rolling/rosidl_dynamic_typesupport_fastrtps/0.6.0-1
   url: https://github.com/ros2-gbp/rosidl_dynamic_typesupport_fastrtps-release.git
   version: 0.6.0
 rosidl_generator_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rcutils
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_type_description
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_typesupport_interface
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_generator_c/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_generator_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_generator_type_description
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_runtime_cpp
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_generator_cpp/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_generator_dds_idl:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_cli
+  - rosidl_pycommon
+  repository: https://github.com/ros2/rosidl_dds
   tag: release/rolling/rosidl_generator_dds_idl/0.14.0-1
   url: https://github.com/ros2-gbp/rosidl_dds-release.git
   version: 0.14.0
 rosidl_generator_py:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_mypy
+  - ament_cmake_pep257
+  - ament_cmake_pytest
+  - ament_cmake_uncrustify
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rmw
+  - rosidl_buffer_py
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_generator_cpp
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_typesupport_c
+  - rosidl_typesupport_fastrtps_c
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_c
+  - rpyutils
+  - test_interface_files
+  repository: https://github.com/ros2/rosidl_python
   tag: release/rolling/rosidl_generator_py/0.28.0-1
   url: https://github.com/ros2-gbp/rosidl_python-release.git
   version: 0.28.0
 rosidl_generator_rs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - ros_environment
+  - rosidl_generator_c
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_typesupport_c
+  - rosidl_typesupport_interface
+  repository: https://github.com/ros2-rust/rosidl_rust
   tag: release/rolling/rosidl_generator_rs/0.5.0-2
   url: https://github.com/ros2-gbp/rosidl_rust-release.git
   version: 0.5.0
 rosidl_generator_type_description:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_cli
+  - rosidl_parser
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_generator_type_description/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_parser:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_mypy
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_adapter
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_parser/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_pycommon:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - rosidl_parser
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_pycommon/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_runtime_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  - rcutils
+  - rosidl_buffer
+  - rosidl_typesupport_interface
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_runtime_c/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_runtime_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  - rosidl_buffer
+  - rosidl_runtime_c
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_runtime_cpp/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_runtime_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rosidl_buffer_py
+  - rosidl_parser
+  - std_msgs
+  - std_srvs
+  - test_msgs
+  repository: https://github.com/ros2/rosidl_runtime_py
   tag: release/rolling/rosidl_runtime_py/0.16.0-1
   url: https://github.com/ros2-gbp/rosidl_runtime_py-release.git
   version: 0.16.0
 rosidl_typesupport_c:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - mimick_vendor
+  - performance_test_fixture
+  - rcpputils
+  - rcutils
+  - rosidl_cli
+  - rosidl_generator_c
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_c
+  repository: https://github.com/ros2/rosidl_typesupport
   tag: release/rolling/rosidl_typesupport_c/3.5.0-1
   url: https://github.com/ros2-gbp/rosidl_typesupport-release.git
   version: 3.5.0
 rosidl_typesupport_cpp:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - performance_test_fixture
+  - rcpputils
+  - rcutils
+  - rosidl_cli
+  - rosidl_generator_c
+  - rosidl_generator_type_description
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_c
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_cpp
+  repository: https://github.com/ros2/rosidl_typesupport
   tag: release/rolling/rosidl_typesupport_cpp/3.5.0-1
   url: https://github.com/ros2-gbp/rosidl_typesupport-release.git
   version: 3.5.0
 rosidl_typesupport_fastrtps_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - osrf_testing_tools_cpp
+  - performance_test_fixture
+  - rcutils
+  - rmw
+  - rosidl_cli
+  - rosidl_generator_c
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_fastrtps_cpp
+  - rosidl_typesupport_interface
+  repository: https://github.com/ros2/rosidl_typesupport_fastrtps
   tag: release/rolling/rosidl_typesupport_fastrtps_c/3.10.1-2
   url: https://github.com/ros2-gbp/rosidl_typesupport_fastrtps-release.git
   version: 3.10.1
 rosidl_typesupport_fastrtps_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - fastcdr
+  - osrf_testing_tools_cpp
+  - performance_test_fixture
+  - rcutils
+  - rmw
+  - rosidl_buffer_backend
+  - rosidl_cli
+  - rosidl_generator_c
+  - rosidl_generator_cpp
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_interface
+  repository: https://github.com/ros2/rosidl_typesupport_fastrtps
   tag: release/rolling/rosidl_typesupport_fastrtps_cpp/3.10.1-2
   url: https://github.com/ros2-gbp/rosidl_typesupport_fastrtps-release.git
   version: 3.10.1
 rosidl_typesupport_interface:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_typesupport_interface/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_typesupport_introspection_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_buffer
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_typesupport_interface
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_typesupport_introspection_c/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidl_typesupport_introspection_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_buffer
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_generator_cpp
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_c
+  repository: https://github.com/ros2/rosidl
   tag: release/rolling/rosidl_typesupport_introspection_cpp/5.3.1-2
   url: https://github.com/ros2-gbp/rosidl-release.git
   version: 5.3.1
 rosidlcpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - rosidlcpp_generator_c
+  - rosidlcpp_generator_cpp
+  - rosidlcpp_generator_py
+  - rosidlcpp_generator_type_description
+  - rosidlcpp_typesupport_c
+  - rosidlcpp_typesupport_cpp
+  - rosidlcpp_typesupport_fastrtps_c
+  - rosidlcpp_typesupport_fastrtps_cpp
+  - rosidlcpp_typesupport_introspection_c
+  - rosidlcpp_typesupport_introspection_cpp
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_generator_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - ament_cmake_ros_core
+  - rcutils
+  - ros_environment
+  - rosidl_cmake
+  - rosidl_generator_type_description
+  - rosidl_typesupport_interface
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_generator_c/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_generator_core:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_generator_core/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_generator_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - rcutils
+  - rosidl_cmake
+  - rosidl_generator_type_description
+  - rosidl_typesupport_interface
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_generator_cpp/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_generator_py:
+  dependencies:
+  - ament_cmake
+  - ament_index_python
+  - rmw
+  - rosidl_generator_c
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_typesupport_c
+  - rosidl_typesupport_interface
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_generator_py/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_generator_type_description:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_core
+  - rcutils
+  - rosidl_runtime_c
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_generator_type_description/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_parser:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_pycommon
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_parser/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_typesupport_c:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_ros_core
+  - ament_index_python
+  - rcpputils
+  - rcutils
+  - ros_environment
+  - rosidl_cli
+  - rosidl_generator_c
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_c
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_typesupport_c/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_typesupport_cpp:
+  dependencies:
+  - ament_cmake_core
+  - ament_cmake_ros_core
+  - ament_index_python
+  - rcpputils
+  - rcutils
+  - ros_environment
+  - rosidl_cli
+  - rosidl_generator_c
+  - rosidl_generator_type_description
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_c
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_cpp
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_typesupport_cpp/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_typesupport_fastrtps_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_cmake_ros
+  - fastcdr
+  - rmw
+  - rosidl_generator_c
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_fastrtps_cpp
+  - rosidl_typesupport_interface
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_typesupport_fastrtps_c/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_typesupport_fastrtps_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_cmake_ros
+  - fastcdr
+  - rmw
+  - rosidl_generator_c
+  - rosidl_generator_cpp
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_interface
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_typesupport_fastrtps_cpp/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_typesupport_introspection_c:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ros_environment
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_typesupport_interface
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_typesupport_introspection_c/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosidlcpp_typesupport_introspection_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros_core
+  - ament_index_python
+  - ros_environment
+  - rosidl_cli
+  - rosidl_cmake
+  - rosidl_generator_c
+  - rosidl_generator_cpp
+  - rosidl_parser
+  - rosidl_pycommon
+  - rosidl_runtime_c
+  - rosidl_runtime_cpp
+  - rosidl_typesupport_interface
+  - rosidl_typesupport_introspection_c
+  - rosidlcpp_generator_core
+  - rosidlcpp_parser
+  repository: https://github.com/Tonywelte/rosidlcpp
   tag: release/rolling/rosidlcpp_typesupport_introspection_cpp/0.6.0-1
   url: https://github.com/ros2-gbp/rosidlcpp-release.git
   version: 0.6.0
 rosx_introspection:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - geometry_msgs
+  - rclcpp
+  - rosbag2_cpp
+  - sensor_msgs
+  repository: https://github.com/facontidavide/rosx_introspection
   tag: release/rolling/rosx_introspection/2.3.0-2
   url: https://github.com/ros2-gbp/rosx_introspection-release.git
   version: 2.3.0
 rplidar_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - diagnostic_updater
+  - geometry_msgs
+  - launch_ros
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/frozenreboot/rplidar_driver
   tag: release/rolling/rplidar_driver/1.4.1-1
   url: https://github.com/ros2-gbp/rplidar_driver-release.git
   version: 1.4.1
 rpyutils:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ros2/rpyutils
   tag: release/rolling/rpyutils/0.8.0-1
   url: https://github.com/ros2-gbp/rpyutils-release.git
   version: 0.8.0
 rqml:
+  dependencies:
+  - ament_cmake
+  - rqml_core
+  - rqml_default_plugins
+  repository: https://github.com/StefanFabian/rqml
   tag: release/rolling/rqml/3.26.42-2
   url: https://github.com/ros2-gbp/rqml-release.git
   version: 3.26.42
 rqml_core:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - ament_lint_auto
+  - qml6_ros2_plugin
+  - ros_babel_fish_test_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/StefanFabian/rqml
   tag: release/rolling/rqml_core/3.26.42-2
   url: https://github.com/ros2-gbp/rqml-release.git
   version: 3.26.42
 rqml_default_plugins:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - control_msgs
+  - controller_manager_msgs
+  - geometry_msgs
+  - moveit_msgs
+  - pal_statistics_msgs
+  - qml6_ros2_plugin
+  - rcl_interfaces
+  - ros_babel_fish_test_msgs
+  - rqml_core
+  - sensor_msgs
+  - tf2_msgs
+  repository: https://github.com/StefanFabian/rqml
   tag: release/rolling/rqml_default_plugins/3.26.42-2
   url: https://github.com/ros2-gbp/rqml-release.git
   version: 3.26.42
 rqml_plugin_example:
+  dependencies:
+  - ament_cmake
+  - qml6_ros2_plugin
+  - rqml_core
+  repository: https://github.com/StefanFabian/rqml
   tag: release/rolling/rqml_plugin_example/3.26.42-2
   url: https://github.com/ros2-gbp/rqml-release.git
   version: 3.26.42
 rqt:
-  tag: release/rolling/rqt/2.0.2-1
+  dependencies:
+  - rqt_gui
+  - rqt_gui_cpp
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt
+  tag: release/rolling/rqt/2.0.3-1
   url: https://github.com/ros2-gbp/rqt-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_action:
+  dependencies:
+  - ament_flake8
+  - ament_xmllint
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_msg
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_action
   tag: release/rolling/rqt_action/3.0.0-1
   url: https://github.com/ros2-gbp/rqt_action-release.git
   version: 3.0.0
 rqt_bag:
-  tag: release/rolling/rqt_bag/2.3.3-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - builtin_interfaces
+  - python_qt_binding
+  - rclpy
+  - rosbag2_py
+  - rosidl_runtime_py
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-visualization/rqt_bag
+  tag: release/rolling/rqt_bag/2.3.5-1
   url: https://github.com/ros2-gbp/rqt_bag-release.git
-  version: 2.3.3
+  version: 2.3.5
 rqt_bag_plugins:
-  tag: release/rolling/rqt_bag_plugins/2.3.3-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - builtin_interfaces
+  - geometry_msgs
+  - rclpy
+  - rosbag2
+  - rqt_bag
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_plot
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-visualization/rqt_bag
+  tag: release/rolling/rqt_bag_plugins/2.3.5-1
   url: https://github.com/ros2-gbp/rqt_bag-release.git
-  version: 2.3.3
+  version: 2.3.5
 rqt_common_plugins:
+  dependencies:
+  - ament_cmake
+  - rqt_action
+  - rqt_bag
+  - rqt_bag_plugins
+  - rqt_console
+  - rqt_graph
+  - rqt_image_view
+  - rqt_msg
+  - rqt_plot
+  - rqt_publisher
+  - rqt_py_common
+  - rqt_py_console
+  - rqt_reconfigure
+  - rqt_service_caller
+  - rqt_shell
+  - rqt_srv
+  - rqt_topic
+  repository: https://github.com/ros-visualization/rqt_common_plugins
   tag: release/rolling/rqt_common_plugins/1.2.0-4
   url: https://github.com/ros2-gbp/rqt_common_plugins-release.git
   version: 1.2.0
 rqt_console:
-  tag: release/rolling/rqt_console/3.0.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - rcl_interfaces
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_console
+  tag: release/rolling/rqt_console/3.0.2-1
   url: https://github.com/ros2-gbp/rqt_console-release.git
-  version: 3.0.1
+  version: 3.0.2
 rqt_controller_manager:
-  tag: release/rolling/rqt_controller_manager/6.9.0-1
+  dependencies:
+  - controller_manager
+  - controller_manager_msgs
+  - launch_testing
+  - launch_testing_ros
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/rqt_controller_manager/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 rqt_dotgraph:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - python_qt_binding
+  - qt_dotgraph
+  - qt_gui_py_common
+  - rqt_graph
+  - rqt_gui
+  - rqt_gui_py
+  - std_msgs
+  repository: https://github.com/niwcpac/rqt_dotgraph
   tag: release/rolling/rqt_dotgraph/0.0.5-2
   url: https://github.com/ros2-gbp/rqt_dotgraph-release.git
   version: 0.0.5
 rqt_gauges:
+  dependencies:
+  - ament_flake8
+  - ament_index_python
+  - ament_xmllint
+  - qt_gui
+  - qt_gui_py_common
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ToyotaResearchInstitute/gauges2
   tag: release/rolling/rqt_gauges/0.0.3-2
   url: https://github.com/ros2-gbp/rqt_gauges-release.git
   version: 0.0.3
 rqt_graph:
-  tag: release/rolling/rqt_graph/2.0.2-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_dotgraph
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-visualization/rqt_graph
+  tag: release/rolling/rqt_graph/2.0.3-1
   url: https://github.com/ros2-gbp/rqt_graph-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_gui:
-  tag: release/rolling/rqt_gui/2.0.2-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui
+  - rclpy
+  repository: https://github.com/ros-visualization/rqt
+  tag: release/rolling/rqt_gui/2.0.3-1
   url: https://github.com/ros2-gbp/rqt-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_gui_cpp:
-  tag: release/rolling/rqt_gui_cpp/2.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - qt_gui_cpp
+  - rclcpp
+  repository: https://github.com/ros-visualization/rqt
+  tag: release/rolling/rqt_gui_cpp/2.0.3-1
   url: https://github.com/ros2-gbp/rqt-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_gui_py:
-  tag: release/rolling/rqt_gui_py/2.0.2-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui
+  - rclpy
+  - rqt_gui
+  repository: https://github.com/ros-visualization/rqt
+  tag: release/rolling/rqt_gui_py/2.0.3-1
   url: https://github.com/ros2-gbp/rqt-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_image_overlay:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - compressed_image_transport
+  - image_transport
+  - pluginlib
+  - rclcpp
+  - ros_image_to_qimage
+  - rqt_gui
+  - rqt_gui_cpp
+  - rqt_image_overlay_layer
+  - std_msgs
+  repository: https://github.com/ros-sports/rqt_image_overlay
   tag: release/rolling/rqt_image_overlay/0.5.0-2
   url: https://github.com/ros2-gbp/rqt_image_overlay-release.git
   version: 0.5.0
 rqt_image_overlay_layer:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rcpputils
+  - rosidl_runtime_cpp
+  repository: https://github.com/ros-sports/rqt_image_overlay
   tag: release/rolling/rqt_image_overlay_layer/0.5.0-2
   url: https://github.com/ros2-gbp/rqt_image_overlay-release.git
   version: 0.5.0
 rqt_image_view:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - geometry_msgs
+  - image_transport
+  - qt_gui_cpp
+  - rclcpp
+  - rqt_gui
+  - rqt_gui_cpp
+  - sensor_msgs
+  repository: https://github.com/ros-visualization/rqt_image_view
   tag: release/rolling/rqt_image_view/2.0.5-2
   url: https://github.com/ros2-gbp/rqt_image_view-release.git
   version: 2.0.5
 rqt_joint_trajectory_controller:
+  dependencies:
+  - control_msgs
+  - controller_manager_msgs
+  - launch_testing
+  - launch_testing_ros
+  - python_qt_binding
+  - qt_gui
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  - trajectory_msgs
+  - urdfdom_py
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/rqt_joint_trajectory_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
+rqt_lifecycle_manager:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - lifecycle_msgs
+  - python_qt_binding
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ajtudela/rqt_lifecycle_manager
+  tag: release/rolling/rqt_lifecycle_manager/0.2.0-1
+  url: https://github.com/ros2-gbp/rqt_lifecycle_manager-release.git
+  version: 0.2.0
 rqt_moveit:
+  dependencies:
+  - python_qt_binding
+  - rclpy
+  - rosidl_default_generators
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  - rqt_topic
+  - sensor_msgs
+  repository: https://github.com/ros-visualization/rqt_moveit
   tag: release/rolling/rqt_moveit/1.0.1-5
   url: https://github.com/ros2-gbp/rqt_moveit-release.git
   version: 1.0.1
 rqt_msg:
-  tag: release/rolling/rqt_msg/2.0.2-1
+  dependencies:
+  - ament_flake8
+  - ament_index_python
+  - ament_xmllint
+  - python_qt_binding
+  - rclpy
+  - rosidl_runtime_py
+  - rqt_console
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_msg
+  tag: release/rolling/rqt_msg/2.0.3-1
   url: https://github.com/ros2-gbp/rqt_msg-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_play_motion_builder:
+  dependencies:
+  - ament_cmake_auto
+  - class_loader
+  - play_motion2_msgs
+  - play_motion_builder
+  - play_motion_builder_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rqt_gui
+  - rqt_gui_cpp
+  - sensor_msgs
+  - urdf
+  repository: https://github.com/pal-robotics/play_motion_builder
   tag: release/rolling/rqt_play_motion_builder/1.4.1-2
   url: https://github.com/ros2-gbp/play_motion_builder-release.git
   version: 1.4.1
 rqt_plot:
-  tag: release/rolling/rqt_plot/2.0.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui_py_common
+  - rclpy
+  - rosidl_parser
+  - rosidl_runtime_py
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  - std_msgs
+  - test_msgs
+  repository: https://github.com/ros-visualization/rqt_plot
+  tag: release/rolling/rqt_plot/2.0.2-1
   url: https://github.com/ros2-gbp/rqt_plot-release.git
-  version: 2.0.1
+  version: 2.0.2
 rqt_publisher:
-  tag: release/rolling/rqt_publisher/2.0.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui_py_common
+  - rclpy
+  - rosidl_runtime_py
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_publisher
+  tag: release/rolling/rqt_publisher/2.0.2-1
   url: https://github.com/ros2-gbp/rqt_publisher-release.git
-  version: 2.0.1
+  version: 2.0.2
 rqt_py_common:
-  tag: release/rolling/rqt_py_common/2.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - python_qt_binding
+  - qt_gui
+  - rclpy
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-visualization/rqt
+  tag: release/rolling/rqt_py_common/2.0.3-1
   url: https://github.com/ros2-gbp/rqt-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_py_console:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui
+  - qt_gui_py_common
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-visualization/rqt_py_console
   tag: release/rolling/rqt_py_console/2.0.1-1
   url: https://github.com/ros2-gbp/rqt_py_console-release.git
   version: 2.0.1
 rqt_reconfigure:
-  tag: release/rolling/rqt_reconfigure/2.0.2-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui_py_common
+  - rclpy
+  - rqt_console
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_reconfigure
+  tag: release/rolling/rqt_reconfigure/2.0.3-1
   url: https://github.com/ros2-gbp/rqt_reconfigure-release.git
-  version: 2.0.2
+  version: 2.0.3
 rqt_robot_dashboard:
+  dependencies:
+  - diagnostic_msgs
+  - python_qt_binding
+  - qt_gui
+  - rclpy
+  - rqt_console
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_robot_monitor
+  repository: https://github.com/ros-visualization/rqt_robot_dashboard
   tag: release/rolling/rqt_robot_dashboard/0.6.1-5
   url: https://github.com/ros2-gbp/rqt_robot_dashboard-release.git
   version: 0.6.1
 rqt_robot_monitor:
+  dependencies:
+  - diagnostic_msgs
+  - python_qt_binding
+  - qt_gui
+  - qt_gui_py_common
+  - rclpy
+  - rosidl_default_generators
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_robot_monitor
   tag: release/rolling/rqt_robot_monitor/1.0.6-2
   url: https://github.com/ros2-gbp/rqt_robot_monitor-release.git
   version: 1.0.6
 rqt_robot_steering:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - python_qt_binding
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-visualization/rqt_robot_steering
   tag: release/rolling/rqt_robot_steering/5.0.0-1
   url: https://github.com/ros2-gbp/rqt_robot_steering-release.git
   version: 5.0.0
 rqt_runtime_monitor:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - diagnostic_msgs
+  - python_qt_binding
+  - qt_gui
+  - rclpy
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-visualization/rqt_runtime_monitor
   tag: release/rolling/rqt_runtime_monitor/1.0.0-5
   url: https://github.com/ros2-gbp/rqt_runtime_monitor-release.git
   version: 1.0.0
 rqt_service_caller:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_service_caller
   tag: release/rolling/rqt_service_caller/2.0.2-1
   url: https://github.com/ros2-gbp/rqt_service_caller-release.git
   version: 2.0.2
 rqt_shell:
-  tag: release/rolling/rqt_shell/2.0.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - python_qt_binding
+  - qt_gui
+  - qt_gui_py_common
+  - rqt_gui
+  - rqt_gui_py
+  repository: https://github.com/ros-visualization/rqt_shell
+  tag: release/rolling/rqt_shell/2.0.2-1
   url: https://github.com/ros2-gbp/rqt_shell-release.git
-  version: 2.0.1
+  version: 2.0.2
 rqt_srv:
+  dependencies:
+  - ament_flake8
+  - ament_xmllint
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_msg
+  repository: https://github.com/ros-visualization/rqt_srv
   tag: release/rolling/rqt_srv/2.0.0-1
   url: https://github.com/ros2-gbp/rqt_srv-release.git
   version: 2.0.0
 rqt_tf_tree:
+  dependencies:
+  - ament_flake8
+  - ament_pep257
+  - python_qt_binding
+  - qt_dotgraph
+  - rclpy
+  - rqt_graph
+  - rqt_gui
+  - rqt_gui_py
+  - tf2_msgs
+  - tf2_ros
+  - tf2_ros_py
+  repository: https://github.com/ros-visualization/rqt_tf_tree
   tag: release/rolling/rqt_tf_tree/1.1.1-1
   url: https://github.com/ros2-gbp/rqt_tf_tree-release.git
   version: 1.1.1
 rqt_topic:
-  tag: release/rolling/rqt_topic/3.0.2-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_xmllint
+  - python_qt_binding
+  - rclpy
+  - ros2topic
+  - rqt_gui
+  - rqt_gui_py
+  - rqt_py_common
+  repository: https://github.com/ros-visualization/rqt_topic
+  tag: release/rolling/rqt_topic/3.0.3-1
   url: https://github.com/ros2-gbp/rqt_topic-release.git
-  version: 3.0.2
+  version: 3.0.3
 rsl:
+  dependencies:
+  - ament_cmake_ros
+  - rclcpp
+  - tcb_span
+  repository: https://github.com/PickNikRobotics/RSL
   tag: release/rolling/rsl/1.3.0-2
   url: https://github.com/ros2-gbp/RSL-release.git
   version: 1.3.0
 rslidar_msg:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rclcpp
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/RoboSense-LiDAR/rslidar_msg
   tag: release/rolling/rslidar_msg/0.0.0-2
   url: https://github.com/ros2-gbp/rslidar_msg-release.git
   version: 0.0.0
 rtabmap:
+  dependencies:
+  - cv_bridge
+  - gtsam
+  - libg2o
+  - libpointmatcher
+  repository: https://github.com/introlab/rtabmap
   tag: release/rolling/rtabmap/0.22.1-2
   url: https://github.com/ros2-gbp/rtabmap-release.git
   version: 0.22.1
 rtcm_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tilk/rtcm_msgs
   tag: release/rolling/rtcm_msgs/1.1.6-4
   url: https://github.com/ros2-gbp/rtcm_msgs-release.git
   version: 1.1.6
 rtest:
-  tag: release/rolling/rtest/0.2.3-1
+  dependencies:
+  - action_msgs
+  - ament_clang_tidy
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rcl
+  - rcl_action
+  - rclcpp
+  - rclcpp_action
+  - ros_environment
+  repository: https://github.com/Beam-and-Spyrosoft/rtest
+  tag: release/rolling/rtest/0.2.4-1
   url: https://github.com/ros2-gbp/rtest-release.git
-  version: 0.2.3
+  version: 0.2.4
 rti_connext_dds_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rmw_connextdds
   tag: release/rolling/rti_connext_dds_cmake_module/1.3.0-2
   url: https://github.com/ros2-gbp/rmw_connextdds-release.git
   version: 1.3.0
 rtsp_image_transport:
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  - image_transport
+  - live555_vendor
+  - pluginlib
+  - rclcpp
+  repository: https://github.com/fkie/rtsp_image_transport
   tag: release/rolling/rtsp_image_transport/2.0.2-1
   url: https://github.com/ros2-gbp/rtsp_image_transport-release.git
   version: 2.0.2
 rttest:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/realtime_support
   tag: release/rolling/rttest/1.0.1-1
   url: https://github.com/ros2-gbp/realtime_support-release.git
   version: 1.0.1
 ruckig:
+  dependencies: []
+  repository: https://github.com/pantor/ruckig
   tag: release/rolling/ruckig/0.9.2-5
   url: https://github.com/ros2-gbp/ruckig-release.git
   version: 0.9.2
 rviz2:
-  tag: release/rolling/rviz2/16.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_lint_cmake
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rviz_common
+  - rviz_default_plugins
+  - rviz_ogre_vendor
+  - sensor_msgs
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz2/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_2d_overlay_msgs:
+  dependencies:
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/teamspatzenhirn/rviz_2d_overlay_plugins
   tag: release/rolling/rviz_2d_overlay_msgs/1.4.2-1
   url: https://github.com/ros2-gbp/rviz_2d_overlay_plugins-release.git
   version: 1.4.2
 rviz_2d_overlay_plugins:
+  dependencies:
+  - ament_cmake
+  - rviz_2d_overlay_msgs
+  - rviz_common
+  - rviz_ogre_vendor
+  - rviz_rendering
+  - std_msgs
+  repository: https://github.com/teamspatzenhirn/rviz_2d_overlay_plugins
   tag: release/rolling/rviz_2d_overlay_plugins/1.4.2-1
   url: https://github.com/ros2-gbp/rviz_2d_overlay_plugins-release.git
   version: 1.4.2
 rviz_common:
-  tag: release/rolling/rviz_common/16.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - resource_retriever
+  - rviz_ogre_vendor
+  - rviz_rendering
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_ros
+  - yaml_cpp_vendor
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz_common/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_default_plugins:
-  tag: release/rolling/rviz_default_plugins/16.0.2-1
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - gz_math_vendor
+  - image_transport
+  - interactive_markers
+  - laser_geometry
+  - map_msgs
+  - nav_msgs
+  - pluginlib
+  - point_cloud_transport
+  - rclcpp
+  - resource_retriever
+  - resource_retriever_service_plugin
+  - rviz_common
+  - rviz_ogre_vendor
+  - rviz_rendering
+  - rviz_rendering_tests
+  - rviz_visual_testing_framework
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - urdf
+  - visualization_msgs
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz_default_plugins/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_imu_plugin:
-  tag: release/rolling/rviz_imu_plugin/2.2.4-2
+  dependencies:
+  - ament_cmake
+  - message_filters
+  - pluginlib
+  - rclcpp
+  - rviz_common
+  - rviz_ogre_vendor
+  - rviz_rendering
+  - sensor_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/CCNYRoboticsLab/imu_tools
+  tag: release/rolling/rviz_imu_plugin/2.2.5-1
   url: https://github.com/ros2-gbp/imu_tools-release.git
-  version: 2.2.4
+  version: 2.2.5
 rviz_marker_tools:
-  tag: release/rolling/rviz_marker_tools/0.1.6-1
+  dependencies:
+  - ament_cmake
+  - eigen3_cmake_module
+  - geometry_msgs
+  - moveit_common
+  - rclcpp
+  - std_msgs
+  - tf2_eigen
+  - visualization_msgs
+  repository: https://github.com/moveit/moveit_task_constructor
+  tag: release/rolling/rviz_marker_tools/0.2.0-1
   url: https://github.com/ros2-gbp/moveit_task_constructor-release.git
-  version: 0.1.6
+  version: 0.2.0
 rviz_ogre_vendor:
-  tag: release/rolling/rviz_ogre_vendor/16.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz_ogre_vendor/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_rendering:
-  tag: release/rolling/rviz_rendering/16.0.2-1
+  dependencies:
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - resource_retriever
+  - rviz_ogre_vendor
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz_rendering/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_rendering_tests:
-  tag: release/rolling/rviz_rendering_tests/16.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - resource_retriever
+  - rviz_rendering
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz_rendering_tests/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_satellite:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - angles
+  - rclcpp
+  - rcpputils
+  - rviz_common
+  - rviz_default_plugins
+  - sensor_msgs
+  repository: https://github.com/nobleo/rviz_satellite
   tag: release/rolling/rviz_satellite/4.3.1-1
   url: https://github.com/ros2-gbp/rviz_satellite-release.git
   version: 4.3.1
 rviz_visual_testing_framework:
-  tag: release/rolling/rviz_visual_testing_framework/16.0.2-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rcutils
+  - rviz_common
+  - rviz_ogre_vendor
+  - rviz_rendering
+  - std_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/ros2/rviz
+  tag: release/rolling/rviz_visual_testing_framework/16.0.3-1
   url: https://github.com/ros2-gbp/rviz-release.git
-  version: 16.0.2
+  version: 16.0.3
 rviz_visual_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - eigen_stl_containers
+  - geometry_msgs
+  - interactive_markers
+  - launch
+  - launch_ros
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - rviz_ogre_vendor
+  - rviz_rendering
+  - sensor_msgs
+  - shape_msgs
+  - std_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - trajectory_msgs
+  - visualization_msgs
+  repository: https://github.com/PickNikRobotics/rviz_visual_tools
   tag: release/rolling/rviz_visual_tools/4.2.0-1
   url: https://github.com/ros2-gbp/rviz_visual_tools-release.git
   version: 4.2.0
+sbg_driver:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - nav_msgs
+  - nmea_msgs
+  - rclcpp
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - rtcm_msgs
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_geometry_msgs
+  - tf2_msgs
+  - tf2_ros
+  - urdf
+  - xacro
+  repository: https://github.com/SBG-Systems/sbg_ros2
+  tag: release/rolling/sbg_driver/3.4.0-1
+  url: https://github.com/ros2-gbp/sbg_ros2-release.git
+  version: 3.4.0
 sdformat_test_files:
+  dependencies: []
+  repository: https://github.com/ros/sdformat_urdf
   tag: release/rolling/sdformat_test_files/3.0.0-1
   url: https://github.com/ros2-gbp/sdformat_urdf-release.git
   version: 3.0.0
 sdformat_urdf:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rcutils
+  - sdformat_test_files
+  - sdformat_vendor
+  - urdf
+  - urdf_parser_plugin
+  repository: https://github.com/ros/sdformat_urdf
   tag: release/rolling/sdformat_urdf/3.0.0-1
   url: https://github.com/ros2-gbp/sdformat_urdf-release.git
   version: 3.0.0
 sdformat_vendor:
-  tag: release/rolling/sdformat_vendor/0.4.1-1
+  dependencies:
+  - ament_cmake_copyright
+  - ament_cmake_core
+  - ament_cmake_lint_cmake
+  - ament_cmake_test
+  - ament_cmake_vendor_package
+  - ament_cmake_xmllint
+  - gz_cmake_vendor
+  - gz_math_vendor
+  - gz_tools_vendor
+  - gz_utils_vendor
+  - urdfdom
+  repository: https://github.com/gazebo-release/sdformat_vendor
+  tag: release/rolling/sdformat_vendor/0.4.2-1
   url: https://github.com/ros2-gbp/sdformat_vendor-release.git
-  version: 0.4.1
+  version: 0.4.2
 sdl2_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-drivers/joystick_drivers
   tag: release/rolling/sdl2_vendor/3.3.0-3
   url: https://github.com/ros2-gbp/joystick_drivers-release.git
   version: 3.3.0
 self_test:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - diagnostic_updater
+  - rclcpp
+  - ros_environment
+  repository: https://github.com/ros/diagnostics
   tag: release/rolling/self_test/4.5.7-1
   url: https://github.com/ros2-gbp/diagnostics-release.git
   version: 4.5.7
 sensor_msgs:
-  tag: release/rolling/sensor_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/sensor_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 sensor_msgs_py:
-  tag: release/rolling/sensor_msgs_py/5.10.1-1
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/sensor_msgs_py/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 septentrio_gnss_driver:
-  tag: release/rolling/septentrio_gnss_driver/1.4.7-2
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - diagnostic_msgs
+  - geometry_msgs
+  - gps_msgs
+  - gtest_vendor
+  - nav_msgs
+  - nmea_msgs
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - tf2
+  - tf2_eigen
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/septentrio-gnss/septentrio_gnss_driver
+  tag: release/rolling/septentrio_gnss_driver/1.4.8-3
   url: https://github.com/ros2-gbp/septentrio_gnss_driver_ros2-release.git
-  version: 1.4.7
+  version: 1.4.8
 serial_driver:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - asio_cmake_module
+  - io_context
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - std_msgs
+  repository: https://github.com/ros-drivers/transport_drivers
   tag: release/rolling/serial_driver/1.2.0-4
   url: https://github.com/ros2-gbp/transport_drivers-release.git
   version: 1.2.0
 service_load_balancing:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - example_interfaces
+  - rclcpp
+  - rosidl_default_runtime
+  - rosidl_typesupport_introspection_cpp
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/Barry-Xu-2018/ros2_service_load_balancing
   tag: release/rolling/service_load_balancing/0.1.3-2
   url: https://github.com/ros2-gbp/service_load_balancing-release.git
   version: 0.1.3
 service_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_core_generators
+  - rosidl_core_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/service_msgs/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 shape_msgs:
-  tag: release/rolling/shape_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/shape_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 sick_safetyscanners2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_updater
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_lifecycle
+  - robot_state_publisher
+  - rviz2
+  - sensor_msgs
+  - sick_safetyscanners2_interfaces
+  - sick_safetyscanners_base
+  - xacro
+  repository: https://github.com/SICKAG/sick_safetyscanners2
   tag: release/rolling/sick_safetyscanners2/1.0.5-1
   url: https://github.com/ros2-gbp/sick_safetyscanners2-release.git
   version: 1.0.5
 sick_safetyscanners2_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  repository: https://github.com/SICKAG/sick_safetyscanners2_interfaces
   tag: release/rolling/sick_safetyscanners2_interfaces/1.0.0-2
   url: https://github.com/ros2-gbp/sick_safetyscanners2_interfaces-release.git
   version: 1.0.0
 sick_safetyscanners_base:
+  dependencies: []
+  repository: https://github.com/SICKAG/sick_safetyscanners_base
   tag: release/rolling/sick_safetyscanners_base/1.0.3-2
   url: https://github.com/ros2-gbp/sick_safetyscanners_base-release.git
   version: 1.0.3
 sick_safevisionary_base:
+  dependencies: []
+  repository: https://github.com/SICKAG/sick_safevisionary_base
   tag: release/rolling/sick_safevisionary_base/1.0.1-3
   url: https://github.com/ros2-gbp/sick_safevisionary_base-release.git
   version: 1.0.1
 sick_safevisionary_driver:
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - sick_safevisionary_base
+  - sick_safevisionary_interfaces
+  repository: https://github.com/SICKAG/sick_safevisionary_ros2
   tag: release/rolling/sick_safevisionary_driver/1.0.5-1
   url: https://github.com/ros2-gbp/sick_safevisionary_ros2-release.git
   version: 1.0.5
 sick_safevisionary_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/SICKAG/sick_safevisionary_ros2
   tag: release/rolling/sick_safevisionary_interfaces/1.0.5-1
   url: https://github.com/ros2-gbp/sick_safevisionary_ros2-release.git
   version: 1.0.5
 sick_safevisionary_tests:
+  dependencies:
+  - ament_cmake
+  - launch
+  - launch_ros
+  - launch_testing_ament_cmake
+  - sick_safevisionary_driver
+  repository: https://github.com/SICKAG/sick_safevisionary_ros2
   tag: release/rolling/sick_safevisionary_tests/1.0.5-1
   url: https://github.com/ros2-gbp/sick_safevisionary_ros2-release.git
   version: 1.0.5
+sicks300_ros2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_msgs
+  - diagnostic_updater
+  - laser_filters
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - rcutils
+  - sensor_msgs
+  repository: https://github.com/ajtudela/sicks300_ros2
+  tag: release/rolling/sicks300_ros2/1.4.0-1
+  url: https://github.com/ros2-gbp/sicks300_ros2-release.git
+  version: 1.4.0
 simple_actions:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - example_interfaces
+  - rclcpp
+  - rclcpp_action
+  - rclpy
+  repository: https://github.com/DLu/simple_actions
   tag: release/rolling/simple_actions/0.5.0-2
   url: https://github.com/ros2-gbp/simple_actions-release.git
   version: 0.5.0
 simple_grasping:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cpplint
+  - ament_cmake_gtest
+  - geometry_msgs
+  - grasping_msgs
+  - moveit_msgs
+  - pcl_conversions
+  - pcl_ros
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - sensor_msgs
+  - shape_msgs
+  - tf2_ros
+  repository: https://github.com/mikeferguson/simple_grasping
   tag: release/rolling/simple_grasping/0.6.0-2
   url: https://github.com/ros2-gbp/simple_grasping-release.git
   version: 0.6.0
 simple_launch:
+  dependencies:
+  - ament_cmake_python
+  - ament_index_python
+  - launch
+  - launch_ros
+  - xacro
+  repository: https://github.com/oKermorgant/simple_launch
   tag: release/rolling/simple_launch/1.11.4-2
   url: https://github.com/ros2-gbp/simple_launch-release.git
   version: 1.11.4
 simulation:
+  dependencies:
+  - ament_cmake
+  - ros_base
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_interfaces
+  - ros_gz_sim
+  repository: https://github.com/ros2/variants
   tag: release/rolling/simulation/0.13.0-2
   url: https://github.com/ros2-gbp/variants-release.git
   version: 0.13.0
 simulation_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-simulation/simulation_interfaces
   tag: release/rolling/simulation_interfaces/2.1.0-2
   url: https://github.com/ros2-gbp/simulation_interfaces-release.git
   version: 2.1.0
 slg_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ajtudela/slg_msgs
   tag: release/rolling/slg_msgs/3.9.1-2
   url: https://github.com/ros2-gbp/slg_msgs-release.git
   version: 3.9.1
 slider_publisher:
+  dependencies:
+  - ament_cmake
+  - rqt_gui_py
+  repository: https://github.com/oKermorgant/slider_publisher
   tag: release/rolling/slider_publisher/2.4.3-2
   url: https://github.com/ros2-gbp/slider_publisher-release.git
   version: 2.4.3
 smach:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  repository: https://github.com/ros/executive_smach
   tag: release/rolling/smach/3.0.3-3
   url: https://github.com/ros2-gbp/executive_smach-release.git
   version: 3.0.3
 smach_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_lint
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros/executive_smach
   tag: release/rolling/smach_msgs/3.0.3-3
   url: https://github.com/ros2-gbp/executive_smach-release.git
   version: 3.0.3
 smach_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - rclpy
+  - smach
+  - smach_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros/executive_smach
   tag: release/rolling/smach_ros/3.0.3-3
   url: https://github.com/ros2-gbp/executive_smach-release.git
   version: 3.0.3
 smclib:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros/bond_core
   tag: release/rolling/smclib/4.4.0-2
   url: https://github.com/ros2-gbp/bond_core-release.git
   version: 4.4.0
 soccer_geometry_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-sports/soccer_interfaces
   tag: release/rolling/soccer_geometry_msgs/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_interfaces-release.git
   version: 1.0.0
 soccer_interfaces:
+  dependencies:
+  - ament_cmake
+  - soccer_vision_2d_msgs
+  - soccer_vision_3d_msgs
+  - soccer_vision_attribute_msgs
+  repository: https://github.com/ros-sports/soccer_interfaces
   tag: release/rolling/soccer_interfaces/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_interfaces-release.git
   version: 1.0.0
 soccer_model_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - soccer_geometry_msgs
+  - soccer_vision_attribute_msgs
+  - std_msgs
+  repository: https://github.com/ros-sports/soccer_interfaces
   tag: release/rolling/soccer_model_msgs/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_interfaces-release.git
   version: 1.0.0
 soccer_vision_2d_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - soccer_vision_attribute_msgs
+  - vision_msgs
+  repository: https://github.com/ros-sports/soccer_interfaces
   tag: release/rolling/soccer_vision_2d_msgs/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_interfaces-release.git
   version: 1.0.0
 soccer_vision_3d_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - soccer_vision_attribute_msgs
+  - vision_msgs
+  repository: https://github.com/ros-sports/soccer_interfaces
   tag: release/rolling/soccer_vision_3d_msgs/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_interfaces-release.git
   version: 1.0.0
 soccer_vision_3d_rviz_markers:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - rclpy
+  - soccer_vision_3d_msgs
+  - soccer_vision_attribute_msgs
+  - visualization_msgs
+  repository: https://github.com/ros-sports/soccer_vision_3d_rviz_markers
   tag: release/rolling/soccer_vision_3d_rviz_markers/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_vision_3d_rviz_markers-release.git
   version: 1.0.0
 soccer_vision_attribute_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-sports/soccer_interfaces
   tag: release/rolling/soccer_vision_attribute_msgs/1.0.0-2
   url: https://github.com/ros2-gbp/soccer_interfaces-release.git
   version: 1.0.0
 sol_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ouxt_lint_common
+  repository: https://github.com/OUXT-Polaris/sol_vendor
   tag: release/rolling/sol_vendor/0.0.3-5
   url: https://github.com/ros2-gbp/sol_vendor-release.git
   version: 0.0.3
 sophus:
+  dependencies: []
+  repository: https://github.com/clalancette/sophus
   tag: release/rolling/sophus/1.22.9102-3
   url: https://github.com/ros2-gbp/sophus-release.git
   version: 1.22.9102
 sound_play:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_python
+  - ament_index_python
+  - launch_xml
+  - rclpy
+  - sound_play_msgs
+  repository: https://github.com/ros-drivers/audio_common
   tag: release/rolling/sound_play/0.4.0-2
   url: https://github.com/ros2-gbp/audio_common-release.git
   version: 0.4.0
 sound_play_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-drivers/audio_common
   tag: release/rolling/sound_play_msgs/0.4.0-2
   url: https://github.com/ros2-gbp/audio_common-release.git
   version: 0.4.0
 spacenav:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/joystick_drivers
   tag: release/rolling/spacenav/3.3.0-3
   url: https://github.com/ros2-gbp/joystick_drivers-release.git
   version: 3.3.0
 spdlog_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/spdlog_vendor
   tag: release/rolling/spdlog_vendor/1.9.0-1
   url: https://github.com/ros2-gbp/spdlog_vendor-release.git
   version: 1.9.0
 spinnaker_camera_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_info_manager
+  - diagnostic_updater
+  - flir_camera_msgs
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-drivers/flir_camera_driver
   tag: release/rolling/spinnaker_camera_driver/3.0.5-1
   url: https://github.com/ros2-gbp/flir_camera_driver-release.git
   version: 3.0.5
 spinnaker_synchronized_camera_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_black
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - spinnaker_camera_driver
+  repository: https://github.com/ros-drivers/flir_camera_driver
   tag: release/rolling/spinnaker_synchronized_camera_driver/3.0.5-1
   url: https://github.com/ros2-gbp/flir_camera_driver-release.git
   version: 3.0.5
 splsm_7:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-sports/r2r_spl
   tag: release/rolling/splsm_7/3.0.1-4
   url: https://github.com/ros2-gbp/r2r_spl-release.git
   version: 3.0.1
 splsm_7_conversion:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - splsm_7
+  repository: https://github.com/ros-sports/r2r_spl
   tag: release/rolling/splsm_7_conversion/3.0.1-4
   url: https://github.com/ros2-gbp/r2r_spl-release.git
   version: 3.0.1
 srdfdom:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_cmake
+  - console_bridge_vendor
+  - urdf
+  - urdfdom_headers
+  - urdfdom_py
+  repository: https://github.com/ros-planning/srdfdom
   tag: release/rolling/srdfdom/2.0.9-2
   url: https://github.com/ros2-gbp/srdfdom-release.git
   version: 2.0.9
 sros2:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_index_python
+  - ament_mypy
+  - ament_pep257
+  - rclpy
+  - ros2cli
+  - ros_testing
+  - test_msgs
+  repository: https://github.com/ros2/sros2
   tag: release/rolling/sros2/0.17.0-1
   url: https://github.com/ros2-gbp/sros2-release.git
   version: 0.17.0
 sros2_cmake:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_test
+  - ament_lint_auto
+  - ament_lint_common
+  - ros2cli
+  - sros2
+  repository: https://github.com/ros2/sros2
   tag: release/rolling/sros2_cmake/0.17.0-1
   url: https://github.com/ros2-gbp/sros2-release.git
   version: 0.17.0
 state_interfaces_broadcaster:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/state_interfaces_broadcaster/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 statistics_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/statistics_msgs/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 std_msgs:
-  tag: release/rolling/std_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/std_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 std_srvs:
-  tag: release/rolling/std_srvs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/std_srvs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 steering_controllers_library:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcpputils
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/steering_controllers_library/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 steering_functions:
+  dependencies:
+  - ros_environment
+  repository: https://github.com/hbanzhaf/steering_functions
   tag: release/rolling/steering_functions/0.3.0-2
   url: https://github.com/ros2-gbp/steering_functions-release.git
   version: 0.3.0
 stereo_image_proc:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - image_geometry
+  - image_proc
+  - image_transport
+  - launch
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - message_filters
+  - python_cmake_module
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - ros_testing
+  - sensor_msgs
+  - stereo_msgs
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/stereo_image_proc/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 stereo_msgs:
-  tag: release/rolling/stereo_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/stereo_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 stomp:
+  dependencies:
+  - ros_industrial_cmake_boilerplate
+  repository: https://github.com/ros-industrial/stomp
   tag: release/rolling/stomp/0.1.2-4
   url: https://github.com/ros2-gbp/stomp-release.git
   version: 0.1.2
 swri_cli_tools:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - marti_introspection_msgs
+  - rcl_interfaces
+  - rclpy
+  - ros2cli
+  - ros2node
+  - ros2param
+  - ros2topic
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_cli_tools/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_console:
+  dependencies:
+  - ament_cmake
+  - rcl_interfaces
+  - rclcpp
+  - rcutils
+  - rmw
+  - rosbag2_storage
+  - rosbag2_storage_mcap
+  - rosbag2_transport
+  repository: https://github.com/swri-robotics/swri_console
   tag: release/rolling/swri_console/2.3.0-1
   url: https://github.com/ros2-gbp/swri_console-release.git
   version: 2.3.0
 swri_console_util:
+  dependencies:
+  - ament_cmake
+  - rclcpp
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_console_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_dbw_interface:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_dbw_interface/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_geometry_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - tf2
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_geometry_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_image_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - camera_calibration_parsers
+  - cv_bridge
+  - image_geometry
+  - image_transport
+  - message_filters
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - swri_geometry_util
+  - swri_math_util
+  - swri_opencv_util
+  - tf2
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_image_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_math_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - rclcpp
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_math_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_opencv_util:
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  - swri_math_util
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_opencv_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_route_util:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - marti_common_msgs
+  - marti_nav_msgs
+  - rclcpp
+  - swri_geometry_util
+  - swri_math_util
+  - swri_transform_util
+  - tf2_geometry_msgs
+  - visualization_msgs
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_route_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_serial_util:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_serial_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 swri_transform_util:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_index_cpp
+  - cv_bridge
+  - diagnostic_msgs
+  - diagnostic_updater
+  - geographic_msgs
+  - geometry_msgs
+  - gps_msgs
+  - launch_ros
+  - launch_testing
+  - launch_testing_ament_cmake
+  - marti_nav_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - sensor_msgs
+  - swri_math_util
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - yaml_cpp_vendor
+  repository: https://github.com/swri-robotics/marti_common
   tag: release/rolling/swri_transform_util/3.9.1-1
   url: https://github.com/ros2-gbp/marti_common-release.git
   version: 3.9.1
 sync_tooling_msgs:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/tier4/sync_tooling_msgs
   tag: release/rolling/sync_tooling_msgs/0.2.11-1
   url: https://github.com/ros2-gbp/sync_tooling_msgs-release.git
   version: 0.2.11
 system_fingerprint:
+  dependencies:
+  - rcl_interfaces
+  - rclpy
+  - ros2action
+  - ros2cli
+  - ros2node
+  - ros2param
+  - ros2topic
+  repository: https://github.com/MetroRobots/ros_system_fingerprint
   tag: release/rolling/system_fingerprint/0.7.0-4
   url: https://github.com/ros2-gbp/ros_system_fingerprint-release.git
   version: 0.7.0
 system_modes:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_index_python
+  - ament_lint_auto
+  - builtin_interfaces
+  - launch_ros
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2run
+  - system_modes_msgs
+  repository: https://github.com/micro-ROS/system_modes
   tag: release/rolling/system_modes/0.9.0-6
   url: https://github.com/ros2-gbp/system_modes-release.git
   version: 0.9.0
 system_modes_examples:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_flake8
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_lint_auto
+  - launch
+  - launch_system_modes
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2launch
+  - system_modes
+  - system_modes_msgs
+  repository: https://github.com/micro-ROS/system_modes
   tag: release/rolling/system_modes_examples/0.9.0-6
   url: https://github.com/ros2-gbp/system_modes-release.git
   version: 0.9.0
 system_modes_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/micro-ROS/system_modes
   tag: release/rolling/system_modes_msgs/0.9.0-6
   url: https://github.com/ros2-gbp/system_modes-release.git
   version: 0.9.0
 system_webview:
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rosbridge_server
+  repository: https://github.com/namo-robotics/ros2_system_webview
   tag: release/rolling/system_webview/0.0.3-2
   url: https://github.com/ros2-gbp/system_webview-release.git
   version: 0.0.3
 tango_icons_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-visualization/tango_icons_vendor
   tag: release/rolling/tango_icons_vendor/0.6.0-1
   url: https://github.com/ros2-gbp/tango_icons_vendor-release.git
   version: 0.6.0
 tcb_span:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  repository: https://github.com/PickNikRobotics/cpp_polyfills
   tag: release/rolling/tcb_span/2.0.3-1
   url: https://github.com/ros2-gbp/cpp_polyfills-release.git
   version: 2.0.3
 teleop_tools:
+  dependencies:
+  - ament_cmake
+  - joy_teleop
+  - key_teleop
+  - teleop_tools_msgs
+  repository: https://github.com/ros-teleop/teleop_tools
   tag: release/rolling/teleop_tools/2.0.0-2
   url: https://github.com/ros2-gbp/teleop_tools-release.git
   version: 2.0.0
 teleop_tools_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-teleop/teleop_tools
   tag: release/rolling/teleop_tools_msgs/2.0.0-2
   url: https://github.com/ros2-gbp/teleop_tools-release.git
   version: 2.0.0
 teleop_twist_joy:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - joy
+  - launch_ros
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros2/teleop_twist_joy
   tag: release/rolling/teleop_twist_joy/2.6.5-2
   url: https://github.com/ros2-gbp/teleop_twist_joy-release.git
   version: 2.6.5
 teleop_twist_keyboard:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - rcl_interfaces
+  - rclpy
+  repository: https://github.com/ros2/teleop_twist_keyboard
   tag: release/rolling/teleop_twist_keyboard/2.4.1-2
   url: https://github.com/ros2-gbp/teleop_twist_keyboard-release.git
   version: 2.4.1
 tensor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/rosidl_buffer_backends
   tag: release/rolling/tensor_msgs/0.1.2-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends-release.git
   version: 0.1.2
 tensorrt_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_xmllint
+  repository: https://github.com/tier4/tensorrt_cmake_module
   tag: release/rolling/tensorrt_cmake_module/0.0.5-2
   url: https://github.com/ros2-gbp/tensorrt_cmake_module-release.git
   version: 0.0.5
 test_apex_test_tools:
+  dependencies:
+  - ament_cmake_auto
+  - ament_lint_auto
+  - apex_test_tools
+  repository: https://gitlab.com/ApexAI/apex_test_tools
   tag: release/rolling/test_apex_test_tools/0.0.2-9
   url: https://github.com/ros2-gbp/apex_test_tools-release.git
   version: 0.0.2
 test_interface_files:
+  dependencies:
+  - ament_cmake_core
+  repository: https://github.com/ros2/test_interface_files
   tag: release/rolling/test_interface_files/0.15.0-1
   url: https://github.com/ros2-gbp/test_interface_files-release.git
   version: 0.15.0
 test_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_mypy
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - test_interface_files
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/test_msgs/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 tf2:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_cpplint
+  - ament_cmake_google_benchmark
+  - ament_cmake_gtest
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_ros_core
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - builtin_interfaces
+  - geometry_msgs
+  - rcutils
+  - rosidl_runtime_cpp
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_2d:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/locusrobotics/tf2_2d
   tag: release/rolling/tf2_2d/1.6.2-1
   url: https://github.com/ros2-gbp/tf2_2d-release.git
   version: 1.6.2
 tf2_bullet:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_bullet/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_eigen:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - tf2
+  - tf2_ros
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_eigen/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_eigen_kdl:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - tf2
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_eigen_kdl/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_geometry_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - tf2
+  - tf2_ros
+  - tf2_ros_py
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_geometry_msgs/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_kdl:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - builtin_interfaces
+  - eigen3_cmake_module
+  - geometry_msgs
+  - rclcpp
+  - tf2
+  - tf2_ros
+  - tf2_ros_py
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_kdl/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_msgs/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_py:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rclpy
+  - rpyutils
+  - tf2
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_py/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - message_filters
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - rcpputils
+  - rosgraph_msgs
+  - tf2
+  - tf2_msgs
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_ros/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_ros_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - geometry_msgs
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  - tf2_msgs
+  - tf2_py
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_ros_py/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_sensor_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - geometry_msgs
+  - rclcpp
+  - sensor_msgs
+  - sensor_msgs_py
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - tf2_ros_py
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_sensor_msgs/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_tools:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - ament_xmllint
+  - rclpy
+  - tf2_msgs
+  - tf2_py
+  - tf2_ros_py
+  repository: https://github.com/ros2/geometry2
   tag: release/rolling/tf2_tools/0.46.3-1
   url: https://github.com/ros2-gbp/geometry2-release.git
   version: 0.46.3
 tf2_web_republisher:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_action
+  - rclcpp_components
+  - tf2
+  - tf2_ros
+  - tf2_web_republisher_interfaces
+  repository: https://github.com/RobotWebTools/tf2_web_republisher
   tag: release/rolling/tf2_web_republisher/1.0.0-2
   url: https://github.com/ros2-gbp/tf2_web_republisher-release.git
   version: 1.0.0
 tf2_web_republisher_interfaces:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/RobotWebTools/tf2_web_republisher
   tag: release/rolling/tf2_web_republisher_interfaces/1.0.0-2
   url: https://github.com/ros2-gbp/tf2_web_republisher-release.git
   version: 1.0.0
 tf_transformations:
+  dependencies:
+  - ament_flake8
+  - ament_pep257
+  repository: https://github.com/DLu/tf_transformations
   tag: release/rolling/tf_transformations/1.1.1-2
   url: https://github.com/ros2-gbp/tf_transformations_release.git
   version: 1.1.1
 tf_tree_terminal:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - geometry_msgs
+  - rclpy
+  - tf2_ros
+  repository: https://github.com/Tanneguydv/tf_tree_terminal
   tag: release/rolling/tf_tree_terminal/2.0.0-3
   url: https://github.com/ros2-gbp/tf_tree_terminal-release.git
   version: 2.0.0
 theora_image_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - image_transport
+  - pluginlib
+  - rclcpp
+  - rcutils
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros-perception/image_transport_plugins
   tag: release/rolling/theora_image_transport/7.0.1-1
   url: https://github.com/ros2-gbp/image_transport_plugins-release.git
   version: 7.0.1
 tile_map:
+  dependencies:
+  - ament_cmake
+  - mapviz
+  - pluginlib
+  - qt_gui_cpp
+  - rclcpp
+  - swri_math_util
+  - swri_transform_util
+  - tf2
+  repository: https://github.com/swri-robotics/mapviz
   tag: release/rolling/tile_map/4.0.3-1
   url: https://github.com/ros2-gbp/mapviz-release.git
   version: 4.0.3
 tinyspline_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/wep21/tinyspline_vendor
   tag: release/rolling/tinyspline_vendor/0.6.1-2
   url: https://github.com/ros2-gbp/tinyspline_vendor-release.git
   version: 0.6.1
 tinyxml2_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros2/tinyxml2_vendor
   tag: release/rolling/tinyxml2_vendor/0.11.3-2
   url: https://github.com/ros2-gbp/tinyxml2_vendor-release.git
   version: 0.11.3
 tinyxml_vendor:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros2/tinyxml_vendor
   tag: release/rolling/tinyxml_vendor/0.10.0-3
   url: https://github.com/ros2-gbp/tinyxml_vendor-release.git
   version: 0.10.0
 tlsf:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/tlsf
   tag: release/rolling/tlsf/0.12.0-1
   url: https://github.com/ros2-gbp/tlsf-release.git
   version: 0.12.0
 tlsf_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rcl
+  - rclcpp
+  - rcpputils
+  - rmw
+  - rmw_implementation_cmake
+  - std_msgs
+  - tlsf
+  repository: https://github.com/ros2/realtime_support
   tag: release/rolling/tlsf_cpp/1.0.1-1
   url: https://github.com/ros2-gbp/realtime_support-release.git
   version: 1.0.1
 topic_monitor:
+  dependencies:
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - example_interfaces
+  - launch
+  - launch_ros
+  - rclpy
+  - std_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/topic_monitor/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 topic_statistics_demo:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - example_interfaces
+  - rclcpp
+  - rcutils
+  - sensor_msgs
+  - statistics_msgs
+  repository: https://github.com/ros2/demos
   tag: release/rolling/topic_statistics_demo/0.38.0-1
   url: https://github.com/ros2-gbp/demos-release.git
   version: 0.38.0
 topic_tools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rclpy
+  - ros2cli
+  - ros2topic
+  - rosidl_default_generators
+  - rosidl_runtime_py
+  - std_msgs
+  - topic_tools_interfaces
+  repository: https://github.com/ros-tooling/topic_tools
   tag: release/rolling/topic_tools/1.6.0-1
   url: https://github.com/ros2-gbp/topic_tools-release.git
   version: 1.6.0
 topic_tools_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-tooling/topic_tools
   tag: release/rolling/topic_tools_interfaces/1.6.0-1
   url: https://github.com/ros2-gbp/topic_tools-release.git
   version: 1.6.0
 toppra:
-  tag: release/rolling/toppra/0.6.9-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_python
+  repository: https://github.com/hungpham2511/toppra
+  tag: release/rolling/toppra/0.6.10-1
   url: https://github.com/ros2-gbp/toppra-release.git
-  version: 0.6.9
+  version: 0.6.10
 torch_conversions:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - launch_testing_ament_cmake
+  - libtorch_vendor
+  - rclcpp
+  - rclcpp_components
+  - rcutils
+  - rmw
+  - rosidl_buffer
+  - std_msgs
+  - tensor_msgs
+  repository: https://github.com/ros2/rosidl_buffer_backends
   tag: release/rolling/torch_conversions/0.1.2-1
   url: https://github.com/ros2-gbp/rosidl_buffer_backends-release.git
   version: 0.1.2
 trac_ik:
+  dependencies:
+  - ament_cmake
+  - trac_ik_kinematics_plugin
+  - trac_ik_lib
+  repository: https://github.com/traclabs/trac_ik
   tag: release/rolling/trac_ik/2.2.0-2
   url: https://github.com/ros2-gbp/trac_ik-release.git
   version: 2.2.0
 trac_ik_kinematics_plugin:
+  dependencies:
+  - ament_cmake
+  - class_loader
+  - generate_parameter_library
+  - moveit_core
+  - pluginlib
+  - rclcpp
+  - tf2_kdl
+  - trac_ik_lib
+  - urdf
+  repository: https://github.com/traclabs/trac_ik
   tag: release/rolling/trac_ik_kinematics_plugin/2.2.0-2
   url: https://github.com/ros2-gbp/trac_ik-release.git
   version: 2.2.0
 trac_ik_lib:
+  dependencies:
+  - ament_cmake
+  - eigen3_cmake_module
+  - geometry_msgs
+  - kdl_parser
+  - rclcpp
+  - urdf
+  repository: https://github.com/traclabs/trac_ik
   tag: release/rolling/trac_ik_lib/2.2.0-2
   url: https://github.com/ros2-gbp/trac_ik-release.git
   version: 2.2.0
 tracetools:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gtest
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/tracetools/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 tracetools_acceleration:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-acceleration/tracetools_acceleration
   tag: release/rolling/tracetools_acceleration/0.4.1-4
   url: https://github.com/ros2-gbp/tracetools_acceleration-release.git
   version: 0.4.1
 tracetools_analysis:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - tracetools_read
+  - tracetools_trace
+  repository: https://github.com/ros-tracing/tracetools_analysis
   tag: release/rolling/tracetools_analysis/3.1.0-2
   url: https://github.com/ros2-gbp/tracetools_analysis-release.git
   version: 3.1.0
 tracetools_image_pipeline:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros-perception/image_pipeline
   tag: release/rolling/tracetools_image_pipeline/8.0.1-1
   url: https://github.com/ros2-gbp/image_pipeline-release.git
   version: 8.0.1
 tracetools_launch:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - tracetools_trace
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/tracetools_launch/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 tracetools_read:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/tracetools_read/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 tracetools_test:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - launch
+  - launch_ros
+  - tracetools_launch
+  - tracetools_read
+  - tracetools_trace
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/tracetools_test/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 tracetools_trace:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_mypy
+  - ament_pep257
+  - ament_xmllint
+  - lttngpy
+  repository: https://github.com/ros2/ros2_tracing
   tag: release/rolling/tracetools_trace/9.0.0-1
   url: https://github.com/ros2-gbp/ros2_tracing-release.git
   version: 9.0.0
 trajectory_msgs:
-  tag: release/rolling/trajectory_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/trajectory_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 transmission_interface:
-  tag: release/rolling/transmission_interface/6.9.0-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gen_version_h
+  - ament_cmake_gmock
+  - hardware_interface
+  - pluginlib
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  repository: https://github.com/ros-controls/ros2_control
+  tag: release/rolling/transmission_interface/6.10.1-1
   url: https://github.com/ros2-gbp/ros2_control-release.git
-  version: 6.9.0
+  version: 6.10.1
 tricycle_controller:
+  dependencies:
+  - ackermann_msgs
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - builtin_interfaces
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - hardware_interface_testing
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - rcpputils
+  - realtime_tools
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  - tf2
+  - tf2_msgs
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/tricycle_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 tricycle_steering_controller:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - backward_ros
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - hardware_interface
+  - hardware_interface_testing
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros2_control_cmake
+  - ros2_control_test_assets
+  - std_srvs
+  - steering_controllers_library
+  repository: https://github.com/ros-controls/ros2_controllers
   tag: release/rolling/tricycle_steering_controller/6.9.0-1
   url: https://github.com/ros2-gbp/ros2_controllers-release.git
   version: 6.9.0
 tsid:
+  dependencies:
+  - ament_cmake
+  - eigenpy
+  - eiquadprog
+  - jrl_cmakemodules
+  - pinocchio
+  repository: https://github.com/stack-of-tasks/tsid
   tag: release/rolling/tsid/1.10.0-1
   url: https://github.com/ros2-gbp/tsid-release.git
   version: 1.10.0
 turbojpeg_compressed_image_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - image_transport
+  repository: https://github.com/wep21/turbojpeg_compressed_image_transport
   tag: release/rolling/turbojpeg_compressed_image_transport/0.3.0-2
   url: https://github.com/ros2-gbp/turbojpeg_compressed_image_transport-release.git
   version: 0.3.0
 turtle_nest:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - tinyxml2_vendor
+  repository: https://github.com/Jannkar/turtle_nest
   tag: release/rolling/turtle_nest/1.2.1-2
   url: https://github.com/ros2-gbp/turtle_nest-release.git
   version: 1.2.1
 turtle_tf2_cpp:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - launch
+  - launch_ros
+  - message_filters
+  - rclcpp
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  - turtlesim_msgs
+  repository: https://github.com/ros/geometry_tutorials
   tag: release/rolling/turtle_tf2_cpp/0.7.0-2
   url: https://github.com/ros2-gbp/geometry_tutorials-release.git
   version: 0.7.0
 turtle_tf2_py:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - geometry_msgs
+  - launch
+  - launch_ros
+  - rclpy
+  - tf2_ros
+  - turtlesim_msgs
+  repository: https://github.com/ros/geometry_tutorials
   tag: release/rolling/turtle_tf2_py/0.7.0-2
   url: https://github.com/ros2-gbp/geometry_tutorials-release.git
   version: 0.7.0
 turtlebot3_applications_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_applications_msgs
   tag: release/rolling/turtlebot3_applications_msgs/1.0.1-2
   url: https://github.com/ros2-gbp/turtlebot3_applications_msgs-release.git
   version: 1.0.1
 turtlebot3_autorace:
+  dependencies:
+  - ament_cmake
+  - turtlebot3_autorace_camera
+  - turtlebot3_autorace_detect
+  - turtlebot3_autorace_mission
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_autorace
   tag: release/rolling/turtlebot3_autorace/1.2.2-2
   url: https://github.com/ros2-gbp/turtlebot3_autorace-release.git
   version: 1.2.2
 turtlebot3_autorace_camera:
+  dependencies:
+  - cv_bridge
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_autorace
   tag: release/rolling/turtlebot3_autorace_camera/1.2.2-2
   url: https://github.com/ros2-gbp/turtlebot3_autorace-release.git
   version: 1.2.2
 turtlebot3_autorace_detect:
+  dependencies:
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_autorace
   tag: release/rolling/turtlebot3_autorace_detect/1.2.2-2
   url: https://github.com/ros2-gbp/turtlebot3_autorace-release.git
   version: 1.2.2
 turtlebot3_autorace_mission:
+  dependencies:
+  - rclpy
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_autorace
   tag: release/rolling/turtlebot3_autorace_mission/1.2.2-2
   url: https://github.com/ros2-gbp/turtlebot3_autorace-release.git
   version: 1.2.2
 turtlebot3_fake_node:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - nav_msgs
+  - rclcpp
+  - robot_state_publisher
+  - sensor_msgs
+  - tf2
+  - tf2_msgs
+  - turtlebot3_msgs
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_simulations
   tag: release/rolling/turtlebot3_fake_node/2.3.7-2
   url: https://github.com/ros2-gbp/turtlebot3_simulations-release.git
   version: 2.3.7
 turtlebot3_gazebo:
+  dependencies:
+  - ament_cmake
+  - geometry_msgs
+  - gz_math_vendor
+  - gz_plugin_vendor
+  - gz_sim_vendor
+  - nav_msgs
+  - rclcpp
+  - ros_gz_bridge
+  - ros_gz_image
+  - ros_gz_sim
+  - sensor_msgs
+  - tf2
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_simulations
   tag: release/rolling/turtlebot3_gazebo/2.3.7-2
   url: https://github.com/ros2-gbp/turtlebot3_simulations-release.git
   version: 2.3.7
 turtlebot3_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_msgs
   tag: release/rolling/turtlebot3_msgs/2.4.0-2
   url: https://github.com/ros2-gbp/turtlebot3_msgs-release.git
   version: 2.4.0
 turtlebot3_simulations:
+  dependencies:
+  - ament_cmake
+  - turtlebot3_fake_node
+  - turtlebot3_gazebo
+  repository: https://github.com/ROBOTIS-GIT/turtlebot3_simulations
   tag: release/rolling/turtlebot3_simulations/2.3.7-2
   url: https://github.com/ros2-gbp/turtlebot3_simulations-release.git
   version: 2.3.7
 turtlesim:
-  tag: release/rolling/turtlesim/1.11.2-1
+  dependencies:
+  - ament_cmake
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_action
+  - std_msgs
+  - std_srvs
+  - turtlesim_msgs
+  repository: https://github.com/ros/ros_tutorials
+  tag: release/rolling/turtlesim/1.11.3-1
   url: https://github.com/ros2-gbp/ros_tutorials-release.git
-  version: 1.11.2
+  version: 1.11.3
 turtlesim_msgs:
-  tag: release/rolling/turtlesim_msgs/1.11.2-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros/ros_tutorials
+  tag: release/rolling/turtlesim_msgs/1.11.3-1
   url: https://github.com/ros2-gbp/ros_tutorials-release.git
-  version: 1.11.2
+  version: 1.11.3
 tuw_airskin_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_airskin_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_geo_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geographic_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_geo_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_geometry:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - gtest_vendor
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_geometry
   tag: release/rolling/tuw_geometry/0.1.4-2
   url: https://github.com/ros2-gbp/tuw_geometry-release.git
   version: 0.1.4
 tuw_geometry_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_geometry_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_graph_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_graph_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - tuw_airskin_msgs
+  - tuw_geometry_msgs
+  - tuw_graph_msgs
+  - tuw_multi_robot_msgs
+  - tuw_nav_msgs
+  - tuw_object_map_msgs
+  - tuw_object_msgs
+  - tuw_std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_multi_robot_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_multi_robot_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_nav_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - nav_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_nav_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_object_map_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geographic_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_object_map_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_object_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - tuw_geo_msgs
+  - tuw_geometry_msgs
+  - tuw_std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_object_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tuw_std_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_cppcheck
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/tuw-robotics/tuw_msgs
   tag: release/rolling/tuw_std_msgs/0.2.6-2
   url: https://github.com/ros2-gbp/tuw_msgs-release.git
   version: 0.2.6
 tvm_vendor:
+  dependencies:
+  - ament_cmake
+  - ros_environment
+  repository: https://github.com/autowarefoundation/tvm_vendor
   tag: release/rolling/tvm_vendor/0.9.1-4
   url: https://github.com/ros2-gbp/tvm_vendor-release.git
   version: 0.9.1
 twist_mux:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_updater
+  - geometry_msgs
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclcpp
+  - std_msgs
+  - twist_mux_msgs
+  - visualization_msgs
+  repository: https://github.com/ros-teleop/twist_mux
   tag: release/rolling/twist_mux/4.5.1-2
   url: https://github.com/ros2-gbp/twist_mux-release.git
   version: 4.5.1
 twist_mux_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/ros-teleop/twist_mux_msgs
   tag: release/rolling/twist_mux_msgs/3.0.1-3
   url: https://github.com/ros2-gbp/twist_mux_msgs-release.git
   version: 3.0.1
 twist_stamper:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - geometry_msgs
+  - rclpy
+  - std_msgs
+  repository: https://github.com/joshnewans/twist_stamper
   tag: release/rolling/twist_stamper/0.0.5-2
   url: https://github.com/ros2-gbp/twist_stamper-release.git
   version: 0.0.5
 type_description_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_core_generators
+  - rosidl_core_runtime
+  - service_msgs
+  repository: https://github.com/ros2/rcl_interfaces
   tag: release/rolling/type_description_interfaces/2.5.1-1
   url: https://github.com/ros2-gbp/rcl_interfaces-release.git
   version: 2.5.1
 ublox:
+  dependencies:
+  - ament_cmake
+  - ublox_gps
+  - ublox_msgs
+  - ublox_serialization
+  repository: https://github.com/KumarRobotics/ublox
   tag: release/rolling/ublox/3.0.0-2
   url: https://github.com/ros2-gbp/ublox-release.git
   version: 3.0.0
 ublox_dgnss:
+  dependencies:
+  - ament_cmake
+  - ntrip_client_node
+  - ublox_dgnss_node
+  - ublox_nav_sat_fix_hp_node
+  - ublox_ubx_interfaces
+  - ublox_ubx_msgs
+  repository: https://github.com/aussierobots/ublox_dgnss
   tag: release/rolling/ublox_dgnss/0.7.6-1
   url: https://github.com/ros2-gbp/ublox_dgnss-release.git
   version: 0.7.6
 ublox_dgnss_node:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_uncrustify
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - rtcm_msgs
+  - std_msgs
+  - ublox_ubx_interfaces
+  - ublox_ubx_msgs
+  repository: https://github.com/aussierobots/ublox_dgnss
   tag: release/rolling/ublox_dgnss_node/0.7.6-1
   url: https://github.com/ros2-gbp/ublox_dgnss-release.git
   version: 0.7.6
 ublox_gps:
+  dependencies:
+  - ament_cmake_ros
+  - diagnostic_msgs
+  - diagnostic_updater
+  - geometry_msgs
+  - nmea_msgs
+  - rcl_interfaces
+  - rclcpp
+  - rclcpp_components
+  - rtcm_msgs
+  - sensor_msgs
+  - std_msgs
+  - tf2
+  - ublox_msgs
+  - ublox_serialization
+  repository: https://github.com/KumarRobotics/ublox
   tag: release/rolling/ublox_gps/3.0.0-2
   url: https://github.com/ros2-gbp/ublox-release.git
   version: 3.0.0
 ublox_msgs:
+  dependencies:
+  - ament_cmake_ros
+  - rosidl_default_generators
+  - sensor_msgs
+  - std_msgs
+  - ublox_serialization
+  repository: https://github.com/KumarRobotics/ublox
   tag: release/rolling/ublox_msgs/3.0.0-2
   url: https://github.com/ros2-gbp/ublox-release.git
   version: 3.0.0
 ublox_nav_sat_fix_hp_node:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_uncrustify
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - std_msgs
+  - ublox_ubx_interfaces
+  - ublox_ubx_msgs
+  repository: https://github.com/aussierobots/ublox_dgnss
   tag: release/rolling/ublox_nav_sat_fix_hp_node/0.7.6-1
   url: https://github.com/ros2-gbp/ublox_dgnss-release.git
   version: 0.7.6
 ublox_serialization:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/KumarRobotics/ublox
   tag: release/rolling/ublox_serialization/3.0.0-2
   url: https://github.com/ros2-gbp/ublox-release.git
   version: 3.0.0
 ublox_ubx_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  repository: https://github.com/aussierobots/ublox_dgnss
   tag: release/rolling/ublox_ubx_interfaces/0.7.6-1
   url: https://github.com/ros2-gbp/ublox_dgnss-release.git
   version: 0.7.6
 ublox_ubx_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - std_msgs
+  repository: https://github.com/aussierobots/ublox_dgnss
   tag: release/rolling/ublox_ubx_msgs/0.7.6-1
   url: https://github.com/ros2-gbp/ublox_dgnss-release.git
   version: 0.7.6
 udp_driver:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - asio_cmake_module
+  - io_context
+  - lifecycle_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - std_msgs
+  - udp_msgs
+  repository: https://github.com/ros-drivers/transport_drivers
   tag: release/rolling/udp_driver/1.2.0-4
   url: https://github.com/ros2-gbp/transport_drivers-release.git
   version: 1.2.0
 udp_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/flynneva/udp_msgs
   tag: release/rolling/udp_msgs/0.0.5-2
   url: https://github.com/ros2-gbp/udp_msgs-release.git
   version: 0.0.5
 unbag:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_python
+  - ament_lint_auto
+  - ament_lint_common
+  - rclpy
+  - ros2cli
+  - rosbag2_py
+  - rosidl_runtime_py
+  - sensor_msgs
+  - tf2_msgs
+  repository: https://github.com/ika-rwth-aachen/ros2_unbag
   tag: release/rolling/unbag/1.3.1-2
   url: https://github.com/ros2-gbp/unbag-release.git
   version: 1.3.1
 uncrustify_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ament/uncrustify_vendor
   tag: release/rolling/uncrustify_vendor/3.3.0-1
   url: https://github.com/ros2-gbp/uncrustify_vendor-release.git
   version: 3.3.0
 unique_identifier_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_core_generators
+  - rosidl_core_runtime
+  repository: https://github.com/ros2/unique_identifier_msgs
   tag: release/rolling/unique_identifier_msgs/2.9.0-1
   url: https://github.com/ros2-gbp/unique_identifier_msgs-release.git
   version: 2.9.0
 ur:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ur_calibration
+  - ur_controllers
+  - ur_dashboard_msgs
+  - ur_moveit_config
+  - ur_robot_driver
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
   tag: release/rolling/ur/7.0.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_ROS2_Driver-release.git
   version: 7.0.0
 ur10_inverse_dynamics_solver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - inverse_dynamics_solver
+  - pluginlib
+  - rclcpp
+  - ros_testing
+  - rosbag2_cpp
+  - rosbag2_storage
+  - rosbag2_storage_default_plugins
+  - trajectory_msgs
+  - ur_description
+  repository: https://github.com/unisa-acg/inverse-dynamics-solver
   tag: release/rolling/ur10_inverse_dynamics_solver/6.0.1-4
   url: https://github.com/ros2-gbp/inverse_dynamics_solver-release.git
   version: 6.0.1
 ur_calibration:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gmock
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - ur_client_library
+  - ur_robot_driver
+  - yaml_cpp_vendor
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
   tag: release/rolling/ur_calibration/7.0.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_ROS2_Driver-release.git
   version: 7.0.0
 ur_client_library:
-  tag: release/rolling/ur_client_library/2.14.1-1
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/UniversalRobots/Universal_Robots_Client_Library
+  tag: release/rolling/ur_client_library/2.15.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_Client_Library-release.git
-  version: 2.14.1
+  version: 2.15.0
 ur_controllers:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - angles
+  - control_msgs
+  - controller_interface
+  - controller_manager
+  - generate_parameter_library
+  - geometry_msgs
+  - hardware_interface
+  - joint_trajectory_controller
+  - lifecycle_msgs
+  - pluginlib
+  - rclcpp_lifecycle
+  - rcutils
+  - realtime_tools
+  - ros2_control_test_assets
+  - std_msgs
+  - std_srvs
+  - tf2_geometry_msgs
+  - tf2_ros
+  - trajectory_msgs
+  - ur_dashboard_msgs
+  - ur_msgs
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
   tag: release/rolling/ur_controllers/7.0.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_ROS2_Driver-release.git
   version: 7.0.0
 ur_dashboard_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
   tag: release/rolling/ur_dashboard_msgs/7.0.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_ROS2_Driver-release.git
   version: 7.0.0
 ur_description:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - joint_state_publisher_gui
+  - launch
+  - launch_ros
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - robot_state_publisher
+  - rviz2
+  - urdf
+  - xacro
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Description
   tag: release/rolling/ur_description/4.3.1-1
   url: https://github.com/ros2-gbp/ur_description-release.git
   version: 4.3.1
 ur_moveit_config:
+  dependencies:
+  - ament_cmake
+  - moveit_configs_utils
+  - moveit_kinematics
+  - moveit_planners
+  - moveit_planners_chomp
+  - moveit_ros_move_group
+  - moveit_ros_visualization
+  - moveit_servo
+  - moveit_simple_controller_manager
+  - ur_description
+  - warehouse_ros_sqlite
+  - xacro
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
   tag: release/rolling/ur_moveit_config/7.0.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_ROS2_Driver-release.git
   version: 7.0.0
 ur_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - control_msgs
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - trajectory_msgs
+  repository: https://github.com/ros-industrial/ur_msgs
   tag: release/rolling/ur_msgs/3.0.0-1
   url: https://github.com/ros2-gbp/ur_msgs-release.git
   version: 3.0.0
 ur_robot_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - backward_ros
+  - control_msgs
+  - controller_manager
+  - controller_manager_msgs
+  - force_torque_sensor_broadcaster
+  - forward_command_controller
+  - geometry_msgs
+  - hardware_interface
+  - joint_state_broadcaster
+  - joint_state_publisher
+  - joint_trajectory_controller
+  - launch
+  - launch_ros
+  - launch_testing_ament_cmake
+  - motion_primitives_controllers
+  - pluginlib
+  - pose_broadcaster
+  - rclcpp
+  - rclcpp_lifecycle
+  - rclpy
+  - robot_state_publisher
+  - ros2_controllers_test_nodes
+  - ros2run
+  - rviz2
+  - std_msgs
+  - std_srvs
+  - tf2_geometry_msgs
+  - ur_client_library
+  - ur_controllers
+  - ur_dashboard_msgs
+  - ur_description
+  - ur_msgs
+  - urdf
+  - xacro
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
   tag: release/rolling/ur_robot_driver/7.0.0-1
   url: https://github.com/ros2-gbp/Universal_Robots_ROS2_Driver-release.git
   version: 7.0.0
 ur_simulation_gz:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - gz_ros2_control
+  - joint_state_publisher
+  - launch
+  - launch_ros
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - ros_gz_bridge
+  - ros_gz_sim
+  - rviz2
+  - ur_controllers
+  - ur_description
+  - ur_moveit_config
+  - urdf
+  - xacro
+  repository: https://github.com/UniversalRobots/Universal_Robots_ROS2_GZ_Simulation
   tag: release/rolling/ur_simulation_gz/2.5.0-2
   url: https://github.com/ros2-gbp/ur_simulation_gz-release.git
   version: 2.5.0
 urdf:
+  dependencies:
+  - ament_cmake_google_benchmark
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rcutils
+  - urdf_parser_plugin
+  - urdfdom
+  - urdfdom_headers
+  repository: https://github.com/ros2/urdf
   tag: release/rolling/urdf/2.14.0-1
   url: https://github.com/ros2-gbp/urdf-release.git
   version: 2.14.0
 urdf_launch:
+  dependencies:
+  - ament_cmake
+  - joint_state_publisher
+  - joint_state_publisher_gui
+  - launch_ros
+  - robot_state_publisher
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - xacro
+  repository: https://github.com/ros/urdf_launch
   tag: release/rolling/urdf_launch/0.1.2-2
   url: https://github.com/ros2-gbp/urdf_launch-release.git
   version: 0.1.2
 urdf_parser_plugin:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - urdfdom_headers
+  repository: https://github.com/ros2/urdf
   tag: release/rolling/urdf_parser_plugin/2.14.0-1
   url: https://github.com/ros2-gbp/urdf-release.git
   version: 2.14.0
 urdf_test:
-  tag: release/rolling/urdf_test/2.1.2-1
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_pytest
+  - ament_lint_auto
+  - ament_lint_common
+  - launch
+  - rclpy
+  - urdfdom
+  - xacro
+  repository: https://github.com/pal-robotics/urdf_test
+  tag: release/rolling/urdf_test/2.1.3-1
   url: https://github.com/ros2-gbp/urdf_test-release.git
-  version: 2.1.2
+  version: 2.1.3
 urdf_tutorial:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - urdf_launch
+  repository: https://github.com/ros/urdf_tutorial
   tag: release/rolling/urdf_tutorial/1.1.0-3
   url: https://github.com/ros2-gbp/urdf_tutorial-release.git
   version: 1.1.0
 urdfdom:
+  dependencies:
+  - console_bridge_vendor
+  - urdfdom_headers
+  repository: https://github.com/ros/urdfdom
   tag: release/rolling/urdfdom/6.0.1-1
   url: https://github.com/ros2-gbp/urdfdom-release.git
   version: 6.0.1
 urdfdom_headers:
+  dependencies: []
+  repository: https://github.com/ros/urdfdom_headers
   tag: release/rolling/urdfdom_headers/3.0.1-1
   url: https://github.com/ros2-gbp/urdfdom_headers-release.git
   version: 3.0.1
 urdfdom_py:
+  dependencies:
+  - rclpy
+  repository: https://github.com/ros/urdf_parser_py
   tag: release/rolling/urdfdom_py/1.2.1-3
   url: https://github.com/ros2-gbp/urdfdom_py-release.git
   version: 1.2.1
 urg_c:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/ros-drivers/urg_c
   tag: release/rolling/urg_c/1.0.4001-6
   url: https://github.com/ros2-gbp/urg_c-release.git
   version: 1.0.4001
 urg_node:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - diagnostic_updater
+  - laser_proc
+  - rclcpp
+  - rclcpp_components
+  - rosidl_default_generators
+  - sensor_msgs
+  - std_srvs
+  - urdf
+  - urg_c
+  - urg_node_msgs
+  repository: https://github.com/ros-drivers/urg_node
   tag: release/rolling/urg_node/1.2.0-2
   url: https://github.com/ros2-gbp/urg_node-release.git
   version: 1.2.0
 urg_node_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - std_msgs
+  repository: https://github.com/ros-drivers/urg_node_msgs
   tag: release/rolling/urg_node_msgs/1.0.1-9
   url: https://github.com/ros2-gbp/urg_node_msgs-release.git
   version: 1.0.1
 usb_cam:
+  dependencies:
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - camera_info_manager
+  - cv_bridge
+  - image_transport
+  - image_transport_plugins
+  - rclcpp
+  - rclcpp_components
+  - ros_environment
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  repository: https://github.com/ros-drivers/usb_cam
   tag: release/rolling/usb_cam/0.8.1-2
   url: https://github.com/ros2-gbp/usb_cam-release.git
   version: 0.8.1
 v4l2_camera:
+  dependencies:
+  - ament_cmake_clang_format
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - camera_info_manager
+  - cv_bridge
+  - image_transport
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://gitlab.com/boldhearts/ros2_v4l2_camera
   tag: release/rolling/v4l2_camera/0.8.1-1
   url: https://github.com/ros2-gbp/ros2_v4l2_camera-release.git
   version: 0.8.1
 velodyne:
+  dependencies:
+  - ament_cmake
+  - velodyne_driver
+  - velodyne_laserscan
+  - velodyne_msgs
+  - velodyne_pointcloud
+  repository: https://github.com/ros-drivers/velodyne
   tag: release/rolling/velodyne/2.5.1-2
   url: https://github.com/ros2-gbp/velodyne-release.git
   version: 2.5.1
 velodyne_driver:
+  dependencies:
+  - ament_cmake_gtest
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - diagnostic_updater
+  - rclcpp
+  - rclcpp_components
+  - tf2_ros
+  - velodyne_msgs
+  repository: https://github.com/ros-drivers/velodyne
   tag: release/rolling/velodyne_driver/2.5.1-2
   url: https://github.com/ros2-gbp/velodyne-release.git
   version: 2.5.1
 velodyne_laserscan:
+  dependencies:
+  - ament_cmake_ros
+  - ament_lint_auto
+  - ament_lint_common
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  repository: https://github.com/ros-drivers/velodyne
   tag: release/rolling/velodyne_laserscan/2.5.1-2
   url: https://github.com/ros2-gbp/velodyne-release.git
   version: 2.5.1
 velodyne_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/velodyne
   tag: release/rolling/velodyne_msgs/2.5.1-2
   url: https://github.com/ros2-gbp/velodyne-release.git
   version: 2.5.1
 velodyne_pointcloud:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_index_cpp
+  - ament_lint_auto
+  - ament_lint_common
+  - angles
+  - diagnostic_updater
+  - geometry_msgs
+  - message_filters
+  - rclcpp
+  - rclcpp_components
+  - sensor_msgs
+  - tf2
+  - tf2_ros
+  - velodyne_msgs
+  repository: https://github.com/ros-drivers/velodyne
   tag: release/rolling/velodyne_pointcloud/2.5.1-2
   url: https://github.com/ros2-gbp/velodyne-release.git
   version: 2.5.1
 video_to_image_msg_publisher:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - rclcpp
+  - sensor_msgs
+  repository: https://github.com/gstavrinos/video_to_image_msg_publisher
   tag: release/rolling/video_to_image_msg_publisher/0.9.5-2
   url: https://github.com/ros2-gbp/video_to_image_msg_publisher-release.git
   version: 0.9.5
 vision_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-perception/vision_msgs
   tag: release/rolling/vision_msgs/4.2.0-2
   url: https://github.com/ros2-gbp/vision_msgs-release.git
   version: 4.2.0
 vision_msgs_rviz_plugins:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - rclcpp
+  - rclpy
+  - rviz2
+  - rviz_common
+  - rviz_default_plugins
+  - rviz_rendering
+  - vision_msgs
+  - yaml_cpp_vendor
+  repository: https://github.com/ros-perception/vision_msgs
   tag: release/rolling/vision_msgs_rviz_plugins/4.2.0-2
   url: https://github.com/ros2-gbp/vision_msgs-release.git
   version: 4.2.0
 vision_opencv:
+  dependencies:
+  - ament_cmake
+  - cv_bridge
+  - image_geometry
+  repository: https://github.com/ros-perception/vision_opencv
   tag: release/rolling/vision_opencv/4.1.0-2
   url: https://github.com/ros2-gbp/vision_opencv-release.git
   version: 4.1.0
 visp:
+  dependencies: []
+  repository: https://github.com/lagadic/visp
   tag: release/rolling/visp/3.7.0-7
   url: https://github.com/ros2-gbp/visp-release.git
   version: 3.7.0
 visualization_msgs:
-  tag: release/rolling/visualization_msgs/5.10.1-1
+  dependencies:
+  - ament_cmake
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - sensor_msgs
+  - std_msgs
+  repository: https://github.com/ros2/common_interfaces
+  tag: release/rolling/visualization_msgs/5.10.2-1
   url: https://github.com/ros2-gbp/common_interfaces-release.git
-  version: 5.10.1
+  version: 5.10.2
 vitis_common:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - ament_vitis
+  repository: https://github.com/ros-acceleration/vitis_common
   tag: release/rolling/vitis_common/0.4.2-4
   url: https://github.com/ros2-gbp/vitis_common-release.git
   version: 0.4.2
 vrpn:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/vrpn/vrpn
   tag: release/rolling/vrpn/7.35.0-21
   url: https://github.com/ros2-gbp/vrpn-release.git
   version: 7.35.0
 vrpn_mocap:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - eigen3_cmake_module
+  - geometry_msgs
+  - rclcpp
+  - std_msgs
+  - tf2
+  - vrpn
+  repository: https://github.com/alvinsunyixiao/vrpn_mocap
   tag: release/rolling/vrpn_mocap/1.1.0-4
   url: https://github.com/ros2-gbp/vrpn_mocap-release.git
   version: 1.1.0
 warehouse_ros:
-  tag: release/rolling/warehouse_ros/2.0.8-1
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_lint_auto
+  - geometry_msgs
+  - pluginlib
+  - rclcpp
+  - std_msgs
+  - tf2
+  - tf2_geometry_msgs
+  - tf2_ros
+  repository: https://github.com/ros-planning/warehouse_ros
+  tag: release/rolling/warehouse_ros/2.0.9-1
   url: https://github.com/ros2-gbp/warehouse_ros-release.git
-  version: 2.0.8
+  version: 2.0.9
 warehouse_ros_sqlite:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_copyright
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - class_loader
+  - geometry_msgs
+  - rclcpp
+  - warehouse_ros
+  repository: https://github.com/ros-planning/warehouse_ros_sqlite
   tag: release/rolling/warehouse_ros_sqlite/1.0.9-1
   url: https://github.com/ros2-gbp/warehouse_ros_sqlite-release.git
   version: 1.0.9
 web_video_server:
+  dependencies:
+  - ament_cmake_clang_tidy
+  - ament_cmake_copyright
+  - ament_cmake_lint_cmake
+  - ament_cmake_ros
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - async_web_server_cpp
+  - cv_bridge
+  - image_transport
+  - pluginlib
+  - rclcpp
+  - rclcpp_components
+  - rmw
+  - ros_environment
+  - sensor_msgs
+  repository: https://github.com/RobotWebTools/web_video_server
   tag: release/rolling/web_video_server/3.1.1-1
   url: https://github.com/ros2-gbp/web_video_server-release.git
   version: 3.1.1
 webots_ros2:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - rclpy
+  - std_msgs
+  - webots_ros2_control
+  - webots_ros2_crazyflie
+  - webots_ros2_driver
+  - webots_ros2_epuck
+  - webots_ros2_husarion
+  - webots_ros2_importer
+  - webots_ros2_mavic
+  - webots_ros2_msgs
+  - webots_ros2_tesla
+  - webots_ros2_tests
+  - webots_ros2_tiago
+  - webots_ros2_turtlebot
+  - webots_ros2_universal_robot
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_control:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - controller_manager
+  - hardware_interface
+  - pluginlib
+  - rclcpp
+  - rclcpp_lifecycle
+  - ros_environment
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_control/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_crazyflie:
+  dependencies:
+  - ament_copyright
+  - ament_flake8
+  - ament_pep257
+  - builtin_interfaces
+  - rclpy
+  - tf_transformations
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_crazyflie/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_driver:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - pluginlib
+  - python_cmake_module
+  - rclcpp
+  - rclpy
+  - ros_environment
+  - sensor_msgs
+  - std_msgs
+  - tf2_geometry_msgs
+  - tf2_ros
+  - tinyxml2_vendor
+  - vision_msgs
+  - webots_ros2_importer
+  - webots_ros2_msgs
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_driver/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_epuck:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - controller_manager
+  - diff_drive_controller
+  - geometry_msgs
+  - joint_state_broadcaster
+  - nav_msgs
+  - rclpy
+  - robot_state_publisher
+  - rviz2
+  - sensor_msgs
+  - std_msgs
+  - tf2_ros
+  - webots_ros2_control
+  - webots_ros2_driver
+  - webots_ros2_msgs
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_epuck/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_husarion:
+  dependencies:
+  - controller_manager
+  - diff_drive_controller
+  - joint_state_broadcaster
+  - laser_filters
+  - robot_localization
+  - robot_state_publisher
+  - webots_ros2_control
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_husarion/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_importer:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - xacro
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_importer/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_mavic:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - rclpy
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_mavic/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  - vision_msgs
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_msgs/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_tesla:
+  dependencies:
+  - ackermann_msgs
+  - ament_copyright
+  - builtin_interfaces
+  - rclpy
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_tesla/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_tests:
+  dependencies:
+  - ament_copyright
+  - geometry_msgs
+  - launch
+  - launch_testing
+  - launch_testing_ament_cmake
+  - launch_testing_ros
+  - rclpy
+  - ros2bag
+  - rosbag2_storage_default_plugins
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - tf2_ros
+  - webots_ros2_driver
+  - webots_ros2_epuck
+  - webots_ros2_husarion
+  - webots_ros2_mavic
+  - webots_ros2_tesla
+  - webots_ros2_tiago
+  - webots_ros2_turtlebot
+  - webots_ros2_universal_robot
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_tests/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_tiago:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - controller_manager
+  - diff_drive_controller
+  - geometry_msgs
+  - joint_state_broadcaster
+  - rclpy
+  - robot_state_publisher
+  - rviz2
+  - tf2_ros
+  - webots_ros2_control
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_tiago/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_turtlebot:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - controller_manager
+  - diff_drive_controller
+  - joint_state_broadcaster
+  - rclpy
+  - robot_state_publisher
+  - rviz2
+  - tf2_ros
+  - webots_ros2_control
+  - webots_ros2_driver
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_turtlebot/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 webots_ros2_universal_robot:
+  dependencies:
+  - ament_copyright
+  - builtin_interfaces
+  - control_msgs
+  - controller_manager
+  - joint_state_broadcaster
+  - joint_trajectory_controller
+  - rclpy
+  - robot_state_publisher
+  - rviz2
+  - trajectory_msgs
+  - webots_ros2_control
+  - webots_ros2_driver
+  - xacro
+  repository: https://github.com/cyberbotics/webots_ros2
   tag: release/rolling/webots_ros2_universal_robot/2025.0.1-2
   url: https://github.com/ros2-gbp/webots_ros2-release.git
   version: 2025.0.1
 wiimote:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_gtest
+  - ament_lint_auto
+  - ament_lint_common
+  - geometry_msgs
+  - rclcpp
+  - rclcpp_components
+  - rclcpp_lifecycle
+  - sensor_msgs
+  - std_msgs
+  - std_srvs
+  - wiimote_msgs
+  repository: https://github.com/ros-drivers/joystick_drivers
   tag: release/rolling/wiimote/3.3.0-3
   url: https://github.com/ros2-gbp/joystick_drivers-release.git
   version: 3.3.0
 wiimote_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_lint_auto
+  - ament_lint_common
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - std_msgs
+  repository: https://github.com/ros-drivers/joystick_drivers
   tag: release/rolling/wiimote_msgs/3.3.0-3
   url: https://github.com/ros2-gbp/joystick_drivers-release.git
   version: 3.3.0
 xacro:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_python
+  - ament_lint_auto
+  repository: https://github.com/ros/xacro
   tag: release/rolling/xacro/2.1.1-2
   url: https://github.com/ros2-gbp/xacro-release.git
   version: 2.1.1
 yaml_cpp_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ros2/yaml_cpp_vendor
   tag: release/rolling/yaml_cpp_vendor/9.3.0-1
   url: https://github.com/ros2-gbp/yaml_cpp_vendor-release.git
   version: 9.3.0
 yasmin:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_cli:
+  dependencies:
+  - ament_index_python
+  - rclpy
+  - ros2cli
+  - yasmin
+  - yasmin_editor
+  - yasmin_factory
+  - yasmin_plugins_manager
+  - yasmin_viewer
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_cli/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_demos:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_index_cpp
+  - example_interfaces
+  - geometry_msgs
+  - nav_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclpy
+  - ros_environment
+  - yasmin
+  - yasmin_factory
+  - yasmin_ros
+  - yasmin_viewer
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_demos/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_editor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - rclpy
+  - ros_environment
+  - yasmin
+  - yasmin_factory
+  - yasmin_plugins_manager
+  - yasmin_ros
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_editor/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_factory:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - ament_index_cpp
+  - ament_index_python
+  - class_loader
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclpy
+  - tinyxml2_vendor
+  - yasmin
+  - yasmin_msgs
+  - yasmin_ros
+  - yasmin_viewer
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_factory/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_msgs:
+  dependencies:
+  - action_msgs
+  - ament_cmake
+  - rosidl_default_generators
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_msgs/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_pcl:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - pcl_conversions
+  - pluginlib
+  - sensor_msgs
+  - yasmin
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_pcl/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_plugins_manager:
+  dependencies:
+  - ament_index_python
+  - rclpy
+  - yasmin
+  - yasmin_factory
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_plugins_manager/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_ros:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_gtest
+  - ament_cmake_pytest
+  - ament_cmake_python
+  - example_interfaces
+  - geometry_msgs
+  - pluginlib
+  - rclcpp
+  - rclcpp_action
+  - rclpy
+  - ros_environment
+  - rosidl_runtime_py
+  - std_msgs
+  - std_srvs
+  - tf2
+  - tf2_msgs
+  - tf2_py
+  - tf2_ros
+  - tf2_ros_py
+  - yasmin
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_ros/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 yasmin_viewer:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_python
+  - ament_index_cpp
+  - rclcpp
+  - rclpy
+  - yasmin
+  - yasmin_msgs
+  - yasmin_ros
+  repository: https://github.com/uleroboticsgroup/yasmin
   tag: release/rolling/yasmin_viewer/6.1.1-1
   url: https://github.com/ros2-gbp/yasmin-release.git
   version: 6.1.1
 zbar_ros:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - cv_bridge
+  - rclcpp
+  - sensor_msgs
+  - std_msgs
+  - zbar_ros_interfaces
+  repository: https://github.com/ros-drivers/zbar_ros
   tag: release/rolling/zbar_ros/0.7.0-2
   url: https://github.com/ros2-gbp/zbar_ros-release.git
   version: 0.7.0
 zbar_ros_interfaces:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - vision_msgs
+  repository: https://github.com/ros-drivers/zbar_ros
   tag: release/rolling/zbar_ros_interfaces/0.7.0-2
   url: https://github.com/ros2-gbp/zbar_ros-release.git
   version: 0.7.0
 zed_description:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - rviz2
+  - xacro
+  repository: https://github.com/stereolabs/zed-ros2-description
   tag: release/rolling/zed_description/0.1.5-1
   url: https://github.com/ros2-gbp/zed-ros2-description-release.git
   version: 0.1.5
 zed_msgs:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_auto
+  - ament_cmake_copyright
+  - ament_cmake_cppcheck
+  - ament_cmake_lint_cmake
+  - ament_cmake_pep257
+  - ament_cmake_uncrustify
+  - ament_cmake_xmllint
+  - ament_lint_auto
+  - builtin_interfaces
+  - geometry_msgs
+  - rosidl_default_generators
+  - rosidl_default_runtime
+  - shape_msgs
+  - std_msgs
+  repository: https://github.com/stereolabs/zed-ros2-interfaces
   tag: release/rolling/zed_msgs/5.3.0-2
   url: https://github.com/ros2-gbp/zed-ros2-interfaces-release.git
   version: 5.3.0
 zenoh_bridge_dds:
+  dependencies:
+  - ament_cmake
+  repository: https://github.com/eclipse-zenoh/zenoh-plugin-dds
   tag: release/rolling/zenoh_bridge_dds/0.5.0-5
   url: https://github.com/ros2-gbp/zenoh_bridge_dds-release.git
   version: 0.5.0
 zenoh_cpp_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_cmake_vendor_package
+  repository: https://github.com/ros2/rmw_zenoh
   tag: release/rolling/zenoh_cpp_vendor/0.12.0-1
   url: https://github.com/ros2-gbp/rmw_zenoh-release.git
   version: 0.12.0
 zenoh_security_tools:
+  dependencies:
+  - ament_cmake_ros_core
+  - ament_lint_auto
+  - ament_lint_common
+  - rcpputils
+  - rcutils
+  - rmw_security_common
+  - zenoh_cpp_vendor
+  repository: https://github.com/ros2/rmw_zenoh
   tag: release/rolling/zenoh_security_tools/0.12.0-1
   url: https://github.com/ros2-gbp/rmw_zenoh-release.git
   version: 0.12.0
 zlib_point_cloud_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - point_cloud_interfaces
+  - point_cloud_transport
+  - rclcpp
+  repository: https://github.com/ros-perception/point_cloud_transport_plugins
   tag: release/rolling/zlib_point_cloud_transport/7.0.0-1
   url: https://github.com/ros2-gbp/point_cloud_transport_plugins-release.git
   version: 7.0.0
 zmqpp_vendor:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/autowarefoundation/zmqpp_vendor
   tag: release/rolling/zmqpp_vendor/0.0.2-4
   url: https://github.com/ros2-gbp/zmqpp_vendor-release.git
   version: 0.0.2
 zstd_cmake_module:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  repository: https://github.com/ros2/rosbag2
   tag: release/rolling/zstd_cmake_module/0.34.0-1
   url: https://github.com/ros2-gbp/rosbag2-release.git
   version: 0.34.0
 zstd_image_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - image_transport
+  repository: https://github.com/ros-perception/image_transport_plugins
   tag: release/rolling/zstd_image_transport/7.0.1-1
   url: https://github.com/ros2-gbp/image_transport_plugins-release.git
   version: 7.0.1
 zstd_point_cloud_transport:
+  dependencies:
+  - ament_cmake
+  - ament_lint_auto
+  - ament_lint_common
+  - pluginlib
+  - point_cloud_interfaces
+  - point_cloud_transport
+  - rclcpp
+  - zstd_cmake_module
+  repository: https://github.com/ros-perception/point_cloud_transport_plugins
   tag: release/rolling/zstd_point_cloud_transport/7.0.0-1
   url: https://github.com/ros2-gbp/point_cloud_transport_plugins-release.git
   version: 7.0.0
diff --git a/scratch_test_recipes/xeus-python-stockdeps/build.sh b/scratch_test_recipes/xeus-python-stockdeps/build.sh
new file mode 100644
index 000000000..72c5d6d69
--- /dev/null
+++ b/scratch_test_recipes/xeus-python-stockdeps/build.sh
@@ -0,0 +1,73 @@
+mkdir build
+cd build
+
+# Upstream's build.sh deletes $PREFIX/bin/python* here ("remove all the
+# fake pythons") -- but that's the crossenv shim cross-python_'s
+# activation script (etc/conda/activate.d/activate_z-cross-python_*.sh,
+# named to run last) just created, and *every* emsdk python-wrapper script
+# (emcc/em++/emcmake/...) honors a generic $PYTHON env var that activation
+# also exports pointing straight at this same file -- deleting it breaks
+# any later emcc/em++/emcmake invocation with "$PREFIX/bin/python: No such
+# file or directory". Our own explicit -DPYTHON_EXECUTABLE=... hints below
+# already tell CMake which python to use for pybind11 detection, so this
+# deletion isn't needed; skip it.
+
+# cross-python_'s activation sets LDFLAGS=$EM_FORGE_SIDE_MODULE_LDFLAGS
+# (i.e. ...-s SIDE_MODULE=1), assuming (correctly, for the overwhelming
+# majority of python-embedding emscripten-forge recipes) that we're building
+# a Python C-extension .so. xeus-python instead links one real executable
+# (xpython, add_executable + -sMAIN_MODULE=1) -- CMake picks up the LDFLAGS
+# env var automatically for every target's link line, so that stray
+# SIDE_MODULE=1 rides along into xpython's own link command too. Harmless
+# on its own (MAIN_MODULE apparently wins silently), but Emscripten's
+# Asyncify support explicitly asserts `not settings.SIDE_MODULE` during
+# linker setup -- fails outright once -sASYNCIFY is added (see recipe.yaml's
+# top comment) unless this is cleared first.
+export LDFLAGS="$EM_FORGE_LDFLAGS_BASE"
+
+# The emscripten-forge toolchain's own activation script sets
+# EMCC_CFLAGS="... -fwasm-exceptions" globally, so every em++/emcc
+# invocation gets native wasm exception-handling by default -- including
+# the xeus-python-wasm static library's own compile steps (its CMakeLists.txt
+# target doesn't call xeus_wasm_compile_options, which is patched
+# per-target for xpython itself; see patches/0001-...). Binaryen's Asyncify
+# pass hard-crashes on wasm EH instructions, and there's no
+# -fno-wasm-exceptions counter-flag emcc honors -- same fix as vinca's
+# build_ament_cmake.sh.in applies project-wide.
+export EMCC_CFLAGS="${EM_FORGE_CFLAGS_BASE:-}"
+
+export CMAKE_PREFIX_PATH=$PREFIX
+export CMAKE_SYSTEM_PREFIX_PATH=$PREFIX
+
+if [[ $target_platform == "emscripten-wasm32" ]]; then
+    export USE_WASM=ON
+else
+    export USE_WASM=OFF
+fi
+
+# Cross-compiling: pybind11Config.cmake's find_package(PythonInterp/Libs)
+# otherwise picks up $BUILD_PREFIX/bin/python (the native build-platform
+# python), not the wasm32-target-shaped one cross-python_ provides
+# under the same name -- see recipe.yaml's requirements.build comment.
+if [[ "${CONDA_BUILD_CROSS_COMPILATION:-}" == "1" ]]; then
+  PYTHON_EXECUTABLE_HINTS="-DPYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python -DPython_EXECUTABLE=$BUILD_PREFIX/bin/python -DPython3_EXECUTABLE=$BUILD_PREFIX/bin/python"
+else
+  PYTHON_EXECUTABLE_HINTS=""
+fi
+
+# Configure step
+cmake ${CMAKE_ARGS} ..                                \
+    -GNinja                                           \
+    -DCMAKE_BUILD_TYPE=Release                        \
+    -DCMAKE_PREFIX_PATH=$PREFIX                       \
+    -DCMAKE_INSTALL_PREFIX=$PREFIX                    \
+    -DXPYT_EMSCRIPTEN_WASM_BUILD=$USE_WASM            \
+    ${PYTHON_EXECUTABLE_HINTS}
+
+# Build step
+ninja
+
+ninja install
+
+# remove raw-kernel
+rm -rf $PREFIX/share/jupyter/kernels/xpython-raw/
diff --git a/scratch_test_recipes/xeus-python-stockdeps/recipe.yaml b/scratch_test_recipes/xeus-python-stockdeps/recipe.yaml
new file mode 100644
index 000000000..6a64f2020
--- /dev/null
+++ b/scratch_test_recipes/xeus-python-stockdeps/recipe.yaml
@@ -0,0 +1,101 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json
+#
+# Hand-written (not vinca-generated): not a ROS package, no package.xml.
+# Lives under extra_recipes/ to survive `rm -rf recipes` regeneration;
+# copied into ./recipes/ by pixi.toml's build-emscripten task.
+#
+# Identical to emscripten-forge/recipes' own xeus-python recipe (recipes/
+# recipes_emscripten/xeus-python/, version 0.19.0 build 3 as of this
+# writing) except for one patch: rclpy's own compiled extension
+# (_rclpy_pybind11...so) is built as an Emscripten SIDE_MODULE with
+# -sASYNCIFY (needed for rmw_wait's cooperative-polling fix -- see
+# ros-rolling-emscripten-zenoh's vinca fork). dlopen()'ing it into a plain
+# xpython.wasm MAIN_MODULE (stock emscripten-forge-4x build, no Asyncify)
+# fails at link time:
+#   LinkError: ... Import #71 "env" "__asyncify_state": imported mutable
+#   global must be a WebAssembly.Global object
+# because Asyncify's dynamic-linking support needs a shared
+# __asyncify_state global that only exists when the MAIN_MODULE hosting
+# it also has ASYNCIFY enabled. Confirmed via a live JupyterLite
+# `import rclpy` traceback, 2026-09-12. Patched below to add -sASYNCIFY
+# (and a matching ASYNCIFY_STACK_SIZE) to xpython's own link step --
+# xpython's own code never needs to actually yield/unwind itself, so no
+# ASYNCIFY_IMPORTS entries are added here, only the scaffolding a side
+# module needs. The patch also strips xeus's own hardcoded
+# -fwasm-exceptions from xpython's compile/link flags (WasmBuildOptions.cmake,
+# Emscripten >=4.0.0 branch): Binaryen's Asyncify pass hard-crashes on wasm
+# native exception-handling instructions ("UNREACHABLE executed ...
+# Asyncify.cpp"), same class of bug already fixed project-wide for every
+# ROS package via vinca's EMCC_CFLAGS override -- replaced with the older
+# JS-based -fexceptions mechanism, which Asyncify does handle.
+
+context:
+  version: 0.19.0
+
+package:
+  name: xeus-python-stockdeps-test
+  version: ${{ version }}
+
+source:
+  url: https://github.com/jupyter-xeus/xeus-python/archive/refs/tags/${{ version }}.tar.gz
+  sha256: 9f85288bbfea0b9087bab57c1d8d827ed0bf0323e63b94af507990c7040cad01
+
+build:
+  script: build.sh
+  # Bump whenever content changes without a version bump, to avoid
+  # rattler-build package-cache collisions under an unchanged identity.
+  number: 102
+
+requirements:
+  build:
+    - ${{ compiler("cxx") }}
+    - cmake
+    - ninja
+    # Without this, CMake's find_package(PythonInterp/PythonLibs) (pulled
+    # in transitively by pybind11Config.cmake) resolves $BUILD_PREFIX/bin/
+    # python to whatever native build-platform python rattler-build's own
+    # env happens to have, not a wasm32-target-shaped one -- fails with
+    # "Python config failure: Python is 64-bit, chosen compiler is 32-bit".
+    # Matches the same fix vinca's build_ament_cmake.sh.in template applies
+    # to every ROS package here that embeds Python.
+    - if: build_platform != target_platform
+      then:
+        - cross-python_${{ target_platform }}
+  host:
+    - python
+    - libpython
+    - openssl <4
+    - nlohmann_json
+    - nlohmann_json-abi
+    - xeus
+    - xeus-lite >=5.0.0
+    - pybind11
+    - pybind11_json
+    - xtl
+    # Depends on pyjs-dev directly (not the meta "pyjs" package, which
+    # just aggregates pyjs-rt + pyjs-dev) so this resolves to our own
+    # locally-rebuilt pyjs-dev (extra_recipes/pyjs) instead of the stock
+    # remote one -- see that recipe's comment for why.
+    - pyjs-dev >=4.0.6
+    - zstd
+  run:
+    - python
+    - xeus-python-shell-lite >=0.8,<0.9
+    - pyjs-rt >=4.0.6
+
+tests:
+  - package_contents:
+      files:
+        - bin/xpython.wasm
+        - bin/xpython.js
+
+about:
+  license: BSD-3-Clause
+  license_family: BSD-3
+  license_file: LICENSE
+  summary: xeus-python (patched locally for Asyncify dynamic-linking compat with this project's rclpy build)
+  homepage: https://github.com/jupyter-xeus/xeus-python
+
+extra:
+  recipe-maintainers:
+    - Tobias-Fischer
diff --git a/sync_native_bootstrap_mirror.sh b/sync_native_bootstrap_mirror.sh
new file mode 100755
index 000000000..d5840b08f
--- /dev/null
+++ b/sync_native_bootstrap_mirror.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# See pixi.toml's sync-native-bootstrap-mirror task for why this mirror
+# exists at all. The mirror directory has to be named after *this
+# machine's own* native platform -- rattler-build's solver only ever
+# looks at the channel subdirectory matching build_platform, which is
+# wherever this script actually runs (osx-arm64 on an Apple Silicon Mac,
+# linux-64 on the ubuntu-latest GitHub Actions runner this repo's own CI
+# uses, etc.) -- a hardcoded platform name here silently mirrors into a
+# directory the solver never looks at on any other machine, so nothing
+# fails loudly, entire closure just never gets past its native-bootstrap
+# bottleneck. Confirmed missing exactly this way on CI, 2026-09-10: it
+# was hardcoded to osx-arm64 (right for local dev on this project's own
+# Mac, wrong for the ubuntu-latest runner CI actually uses).
+set -euo pipefail
+
+case "$(uname -s)-$(uname -m)" in
+  Linux-x86_64) NATIVE_PLATFORM=linux-64 ;;
+  Linux-aarch64|Linux-arm64) NATIVE_PLATFORM=linux-aarch64 ;;
+  Darwin-arm64) NATIVE_PLATFORM=osx-arm64 ;;
+  Darwin-x86_64) NATIVE_PLATFORM=osx-64 ;;
+  *)
+    echo "sync_native_bootstrap_mirror.sh: unrecognized platform '$(uname -s)-$(uname -m)' -- add a case for it (see pixi.toml's own [workspace] platforms list for the full set this repo targets)." >&2
+    exit 1
+    ;;
+esac
+
+mkdir -p "output/emscripten-wasm32" "output/$NATIVE_PLATFORM"
+find "output/emscripten-wasm32" -maxdepth 1 -name '*.tar.bz2' -exec cp {} "output/$NATIVE_PLATFORM/" \;
+rattler-index fs output --force
diff --git a/vinca.yaml b/vinca.yaml
index 72c75bb04..28cfe2fd8 100644
--- a/vinca.yaml
+++ b/vinca.yaml
@@ -52,6 +52,357 @@ packages_skip_by_deps:
     then:
       - mujoco_ros2_control_plugins
 
+  # Ported from ros-humble-emscripten's vinca.yaml; transitively-pulled packages
+  # not meant to build for wasm32. Re-verify against rolling's own closure later.
+  - if: wasm32
+    then:
+      - rmw_connextdds
+      - rmw_cyclonedds_cpp
+      - rmw_fastrtps_cpp
+      - rmw_fastrtps_dds_common
+      - rmw_fastrtps_dynamic_cpp
+      - rmw_fastrtps_shared_cpp
+      # Native zenoh-c/zenoh-cpp RMW; we target zenoh-pico for wasm32 instead.
+      - rmw_zenoh_cpp
+      - ros_gz
+      - ros_gz_bridge
+      - ros_gz_image
+      - ros_gz_sim
+      - ros_gz_sim_demos
+      - ros_ign
+      - ros_ign_bridge
+      - ros_ign_gazebo
+      - rosidl_typesupport_fastrtps_c
+      - rosidl_typesupport_fastrtps_cpp
+      - zenoh_cpp_vendor
+
+  # Transitively-pulled packages (moveit/autoware/ros2_control/rviz2/clearpath
+  # families) not meant to build for wasm32 -- needs full DDS/GUI/HW drivers.
+  - if: wasm32
+    then:
+      - ackermann_msgs
+      - ackermann_steering_controller
+      - actionlib_msgs
+      - admittance_controller
+      - ament_clang_format
+      - ament_clang_tidy
+      - ament_cmake_auto
+      - ament_cmake_clang_tidy
+      - ament_mypy
+      - angles
+      - automatika_embodied_agents
+      - automatika_ros_sugar
+      - autoware_adapi_v1_msgs
+      - autoware_adapi_version_msgs
+      - autoware_auto_msgs
+      - autoware_cmake
+      - autoware_common_msgs
+      - autoware_control_msgs
+      - autoware_internal_debug_msgs
+      - autoware_internal_metric_msgs
+      - autoware_internal_msgs
+      - autoware_internal_perception_msgs
+      - autoware_internal_planning_msgs
+      - autoware_lanelet2_extension
+      - autoware_lanelet2_extension_python
+      - autoware_lint_common
+      - autoware_localization_msgs
+      - autoware_map_msgs
+      - autoware_msgs
+      - autoware_perception_msgs
+      - autoware_planning_msgs
+      - autoware_sensing_msgs
+      - autoware_simulation_msgs
+      - autoware_system_msgs
+      - autoware_utils_debug
+      - autoware_utils_diagnostics
+      - autoware_utils_geometry
+      - autoware_utils_logging
+      - autoware_utils_math
+      - autoware_utils_pcl
+      - autoware_utils_rclcpp
+      - autoware_utils_system
+      - autoware_utils_tf
+      - autoware_utils_uuid
+      - autoware_utils_visualization
+      - autoware_v2x_msgs
+      - autoware_vehicle_msgs
+      - backward_ros
+      - behaviortree_cpp_v3
+      - bicycle_steering_controller
+      - bond
+      - bondcpp
+      - can_msgs
+      - cascade_lifecycle_msgs
+      - chomp_motion_planner
+      - class_loader
+      - clearpath_common
+      - clearpath_config
+      - clearpath_control
+      - clearpath_description
+      - clearpath_generator_common
+      - clearpath_manipulators
+      - clearpath_manipulators_description
+      - clearpath_mecanum_drive_controller
+      - clearpath_mounts_description
+      - clearpath_platform_description
+      - clearpath_sensors_description
+      - common_interfaces
+      - composition_interfaces
+      - console_bridge_vendor
+      - control_msgs
+      - control_toolbox
+      - controller_interface
+      - controller_manager
+      - controller_manager_msgs
+      - cv_bridge
+      - diagnostic_aggregator
+      - diagnostic_common_diagnostics
+      - diagnostic_msgs
+      - diagnostic_updater
+      - diagnostics
+      - diff_drive_controller
+      - effort_controllers
+      - eigen3_cmake_module
+      - eigen_stl_containers
+      - ewellix_description
+      - fastcdr
+      - fastrtps_cmake_module
+      - filters
+      - force_torque_sensor_broadcaster
+      - forward_command_controller
+      - foxglove_msgs
+      - franka_description
+      - generate_parameter_library
+      - generate_parameter_library_py
+      - geographic_msgs
+      - geometric_shapes
+      - geometry_msgs
+      - gpio_controllers
+      - gripper_controllers
+      - gz_ros2_control
+      - gz_ros2_control_demos
+      - hardware_interface
+      - hardware_interface_testing
+      - ignition_cmake2_vendor
+      - ignition_math6_vendor
+      - image_transport
+      - imu_filter_madgwick
+      - imu_sensor_broadcaster
+      - interactive_marker_twist_server
+      - interactive_markers
+      - irobot_create_common_bringup
+      - irobot_create_control
+      - irobot_create_description
+      - irobot_create_msgs
+      - irobot_create_nodes
+      - irobot_create_toolbox
+      - joint_state_broadcaster
+      - joint_state_publisher
+      - joint_state_publisher_gui
+      - joint_trajectory_controller
+      - joy
+      - joy_linux
+      - joy_teleop
+      - jrl_cmakemodules
+      - kdl_parser
+      - key_teleop
+      - kinematics_interface
+      - kinematics_interface_kdl
+      - kortex_description
+      - lanelet2_core
+      - lanelet2_io
+      - lanelet2_maps
+      - lanelet2_matching
+      - lanelet2_projection
+      - lanelet2_python
+      - lanelet2_routing
+      - lanelet2_traffic_rules
+      - lanelet2_validation
+      - laser_geometry
+      - launch_param_builder
+      - launch_pytest
+      - launch_ros
+      - launch_testing_ros
+      - libcurl_vendor
+      - libg2o
+      - libnabo
+      - libpointmatcher
+      - logging_demo
+      - magic_enum
+      - map_msgs
+      - mavros_msgs
+      - mecanum_drive_controller
+      - message_filters
+      - microstrain_inertial_description
+      - mouse_teleop
+      - moveit_common
+      - moveit_configs_utils
+      - moveit_core
+      - moveit_kinematics
+      - moveit_msgs
+      - moveit_planners
+      - moveit_planners_chomp
+      - moveit_planners_ompl
+      - moveit_resources_fanuc_description
+      - moveit_resources_fanuc_moveit_config
+      - moveit_resources_panda_description
+      - moveit_resources_panda_moveit_config
+      - moveit_resources_pr2_description
+      - moveit_resources_prbt_ikfast_manipulator_plugin
+      - moveit_resources_prbt_moveit_config
+      - moveit_resources_prbt_pg70_support
+      - moveit_resources_prbt_support
+      - moveit_ros_move_group
+      - moveit_ros_occupancy_map_monitor
+      - moveit_ros_planning
+      - moveit_ros_planning_interface
+      - moveit_ros_robot_interaction
+      - moveit_ros_visualization
+      - moveit_ros_warehouse
+      - moveit_setup_framework
+      - moveit_setup_srdf_plugins
+      - moveit_simple_controller_manager
+      - mrt_cmake_modules
+      - mujoco_ros2_control_msgs
+      - mujoco_vendor
+      - nav_msgs
+      - nmea_msgs
+      - nmea_navsat_driver
+      - object_recognition_msgs
+      - octomap_msgs
+      - orocos_kdl_vendor
+      - ouster_ros
+      - ouster_sensor_msgs
+      - parameter_traits
+      - pcl_conversions
+      - pcl_msgs
+      - pcl_ros
+      - persist_parameter_server
+      - pick_ik
+      - picknik_ament_copyright
+      - picknik_reset_fault_controller
+      - picknik_twist_controller
+      - pid_controller
+      - pilz_industrial_motion_planner
+      - pilz_industrial_motion_planner_testutils
+      - plansys2_bringup
+      - plansys2_bt_actions
+      - plansys2_core
+      - plansys2_domain_expert
+      - plansys2_executor
+      - plansys2_lifecycle_manager
+      - plansys2_msgs
+      - plansys2_pddl_parser
+      - plansys2_planner
+      - plansys2_popf_plan_solver
+      - plansys2_problem_expert
+      - pluginlib
+      - point_cloud_transport
+      - point_cloud_transport_py
+      - popf
+      - pose_broadcaster
+      - position_controllers
+      - python_orocos_kdl_vendor
+      - python_qt_binding
+      - qt_gui
+      - qt_gui_cpp
+      - random_numbers
+      - range_sensor_broadcaster
+      - rclcpp_cascade_lifecycle
+      - rclcpp_components
+      - rclcpp_lifecycle
+      - realsense2_camera_msgs
+      - realsense2_description
+      - realtime_tools
+      - resource_retriever
+      - robot_localization
+      - robot_state_publisher
+      - robotiq_description
+      - ros2_control_test_assets
+      - ros2_controllers
+      - ros2_fmt_logger
+      - ros2_socketcan_msgs
+      - ros2cli
+      - ros2controlcli
+      - ros2launch
+      - ros2node
+      - ros2param
+      - ros2pkg
+      - ros2run
+      - ros2service
+      - ros2test
+      - ros2topic
+      - ros_testing
+      - rosidl_runtime_py
+      - rosidl_typesupport_fastrtps_c
+      - rosidl_typesupport_fastrtps_cpp
+      - rqt_gui
+      - rqt_gui_py
+      - rqt_runtime_monitor
+      - rsl
+      - rtabmap
+      - rtcm_msgs
+      - ruckig
+      - rviz2
+      - rviz_2d_overlay_msgs
+      - rviz_assimp_vendor
+      - rviz_common
+      - rviz_default_plugins
+      - rviz_ogre_vendor
+      - rviz_rendering
+      - rviz_rendering_tests
+      - rviz_visual_testing_framework
+      - rviz_visual_tools
+      - sbg_driver
+      - sdl2_vendor
+      - self_test
+      - sensor_msgs
+      - sensor_msgs_py
+      - shape_msgs
+      - sick_scan_xd
+      - smacc2_msgs
+      - smclib
+      - srdfdom
+      - std_srvs
+      - steering_controllers_library
+      - stereo_msgs
+      - tango_icons_vendor
+      - tcb_span
+      - teleop_tools_msgs
+      - teleop_twist_joy
+      - tf2
+      - tf2_eigen
+      - tf2_eigen_kdl
+      - tf2_geometry_msgs
+      - tf2_kdl
+      - tf2_msgs
+      - tf2_py
+      - tf2_ros
+      - tf2_ros_py
+      - tf_transformations
+      - tinyxml2_vendor
+      - tinyxml_vendor
+      - tl_expected
+      - tracetools_launch
+      - tracetools_trace
+      - trajectory_msgs
+      - tricycle_controller
+      - tricycle_steering_controller
+      - twist_mux
+      - twist_mux_msgs
+      - ur_client_library
+      - ur_description
+      - urdf
+      - urdf_launch
+      - urdf_parser_plugin
+      - velocity_controllers
+      - velodyne_description
+      - visualization_msgs
+      - warehouse_ros
+      - xacro
+      - zed_msgs
+
 packages_remove_from_deps:
 
   # Use the conda-forge iceoryx 2.0.6 packages instead of rebuilding the ROS
@@ -67,130 +418,189 @@ packages_remove_from_deps:
       - tlsf
       - tlsf_cpp
 
-skip_existing:
-  - https://prefix.dev/robostack-rolling/
+  # google_benchmark_vendor's ExternalProject build fails on emscripten; unneeded here.
+  - if: wasm32
+    then:
+      - ament_cmake_google_benchmark
+      - google_benchmark_vendor
 
-packages_select_by_deps:
-  - ackermann-msgs
-  - ament_cmake_black
-  - ament_cmake_catch2
-  - ament_cmake_clang_tidy
-  - ament_cmake_core
-  - ament_cmake_mypy
-  - apriltag_detector
-  - asio_cmake_module
-  - autoware_cmake
-  - autoware_common_msgs
-  - autoware_component_interface_specs
-  - autoware_control_msgs
-  - autoware_geography_utils
-  - autoware_global_parameter_loader
-  - autoware_internal_msgs
-  - autoware_interpolation
-  - autoware_kalman_filter
-  - autoware_localization_msgs
-  - autoware_map_msgs
-  - autoware_node
-  - autoware_object_recognition_utils
-  - autoware_perception_msgs
-  - autoware_planning_msgs
-  - autoware_point_types
-  - autoware_sensing_msgs
-  - autoware_signal_processing
-  - autoware_system_msgs
-  - autoware_utils
-  - autoware_v2x_msgs
-  - autoware_vehicle_info_utils
-  - autoware_vehicle_msgs
-  - battery_state_broadcaster
-  - behaviortree_cpp
-  - better_launch
-  - bond_core
-  - bondcpp
-  - can_msgs
-  - data_tamer_cpp  # Requested in https://github.com/RoboStack/ros-humble/issues/325
-  - desktop
-  - desktop_full
-  - dev_tools
-  - diagnostic-remote-logging
-  - diagnostics
-  - flex_sync
-  - foxglove_bridge
-  - foxglove_msgs
-  - gripper_controllers
-  - gtsam
-  - gz_ros2_control
-  - gz_ros2_control_demos
-  - lanelet2
-  - magic_enum
-  - moveit
-  - moveit-chomp-optimizer-adapter  # Requested in https://www.linkedin.com/feed/update/urn:li:activity:7346559234177703938/
-  - moveit-planners-chomp
-  - moveit-ros-control-interface
-  - moveit-ros-trajectory-cache
-  - moveit-servo
-  - moveit-visual-tools
-  - nav2_minimal_tb3_sim
-  - nav2_minimal_tb4_sim
-  - navigation2
-  - nmea-navsat-driver
-  - perception
-  - point_cloud_transport_plugins
-  - polygon_msgs
-  - proxsuite
-  - py-trees
-  - py-trees-ros
-  - py-trees-ros-interfaces
-  - py-trees-ros-viewer
-  - rmw_zenoh_cpp  # requested in https://github.com/RoboStack/ros-humble/issues/252
-  - roboplan  # requested in https://github.com/RoboStack/ros-rolling/issues/28
-  - roboplan_cartesian_planning
-  - roboplan_example_models
-  - roboplan_examples
-  - roboplan_oink
-  - roboplan_ros_cpp
-  - roboplan_ros_examples
-  - roboplan_ros_py
-  - roboplan_ros_visualization
-  - roboplan_rrt
-  - roboplan_simple_ik
-  - roboplan_toppra
-  - robot
-  - robot-localization
-  - ros2_control
-  - ros2_controllers
-  - ros2_fmt_logger
-  - ros2_socketcan_msgs
-  - ros_base
-  - ros_environment
-  - ros_gz
-  - ros_workspace
-  - rosbridge_suite
-  - rosidl_buffer
-  - rosidl_buffer_backend
-  - rosidl_buffer_backend_registry
-  - rosidl_buffer_py
-  - rtabmap
-  - rviz_visual_tools
-  - sbg_driver
-  - simulation
-  - slam_toolbox
-  - teleop
-  - toppra
-  - turtlebot3
-  - twist_mux  # requested in https://github.com/RoboStack/ros-humble/issues/249
-  - ublox
-  - ur
-  - ur_client_library
-  - ur_simulation_gz
+  # cppcheck/uncrustify are native tools emscripten-forge doesn't publish.
+  # Pulled in only transitively via ament_lint_common; removing here also
+  # drops them from its run: list. Their ament_cmake_* wrappers too.
+  - if: wasm32
+    then:
+      - ament_cmake_cppcheck
+      - ament_cmake_uncrustify
+      - ament_cppcheck
+      - ament_uncrustify
+      - uncrustify_vendor
 
-  # - web-video-server
-  - persist-parameter-server
+  # skip_by_deps (mechanism 2) doesn't strip an already-selected package's own
+  # dependency reference on ament_mypy -- needs this mechanism-3 removal too.
+  - if: wasm32
+    then:
+      - ament_cmake_mypy
+      - ament_mypy
 
+  # launch_yaml needs a libyaml-accelerated pyyaml, unavailable for wasm32
+  # (only pure-python pyyaml exists there). Not needed for the demo runtime.
+  - if: wasm32
+    then:
+      - launch_testing
+      - launch_yaml
 
-  - twist_stamper  # Requested in https://github.com/RoboStack/ros-rolling/issues/12
+  # performance_test_fixture needs the native "benchmark" package, unavailable
+  # for wasm32; only ever pulled in as a test_depend across the rcl/rclcpp/rosidl chain.
+  - if: wasm32
+    then:
+      - performance_test_fixture
 
-  - urdf_tutorial
+  # mimick_vendor transitively needs "git" (a native VCS tool, no wasm32 package).
+  - if: wasm32
+    then:
+      - mimick_vendor
+
+  # Same class of bug as ament_mypy above: skip_by_deps doesn't strip the
+  # dependency reference rosidl_typesupport_c/cpp declare on these.
+  - if: wasm32
+    then:
+      - rosidl_typesupport_fastrtps_c
+      - rosidl_typesupport_fastrtps_cpp
+
+  # Same class of bug again: rmw_implementation's package.xml exec_depends on
+  # every known RMW; mechanism 2 doesn't strip those references either.
+  - if: wasm32
+    then:
+      - rmw_connextdds
+      - rmw_cyclonedds_cpp
+      - rmw_fastrtps_cpp
+      - rmw_fastrtps_dynamic_cpp
+      - rmw_fastrtps_shared_cpp
+      - rmw_zenoh_cpp
+
+skip_existing:
+  - https://prefix.dev/robostack-rolling/
+
+packages_select_by_deps:
+
+  - if: not wasm32
+    then:
+      - ackermann-msgs
+      - ament_cmake_black
+      - ament_cmake_catch2
+      - ament_cmake_clang_tidy
+      - ament_cmake_core
+      - ament_cmake_mypy
+      - apriltag_detector
+      - asio_cmake_module
+      - autoware_cmake
+      - autoware_common_msgs
+      - autoware_component_interface_specs
+      - autoware_control_msgs
+      - autoware_geography_utils
+      - autoware_global_parameter_loader
+      - autoware_internal_msgs
+      - autoware_interpolation
+      - autoware_kalman_filter
+      - autoware_localization_msgs
+      - autoware_map_msgs
+      - autoware_node
+      - autoware_object_recognition_utils
+      - autoware_perception_msgs
+      - autoware_planning_msgs
+      - autoware_point_types
+      - autoware_sensing_msgs
+      - autoware_signal_processing
+      - autoware_system_msgs
+      - autoware_utils
+      - autoware_v2x_msgs
+      - autoware_vehicle_info_utils
+      - autoware_vehicle_msgs
+      - battery_state_broadcaster
+      - behaviortree_cpp
+      - better_launch
+      - bond_core
+      - bondcpp
+      - can_msgs
+      - data_tamer_cpp  # Requested in https://github.com/RoboStack/ros-humble/issues/325
+      - desktop
+      - desktop_full
+      - dev_tools
+      - diagnostic-remote-logging
+      - diagnostics
+      - flex_sync
+      - foxglove_bridge
+      - foxglove_msgs
+      - gripper_controllers
+      - gtsam
+      - gz_ros2_control
+      - gz_ros2_control_demos
+      - lanelet2
+      - magic_enum
+      - moveit
+      - moveit-chomp-optimizer-adapter  # Requested in https://www.linkedin.com/feed/update/urn:li:activity:7346559234177703938/
+      - moveit-planners-chomp
+      - moveit-ros-control-interface
+      - moveit-ros-trajectory-cache
+      - moveit-servo
+      - moveit-visual-tools
+      - nav2_minimal_tb3_sim
+      - nav2_minimal_tb4_sim
+      - navigation2
+      - nmea-navsat-driver
+      - perception
+      - persist-parameter-server
+      - point_cloud_transport_plugins
+      - polygon_msgs
+      - proxsuite
+      - py-trees
+      - py-trees-ros
+      - py-trees-ros-interfaces
+      - py-trees-ros-viewer
+      - rmw_zenoh_cpp  # requested in https://github.com/RoboStack/ros-humble/issues/252
+      - roboplan  # requested in https://github.com/RoboStack/ros-rolling/issues/28
+      - roboplan_cartesian_planning
+      - roboplan_example_models
+      - roboplan_examples
+      - roboplan_oink
+      - roboplan_ros_cpp
+      - roboplan_ros_examples
+      - roboplan_ros_py
+      - roboplan_ros_visualization
+      - roboplan_rrt
+      - roboplan_simple_ik
+      - roboplan_toppra
+      - robot
+      - robot-localization
+      - ros2_control
+      - ros2_controllers
+      - ros2_fmt_logger
+      - ros2_socketcan_msgs
+      - ros_base
+      - ros_environment
+      - ros_gz
+      - ros_workspace
+      - rosbridge_suite
+      - rosidl_buffer
+      - rosidl_buffer_backend
+      - rosidl_buffer_backend_registry
+      - rosidl_buffer_py
+      - rtabmap
+      - rviz_visual_tools
+      - sbg_driver
+      - simulation
+      - slam_toolbox
+      - teleop
+      - toppra
+      - turtlebot3
+      - twist_mux  # requested in https://github.com/RoboStack/ros-humble/issues/249
+      - twist_stamper  # Requested in https://github.com/RoboStack/ros-rolling/issues/12
+      - ublox
+      - ur
+      # - web-video-server
+      - ur_client_library
+      - ur_simulation_gz
+      - urdf_tutorial
 
   # These packages are only built on Linux as they depend on Linux-specific API
   - if: linux
@@ -213,7 +623,7 @@ packages_select_by_deps:
       - v4l2_camera  # Depends on v4l that is only available on linux
 
   # These packages are currently not build on Windows, but they be with some work
-  - if: not win
+  - if: not win and not wasm32
     then:
       - ament_cmake
       - ament_cmake_vendor_package
@@ -265,70 +675,89 @@ packages_select_by_deps:
   - ament_lint_common
   - ament_pep257
   - ament_pycodestyle
-  - autoware_adapi_v1_msgs
-  - autoware_adapi_version_msgs
-  - autoware_auto_msgs
-  - autoware_internal_debug_msgs
-  - autoware_internal_metric_msgs
-  - autoware_internal_perception_msgs
-  - autoware_internal_planning_msgs
-  - autoware_lanelet2_extension
-  - autoware_lanelet2_extension_python
-  - autoware_lint_common
-  - autoware_msgs
-  - autoware_utils_debug
-  - autoware_utils_diagnostics
-  - autoware_utils_geometry
-  - autoware_utils_logging
-  - autoware_utils_math
-  - autoware_utils_pcl
-  - autoware_utils_rclcpp
-  - autoware_utils_system
-  - autoware_utils_tf
-  - autoware_utils_uuid
-  - autoware_utils_visualization
   - builtin_interfaces
-  - irobot_create_msgs
-  - joy_teleop
-  - key_teleop
-  - mavros_msgs
-  - mouse_teleop
-  - mujoco_ros2_control_msgs
-  - mujoco_vendor
   - osrf_testing_tools_cpp
-  - pick_ik
-  - picknik_ament_copyright
-  - point_cloud_transport_py
   - rclc
   - rclcpp
   - rclpy
-  - rclpy_cascade_lifecycle
   - rcpputils
   - rcutils
   - rmw
-  - rosidl_generator_dds_idl
   - rosidl_runtime_c
   - rosidl_runtime_cpp
   - rosidl_typesupport_introspection_c
   - rosidl_typesupport_introspection_cpp
-  - rqt_robot_monitor
-  - rqt_runtime_monitor
-  - rtest
-  - rviz_2d_overlay_msgs
-  - teleop_tools
-  - ntrip_client
   - tracetools
   - tracetools_launch
   - tracetools_trace
-  - turtlebot3_gazebo
-  - urdf_launch
   - yaml_cpp_vendor
 
+  # zenoh-pico RMW (rclc-based) plus its microxrcedds typesupport chain.
+  - if: wasm32
+    then:
+      - micro_ros_msgs
+      - rmw_zenoh_pico
+      - rosidl_typesupport_microxrcedds_c
+      - rosidl_typesupport_microxrcedds_cpp
+      # geometry_msgs (Twist, etc.) and sensor_msgs (Image, NavSatFix, etc.)
+      # for the browser demo's teleop/camera/GPS pages -- neither is a
+      # transitive dependency of anything else in this closure, so both need
+      # to be selected explicitly.
+      - geometry_msgs
+      - sensor_msgs
+
+  # Application-specific extras not needed for a minimal wasm32 build.
+  - if: not wasm32
+    then:
+    - autoware_adapi_v1_msgs
+    - autoware_adapi_version_msgs
+    - autoware_auto_msgs
+    - autoware_internal_debug_msgs
+    - autoware_internal_metric_msgs
+    - autoware_internal_perception_msgs
+    - autoware_internal_planning_msgs
+    - autoware_lanelet2_extension
+    - autoware_lanelet2_extension_python
+    - autoware_lint_common
+    - autoware_msgs
+    - autoware_utils_debug
+    - autoware_utils_diagnostics
+    - autoware_utils_geometry
+    - autoware_utils_logging
+    - autoware_utils_math
+    - autoware_utils_pcl
+    - autoware_utils_rclcpp
+    - autoware_utils_system
+    - autoware_utils_tf
+    - autoware_utils_uuid
+    - autoware_utils_visualization
+    - irobot_create_msgs
+    - joy_teleop
+    - key_teleop
+    - mavros_msgs
+    - mouse_teleop
+    - mujoco_ros2_control_msgs
+    - mujoco_vendor
+    - pick_ik
+    - picknik_ament_copyright
+    - point_cloud_transport_py
+    - rclpy_cascade_lifecycle
+    - rosidl_generator_dds_idl
+    - rqt_robot_monitor
+    - rqt_runtime_monitor
+    - rtest
+    - rviz_2d_overlay_msgs
+    - teleop_tools
+    - ntrip_client
+    - turtlebot3_gazebo
+    - urdf_launch
+
   # Allied Vision only ships prebuilt Vimba SDK binaries (libVimbaC/libVimbaCPP)
   # for Linux (x86_64/arm), not macOS -- no source-level fix is possible.
-  - if: not win and not osx
+  - if: not win and not osx and not wasm32
     then:
       - avt_vimba_camera
+
   - if: not wasm32
     then:
       - joy_linux
@@ -396,7 +825,8 @@ packages_select_by_deps:
       - rqt
       - rqt_controller_manager
       - rqt_gui
-  - if: not win
+
+  - if: not win and not wasm32
     then:
       - rqt_mocap4r2_control
       - rqt_moveit
@@ -416,6 +846,7 @@ packages_select_by_deps:
     then:
       - mujoco_ros2_control
       - mujoco_ros2_control_demos
+
   - if: linux
     then:
       - rviz_satellite
diff --git a/vinca_pinning.yaml b/vinca_pinning.yaml
index 30ecdc8fb..14e59f773 100644
--- a/vinca_pinning.yaml
+++ b/vinca_pinning.yaml
@@ -23,26 +23,98 @@ pinning_overrides:
     - 2.39                       # [linux and riscv64]
     - 2.28                       # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
     - 14.0                       # [osx]
+  c_compiler:
+    - gcc                        # [linux]
+    - clang                      # [osx]
+    - vs2022                     # [win]
+    - emscripten                 # [emscripten]
+  cxx_compiler:
+    - gxx                        # [linux]
+    - clangxx                    # [osx]
+    - vs2022                     # [win]
+    - emscripten                 # [emscripten]
   c_compiler_version:
     - 15                         # [linux]
     - 21                         # [osx]
     - 14                         # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+    # Matches emscripten-forge/recipes' variant.yaml c_compiler_version; refresh
+    # alongside cxx_compiler_version and emscripten_emscripten-wasm32 (below) when
+    # emscripten-forge bumps their emscripten SDK version.
+    - 4.0.9                      # [emscripten]
   cxx_compiler_version:
     - 15                         # [linux]
     - 21                         # [osx]
     - 14                         # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+    - 4.0.9                      # [emscripten]
+  # emscripten-wasm32 support: vinca's own selector namespace (v1_selectors.py)
+  # treats "unix" as linux OR osx OR emscripten OR wasi OR freebsd OR zos, so the
+  # base conda-forge-pinning zip_keys group -- [c_stdlib_version,
+  # c_compiler_version, cxx_compiler_version, fortran_compiler_version,
+  # cuda_compiler_version], all scoped [unix] -- silently applies to emscripten too,
+  # even though conda-forge itself never builds for that platform. Since emscripten
+  # needs its own compiler but has no Fortran toolchain, no libc sysroot, and no
+  # CUDA, simply adding an emscripten branch to c_compiler_version/
+  # cxx_compiler_version would leave them non-empty while c_stdlib_version/
+  # fortran_compiler_version/cuda_compiler_version stay empty for that platform --
+  # a zip-length mismatch ("Zip key elements do not all have same length"). Fixed
+  # by (1) restricting fortran_compiler_version's selector from [unix] to
+  # [linux or osx] so it no longer nominally covers emscripten, and (2) splitting
+  # zip_keys (below) into a [c_compiler_version, cxx_compiler_version] group
+  # (valid for linux/osx/emscripten alike, always 1 entry each) separate from the
+  # [c_stdlib_version, fortran_compiler_version, cuda_compiler_version] group
+  # (linux/osx only, always 0 entries -- i.e. absent -- on emscripten).
   fortran_compiler_version:
-    - 15                         # [unix]
+    - 15                         # [linux or osx]
     - 5                          # [win64]
     - 22                         # [win and arm64]
     - 14                         # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
   cuda_compiler_version:
     - None
     - 12.9                       # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
+  zip_keys:
+    -
+      - c_compiler_version
+      - cxx_compiler_version
+    -
+      - c_stdlib_version         # [linux or osx]
+      - fortran_compiler_version # [linux or osx]
+      - cuda_compiler_version    # [linux or osx]
   libzenohc:
     - 1.9.0
   libzenohcxx:
     - 1.9.0
+  # emscripten-forge/recipes only publishes graphviz 15.1.0 -- our regular
+  # graphviz pin (from conda-forge-pinning) has no candidates there. Keep the
+  # base '14' pin for every other platform (if/then replaces the whole list,
+  # so the non-emscripten branch must be spelled out too).
+  graphviz:
+    - if: emscripten
+      then:
+        - '15.1.0'
+    - if: not emscripten
+      then:
+        - '14'
+  # emscripten-forge/recipes only publishes libffi 3.4.6 -- our regular
+  # 3.5.* pin (from conda-forge-pinning) has no candidates there, breaking
+  # rmw_wasm_cpp's host: dep on it (added via patch/dependencies.yaml
+  # add_host since its package.xml never declares one).
+  libffi:
+    - if: emscripten
+      then:
+        - '3.4.6'
+    - if: not emscripten
+      then:
+        - '3.5'
+  # emscripten-forge/recipes only publishes python 3.13 builds today (their own
+  # variant.yaml pins python: 3.13.* *_cp313), well behind conda-forge's 3.14 --
+  # keep 3.14 for every other platform and use their exact pin for emscripten.
+  # Written as a v1 if/then/else (rather than the legacy `# [selector]` comment
+  # form) because a cross-compiling recipe's BUILD-time deps need to resolve
+  # against the *build platform*'s own variant (e.g. a native osx-arm64
+  # rosidl_default_generators helper, itself built at python 3.14), not the
+  # invocation's --target-platform; the legacy comment selector only ever sees
+  # target_platform, so it would pin python 3.13 globally for the whole
+  # invocation regardless of which sub-resolution was actually being solved.
   # conda-forge published sip 6.16.1 on 2026-09-08, which broke ABI targeting for
   # packages like qt_gui_cpp_sip that build against PyQt-sip's fixed ABI v12
   # (hit this on humble/jazzy first; rolling also builds qt_gui_cpp via
@@ -51,9 +123,32 @@ pinning_overrides:
   sip:
     - 6.15
   python:
-    - 3.14.* *_cp314
+    - if: emscripten
+      then:
+        - 3.13.* *_cp313
+    - if: not emscripten
+      then:
+        - 3.14.* *_cp314
   is_python_min:
-    - false
+    - if: emscripten
+      then:
+        - false
+    - if: not emscripten
+      then:
+        - false
   python_impl:
     - cpython
+  # Needed for cross-compiled targets: emitted whenever a recipe's
+  # `packages_select_by_deps`/host deps expand `cross-python_${{ target_platform }}`
+  # with target_platform == emscripten-wasm32. Not a conda-forge-pinning key at
+  # all (conda-forge doesn't cross-compile to emscripten), so it must be added
+  # here rather than merely overridden. Matches emscripten-forge/recipes'
+  # variant.yaml.
+  cross-python_emscripten-wasm32:
+    - '3.13.1'
+  # The emscripten SDK/toolchain package version itself, keyed by vinca's
+  # `_` convention for cross-compilation toolchain
+  # packages. Keep in sync with c_compiler_version/cxx_compiler_version above.
+  emscripten_emscripten-wasm32:
+    - 4.0.9