Skip to content

Modular AirStack 1/9: wiring observability, module manifest, reusable module CI - #388

Open
andrewjong wants to merge 7 commits into
developfrom
rfc/s1-observability-manifest
Open

Modular AirStack 1/9: wiring observability, module manifest, reusable module CI#388
andrewjong wants to merge 7 commits into
developfrom
rfc/s1-observability-manifest

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 1/9 · base: develop

Lays the observability and contract foundations for Modular AirStack (RFC #379) before any behavior changes: you can't safely restructure a launch graph you can't diff.

What's inside

  • Observed wiring snapshots (tests/wiring_snapshot.py, stdlib-only): captures the running ROS graph (nodes, pub/sub edges, types, QoS) via batched ros2 topic info --verbose, renders mermaid, and diffs against a committed golden. New wiring system-test mark + drift check; first golden captured from the then-current AUTONOMY_ROLE=full topology.
  • module.yaml manifest schema (common/module_schema/module.schema.json) + tools/validate_module.py + a hello_module fixture and unit-mark contract tests. Manifests carry identity/deps/assets/hooks only — never wiring.
  • Reusable module CI (.github/workflows/module-system-tests.yml, first workflow_call workflow in the repo): external module repos run trunk's own harness against a pinned trunk ref on the ephemeral GPU runners; same-repo/org callers only.

Validation

  • wiring mark green on Isaac Sim (snapshot + drift check); goldens stable across repeated bring-ups after excluding timing-dependent sim render-pipeline nodes.
  • All new contract tests in the unit suite; no behavior change to any launch path.

🤖 Generated with Claude Code

andrewjong and others added 6 commits August 20, 2026 16:46
…contract tests

- common/module_schema/module.schema.json: thin-manifest schema per RFC #379 §2
  (deps/identity/tests only — wiring deliberately absent), draft-07 subset with
  x-airstack-* annotations for semver-range/path-safety/existence checks
- tools/validate_module.py: stdlib+PyYAML generic schema walker (no jsonschema
  dep); JSON verdict on stdout, exit 0/1; dir mode adds cross-file checks
- tests/fixtures/modules/hello_module: minimal valid module (manifest + buildable
  ament_python package) for overlay/build phases
- tests/meta/test_module_manifest_contract.py: 24 unit-mark contract tests
- .agents/skills/create-module: by-hand module authoring skill (scaffolding CLI
  lands in a later phase)

RFC: #379

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

Back-to-back 'airstack up --dry-run' calls within one second landed in the same
.airstack/runs/<ts>/ dir, making test_effective_config_dump_written flaky.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- tests/wiring_snapshot.py: stdlib-only capture/render/diff (ros2 node list +
  topic info --verbose parser, deterministic mermaid grouped by namespace,
  wiring.md with canonical-JSON trailer, graph differ; JSON verdict CLI)
- tests/system/test_wiring_snapshot.py (new 'wiring' mark): batched per-robot
  graph capture via one docker exec per 40-topic chunk, node-set settle poll,
  golden drift gate at tests/goldens/wiring/ (bootstrap: pass + instruction
  when golden absent)
- mark/module registrations in pytest.ini, harness/collection.py,
  harness/run_meta.py; 7 unit contract tests

Per RFC #379 §4.4 — the wiring picture is snapshotted from the running system;
goldens move into stacks/<name>/wiring.md at P5.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- .github/workflows/module-system-tests.yml: first on:workflow_call workflow —
  a module repo's entire CI calls this (checkout trunk @ airstack_ref, checkout
  module w/ submodules, validate manifest, airstack module add/sync, image
  pull/retag/build fallback, airstack test -m "<marks>", run_meta honesty
  gate, artifacts). workflow_dispatch path for trunk-side smoke tests against
  any module repo. First-party (castacks) callers only; external modules wait
  for the deferred dispatch test bench.
- docs/development/module_ci.md: caller snippet, inputs/secrets, RFC §5 mark
  guidance per module category, cost ladder, canary cron snippet
- orchestrator README: how to add an asm_ module repo to the runner poll list

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- exclude _CREATED_BY_BARE_DDS_APP_ phantom participants (bare-DDS apps: sim
  bridges, uXRCE agents) from the normalized graph
- source-sha provenance falls back to reading .git/HEAD directly (tests
  container has no git binary)
- bless tests/goldens/wiring/full_default.isaacsim.1robot.md, captured from a
  live isaacsim bring-up @ 5c6c4a4 (83 nodes) and verified drift-clean
  against a second independent bring-up

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

Copy link
Copy Markdown
Contributor

Test Metrics — 7865b81ff6b467667978dca140ea4d927f53931b

No metrics report generated.

.env VERSION conflict resolved in favor of this branch's bump; the
CHANGELOG [0.19.0] promotion merges through untouched.

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

# Conflicts:
#	.env
@github-actions

Copy link
Copy Markdown
Contributor

Test Metrics — 1b00e1bba8e445f3aa76497aa76c71f63c431d12

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