Modular AirStack 2/9: module CLI, workspace overlay, Docker layer composition - #389
Open
andrewjong wants to merge 6 commits into
Open
Modular AirStack 2/9: module CLI, workspace overlay, Docker layer composition#389andrewjong wants to merge 6 commits into
andrewjong wants to merge 6 commits into
Conversation
- .airstack/modules/module.sh: module add|remove|list|sync|create|doctor — drop-in command group (zero core-dispatcher edits); pinned modules.repos (tags/SHAs only — branch refs refused per RFC), vcs2l-based import (ros-infrastructure/vcs2l, the maintained vcstool successor), host_setup hook runner with --no-hooks - tools/module_overlay.py: symlinks ros packages into robot/ros_ws/src/modules/ and isaac launch scripts into launch_scripts/modules/<name>/; mounts Kit extensions; merges module compose fragments into .airstack/generated/docker-compose.modules.yaml (absolute host paths, regenerated each sync); --check/--remove - closes the asm_dfm2_disturbances pilot friction-log gaps: compose-fragment merge, launch-script exposure, exts mounting, AIRSTACK_LAUNCH_SCRIPTS_DIR - 12 hermetic contract tests (unit mark); developer guide at docs/development/modules.md; gitignore entries for all overlay artifacts Full unit suite: 252 passed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ck up With modules synced, cmd_up appends -f .airstack/generated/ docker-compose.modules.yaml (opt out: AIRSTACK_NO_MODULE_COMPOSE=1). Absent file = no modules = byte-identical behavior. This closes the gap where module mounts never reached containers brought up by airstack test / the reusable module CI workflow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nclude Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- tools/compose_module_layers.py: three dep tiers per RFC #379 §6 — tier-1 rosdep/apt/pip (one RUN per module per package manager → per-module layer cache; pip uses --no-cache-dir --break-system-packages per trunk's PEP 668 house pattern), tier-2 Dockerfile.module chained via ARG BASE_IMAGE, tier-3 prebuilt overlay (used as-is only when sole docker-relevant module on the host; fragment is source of truth otherwise). Deterministic plan (.airstack/generated/layer_plan.json), gitignored modules.lock (dep hashes + plan hash, byte-identical for identical inputs), --check-conflicts static apt/pip pin-conflict gate (doctor hard gate #1 — sync fails on conflict), --build executes the chain and points robot services at the composed tag - ZERO-MODULE IDENTITY RULE: no docker-relevant modules ⇒ every host keeps today's exact image tag; no image: overrides emitted. Published trunk images are untouched (composed -m<hash> tags are per-checkout artifacts), so docker_image_plan.py needs no change - validated end-to-end locally: heavy_module fixture built a real 2-step chain on v0.19.0-alpha.18_robot-x86-64_dev (apt cowsay + pip tabulate + tier-2 marker verified in-container); identity restored on removal - 18 contract tests; full unit suite 270 passed Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A ros_package module that also targets isaac-sim (asm_optitrack: robot-side NatNet client + in-sim emulator extension) ships launch scripts and Kit extensions too; placement now follows targets so hybrid modules resolve. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack 2/9 · base:
rfc/s1-observability-manifestThe module machinery: pull a capability from an external repo into this checkout, overlay it into the workspace, and compose its Docker dependency layers — without the monolith ever knowing its name at rest.
What's inside
airstack moduleCLI (add <url> --version <tag|sha>— branches refused, local paths allowed;list|sync|remove|create --in-tree|doctor [--drift]), synced by vcs2l (ros-infrastructure's maintained vcstool successor) from a pinnedmodules.reposinto gitignoredmodules/.robot/ros_ws/src/modules/; Isaac assets keyed off manifesttargets(not module type); modulecompose:fragments merged into a generated override thatairstack upincludes automatically.tools/compose_module_layers.py+airstack module lock [--build]): tier-1 apt/pip RUN-per-module, tier-2Dockerfile.module(ARG BASE_IMAGEchains), tier-3 published overlays; deterministicmodules.lock; composed tags get a-m<planhash>suffix.Validation
build_packagesidentical with no modules configured; fixture-module compose + liveliness green.🤖 Generated with Claude Code