Skip to content

docs: Diátaxis documentation overhaul - #404

Merged
andrewjong merged 13 commits into
developfrom
feature/diataxis-docs-overhaul
Aug 25, 2026
Merged

docs: Diátaxis documentation overhaul#404
andrewjong merged 13 commits into
developfrom
feature/diataxis-docs-overhaul

Conversation

@andrewjong

Copy link
Copy Markdown
Member

Motivation

The docs site grew through the monolith→modular transition without an explicit information-architecture model. A full audit of all ~110 documents against the Diátaxis framework (classification of every page, mechanical verification against airstack.sh/.env/compose/pytest.ini/message packages) found five clusters of problems:

  1. Mislabeled taxonomy — the entire Development nav sat in "Beginner/Intermediate/Advanced Tutorials" buckets containing zero tutorials (difficulty is orthogonal to document kind).
  2. One canonical reference, decaying clones — topic tables, CLI flags, pytest marks, and hardware requirements each duplicated 3–4×, already drifted (phantom interface/cmd_vel, phantom --recreate flag, three-way requirements contradiction).
  3. A fossil stratum — orphaned/superseded pages (Ascent-era scene pipeline, pre-harness testing docs) still linked from live pages.
  4. Generated-looking filler presented as product — fabricated config examples, an rsync cookbook contradicting the real data-offloading tool, invented performance tables, a never-built Global-Manager protocol with live {==TODO==} markers.
  5. Missing on-ramps and reference surfaces — the Define module interfaces #1 "start here" hardware page was an explicit placeholder; no .env schema; no airstack_msgs docs (the doc standards themselves cited a message type that doesn't exist).

What changed (12 commits, intended for squash merge)

Commit Change
6d0bf18d 18 verified accuracy defects fixed (phantom flags/env vars/message types, dead paths, stale Foxglove step, requirements drift, OSMO positioning); interface spec → v1.0.1 (all 8 task_msgs actions)
31f2ffc2 Fossils removed with redirects (6 pages + 6 orphaned images); frame_conventions.md rewritten from live code (the map_FLU story matched nothing in the repo); git-hooks READMEs → deprecation notices
20a6b1f6 Orphaned knowledge surfaced into nav: vehicle.yaml/module.yaml schemas, calibration contract, RViz panel manuals, LiDAR filter README, OSMO lab-admin guide
6197dd8c Nav restructured into Diátaxis tabs — Tutorials / Concepts / How-to Guides / Reference — no file moves, all URLs preserved, ≤3-level depth restored; hub pages rewritten
d2dbe79c De-duplication to canonical homes (topic tables → interface spec; flags → CLI ref; marks → tests/README); MS-AirSim pair merged — both pages had the tmux ordering backwards (fixed from entrypoint.sh)
25ccbd84 Hybrid pages split by audience: system_architecture (643→375 lines, invented perf tables gone), CI/CD → + Using CI how-to, Foxglove → + Extending the Visualizer, Isaac docker → + Container Workflows
1b988c99 Fiction/filler rewritten from code (−600 lines): global-planning protocol, robot-interface state path (odometry_conversion), robot configuration, HITL (now uses the gcs-real hitl profile + Foxglove verification), data-offloading fork resolved; 6 layer-index stubs filled
4c3ccf3d New reference/onboarding docs: complete .env schema, airstack_msgs reference, trajectory-library YAML format, platform matrix, Deploy to Hardware tutorial, Operating the GCS
65e3930d Standards adopt Diátaxis (decision tree in the Documentation Guide + both mkdocs skills); VERSION → 0.20.0-alpha.15 + release-notes entry
c98a3d1e Six how-to guides (state estimator, world-model+planner, coordination algorithm — new Autonomy group — custom stack, vehicle/platform, coding agents via notebooks), each with the in-tree vs module create --in-tree scaffolding choice; Concepts tab moved after Tutorials; UE-export tutorial refreshed (new video, Z-up/meters, Decals warning)
d73d44e7 Five beginner tutorials completing the learning path (GCS mission, parameter loop, first module, first fleet, own scene — several steps executed to verify, incl. the module scaffold and fleet validation); Adding a Controller how-to (verified trajectory_controller → pid_controller → interface chain)
ba943255 Tutorials use airstack connect instead of docker exec one-liners (agent docs keep the non-interactive idiom deliberately)

