Skip to content

Modular AirStack 8/9: full-stack audit — deletions, dep purge, simple-sim, BSD-3-Clause-Clear - #395

Open
andrewjong wants to merge 15 commits into
rfc/s7-catalog-role-removalfrom
rfc/s8-audit
Open

Modular AirStack 8/9: full-stack audit — deletions, dep purge, simple-sim, BSD-3-Clause-Clear#395
andrewjong wants to merge 15 commits into
rfc/s7-catalog-role-removalfrom
rfc/s8-audit

Conversation

@andrewjong

Copy link
Copy Markdown
Member

Stacked PR — merge the stack bottom-up with merge commits (squash-merging a lower PR orphans the commits every higher PR builds on). When the PR below merges, GitHub retargets this one to develop automatically. Each PR bumps VERSION (0.20.0-alpha.N), so check-version-increment passes at every level and each merge publishes images.

Stack 8/9 · base: rfc/s7-catalog-role-removal

Full-stack audit, executed against 14 owner rulings: delete what's dead, declare what's implicit, relicense, and make the sims honest.

What's inside

  • Audit sweeps (CLI, robot, gcs/sim, docs): truthful CLI help, one fleet pipeline, index-collision fix, fleet-aware GCS action relay, distinct GPS spawn origins, docs link integrity 81→4.
  • Owner-ruled deletions: px4_interface+vendored px4_msgs (uXRCE-DDS redesign tracked in Design: native PX4 uXRCE-DDS interface as a platform-module capability #387), waypoint_interface, attitude_controller(+msgs), the RQT/RViz GUI set (incl. rqt_gcs, rqt_behavior_tree, xdot_cpp submodule), sensors trio (camera_param_server/gimbal_stabilizer/sensor_interfaces), WinTAK/TAK integration, Isaac standalone_examples.
  • simple-sim adopted as airstack up --sim simple + a simple_sim smoke mark — which immediately caught that the sim had been dead since the Jazzy migration (bashrc sourced Humble); fixed.
  • Dependency purge: robot image −152 MB; droan_gl's GL deps now declared. The purge surfaced asm_macvo silently riding on trunk's rich/tqdm — fixed module-side and re-pinned (the module-boundary model working as intended).
  • Repo-wide relicense to BSD 3-Clause Clear (vendored packages keep upstream licenses); real maintainers/descriptions in every package.xml (contract-tested); airstack_msgs 1.0.0.
  • Harness: --stack accepts <name>[:<entry>] so split stacks are testable.

Validation

  • Unit suite 397 passed / 7 skipped; wiring drift green on all five stacks; clean-from-scratch colcon builds (robot 44/44, gcs 16/16); simple-sim smoke 4/4.

🤖 Generated with Claude Code

andrewjong and others added 15 commits August 22, 2026 04:02
…dened commands

From the four-domain rot audit (fix-now tier, CLI/toolchain):
- .airstack/README.md rewritten — it documented a containerized-compose CLI
  that never existed (rebuild-cli, Dockerfile.airstack-cli)
- ONE fleet pipeline: bridge-router generation moved into
  generate_fleet_compose.py (resolve-aware, covers <alias>/<stack> external
  stacks); airstack up --fleet and fleet generate share it; --dry-run no
  longer writes files
- set -e dead error paths fixed (connect/logs/config); rmi rewritten off
  positional docker-images parsing; ready --json emits pure JSON on stdout;
  ready gates built from the resolved robot NAME (non-robot_N fleets no
  longer 10-min false-timeout)
- help arms regenerated from reality (up/test/module/ready/sync/rmi) + a
  help-truth contract test; lint wired to real checks; format unregistered
- .airstack/modules/_lib.sh: the 4 duplicated shell primitives deduped
  (python/yaml check ×5, container identity ×3, env-value ×4, discovery ×2)
- .airstack/runs/ pruned to newest 50 (969-dir backlog cleared)
- module sync warns when plan-only regeneration drops lock --build image
  overrides (containers silently ran the base image without module layers —
  bit the macvo wiring gate); deprecation shims annotated 'remove in 0.21.0'

Unit suite: 273 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s, orphan purge

From the four-domain rot audit (fix-now tier, robot domain):
- robot_name_map regex: robots >=9 no longer collapse onto another robot's
  namespace/domain (robot 12 -> robot_2 before; contract-tested now)
- robot_interface_node honors its 'interface' plugin parameter (was
  hardcoded to MAVROSInterface, silently discarding the param)
- wiring baselines: JSON trailers compacted (30,406 -> 1,935 committed
  lines), full_droan_cpu's hand-copied title fixed + title==stack asserted,
  golden-node wait added (settle proves the graph stopped growing, not that
  it is complete — MAC-VO's model load raced the capture); all five
  baselines re-blessed drift-clean on GPU
- full_macvo modules.repos: real HTTPS pin replaces the phantom v0.1.0 SSH
  placeholder
- 13 orphan files deleted (ROS1 leftovers, byte-identical config dups, the
  caller-less domain-bridge machinery, .vscode dup); exploration package
  repaired (ament_package order, format-3 manifest, real deps) with its
  invalid ROS1 launch deleted
- stack READMEs/headers: bootstrap-instruction contradictions removed,
  set_remap wording corrected in 10 module launch headers + the lint
  docstring, Dockerfile diagnostic block deleted + lying stage comments
  fixed, robot-test runs the whole workspace, .bashrc identity resolution
  deduped, rviz MACVO ghosts removed

GPU-gated: default + 4 stack wiring drift-clean; heterogeneous fleet
flight-ready 111s.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ile purge

From the four-domain rot audit (fix-now tier, GCS + simulation):
- action_relay is fleet-aware: roster from FLEET_CONFIG_FILE (mounted
  config/ + tools/fleet), ROBOT_RELAY_MAP env override, legacy NUM_ROBOTS
  byte-identical fallback; gcs container gains the fleet env + mounts
- multi-drone runs get distinct PX4 GPS homes (PegasusApp anchors
  world_gps_origin for >1 drone; single-drone byte-unchanged) — verified
  live: three distinct coordinates matching the fleet spawn offsets; the
  GCS map no longer stacks the fleet on one point
- sshd actually starts (gcs/simple-sim/zed services ran 'ssh service
  restart'); isaac .bashrc no longer clobbers persisted shell history
- deleted: the retired domain-100 sim_to_robot_bridge.yaml, the inert
  gcs/docker/.env (wrong values), superseded robot-commands.foxe v1, unused
  fastrtps profile, committed bash histories teaching a deleted package,
  ms-airsim's bypassed bridge launch, simple-sim's stale duplicate launch
- fleet_spawn honors per-vehicle camera flags; ENU-origin constants
  cross-referenced in all four copies; AIRSIM_* knobs plumbed through
  compose; devcontainer/gcs unbroken; gcs docs rewritten against reality;
  user_TEMPLATE asset_root 4.5 -> 5.1; .gitignore footguns scoped

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eginner funnel

From the four-domain rot audit (fix-now tier, docs/tests/skills):
- repo-wide broken links 81 -> 4 (all intentional placeholders); nav 404s
  fixed and made unrepeatable by a nav-existence contract test
- CHANGELOG [Unreleased]: five entries advertising extracted/deleted things
  removed; the campaign's actual user-visible changes written up
  (stacks-only dispatch, module/fleet/doctor CLI, removals, image slimming)
- repo-root README.md created (there was none); docs/README architecture
  refreshed post-RFC
- beginner funnel taught the new canon: key_concepts gains
  stacks/modules/fleets, the CLI reference regenerated from real
  registrations (~35 commands), tutorials_reference repaired
- tests/README: wiring + tests/meta + --stack/--fleet documented, wrong
  defaults fixed; tests/meta/README added
- skills: use-airstack-cli + run-system-tests refreshed; frontmatter added
  to the two headless skills; NEW extract-module skill distilled from the
  three completed extractions; catalog sentence fixed + pages regenerated

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sensors trio, TAK, standalone examples

Owner rulings on the full-stack audit (2026-08-21), all referrers scrubbed:

- px4_interface + vendored px4_msgs: deleted pending a clean uXRCE-DDS
  platform-module design (#387); MAVROS remains the
  interface.
- waypoint_interface, attitude_controller(+_msgs): dead code, no launch
  path referenced them.
- GUI set: rviz_behavior_tree_panel (with xdot_cpp submodule),
  rqt_behavior_tree_command, rqt_gcs, rqt_airstack_control_panel,
  orphaned desktop_bringup perspectives — Foxglove is the GCS surface.
- Sensors trio camera_param_server / gimbal_stabilizer /
  sensor_interfaces: hardware-specific packages will return as modules
  out of trunk (lidar_point_cloud_filter kept).
- WinTAK/TAK: ros2tak_tools, TAK docs/assets, gcs Dockerfile TAK deps
  (pytak/mqtt/gstreamer); can return as a module if needed.
- isaac-sim standalone_examples (11MB, upstream copies) and stale
  robot/docker/wait_for_px4.py + custom_rosdep.yaml.
- exploration_planner KEPT by ruling: future Tasks-Panel-selectable
  geometric frontier planner; intent noted in its package.xml.

Unit suite: 273 passed, 7 skipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sim-gui; demote prebuilt to tag-only; drop WinTAK CLI

Owner rulings 9-12 from the full-stack audit:

- simple-sim (John Keller's kinematic single-robot sim mocking the
  MAVROS surface): airstack up --sim simple maps to compose profile
  'simple' and drops 'desktop' (simple-robot IS the robot container);
  harness gains SIM_CONFIG[simplesim] with per-sim compose_profiles/
  robot_pattern (isaac/airsim byte-identical); new simple_sim mark +
  4-test smoke chain (containers, /clock, mock-MAVROS odometry,
  sentinel nodes — MAVROS itself deliberately absent under
  SIM_TYPE=simple); collection guard skips mismatched sim/mark pairs
  before any bring-up. simple-sim docs rewritten truthfully from code
  (old pages described nonexistent config surfaces).
- isaac-sim-gui: documented as the USD/scene-editing path (GUI editor,
  off airstack_network, not for flying).
- DOCKER_IMAGE_BUILD_MODE=prebuilt: documented as tag-discriminator
  only; real prebuilt stage tracked as follow-up.
- WinTAK CLI plumbing removed (.airstack/modules/wintak.sh,
  --with-wintak, install block) — ROS/doc side went in the audit
  deletions commit.

Unit suite: 274 passed, 6 skipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ps (-152MB)

Audit ruling 14 (+7). Removed from Dockerfile.robot: libcgal-dev;
pips lxml, pkgconfig, pygments, toml, six, psutil, pymavlink, tqdm,
rich, pillow; ros-jazzy-foxglove-bridge (GCS owns the bridge) and its
8767-8787 port range from the robot compose service.

KEPT deliberately: libglm-dev/libglfw3-dev/assimp/opengl — droan_gl
uses them, and they are now DECLARED in its package.xml plus an
explicit named apt block in the runtime stage (previously they rode in
implicitly). matplotlib==3.8.4 and scipy kept (in-tree consumers).

Validated: image builds; 44/44 packages colcon-build in-container.
6.06GB -> 5.91GB. Module layers must declare their own runtime deps —
asm_macvo's missing rich/tqdm surfaced by this purge, fixed module-side.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ch/tqdm

Trunk's dep purge removed rich/tqdm from the base robot image; MAC-VO
imports both on its core runtime path (they had been riding on trunk).
asm_macvo@06f3a8c8 declares them in its Dockerfile.module; composed
layer rebuilt and import-verified (rich 15.0.0, tqdm 4.70.0, torch ok,
numpy re-pinned 1.26.4).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rs + descriptions everywhere

Owner ruling 13 from the full-stack audit:

- Root LICENSE (and 4 stray per-package Apache LICENSE files) -> BSD
  3-Clause Clear, Copyright (c) 2023-2026 Carnegie Mellon University,
  AirLab.
- 38 package.xmls: license tag set, placeholder maintainers (todo/root/
  uav/airlab/@todo.todo) -> Andrew Jong <ajong@andrew.cmu.edu>, all
  TODO descriptions replaced with real ones written from each package's
  source. airstack_msgs promoted to 1.0.0.
- Vendored packages KEEP their upstream licenses: ETH mav_* (ASL 2.0;
  two ship upstream 'TBD' — left matching upstream), rqt-derived
  packages (BSD), 3d_waypoint_rviz2_plugin (Apache-2.0); submodules
  untouched (vdb_mapping*, rviz_polygon_selection_tool).
- 29 campaign-era '# MIT License' python headers -> SPDX
  BSD-3-Clause-Clear; 23 skill frontmatters; docs license mentions;
  module fixtures.
- New meta contract test_package_metadata_contract.py (unit): every
  non-submodule package.xml must have a real description, real
  maintainer, non-empty license (value not asserted — vendored differ).
- asm_* module repos + airstack-modules-index relicensed in lockstep;
  asm_macvo re-pinned to f0d19213 (metadata-only, layer cache-hit).

Unit suite: 400 passed, 7 skipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ce the Jazzy migration

The mounted bashrc still sourced /opt/ros/humble/setup.bash (gone since
the Jazzy migration), so the at-startup colcon build of the sim
workspace failed on ament_cmake and no sim node ever launched. Source
jazzy in the bashrc (guarding the not-yet-built install/setup.bash) and
explicitly in the compose startup command so the launch chain does not
depend on the interactive rc file.

Caught by the new simple_sim smoke mark on adoption: 4/4 passed, sim
publishes /clock ~25s after up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…_macvo past its stale-import fix

The harness hardcoded AIRSTACK_STACK_ENTRY=stack, so a split stack
(lite_offload_global has only onboard/offboard entries) dispatched to a
nonexistent entry and stranded the launch after the dispatcher preamble
— the wiring sentinel gate caught it (mavros/trajectory_control never
appeared). --stack now parses the same <name>[:<entry>] syntax as
airstack up; airstack_env carries stack (entry stripped, so goldens and
doctor lookups keep keying on the folder) plus a new stack_entry.

asm_macvo re-pinned to 269ffc0b: macvo_node imported the trunk-deleted
sensor_interfaces srv it never used (camera params arrive via a plain
CameraInfo subscription) and crashed at startup — the full_macvo wiring
gate caught the missing node.

Wiring gates all green: full_default, full_droan_cpu, full_macvo,
lite_default (2 passed each), lite_offload_global:onboard (2 passed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-set removal

Owner-ruled follow-up to the audit deletions: with the rqt/rviz
behavior-tree GUIs and their perspectives gone, this rqt-derived
viewer (bundled Python xdot renderer + py_console) had no remaining
referrer repo-wide. behavior_tree_msgs' GraphVizXdot messages stay —
they are framework messages, published regardless of any viewer.
rqt_py_template (John Keller's) stays.

Clean rebuilds after removal: robot 44/44, gcs 16/16; unit suite
397 passed, 7 skipped (metadata contract re-counts automatically).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Promote the 0.19 series (intent-flag launch workflow, airstack ready,
resolved-config preflight, OSMO ephemeral CI runners, OptiTrack
external-vision configurations, feature-notebook workflow) out of
pre-release: VERSION 0.19.0-alpha.18 -> 0.19.0; CHANGELOG [Unreleased]
promoted to [0.19.0] - 2026-08-22.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nd 0.20.0-alpha.8

Conflict resolutions: CHANGELOG.md keeps this branch's truthful rewrite
(the 0.19.0 release history is preserved in docs/release_notes/index.md,
which replaces CHANGELOG one PR up the stack); .env keeps this branch's
VERSION bump.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

# Conflicts:
#	.env
#	CHANGELOG.md
@github-actions

Copy link
Copy Markdown
Contributor

Test Metrics — d703606fc067591e1baf94771890cb77f35b1591

No metrics report generated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant