feat(simulation): qualify D-only stock rover smoke

This commit is contained in:
DCCONSTRUCTIONS
2026-07-24 16:51:39 +03:00
parent 81761067e9
commit 6290fcb2ce
8 changed files with 545 additions and 60 deletions
+28 -12
View File
@@ -51,11 +51,14 @@ accepted navigation behavior, safety behavior or real actuator control.
Polygon is now a parallel product branch. As of this document:
- P0 architecture and SRS are being committed;
- P0 architecture and SRS are committed on the Polygon branch;
- SIM S0 has a strict candidate qualification profile and read-only doctor;
- no target-worker S0 evidence has been admitted;
- PX4/Gazebo/ROS 2/Nav2 have not been installed or accepted by this repository;
- no stock rover run has been accepted;
- the dedicated D-only worker distribution has been created and the candidate
PX4/Gazebo/ROS 2/Nav2 stack has been installed without using Docker;
- PX4 v1.17.0 and the stock Ackermann rover have completed repeated factual
smoke runs with ROS 2 vehicle status, Gazebo clock and clean shutdown;
- the complete digest-bound S0 evidence manifest has not been admitted;
- pause/step/speed and accepted 1×/2× resource evidence remain open;
- `actuator_authority=false`;
- `navigation_or_safety_accepted=false`.
@@ -369,7 +372,8 @@ incompatible.
The S0 candidate line is:
- Windows 11 AI worker;
- WSL2 Ubuntu 24.04;
- dedicated `MissionCore-Sim` WSL2 Ubuntu 24.04 distribution physically on D;
- no Docker dependency in S0, so active shared Docker co-tenants remain untouched;
- ROS 2 Jazzy;
- Gazebo Harmonic;
- PX4 Autopilot v1.17.0;
@@ -378,9 +382,10 @@ The S0 candidate line is:
- Nav2 Jazzy;
- PX4 Gazebo stock rover models.
The exact source commits already resolved in the candidate profile do not become
accepted merely because they are present. ROS/Gazebo package versions and every
candidate build remain pending target-worker qualification.
The exact source commits and package versions are resolved in the candidate
profile. Target installation, PX4 build, DDS telemetry and repeated stock-rover
smoke evidence now exist, but components do not become `accepted` until the
remaining S0 behavior/resource cases and digest-bound evidence generation pass.
S1 uses direct exact `px4_msgs` integration. The experimental
`px4-ros2-interface-lib` is evaluated later and is not on the S1 critical path.
@@ -390,8 +395,9 @@ S1 uses direct exact `px4_msgs` integration. The experimental
All mutable worker bytes must be physically placed under
`D:\NDC_MISSIONCORE`, including:
- WSL distribution/VHD;
- Docker data and images;
- the dedicated `MissionCore-Sim` WSL distribution/VHD;
- Docker data and images if a later profile elects to use containers; the S0
profile explicitly does not;
- sources and build products;
- package/model caches;
- runtime and logs;
@@ -402,6 +408,13 @@ The WSL view is `/mnt/d/NDC_MISSIONCORE`. C-drive placement is a blocking
failure. S0 requires at least 300 GiB free before installation and a stop-below
threshold of 200 GiB. Full external datasets are out of S0 scope.
S0 runtime processes execute in a new loopback-only Linux network namespace.
Micro XRCE-DDS Agent v2.4.3 has no address-selection flag and therefore binds
UDP wildcard inside that namespace; the namespace contains only `lo`, so the
effective exposure remains loopback-only. ROS domain 0 is isolated by the same
boundary. This distinction is part of the port evidence and must not be
misreported as a host-wide `127.0.0.1` bind.
## 16. Delivery plan
| Phase | Estimate | Exit condition |
@@ -435,7 +448,10 @@ Implementation cards follow this order:
SIM S0 requires all of the following factual evidence:
- worker inventory;
- physical D-only placement, including WSL and Docker VHD;
- physical D-only placement of the dedicated WSL VHD, sources, builds, caches
and artifacts;
- confirmation that S0 uses the dedicated D-only WSL and does not use the
existing C-backed Docker Desktop runtime;
- exact component/package pins and licenses;
- one stock PX4 rover launch;
- ROS 2 telemetry;
@@ -444,7 +460,7 @@ SIM S0 requires all of the following factual evidence:
- clean stop with no orphan processes;
- 1× resource baseline;
- 2× resource baseline;
- explicit `GO`, `PAUSE` or `BLOCKED` report.
- explicit `GO`, `INCOMPLETE` or `BLOCKED` report.
The repository profile and doctor implement preflight and evidence admission.
They do not install packages, start processes, open ports or write a target
@@ -44,13 +44,20 @@ reports easy to misuse.
9. Source-of-record, derived artifacts and presentation state remain separate.
Reset creates a new immutable run/episode.
10. Ground truth is evaluator-only and is not visible to perception or planning.
11. SIM S0 targets the reviewed Windows 11/WSL2 AI worker with all mutable bytes
physically under `D:\NDC_MISSIONCORE`.
12. S1 uses exact `px4_msgs` directly. The experimental
11. SIM S0 targets the reviewed Windows 11 worker through a dedicated
`MissionCore-Sim` WSL2 Ubuntu 24.04 distribution physically under
`D:\NDC_MISSIONCORE`.
12. SIM S0 does not depend on the existing Docker Desktop runtime. Its WSL
backend is C-backed and currently serves unrelated co-tenants.
13. S1 uses exact `px4_msgs` directly. The experimental
`px4-ros2-interface-lib` is not a mandatory S1 dependency.
13. A top-level Polygon UI is gated on accepted contracts and a proven S1
14. A top-level Polygon UI is gated on accepted contracts and a proven S1
backend lifecycle with persisted run history.
14. Real actuator authority requires a new decision and physical safety gate.
15. Real actuator authority requires a new decision and physical safety gate.
16. S0 processes run inside an ephemeral loopback-only Linux network namespace.
Micro XRCE-DDS Agent's UDP wildcard bind is acceptable only inside that
boundary; no S0 listener may be reachable from the worker LAN or Windows
host network.
## Consequences
@@ -67,7 +74,7 @@ reports easy to misuse.
## First implementation
The first implementation is deliberately read-only:
The qualification doctor is deliberately read-only:
- `simulation/s0/qualification-profile.yaml` is the candidate stack,
storage, clock, authority, port and process contract.
@@ -77,6 +84,12 @@ The first implementation is deliberately read-only:
starting or modifying anything.
- MISSIONCOR-40 tracks factual worker qualification.
The first target bootstrap also includes `simulation/s0/worker-smoke.sh`. It
creates the reviewed loopback-only namespace, starts only the pinned stock-rover
providers, observes ROS 2 vehicle status and Gazebo clock, requests PX4 shutdown,
checks for owned-process residue and writes D-only factual artifacts. It never
arms the vehicle or sends an actuator command.
The doctor reports `INCOMPLETE` until it is running on the reviewed target with
resolved/accepted pins and all required evidence. It cannot infer `GO` from the
repository state.
@@ -0,0 +1,126 @@
# Lab 006: SIM S0 worker bootstrap and stock-rover smoke
Date: 2026-07-24 (Europe/Moscow).
## Scope
The reviewed Windows 11 AI worker received a dedicated Docker-free
`MissionCore-Sim` WSL2 Ubuntu 24.04 distribution physically stored at
`D:\NDC_MISSIONCORE\simulation\wsl\MissionCore-Sim`. Source, build, cache,
runtime, artifacts and datasets are all under the same D-only root. Existing
Docker Desktop co-tenants were inventoried but not stopped, reconfigured or
used.
This lab grants no real or simulated actuator authority. Every smoke run kept
`actuator_authority=false`; it observed the stock rover while disarmed.
## Redacted worker inventory
- Windows 11 Pro, build 26200;
- WSL2 kernel `6.18.33.1-microsoft-standard-WSL2`;
- Ubuntu 24.04.4 LTS, x86_64;
- 13th Gen Intel Core i9-13900KF, 32 WSL-visible logical CPUs;
- 50,427,760,640 WSL-visible RAM bytes and 12,884,901,888 swap bytes;
- NVIDIA GeForce RTX 4090, driver 610.47, 24,564 MiB VRAM;
- D capacity 2,000,381,014,016 bytes;
- D free after bootstrap and builds: 392,758,685,696 bytes.
The remaining D capacity is above the 300 GiB S0 start threshold and 200 GiB
stop threshold. This does not waive continuous disk monitoring.
## Installed candidate generation
- ROS 2 Jazzy `ros-base=0.11.0-1noble.20260616.084325`;
- `ros-gz=1.0.22-1noble.20260616.074726`;
- Gazebo Harmonic `1.0.0-1~noble`, Gazebo Sim `8.14.0-1~noble`,
SDFormat `14.9.0-1~noble`;
- PX4 Autopilot v1.17.0 commit
`d6f12ad1c4f70ad3230afd7d86e971421e02fef4`;
- `px4_msgs` v1.17.0 commit
`86d8239e962f6939e05c3737784f60c02fa884db`;
- PX4 Gazebo models commit
`b6127f4ec20de867e215fb5f78ae88b80f371909`;
- Micro XRCE-DDS Agent v2.4.3 commit
`73622810d984349b80bbac0ef55fc0b694d62222`;
- Nav2 `navigation2=1.3.12-1noble.20260615.181551` and
`nav2-bringup=1.3.12-1noble.20260616.082701`.
PX4 SITL and `px4_msgs` were built successfully from the pinned D-only source.
The Micro XRCE-DDS Agent was built from source and installed under the D-only
runtime root. Nav2 is installed but has not yet passed an S2 navigation case.
## Observed smoke result
Two consecutive canonical runs and one preliminary resource run passed:
- `20260724T134400Z-stock-rover`;
- `20260724T134600Z-stock-rover-repeat`;
- `20260724T135000Z-stock-rover-baseline`.
The final smoke-script generation also passed as
`20260724T135800Z-stock-rover-final` and added a runtime listener inventory plus
the point resource snapshot.
Each run started PX4 v1.17.0 with Gazebo world `rover` and model
`rover_ackermann_0`, established a Micro XRCE-DDS session, observed
`/fmu/out/vehicle_status_v1`, observed Gazebo `/clock`, requested PX4 shutdown
and found no owned runtime residue. The captured vehicle state was disarmed,
`failsafe=false`, with pre-flight checks passing.
Each provider set ran inside a new Linux network namespace containing only
`127.0.0.1` and `::1`. The Agent's UDP `0.0.0.0:8888` bind was therefore
effective only inside that loopback boundary. No PX4, Gazebo or Agent service
was exposed to the LAN.
The two canonical artifact directories are 68 KiB each. The preliminary
resource run completed in 38.75 seconds. One point sample observed approximately
202 MiB RSS for headless Gazebo, 19 MiB for PX4 and 17 MiB for the Agent. The
worker GPU was already occupied by unrelated co-tenants; no S0 GPU allocation
was attributable in this headless run. These point observations are not the
accepted 1× or 2× resource baselines.
## Diagnostics retained
Earlier bootstrap attempts remain outside Git under the D-only artifact root:
- one check raced the asynchronous DDS connection even though the session
subsequently established;
- one used an unsupported ROS 2 Jazzy long option;
- one used ROS domain 42 while PX4 v1.17.0 published on domain 0.
The smoke contract now waits for the Agent session plus the PX4
`vehicle_status_v1` writer, uses Jazzy `topic list -t`, and relies on the
loopback-only namespace to isolate domain 0.
An initial malformed interactive log repeatedly captured PX4 terminal repaint
output and reached approximately 1.1 GiB. That generated diagnostic artifact
was removed, then the case was rerun non-interactively; the valid standalone
PX4 log was approximately 8 KiB.
## Target doctor
The exact candidate profile was executed through the read-only doctor inside
`MissionCore-Sim`. Profile SHA-256:
`70bf0df44c85dd57eb3cedb98a474a46ba498c6ffc60ce0d8a06829e28587df1`.
Target identity, authority, clock, port/process registries, all seven D-only
mutable roots, the disk threshold and all eight required executables passed.
Version acceptance and the nine-item digest-bound evidence set remain
incomplete, so the doctor correctly returned `INCOMPLETE`.
## Verdict
`INCOMPLETE`.
Worker compatibility, D-only placement, exact candidate pins, PX4 build,
stock-rover launch, DDS telemetry, authoritative clock observation and repeated
clean lifecycle are factually proven. S0 still requires:
- pause/resume and deterministic single-step evidence;
- 1× speed/real-time-factor acceptance;
- isolated 2× resource/coexistence baseline;
- a complete digest-bound evidence manifest;
- final `GO`, `INCOMPLETE` or `BLOCKED` decision.
This lab does not accept Nav2 behavior, navigation safety, real-time guarantees,
or real actuator control.
+31 -4
View File
@@ -5,11 +5,17 @@ real vehicle control or a `GO` verdict by itself.
## Safety and placement
- Target: reviewed Windows 11 worker with WSL2 Ubuntu 24.04.
- Target: reviewed Windows 11 worker with the dedicated `MissionCore-Sim` WSL2
Ubuntu 24.04 distribution physically installed on D.
- All mutable bytes must be under `D:\NDC_MISSIONCORE`.
- Do not place a WSL distribution, Docker VHD, source, build, cache, log, bag,
ULog, Gazebo artifact or dataset on C.
- Do not place a WSL distribution, source, build, cache, log, bag, ULog,
Gazebo artifact or dataset on C.
- Do not use or reconfigure the existing Docker Desktop runtime in S0. Its
backend is C-backed and serves unrelated co-tenants.
- Do not expose S0 services beyond loopback.
- Run providers inside the ephemeral loopback-only network namespace created
by `simulation/s0/worker-smoke.sh`. Micro XRCE-DDS Agent binds UDP wildcard
inside that namespace because v2.4.3 has no address-selection option.
- Do not download full external datasets.
- Keep `actuator_authority=false`.
@@ -24,13 +30,34 @@ uv run missioncore-sim s0 doctor --json
Before target evidence exists, the expected verdict is `INCOMPLETE`.
## Stock-rover smoke
Copy the reviewed script to the D-only worker source root, then invoke it as
root inside `MissionCore-Sim` with a unique immutable run ID:
```bash
simulation/s0/worker-smoke.sh <UTC-run-id>-stock-rover
```
The script:
- creates a new network namespace containing only loopback;
- starts Micro XRCE-DDS Agent, PX4 SITL and the stock Gazebo Ackermann world;
- verifies the DDS session, `/fmu/out/vehicle_status_v1` and Gazebo `/clock`;
- records listeners and a non-acceptance resource point sample;
- sends the PX4 `shutdown` command and rejects owned-process residue.
Do not reuse a run ID. A failed run remains diagnostic evidence; rerun with a
new ID after correction.
## Required target inventory
Record a redacted artifact for each of:
1. Windows release, WSL version, Ubuntu version and architecture.
2. GPU/driver, CPU, RAM and VRAM.
3. Physical locations of the WSL distribution and Docker data/VHD.
3. Physical location of the dedicated WSL distribution and confirmation that
the Docker-free S0 profile is active.
4. D total/free bytes before installation.
5. Existing Docker images, WSL distributions and simulation-related processes.
6. Existing listeners and the candidate port registry.