Validation

  • mkdocs build --strict passes after every commit and at HEAD; mkdocs-redirects entries cover all removed URLs.
  • Regression greps for all 18 audited defects return zero hits.
  • Version gate: VERSION bumped 0.20.0-alpha.14 → 0.20.0-alpha.15 (regex-validated against check-version-increment), release notes updated under 0.20.0 (Unreleased).
  • Several tutorial steps were executed, not just read: the module scaffold was generated for ground truth (its launch stub's double-namespace gotcha is documented and handled), the two-robot fleet YAML validated via resolve_fleet.py, the scene-catalog resolution check run for real.

Maintainer decisions made (please sanity-check)

  1. OSMO positioning: local Linux+GPU remains the golden path; OSMO reframed as the recommended remote path.
  2. Requirements canonicalized: RTX 3070 min / 4080+ recommended; ~25 GB images with 100 GB free disk recommended; Ubuntu 22.04/24.04.
  3. Task-action canon: the 8 task_msgs actions, with honest implementation status (spec §8 and tasks.md now agree).
  4. about.md platform list: Xavier NX / TX2 removed (no repo evidence); Orin + VOXL 2 per compose profiles.

Follow-ups (out of scope, flagged)

  • Code: airstack config git-hooks (config.sh:86-122) still installs the docker-versioning hook that the semver gate rejects — small CLI removal PR recommended (READMEs now warn).
  • tools/gen_docs_catalog.py template polish (dedupe the per-page compat explainer; contextualize registry notes).
  • Standalone architecture-decision Concept pages (containers/replicas rationale, build-system design).
  • Upstream gaps found: PlanToWaypoint.srv missing from rosidl_generate_interfaces (never built); pid_controller has no README; the Foxglove robot-commands panel lacks the RViz panel's airborne gating (documented accurately).

🤖 Generated with Claude Code

andrewjong and others added 13 commits August 25, 2026 18:01
Point fixes from the Diátaxis docs audit (notebook 006), each verified
against the code before editing:

- CLI reference: remove phantom --recreate, add real --scene flag
- robot/docker: ROBOT_LAUNCH_PACKAGE/FILE -> real LAUNCH_PACKAGE var
- Replace nonexistent airstack_msgs types (TrajectorySegment,
  TrajectoryOverride) with TrajectoryXYZVYaw in doc standards, AGENTS.md
- Fix dead local/c_controls path -> local/controls (AGENTS.md, agent guide)
- pegasus_scene_setup: .env snippet now matches actual .env defaults
- scenes.md: fetch_scene.sh example uses a real key (blocks)
- Testing docs: add missing wiring/waypoint_flight marks; drop false
  'autonomy mark unregistered' troubleshooting row
- Getting Started: Move Robot step updated to the auto-seeded Foxglove
  layout flow (+ host port 8766 note); requirements canonicalized
  (RTX 3070 min / 4080 rec, 100GB free disk, Ubuntu 22.04/24.04) and
  aligned in docs/README.md and about.md
- OSMO positioning reconciled: recommended REMOTE path; local Linux+GPU
  remains the golden path
- tasks.md + interface conventions spec reconciled to the eight
  task_msgs actions (spec bumped to v1.0.1 per its changelog rules)
- perception index outputs corrected to spec (odometry_conversion/odometry)
- exploration README: fix random-walk copy-paste; vscode_debug:
  per-container .devcontainer layout; docker_usage: retire pre-harness
  'Automated Testing' section, fix subnet, drop dead Isaac streaming refs
- Remove deprecated Ascent extension from simulation Getting-Started list

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deletes the superseded/orphaned stratum found by the audit:
- docs/tutorials/index.md (zero inbound links; duplicate of
  tutorials_reference.md)
- docs/development/development_environment.md and
  docs/development/airstack-cli/index.md (stale orphaned twins of the
  in-nav beginner/ versions)
- docs/development/intermediate/testing/testing_frameworks.md
  (pre-harness taxonomy, broken example; inbound links repointed)
- docs/simulation/isaac_sim/scene_setup.md and
  ascent_sitl_extension.md (Ascent-era pipeline; nav entry removed)
  plus six images referenced only by them

frame_conventions.md rewritten from live facts: the world->map static
identity TF in autonomy_bringup robot.launch.xml and the canonical TF
table in the interface conventions spec. (scene_setup's map_FLU
90-degree-rotation story matched nothing in the code.)

mkdocs-redirects entries added for all six removed URLs. git-hooks
READMEs rewritten as deprecation notices: the docker-versioning hook
writes a commit hash into .env VERSION, which the semver
check-version-increment gate rejects; note left that
'airstack config git-hooks' still installs it (CLI removal is a
follow-up code change).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds seven documents that existed only as off-site READMEs to
mkdocs.yml (served via the same-dir plugin, like the stack READMEs):

- config/vehicles/README.md — the vehicle.yaml schema (fleets.md now
  links it relatively instead of via GitHub URL)
- config/local/README.md — the CALIBRATION_DIR unit-calibration contract
- common/module_schema/README.md — the authoritative module.yaml
  field/validation reference, under the Modules section
- robot/ros_ws/src/sensors/lidar_point_cloud_filter/README.md — the
  only full-quality robot package README that was not in nav
- common/ros_packages/gui/rviz/rviz_tasks_panel/README.md and
  3d_waypoint_rviz2_plugin/README.md — operator manuals for the task
  and waypoint panels
- osmo/README.md — the OSMO lab-admin half of the OSMO story,
  complementing the student tutorial

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mkdocs.yml nav reorganized into Tutorials / How-to Guides / Reference /
Concepts tabs (plus Home, Release Notes, About), with product areas as
second-level groups inside each tab. No files move — nav labels only —
so every page keeps its URL. This also restores the repo's own 3-level
nav-depth rule (the old Robot tree reached 5 levels).

The mislabeled Beginner/Intermediate/Advanced 'Tutorials' buckets are
gone: the Development section contained zero tutorials (all how-to,
reference, and explanation content, now filed by type).

Two hub pages rewritten for the new shape:
- getting_started/tutorials_reference.md — quadrant-honest 'What Next'
  page (by-goal table + persona paths) replacing the level-labeled
  catalog that called reference/explanation pages tutorials
- development/index.md — How-to Guides landing (guide groups + the
  handful of daily commands, deferring tables to the CLI reference)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One canonical home per fact; clones replaced with links (net -131 lines):

- Topic/interface tables -> interface_conventions.md spec:
  robot/index.md keeps 3 labeled examples; integration_checklist.md's
  ~110-line drifted reference block (incl. nonexistent interface/cmd_vel)
  replaced with deep links into spec sections (anchors verified against
  the rendered toc)
- airstack up flags -> CLI reference: docker_usage, key_concepts, and
  the Getting Started launch tail keep 2-3 examples + a link
- pytest marks -> tests/README.md: testing/index.md table replaced with
  a summary + link; ci_cd.md keeps its table for the CI-cost narrative
  but now cites tests/README.md as authoritative
- scene_prep.py helpers -> spawning_drones.md (richer copy); pegasus
  page links it via a stable {#scene-prep-helpers} anchor
- modular_airstack.md: duplicated setup section replaced with its own
  prerequisite pointer; redundant -f docker-compose.modules.yaml flag
  removed (airstack.sh auto-includes it, verified cmd_up/cmd_down)
- MS-AirSim pair merged: index.md owns overview/quickstart/settings/
  topics/user troubleshooting; docker.md owns container internals.
  Ground truth from entrypoint.sh: BOTH pages had the tmux ordering
  backwards (bridges are windows 1..N, PX4 N+1..2N, named
  robot_<i>_bridge / robot_<i>_px4); port table corrected to
  4560+i / 24540+i / 24580+i per settings.json.j2, and the wrong
  MAVLink-port troubleshooting bullet fixed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Four splits from the audit's Phase-3 list (originals keep their URLs;
new pages added to nav):

- system_architecture.md (643 -> ~375 lines): keeps the explanation
  core (node types, task cascade, layer table, communication patterns,
  multi-robot); per-layer topic lists (a drifted 4th copy of spec data)
  replaced with layer-index + spec links; the data-flow diagram now
  matches the real action cascade (results return to the action client,
  not a Behavior node); invented Performance Characteristics deleted;
  integration guidelines deferred to the checklist
- ci_cd.md -> ci_cd.md (maintainer explanation: architecture, cache,
  security, pod anatomy) + NEW using_ci.md (developer how-to:
  triggering, /pytest syntax, marks/cost, reading results,
  user-facing troubleshooting); 18 absolute blob/main links converted
  to relative
- foxglove.md -> operator page + NEW extending_foxglove.md (the 6-step
  marker-type recipe and visualizer-source guidance)
- isaac_sim/docker.md (459 -> 193 lines, pure container reference) +
  NEW container_workflows.md (launch modes, credentials, access,
  dev workflow, image management, troubleshooting); verbatim compose
  quoting trimmed to excerpts; two placeholder sections folded away

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rewrites of pages whose content was fictional, generic filler, or
contradicted the code (net -600 lines of invented material):

- global/planning/index.md: never-built Global-Manager/PlanRequest
  protocol (live TODO markers included) replaced with the shipped
  architecture: task-executor action servers -> global_plan handoff,
  verified against tasks.md, spec sections, and both planner sources
  (toggle attributed only to exploration — random_walk declares the
  remap but never serves it)
- interface/index.md: hotlinked placeholder diagram replaced with a
  verified mermaid of the real command/state flow; State section
  corrected — canonical odometry + map->base_link TF come from the
  odometry_conversion node, not RobotInterface; both TODOs gone
- configuration/index.md (369 -> 96 lines): fabricated config YAML,
  invented validation script, and generic Linux/Jetson sections
  deleted; keeps verified stack selection, env vars, identity pointer,
  and a new where-config-actually-lives table
- rosbags.md (210 -> 86): generic ros2-bag tutorial cut to a link;
  fake bag-info output removed; BAG_STORAGE_PATH documented
- logging/data_offloading.md (323 -> 23): gutted to a pointer at the
  real storage-tools workflow with one honest rsync one-liner using
  real bag paths (the old /opt/airstack paths exist nowhere)
- HITL/index.md rewritten for the current stack: gcs-real hitl
  profile, l4t launch, domain-ID alignment and fastdds.xml, honest
  unverified-caveats for cross-machine DDS and sim-SITL FCU paths,
  Foxglove-based verification (RViz-era steps gone)
- Six layer-index stubs filled to a uniform template (role, child
  links, stack-launch note, spec-linked interchanges): autonomy front
  door, local, global, global/world_model, static_transforms,
  behavior (first paragraph no longer contradicts the page)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New documents for surfaces that had none, every claim verified in code:

- Environment Variables reference (docs/robot/configuration/
  environment_variables.md): the complete .env schema — every
  uncommented var with default and verified consumer, plus the
  variables exported by airstack up flags and the notable optional vars
- airstack_msgs README (nav-linked under Reference -> Interfaces): all
  10 messages + 4 services with field tables; unused types marked
  'defined; no trunk consumer' honestly; found PlanToWaypoint.srv is
  not in rosidl_generate_interfaces (never built) — documented as such
- trajectory_library README (replaces the 6-line in-nav TODO stub):
  classes, the YAML config schema from the parser (degrees conversion,
  $(param) substitution), real config excerpts; corrects the
  assumption that droan_gl loads the YAML (it only links the classes)
- Supported-platform matrix (docs/real_world/supported_platforms.md):
  honest statuses — CI-tested only for desktop x86 sim; Orin
  field-used per install guide; VOXL 'profile exists, docs in progress'
- Deploying to Hardware rewritten from its TODO skeleton into a real
  8-step tutorial (identity, FCU serial, stack choice, props-off bench
  test, HITL rehearsal, first-flight checks) with per-step checks and
  hardware-verify notes where the repo can't confirm specifics; nav
  entry promoted to the Tutorials tab
- Operating the GCS (rewrites the 23-line user_interface.md stub):
  panel walkthrough verified from the seeded layout JSON and the
  robot-commands extension bundle (7 task tabs; explicitly notes the
  Foxglove panel lacks the RViz panel's airborne gating)
- robot/docker/index.md base-image rows updated to current compose
  values (ubuntu24.04 / dustynv jazzy r36.4.0)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Updates the doc-authoring standards so the new structure stays clean:

- documentation.md: the three-type taxonomy (Tutorials/Guides/Reference)
  replaced with the four Diátaxis quadrants plus a decision tree for
  choosing the kind of a new page; package READMEs stay exempt
  (intentionally all-in-one)
- contributing.md: Documentation section now names the quadrant rule
  and links the decision tree; docs commands unified on airstack docs
- write-mkdocs-documentation skill: the beginner/intermediate/advanced
  organization pattern (the root cause of the old mislabeled nav)
  replaced with the quadrant-tab layout; nav example updated
- update-documentation skill + AGENTS.md: mkdocs nav examples updated
  to the new Reference -> Autonomy Packages shape; AGENTS.md points at
  the decision tree

Release flow per bump-version-and-release: VERSION 0.20.0-alpha.14 ->
0.20.0-alpha.15 (regex-validated), with a Documentation Overhaul entry
added to the 0.20.0 (Unreleased) release-notes section summarizing the
restructure, the 18 accuracy fixes, removals/redirects, rewrites,
splits, newly surfaced references, and the interface-spec v1.0.1 bump.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New guides (every command/topic verified in code, each offering the
in-tree package vs 'airstack module create --in-tree' scaffolding
choice per the module workflow):

- Adding a State Estimator (perception): conform to spec §2, swap via
  the interface_odometry_in_topic launch arg in a stack entry (the
  odometry_conversion node owns the canonical topic and map->base_link
  TF, launched unconditionally); asm_macvo as the module precedent
- Adding a Planner: local (DROAN pattern, §5 surface; verified swap
  example from full_droan_cpu) and global (task-executor pattern,
  random_walk); flight verification via -m waypoint_flight since
  -m autonomy never exercises tasks/navigate
- Creating a Multi-Agent Coordination Algorithm: gossip/PeerProfile bus
  (peer_registry over raw /gossip/peers, QoS verified), honest
  platform-gaps section from the coordination README
- Creating a Custom Stack Topology: airstack stack new -> entry-file
  wiring (single-locus) -> modules.repos pins -> wiring regen ->
  doctor/wiring-mark validation; splits deferred to lite_offload_global
- Adding a Vehicle Type, Unit, or Platform: vehicle.yaml (quad_default
  example, honest sim pass-through note), calibration overlay units,
  compute-platform compose/build chain (l4t precedent, CI-untested)
- Getting the Most out of Your Coding Agent: design-spec-first notebook
  workflow, skill-directed prompting, lettered results artifacts,
  capture-discovered-knowledge loop

Nav: new How-to -> Autonomy group (also absorbs Integration Checklist
and Coordination Payloads); Create a Custom Stack under Modules &
Stacks; vehicle guide under Robot & Field; coding-agent guide under
Contributing. Concepts tab moved directly after Tutorials (conceptual
grounding before task recipes).

UE->Isaac export tutorial refreshed: new walkthrough video
(cMjO7Sb7Zmo), instruction to export Z-up with scale in meters (unlike
the video), and a warning that UE Decals (paint markings, dirt,
puddles) do not export — bake them into textures instead.

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

New tutorials completing the Tutorials tab learning path (Get AirStack
Flying -> GCS mission -> parameter loop -> modular walkthrough -> first
module -> first fleet -> own scene -> hardware), each a single golden
path with per-step checks, every command verified (several executed):

- Fly a Mission from the GCS: takeoff, waypoints, geofence, Navigate,
  land, save (panel names/defaults verified against the extension
  bundle; honest no-obstacles note for the default scene)
- Change a Parameter: takeoff_velocity edit -> relaunch -> observe;
  verified that config YAML is symlink-installed from the bind-mounted
  source so NO rebuild is needed, and the code path that makes the
  panel's velocity=0 fall back to the config value
- Write Your First Module: ran the actual scaffold for ground truth;
  handles the scaffold stub's double-namespace gotcha (robot.launch.xml
  already pushes the ROBOT_NAME namespace)
- Your First Fleet: two-robot fleet YAML validated with
  resolve_fleet.py; documents the real per-robot tab / Robot-field
  targeting mechanics from render_layout.py
- Build and Fly Your Own Scene: no-UE golden path (GUI stage ->
  scenes.yaml entry -> --scene flight -> baked contained scene.usd);
  the catalog-resolution check was actually executed

How-to guides:
- NEW Adding a Controller: verified chain trajectory_controller
  tracking_point -> pid_controller -> interface/cmd_roll_pitch_
  yawrate_thrust; Path A (swap the feedback controller) vs Path B
  (take over the full spec-§5 surface, obligations enumerated);
  flight-test marks chosen for what each actually exercises
- Adding a Planner renamed/expanded to Adding a World Model and
  Planner: local world-model+planner matched pairs (disparity pipeline
  worked example; full_droan_cpu swaps the pair together) vs the
  spec'd §3 global map interchange; new Path C

Nav: Tutorials tab reordered to the learning path; Autonomy group gains
Add a Controller and the renamed guide. What-Next hub lists the
sequence. Release notes updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Human-facing tutorials now teach the human workflow: hop into the
container with 'airstack connect robot-desktop' (attaches to the
container's tmux session; new shell window with Ctrl-b c, detach with
Ctrl-b d) and run bws/sws/ros2 commands interactively, instead of
docker exec bash -c one-liners. Applies to first_module.md and
change_a_parameter.md (5 spots). Host-side 'docker logs' checks stay,
noted as the tmux-mirror view. The non-interactive docker exec pattern
remains, deliberately, in the agent-facing docs
(working_with_coding_agents.md, AGENTS.md).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@andrewjong
andrewjong merged commit 66e62ef into develop Aug 25, 2026
2 of 4 checks passed
@andrewjong
andrewjong deleted the feature/diataxis-docs-overhaul branch August 25, 2026 23:41
andrewjong added a commit that referenced this pull request Aug 28, 2026
…y impact

airstack-paper now sits on develop @ d4a04df (modular restructure +
Diátaxis docs overhaul, PR #404 — closing the merge-not-recorded gap
in §Campaigns). Direction log notes the lead's flag: the restructure
will impact the agent study and may impact its numbers — pins and
judge budgets predate it, so a re-pin means a new campaign id.
Commit hashes cited in the log re-mapped to their rebased values.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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