Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
cce3977
Bump VERSION to after sync from main
github-actions[bot] May 20, 2026
25d52da
feat(osmo): VS Code/Cursor dev workflow on NVIDIA OSMO (#352)
smash0190 May 22, 2026
dff3dc6
fix(isaac-sim): pegasus drone retains PX4 state across Stop/Play (#363)
andrewjong May 28, 2026
8b927e4
Johnliu/optitrack autonomy (#359)
JohnYanxinLiu May 29, 2026
6279bea
Fix/camera init (#368)
krrishj18 Jul 7, 2026
fa990f4
Add fixed-trajectory system tests with cross-track error metrics (#365)
pvkumara Jul 10, 2026
c476db3
General robot deployment infra: aarch64 build args + robot-name resol…
JohnYanxinLiu Jul 21, 2026
1a25d60
l4t deployment fixes: make the Jetson profile build + boot on real ha…
JohnYanxinLiu Jul 22, 2026
47f8c79
Test infra rework: YAML-driven unit-test collection + integration tie…
JohnYanxinLiu Jul 31, 2026
55d9b88
Add waypoint_flight system test judged by a standalone track checker …
andrewjong Aug 4, 2026
ae2e942
Add feature-notebook workflow: per-feature design specs + test result…
andrewjong Aug 5, 2026
9788b14
Remove stray files
andrewjong Aug 5, 2026
234587a
Robot deployment fixes: bag recording + adding warning for robot-iden…
JohnYanxinLiu Aug 5, 2026
5cf5955
ci: land OSMO ephemeral runners and system-test harness on develop (#…
pvkumara Aug 14, 2026
0ae96fe
OptiTrack (1/3): robot-side NatNet client + PX4 external-vision fusio…
JohnYanxinLiu Aug 15, 2026
19402c2
OptiTrack (2/3): NatNet server emulator + host integration tests (#375)
JohnYanxinLiu Aug 16, 2026
1c41f8c
OptiTrack (3/3): Isaac wrapper, mocap EV fusion in sim, and a Circle-…
JohnYanxinLiu Aug 17, 2026
f469726
CI/CD Tuning PR - pytest collection bug fix (#384)
pvkumara Aug 18, 2026
9e2e0e3
docs(skills): require dates and timestamps in feature notebook entries
andrewjong Aug 20, 2026
262f126
Pre-RFC workflow cleanup: intent-based launch, readiness gates, launc…
andrewjong Aug 20, 2026
b6e4dba
P1(rfc-379): module.yaml manifest schema, validator, fixture module, …
andrewjong Aug 20, 2026
05db6c5
fix(cli): PID-suffix effective-config run dirs to avoid same-second c…
andrewjong Aug 20, 2026
5c6c4a4
P0(rfc-379): observed wiring-snapshot tool, wiring mark, drift check
andrewjong Aug 20, 2026
11f51c5
P3(rfc-379): reusable module-system-tests workflow + module CI docs
andrewjong Aug 20, 2026
b2364b9
P0(rfc-379): first observed wiring golden + snapshot robustness fixes
andrewjong Aug 20, 2026
aa578de
fix(tests): widen landing phase-timeout margin — evidence-based
andrewjong Aug 20, 2026
38f228a
P6(rfc-380): airstack.yaml, vehicles, fleets, fleet resolver, generic…
andrewjong Aug 21, 2026
70423c4
M2(rfc-379): remove OptiTrack/natnet from trunk — extracted to castac…
andrewjong Aug 20, 2026
b951fd3
M3(rfc-379): remove MACVO from trunk — extracted to castacks/asm_macvo
andrewjong Aug 20, 2026
efb7c86
P6(rfc-380): fix fleet-service discovery in ready.sh; clamp harness c…
andrewjong Aug 21, 2026
326c27a
P2(rfc-379): airstack module CLI, vcs2l sync, workspace overlay
andrewjong Aug 20, 2026
70a6fc6
P5-E2(rfc-379): flatten the local layer into stack files
andrewjong Aug 20, 2026
343fc5c
M3(rfc-379): regen wiring baselines post-MACVO removal; exclude sim r…
andrewjong Aug 21, 2026
ff35e36
P6(rfc-380): mount .airstack/generated into robot containers; auto-ge…
andrewjong Aug 21, 2026
73a53ee
P2(rfc-379): auto-include generated module compose override in airsta…
andrewjong Aug 20, 2026
1477df3
P3(rfc-379): hook_env input for module host_setup hooks
andrewjong Aug 20, 2026
115c991
M3(rfc-379): bless full_macvo wiring baseline on the composed module …
andrewjong Aug 21, 2026
a9f56b0
P6(rfc-380): doctor --live handles heterogeneous fleets
andrewjong Aug 21, 2026
6d40d9a
P2(rfc-379): update sync hint and docs for automatic module-compose i…
andrewjong Aug 20, 2026
19c4adc
P5-E1(rfc-379): reference stack folders (wrap form), --stack dispatch…
andrewjong Aug 20, 2026
76af860
P2(rfc-379): warn on stale colcon caches for extracted module packages
andrewjong Aug 20, 2026
6f436d8
P5-E3a(rfc-379): flatten perception/sensors/global/behavior into stac…
andrewjong Aug 21, 2026
643d0c3
P6(rfc-380): single-robot fleets use the historical single-drone prim…
andrewjong Aug 21, 2026
4a76935
P4(rfc-379): docker module-layer composition, layer plan, modules.lock
andrewjong Aug 20, 2026
5efffa3
P5-E1(rfc-379): observed wiring.md for all three reference stacks
andrewjong Aug 20, 2026
e58caad
P5(rfc-379): stack entries must never include the dispatcher (contract)
andrewjong Aug 20, 2026
9cc7b33
P5-E3b(rfc-379): split stack + bridge.yaml, doctor, interface convent…
andrewjong Aug 21, 2026
b408ee7
fix(tests): wait for the state-estimate watchdog before commanding ta…
andrewjong Aug 21, 2026
7933f40
P2(rfc-379): key Isaac overlay placements off targets, not module type
andrewjong Aug 20, 2026
e361ef1
P3(rfc-379): build module Docker layers in the reusable workflow
andrewjong Aug 20, 2026
b0541c1
P2(rfc-379): sync self-heals stale partial module checkouts
andrewjong Aug 20, 2026
2a178e6
P5-E3(rfc-379): bless lite_default wiring baseline
andrewjong Aug 21, 2026
b899906
P6(rfc-380): airstack down sees generated module/fleet compose services
andrewjong Aug 21, 2026
aebd6e4
Bump version to 0.20.0-alpha.1
andrewjong Aug 22, 2026
592f6cf
Bump version to 0.20.0-alpha.2
andrewjong Aug 22, 2026
f1c1352
Bump version to 0.20.0-alpha.3
andrewjong Aug 22, 2026
7980fb0
Bump version to 0.20.0-alpha.4
andrewjong Aug 22, 2026
4044aa1
Bump version to 0.20.0-alpha.5
andrewjong Aug 22, 2026
17de16f
Bump version to 0.20.0-alpha.6
andrewjong Aug 22, 2026
3852ae2
P7(rfc-379): marketplace catalog, module-docs fetch, new-developer wa…
andrewjong Aug 21, 2026
2b02740
chore: delete the stillborn ensemble_planner skeleton
andrewjong Aug 21, 2026
1ccbb20
chore(launch): legibility sweep — delete dead launch files, purge dea…
andrewjong Aug 21, 2026
46c499b
Remove the legacy AUTONOMY_ROLE dispatch — stacks are the only launch…
andrewjong Aug 21, 2026
c9e3cf6
P2(rfc-379): module remove survives root-owned container artifacts
andrewjong Aug 21, 2026
0a13f04
audit(cli): truthful help/README, one fleet pipeline, shared lib, har…
andrewjong Aug 22, 2026
9184110
docs(stacks): why stacks don't launch standalone — the dispatcher phi…
andrewjong Aug 21, 2026
8242ae8
audit(robot): index-collision fix, live plugin param, honest baseline…
andrewjong Aug 22, 2026
4f4a224
Bump version to 0.20.0-alpha.7
andrewjong Aug 22, 2026
0b7b33d
audit(gcs/sim): fleet-aware GCS, distinct GPS homes, sshd fix, dead-f…
andrewjong Aug 22, 2026
dbead2a
audit(docs): link integrity 81->4, truthful CHANGELOG, root README, b…
andrewjong Aug 22, 2026
6ea3e81
chore(audit): execute owner-ruled deletions — dead interfaces, GUIs, …
andrewjong Aug 22, 2026
4d97b89
feat(sim): adopt simple-sim as a first-class --sim target; doc isaac-…
andrewjong Aug 22, 2026
96ad668
chore(docker): dependency purge — robot image sheds unused apt/pip de…
andrewjong Aug 22, 2026
4cacc81
chore(modules): re-pin asm_macvo to 06f3a8c8 — module now declares ri…
andrewjong Aug 22, 2026
8f26976
chore(license): relicense trunk to BSD-3-Clause-Clear; real maintaine…
andrewjong Aug 22, 2026
002dd23
fix(simple-sim): source ROS Jazzy, not Humble — sim never started sin…
andrewjong Aug 22, 2026
277b6eb
fix(tests): --stack accepts <name>[:<entry>] like the CLI; re-pin asm…
andrewjong Aug 22, 2026
c9bc2b4
chore(audit): delete rqt_behavior_tree — zero referrers after the GUI…
andrewjong Aug 22, 2026
c97e308
docs: versioned Release Notes replace CHANGELOG.md; docs-are-snapshot…
andrewjong Aug 22, 2026
385ca68
docs: deep standalone-snapshot audit — RFC scrub, motivation-first op…
andrewjong Aug 22, 2026
d4802e4
chore(audit): remove flagged leftovers — vestigial rqt trajectory sel…
andrewjong Aug 22, 2026
86da1f9
Bump version to 0.20.0-alpha.9
andrewjong Aug 22, 2026
298cb72
Bump version to 0.20.0-alpha.8
andrewjong Aug 22, 2026
5efa388
Release 0.19.0
andrewjong Aug 22, 2026
9104249
Release 0.19.0 (#397)
andrewjong Aug 22, 2026
84b15b9
Merge develop (Release 0.19.0) — keep the stack's 0.20.0-alpha.1
andrewjong Aug 22, 2026
a871838
docs(release-notes): record 0.19.0 — the versioned page now carries t…
andrewjong Aug 22, 2026
0a161dc
Merge develop (Release 0.19.0) — keep this branch's audit CHANGELOG a…
andrewjong Aug 22, 2026
06981aa
Merge rfc/s8-audit (develop release sync) — CHANGELOG stays deleted, …
andrewjong Aug 22, 2026
03ef065
fix(.env): restore the audited env comments and the 0.20.0-alpha.9 bump
andrewjong Aug 22, 2026
968d623
Merge pull request #388 from castacks/rfc/s1-observability-manifest
andrewjong Aug 24, 2026
bf0b12a
Merge pull request #389 from castacks/rfc/s2-module-cli-layers
andrewjong Aug 24, 2026
7759539
Merge pull request #390 from castacks/rfc/s3-stacks-wrap
andrewjong Aug 24, 2026
3e4e726
Merge pull request #391 from castacks/rfc/s4-optitrack-flatten-local
andrewjong Aug 24, 2026
54efefe
Merge pull request #392 from castacks/rfc/s5-macvo-flatten-split
andrewjong Aug 24, 2026
fe23f14
Merge pull request #393 from castacks/rfc/s6-fleets
andrewjong Aug 24, 2026
ce348c2
Merge pull request #394 from castacks/rfc/s7-catalog-role-removal
andrewjong Aug 24, 2026
7d27821
Merge develop (stack levels 1-7) — keep 0.20.0-alpha.8
andrewjong Aug 24, 2026
7d474a3
Merge pull request #395 from castacks/rfc/s8-audit
andrewjong Aug 24, 2026
86ea6ff
Merge pull request #396 from castacks/rfc/s9-docs-release-notes
andrewjong Aug 24, 2026
8e5e817
feat(gcs): auto-load NUM_ROBOTS-matched Foxglove layout — no manual i…
andrewjong Aug 24, 2026
2f11a8c
fix(bringup): loud AUTOLAUNCH FAILED banner instead of silent tmux pr…
andrewjong Aug 24, 2026
5d367c8
feat(sync): warn when airstack.yaml release: drifts off the .env VERS…
andrewjong Aug 24, 2026
bd6d546
feat(docs): modernize mkdocs-material theme with official CMU palette
andrewjong Aug 25, 2026
f358273
feat(cli): consolidate osmo/config/image commands into command groups
andrewjong Aug 25, 2026
5c0665f
fix(cli): config nucleus blank input no longer clobbers an existing t…
andrewjong Aug 25, 2026
e5889c0
feat(sim): airstack up --scene <shortname> — simulator-agnostic scene…
andrewjong Aug 25, 2026
d3e746a
feat(sim): Isaac follow-cam, spawn relocation, and scene light-boost …
andrewjong Aug 25, 2026
bfb17a9
feat(docs): redesign landing page around demonstrated pillars + live …
andrewjong Aug 25, 2026
a238c5a
docs: prefer airstack CLI flags over env vars in launch instructions
andrewjong Aug 25, 2026
d036a9c
feat(docs): release notes page shows only the docs version being viewed
andrewjong Aug 25, 2026
e5c6629
feat(sim): sim starts playing by default (PLAY_SIM_ON_START=true)
andrewjong Aug 25, 2026
45e2a65
fix(docs): hero no longer clips CTAs on short viewports
andrewjong Aug 25, 2026
fce0f4c
feat(docs): version selector shows release numbers, develop listed first
andrewjong Aug 25, 2026
383d344
fix(docs): prevent landing sections from overflowing on narrow screens
andrewjong Aug 25, 2026
02a12d5
feat(docs): shorten version selector titles to (stable)/(unstable)
andrewjong Aug 25, 2026
66e62ef
docs: Diátaxis documentation overhaul (#404)
andrewjong Aug 25, 2026
7ead8d8
fix(docs): search dropdown rendered behind nav tabs and version text
andrewjong Aug 25, 2026
e3baec7
docs: sync How-to Guides landing table with the current nav groups
andrewjong Aug 26, 2026
d4a04df
docs(skills): require branch + commit hash alongside timestamps in fe…
andrewjong Aug 26, 2026
6c0a4e7
feat(stacks): full_mighty reference stack + mighty module catalog ent…
andrewjong Aug 29, 2026
02f7660
fix(ci): un-red every PR — metrics-job deps and unit-test workflow en…
andrewjong Aug 29, 2026
c5fc15c
feat(orchestrator): poll a repos: list — one instance covers trunk + …
andrewjong Aug 29, 2026
270910a
Ci/trustworthy system tests (#403)
pvkumara Aug 29, 2026
24a80f7
docs(agents): module registration is TWO merges — registry PR must la…
andrewjong Aug 29, 2026
ff7c4c5
feat(ci): registry→trunk catalog sync automation + drift alarm (#408)
andrewjong Aug 29, 2026
c33f3f7
Release 0.20.0: switch pre-release terminology to -dev.N, single reva…
andrewjong Aug 29, 2026
aa2784c
Merge main into develop (ours): re-establish common ancestry for rele…
andrewjong Aug 29, 2026
cbdcd6d
Merge pull request #411 from castacks/sync/main-ancestry
andrewjong Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
72 changes: 38 additions & 34 deletions .agents/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,43 +7,39 @@ This directory contains Agent Skills following the [Agent Skills standard](https
```
.agents/
├── README.md # This file
└── skills/ # Agent Skills directory
├── add-ros2-package/
│ └── SKILL.md # Create new ROS 2 packages
├── add-task-executor/
│ └── SKILL.md # Implement a task executor as a ROS 2 action server
├── integrate-module-into-layer/
│ └── SKILL.md # Integrate modules into layer bringup
├── write-isaac-sim-scene/
│ └── SKILL.md # Create Isaac Sim simulation scenes
├── debug-module/
│ └── SKILL.md # Autonomous debugging strategies
├── update-documentation/
│ └── SKILL.md # Document modules and update mkdocs
├── test-in-simulation/
│ └── SKILL.md # End-to-end simulation testing
└── add-behavior-tree-node/
└── SKILL.md # Create behavior tree nodes
└── skills/ # One directory per skill
└── <skill-name>/
├── SKILL.md # YAML frontmatter + step-by-step instructions
└── assets/ # (optional) templates and reference files
```

## Skills Overview

Each skill is a directory containing a `SKILL.md` file with:
- **YAML frontmatter:** Name, description, license, metadata
- **Markdown body:** Step-by-step instructions for the workflow

### Available Skills
## Available Skills

| Skill | Purpose |
|-------|---------|
| [add-ros2-package](skills/add-ros2-package) | Create a new ROS 2 package for the autonomy stack |
| [add-task-executor](skills/add-task-executor) | Implement a task executor as a ROS 2 action server |
| [integrate-module-into-layer](skills/integrate-module-into-layer) | Integrate a module into layer bringup |
| [write-isaac-sim-scene](skills/write-isaac-sim-scene) | Create custom simulation environments |
| [debug-module](skills/debug-module) | Systematically debug ROS 2 modules |
| [update-documentation](skills/update-documentation) | Document modules and update mkdocs |
| [test-in-simulation](skills/test-in-simulation) | Test modules in Isaac Sim |
| [add-behavior-tree-node](skills/add-behavior-tree-node) | Create behavior tree nodes |
| [add-behavior-tree-node](skills/add-behavior-tree-node) | Create behavior tree nodes for high-level mission logic |
| [add-ros2-package](skills/add-ros2-package) | Create a new ROS 2 package (module) from the template |
| [add-task-executor](skills/add-task-executor) | Implement a task executor as a ROS 2 action server (`tasks/*`) |
| [add-unit-tests](skills/add-unit-tests) | Add co-located Python/C++ unit tests and register them for CI |
| [attach-gossip-payload](skills/attach-gossip-payload) | Broadcast custom ROS messages to peers via PeerProfile gossip payloads |
| [bump-version-and-release](skills/bump-version-and-release) | Bump `.env` VERSION + CHANGELOG to clear the version-check gate |
| [capture-discovered-knowledge](skills/capture-discovered-knowledge) | Persist hard-won discoveries to AGENTS.md or a skill |
| [configure-multi-robot](skills/configure-multi-robot) | Multi-robot setup, fleet-first: fleet files under `config/fleets/` (`--fleet`) primary; `NUM_ROBOTS` is the legacy homogeneous knob |
| [create-module](skills/create-module) | Author a thin module repo (module.yaml manifest, CI, test_stack) |
| [create-stack](skills/create-stack) | Create a stack folder: `airstack stack new`, wiring bootstrap, split stacks + bridge.yaml, doctor |
| [debug-module](skills/debug-module) | Systematic autonomous debugging of ROS 2 modules |
| [docker-build-profiles](skills/docker-build-profiles) | Build-time validation for Docker compose profiles and build args |
| [extract-module](skills/extract-module) | Extract an in-tree capability into a standalone module repo (TRUNK_REMOVAL.md pattern, sequencing rules, module CI) |
| [integrate-module-into-layer](skills/integrate-module-into-layer) | Integrate a module into a **stack** (stack entry include, canonical defaults, wiring.md regen, lint) — the layer-bringup workflow is legacy |
| [run-system-tests](skills/run-system-tests) | Run/extend the pytest system-test harness (marks, MetricsRecorder, /pytest) |
| [test-in-simulation](skills/test-in-simulation) | End-to-end module testing in Isaac Sim |
| [update-documentation](skills/update-documentation) | Document modules and update mkdocs navigation |
| [use-airstack-cli](skills/use-airstack-cli) | The `airstack` CLI and the non-interactive `docker exec` pattern |
| [use-feature-notebook](skills/use-feature-notebook) | Local notebook/ entry (design spec + results) for every feature |
| [visualize-in-foxglove](skills/visualize-in-foxglove) | Add topic visualization to Foxglove/GCS |
| [write-isaac-sim-scene](skills/write-isaac-sim-scene) | Create custom Isaac Sim scenes on pegasus_app |
| [write-launch-file](skills/write-launch-file) | Launch-file conventions: canonical-default topic args, ROBOT_NAME namespacing, single-locus rule |
| [write-mkdocs-documentation](skills/write-mkdocs-documentation) | Writing effective MkDocs documentation |

## Usage

Expand All @@ -62,12 +58,20 @@ When adding new skills:
2. Add `SKILL.md` with proper YAML frontmatter
3. Follow Agent Skills format specification
4. Reference related skills using relative paths (`../other-skill/`)
5. Update this README with the new skill
5. Update this README **and** the skills table in [AGENTS.md](../AGENTS.md)

Skills ship with the mechanism, not after it (RFC #379 §10): when a workflow
changes (e.g. layer bringups → stacks), update the affected skills in the same
PR as the machinery, or every agent session will faithfully reintroduce the
old pattern.

## References

- **Main Guide:** [AGENTS.md](../AGENTS.md)
- **Agent Skills Spec:** [https://agentskills.io](https://agentskills.io)
- **System Architecture:** [docs/robot/autonomy/system_architecture.md](../docs/robot/autonomy/system_architecture.md)
- **Interface Conventions Spec:** [docs/robot/autonomy/interface_conventions.md](../docs/robot/autonomy/interface_conventions.md)
- **Integration Checklist:** [docs/robot/autonomy/integration_checklist.md](../docs/robot/autonomy/integration_checklist.md)
- **AI Agent Guide:** [docs/development/ai_agent_guide.md](../docs/development/ai_agent_guide.md)
- **Stacks Guide:** [docs/development/stacks.md](../docs/development/stacks.md)
- **Modules Guide:** [docs/development/modules.md](../docs/development/modules.md)
- **AI Agent Guide:** [docs/development/advanced/ai_agent_guide.md](../docs/development/advanced/ai_agent_guide.md)
2 changes: 1 addition & 1 deletion .agents/skills/add-behavior-tree-node/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: add-behavior-tree-node
description: Create behavior tree nodes for high-level mission logic and decision-making. Use when implementing actions, conditions, or decorators for behavior trees. Covers BT node types, registration, and integration with behavior executive.
license: Apache-2.0
license: BSD-3-Clause-Clear
metadata:
author: AirLab CMU
repository: AirStack
Expand Down
49 changes: 28 additions & 21 deletions .agents/skills/add-ros2-package/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: add-ros2-package
description: Create a new ROS 2 package for the AirStack autonomy stack. Use when implementing a new algorithm module (planner, controller, perception, world model, behavior node). Covers package structure, CMakeLists.txt, package.xml, launch files, and configuration.
license: Apache-2.0
license: BSD-3-Clause-Clear
metadata:
author: AirLab CMU
repository: AirStack
Expand Down Expand Up @@ -354,33 +354,40 @@ Create `config/<package_name>.yaml` with default parameters:

### 8. Create Launch File

Create `launch/<package_name>.launch.xml` with topic remapping:
Create `launch/<package_name>.launch.xml` following the canonical module
launch pattern (RFC #379 §4 — see `.agents/skills/write-launch-file`):

```xml
<launch>
<!-- Launch arguments for topic remapping -->
<arg name="odometry_topic" default="/robot/odometry" />
<arg name="output_topic" default="/robot/cmd_vel" />
<arg name="config_file" default="$(find-pkg-share your_package_name)/config/your_package_name.yaml" />

<node pkg="your_package_name"
exec="your_node_name"
name="your_node_name"
output="screen">

<!-- Load parameters -->
<param from="$(var config_file)" allow_substs="true" />

<!-- Remap topics -->
<remap from="odometry" to="$(var odometry_topic)" />
<remap from="cmd_vel" to="$(var output_topic)" />
</node>
<!-- Prefixed, described args; defaults = the CANONICAL topic names -->
<arg name="your_module_odometry_topic" default="/$(env ROBOT_NAME)/odometry"
description="Input odometry (nav_msgs/Odometry)" />
<arg name="your_module_output_topic" default="/$(env ROBOT_NAME)/cmd_vel"
description="Output velocity command" />
<arg name="your_module_config"
default="$(find-pkg-share your_package_name)/config/your_package_name.yaml"
description="Node parameter YAML (loaded with allow_substs)" />

<group>
<!-- Bind the node's relative topic names to the declared args -->
<set_remap from="odometry" to="$(var your_module_odometry_topic)" />
<set_remap from="cmd_vel" to="$(var your_module_output_topic)" />

<node pkg="your_package_name"
exec="your_node_name"
name="your_node_name"
output="screen">
<!-- Load parameters -->
<param from="$(var your_module_config)" allow_substs="true" />
</node>
</group>
</launch>
```

**Key points:**
- Use `allow_substs="true"` to enable environment variable substitution in config files
- Define launch arguments for all topic names (enables flexible remapping)
- Declare a prefixed launch argument (with `description=`) for every topic endpoint, defaulting to the canonical name — never generic names like `config_file` (launch configurations leak across sibling includes)
- Use `set_remap` inside the module's group; module launch files never use `remap` tags — cross-module rewiring lives in the stack entry file (`stacks/<name>/launch/`), enforced by the single-locus lint (`tests/meta/test_launch_single_locus.py`)
- Use `$(var arg_name)` to reference launch arguments
- Use `$(env VAR_NAME)` for environment variables in configs

Expand Down Expand Up @@ -432,7 +439,7 @@ Build and test your package:

```bash
# From outside the container
AUTOLAUNCH=false airstack up robot-desktop
airstack up robot-desktop --no-autolaunch

# Build the specific package
docker exec airstack-robot-desktop-1 bash -c "bws --packages-select your_package_name"
Expand Down
24 changes: 11 additions & 13 deletions .agents/skills/add-ros2-package/assets/package_template/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,24 +184,24 @@ ros2 launch your_package your_package.launch.xml

# With custom config
ros2 launch your_package your_package.launch.xml \
config_file:=/path/to/custom/config.yaml
your_module_config:=/path/to/custom/config.yaml

# With topic remapping
# With custom topic wiring (prefixed args; in a stack these are include args)
ros2 launch your_package your_package.launch.xml \
odometry_topic:=/robot/custom_odom \
output_topic:=/robot/custom_output
your_module_odometry_topic:=/robot/custom_odom \
your_module_output_topic:=/robot/custom_output
```

### Integrated in Autonomy Stack

The module is automatically launched when the autonomy stack starts:

```bash
# Full autonomy stack
# Full autonomy stack (autolaunches by default)
airstack up robot-desktop

# Or with autolaunch
AUTOLAUNCH=true airstack up robot-desktop
# Or start idle and launch manually
airstack up robot-desktop --no-autolaunch
```

The module is integrated in: `<layer>_bringup/launch/<layer>.launch.xml`
Expand Down Expand Up @@ -254,7 +254,7 @@ airstack up isaac-sim robot
# Run test scenario...
```

See [test_in_simulation.md](../../.agents/skills/test_in_simulation.md) for detailed testing procedures.
See the [test-in-simulation skill](../../../test-in-simulation/SKILL.md) for detailed testing procedures.

## Visualization

Expand Down Expand Up @@ -351,8 +351,6 @@ Apache-2.0 (consistent with AirStack)
- **Maintainer:** Your Name (your.email@example.com)
- **Contributors:** List additional contributors here

## Changelog

### Version 0.0.1 (YYYY-MM-DD)
- Initial implementation
- TODO: Add changelog entries as the module evolves
<!-- No per-README changelog: change records live in the versioned Release
Notes (docs/release_notes/index.md); this README describes only the
current system. -->
Original file line number Diff line number Diff line change
@@ -1,68 +1,77 @@
<!--
your_package_name : canonical module launch file (RFC #379 §2/§4).

Conventions this template follows (see .agents/skills/write-launch-file):
- Every topic endpoint is a declared <arg> with a description= and a
default equal to the CANONICAL topic name (docs/robot/autonomy/
integration_checklist.md), so a bare include means "wired canonically".
- Args are PREFIXED with the module name (never generic names like
`config_file` or `namespace` — generic launch configurations leak
across sibling includes in the same launch scope).
- Wiring uses set_remap inside the module's namespace group. Module launch
files never use remap tags — cross-module rewiring lives in the stack
entry file (stacks/<name>/launch/), the single-locus rule enforced by
tests/meta/test_launch_single_locus.py.
-->
<launch>
<!-- ============================================ -->
<!-- Launch Arguments -->
<!-- Launch Arguments (all prefixed + described) -->
<!-- ============================================ -->

<!-- TODO: Add launch arguments for configurability -->

<!-- Input topics (for remapping) -->
<arg name="odometry_topic" default="/$(env ROBOT_NAME)/odometry"
description="Odometry input topic"/>
<arg name="sensor_topic" default="/$(env ROBOT_NAME)/sensors/data"
description="Sensor data input topic"/>

<!-- Output topics (for remapping) -->
<arg name="output_topic" default="/$(env ROBOT_NAME)/your_module/output"

<!-- TODO: rename the your_module_ prefix to your module name -->

<!-- Namespace -->
<arg name="your_module_namespace" default="your_module"
description="Namespace to run in"/>

<!-- Input topics -->
<arg name="your_module_odometry_topic" default="/$(env ROBOT_NAME)/odometry"
description="Input odometry (nav_msgs/Odometry)"/>
<arg name="your_module_sensor_topic" default="/$(env ROBOT_NAME)/sensors/data"
description="Input sensor data"/>

<!-- Output topics -->
<arg name="your_module_output_topic" default="/$(env ROBOT_NAME)/your_module/output"
description="Module output topic"/>

<!-- Configuration -->
<arg name="config_file"
<arg name="your_module_config"
default="$(find-pkg-share your_package_name)/config/template.yaml"
description="Path to configuration file"/>

<!-- Namespace -->
<arg name="namespace" default="your_module"
description="Namespace for the node"/>

description="Node parameter YAML (loaded with allow_substs)"/>

<!-- Other options -->
<arg name="enable_debug" default="false"
<arg name="your_module_enable_debug" default="false"
description="Enable debug mode"/>

<!-- ============================================ -->
<!-- Node Launch -->
<!-- ============================================ -->

<group>
<!-- Apply namespace -->
<push-ros-namespace namespace="$(var namespace)" />

<push-ros-namespace namespace="$(var your_module_namespace)" />

<!-- Bind the node's relative topic names to the declared args.
Sources are the names the node uses in code (relative, resolved in
its namespace); targets are the absolute arg values. -->
<set_remap from="odometry" to="$(var your_module_odometry_topic)" />
<set_remap from="sensor_data" to="$(var your_module_sensor_topic)" />
<set_remap from="output" to="$(var your_module_output_topic)" />

<!-- TODO: Replace with your package/node name -->
<node pkg="your_package_name"
exec="your_node_name"
<node pkg="your_package_name"
exec="your_node_name"
name="your_node_name"
output="screen">

<!-- Load parameters from config file -->
<!-- allow_substs="true" enables environment variable substitution -->
<param from="$(var config_file)" allow_substs="true" />
<param from="$(var your_module_config)" allow_substs="true" />

<!-- Override specific parameters from launch args -->
<param name="enable_debug" value="$(var enable_debug)" />

<!-- ======================================== -->
<!-- Topic Remapping -->
<!-- ======================================== -->

<!-- Remap input topics -->
<remap from="odometry" to="$(var odometry_topic)" />
<remap from="sensor_data" to="$(var sensor_topic)" />

<!-- Remap output topics -->
<remap from="output" to="$(var output_topic)" />

<!-- TODO: Add additional topic remappings as needed -->

<param name="enable_debug" value="$(var your_module_enable_debug)" />

</node>
</group>

</launch>
6 changes: 3 additions & 3 deletions .agents/skills/add-task-executor/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: add-task-executor
description: Implement a new task executor as a ROS 2 action server in AirStack. Use when adding a new goal-directed task (coverage, search, counting, trajectory following, etc.) that a user can trigger with parameters, monitor via feedback, and cancel. Reference implementation is random_walk_planner (ExplorationTask).
license: Apache-2.0
license: BSD-3-Clause-Clear
metadata:
author: AirLab CMU
repository: AirStack
Expand Down Expand Up @@ -260,9 +260,9 @@ int main(int argc, char* argv[]) {

Only switch to `MultiThreadedExecutor` if you have independent callbacks that genuinely need concurrent execution **and** all shared resources are thread-safe. Nodes that use OpenGL, CUDA, or other thread-affine resources **must** use `rclcpp::spin()` to keep callbacks serialized.

### 3. Add remap to bringup launch
### 3. Add remap in the stack entry file

In the layer bringup launch file (e.g., `global_bringup/launch/global.launch.xml`):
In the module's canonical launch file, declare the action endpoint as a topic arg with the canonical default; any deviation is wired in the stack entry file (e.g., `stacks/full_default/launch/stack.launch.xml` — the single-locus rule):
```xml
<remap from="~/your_task" to="/$(env ROBOT_NAME)/tasks/your_task_name" />
```
Expand Down
Loading
Loading