Skip to content

Modular AirStack 7/9: module catalog + AUTONOMY_ROLE removal (breaking) - #394

Merged
andrewjong merged 7 commits into
developfrom
rfc/s7-catalog-role-removal
Aug 24, 2026
Merged

Modular AirStack 7/9: module catalog + AUTONOMY_ROLE removal (breaking)#394
andrewjong merged 7 commits into
developfrom
rfc/s7-catalog-role-removal

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 7/9 · base: rfc/s6-fleets

The marketplace face of the module system — and the breaking cutover: stacks become the only launch path.

What's inside

  • Module & Stack Catalog: tools/gen_docs_catalog.py generates docs/modules/ from the airstack-modules-index registry; docs deploys fetch registered module docs at pinned refs (with failure isolation); new-developer walkthrough page.
  • AUTONOMY_ROLE removed (breaking): the role dispatch and its per-role launch trees (onboard_all/, onboard_local_offboard_global/) are deleted — a set AUTONOMY_ROLE is a preflight hard error; no --stack means full_default. −9,965 lines.
  • Launch-file legibility sweep (dead files/blocks purged, header discipline), ensemble_planner skeleton deleted, and the "why stacks don't launch standalone" dispatcher-philosophy doc.

Validation

  • Post-removal wiring drift green on every reference stack — the graph identity proven in stack 3/9 held through the cutover.
  • Unit contracts (help-truth, nav-existence, dispatcher-recursion ban) green.

🤖 Generated with Claude Code

andrewjong and others added 7 commits August 22, 2026 04:02
…lkthrough

- tools/gen_docs_catalog.py: deterministic docs/modules/ generator from the
  airstack-modules-index registry (catalog table, per-module pages with
  pinned install snippets, DECLARED-vs-VERIFIED compat notes); --check drift
  mode; committed pages regenerate from a hermetic registry fixture
- docs deploy workflows: shallow-clone registry + registered module repos at
  their registered refs before mike deploy, with RFC §9 failure isolation
  (unreachable repo = skip + stub, never a failed deploy); weekly cron +
  dispatch on develop; triggers extended with stacks/**
- mkdocs: top-level Modules tab (catalog + module pages + the five reference
  stacks with rendered wiring.md); fetched checkouts excluded from the site
  (strict-build warnings 112 → 59, zero new)
- docs/getting_started/modular_airstack.md: the end-to-end new-developer
  walkthrough (stack up → wiring map → module add → own stack → fleet →
  doctor); AGENTS.md updated (RFC subsection, workflow table, CLI)
- 14 new contract tests; unit suite 252 passed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
61 lines that declared one parameter and nothing else — no launch file, no
references, gtest commented out, untouched since scaffolding (Nov 2024)
except the repo restructure. It cost a colcon build in every CI run and
bring-up.

The idea survives in a better home: in the stack world, an ensemble of
planners is a stack-level composition — a stack includes N planner modules
plus an arbiter selecting among their global_plan outputs (see
docs/robot/autonomy/global/planning/index.md, kept as design intent).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d blocks, header discipline

Graph-neutrality machine-proven: colcon build green and the legacy wiring
golden + all four stack wiring.md baselines drift-clean after the sweep.

Deleted (zero references, evidence per file in the sweep audit):
- the legacy Gazebo parallel-bringup tree (8 files, dead env indirection)
- static_transforms dup, gst2ros orphan, mavros_connection_poll,
  odometry_conversion (pointed at the wrong package), the unwired
  px4_interface uXRCE launch (package + plugin kept), the empty
  global_planner.launch.xml stub
- dead <?ignore?> blocks in local/sensors/gcs launch files (alternates live
  in stacks now) and the consumerless local_depth_in_topic arg

Legibility: 2-6 line status headers on 22 launch files (stack entry /
canonical module launch / LEGACY graph-frozen until 0.21 / utility);
description= added to 19 args across 5 files; 6 wrong type-claims corrected
(tracking_point/look_ahead are airstack_msgs/Odometry per the conventions
spec). Lint allowlist shrinks 14 -> 8.

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

Owner ruling: no legacy-hardware compatibility required; hardware launch
workflows redefinable at will. Evidence basis: full ≡ full_default is
machine-proven (graph equality, held through every flatten); the desktop
profile's 'onboard' role was unreachable anyway (compose hardcoded
AUTONOMY_ROLE=full); lite_offload_global's generated bridge config
deliberately improves on the legacy split (drops the set_trajectory_mode
crossing — doctor hard gate #2).

- robot.launch.xml: shared preamble + one stack include; no-env default =
  stacks/full_default. role arg, three role groups, gossip/gcs args gone
- deleted: onboard_all/ + onboard_local_offboard_global/ (shared DDS configs
  moved to autonomy_bringup/config/ first), the five frozen layer launch
  files, and the now-empty behavior_bringup/sensors_bringup/local_bringup
  packages; lite stacks flattened to match (their only remaining wraps)
- compose: role env/args gone everywhere; desktop_split/voxl/l4t services
  select stacks via AIRSTACK_STACK_DIR (redefinable); base default
  full_default; l4t override rewritten stack-form
- CLI: AUTONOMY_ROLE now a hard preflight error with migration guidance;
  effective config always names the stack
- tests: legacy wiring golden retired (default golden = the stack baseline);
  contract tests assert the removal error; lint allowlist down to 4
  principled entries (playback utility, vendored zed, exploration pending
  rewrite, interface safety boundary)
- docs/skills sweep: 15+ pages and 7 skills re-pointed at stacks

GPU-gated: flagless default drift-clean vs stacks/full_default/wiring.md;
lite_default drift-clean through its flatten; fleet liveliness 8/8.
Module follow-up: asm_optitrack/asm_macvo test_stacks still wrap the deleted
layer files and need the same flatten in their repos.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Containers drop root-owned __pycache__/build debris into mounted module
checkouts; plain rm then failed and left a partial dir that broke the next
vcs import. Retry via a throwaway container, with the manual command in the
error path.

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

Answers the natural 'can we delete robot.launch.xml?' question in the docs
instead of in review threads: namespace-scoping mechanics (push_ros_namespace
cannot scope sibling includes from within an included preamble), stack files
as pure wiring documents, and the dispatcher as the seed of RFC #380's
platform module.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@andrewjong
andrewjong changed the base branch from rfc/s6-fleets to develop August 24, 2026 20:31
@andrewjong
andrewjong merged commit ce348c2 into develop Aug 24, 2026
2 of 3 checks passed
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