feat: QEMU ESP32-S3 testing platform + swarm configurator (ADR-061/062) (#260)

9-layer QEMU testing platform (ADR-061) and YAML-driven swarm
configurator (ADR-062) for ESP32-S3 firmware testing without hardware.

12 commits, 56 files, +9,500 lines. Tested on Windows with
Espressif QEMU 9.0.0 — firmware boots, mock CSI generates frames,
14/16 validation checks pass. 39 bugs found and fixed across
2 deep code reviews.

Closes #259

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
rUv
2026-03-14 13:39:51 -04:00
committed by GitHub
parent a467dfed9f
commit 523be943b0
57 changed files with 9532 additions and 8 deletions
+31
View File
@@ -0,0 +1,31 @@
# CI-optimized preset: 3 nodes, star topology, 30s, minimal assertions
swarm:
name: ci-matrix
duration_s: 30
topology: star
aggregator_port: 5005
nodes:
- role: coordinator
node_id: 0
scenario: 0
channel: 6
edge_tier: 1
- role: sensor
node_id: 1
scenario: 1
channel: 6
tdm_slot: 1
- role: sensor
node_id: 2
scenario: 2
channel: 6
tdm_slot: 2
assertions:
- all_nodes_boot
- no_crashes
- tdm_no_collision
- max_boot_time_s: 10
+49
View File
@@ -0,0 +1,49 @@
# Mixed scenarios: 5 nodes with different CSI scenarios, star topology, 90s
swarm:
name: heterogeneous
duration_s: 90
topology: star
aggregator_port: 5005
nodes:
- role: coordinator
node_id: 0
scenario: 0
channel: 6
edge_tier: 2
is_gateway: true
- role: sensor
node_id: 1
scenario: 1
channel: 6
tdm_slot: 1
- role: sensor
node_id: 2
scenario: 2
channel: 6
tdm_slot: 2
- role: sensor
node_id: 3
scenario: 3
channel: 6
tdm_slot: 3
- role: sensor
node_id: 4
scenario: 5
channel: 11
tdm_slot: 4
assertions:
- all_nodes_boot
- no_crashes
- tdm_no_collision
- all_nodes_produce_frames
- coordinator_receives_from_all
- fall_detected_by_node_3
- no_heap_errors
- frame_rate_above: 12
- max_boot_time_s: 12
+54
View File
@@ -0,0 +1,54 @@
# Scale test: 6 fully-connected nodes in mesh topology, 90s
swarm:
name: large-mesh
duration_s: 90
topology: mesh
aggregator_port: 5005
nodes:
- role: coordinator
node_id: 0
scenario: 0
channel: 6
edge_tier: 2
is_gateway: true
- role: sensor
node_id: 1
scenario: 1
channel: 6
tdm_slot: 1
- role: sensor
node_id: 2
scenario: 2
channel: 6
tdm_slot: 2
- role: sensor
node_id: 3
scenario: 3
channel: 6
tdm_slot: 3
- role: sensor
node_id: 4
scenario: 4
channel: 6
tdm_slot: 4
- role: sensor
node_id: 5
scenario: 5
channel: 6
tdm_slot: 5
assertions:
- all_nodes_boot
- no_crashes
- tdm_no_collision
- all_nodes_produce_frames
- coordinator_receives_from_all
- no_heap_errors
- frame_rate_above: 10
- max_boot_time_s: 15
+39
View File
@@ -0,0 +1,39 @@
# Multi-hop relay chain: 4 nodes in line topology, 60s
swarm:
name: line-relay
duration_s: 60
topology: line
aggregator_port: 5005
nodes:
- role: gateway
node_id: 0
scenario: 0
channel: 6
edge_tier: 2
is_gateway: true
- role: coordinator
node_id: 1
scenario: 0
channel: 6
edge_tier: 1
- role: sensor
node_id: 2
scenario: 2
channel: 6
tdm_slot: 2
- role: sensor
node_id: 3
scenario: 1
channel: 6
tdm_slot: 3
assertions:
- all_nodes_boot
- no_crashes
- tdm_no_collision
- all_nodes_produce_frames
- max_boot_time_s: 12
+41
View File
@@ -0,0 +1,41 @@
# Ring topology with fault injection: 4 nodes, 75s
swarm:
name: ring-fault
duration_s: 75
topology: ring
aggregator_port: 5005
nodes:
- role: coordinator
node_id: 0
scenario: 0
channel: 6
edge_tier: 2
is_gateway: true
- role: sensor
node_id: 1
scenario: 1
channel: 6
tdm_slot: 1
- role: sensor
node_id: 2
scenario: 2
channel: 6
tdm_slot: 2
- role: sensor
node_id: 3
scenario: 3
channel: 6
tdm_slot: 3
assertions:
- all_nodes_boot
- no_crashes
- tdm_no_collision
- all_nodes_produce_frames
- coordinator_receives_from_all
- no_heap_errors
- max_boot_time_s: 12
+24
View File
@@ -0,0 +1,24 @@
# Quick CI smoke test: 2 nodes, star topology, 15s duration
swarm:
name: smoke
duration_s: 15
topology: star
aggregator_port: 5005
nodes:
- role: coordinator
node_id: 0
scenario: 0
channel: 6
edge_tier: 1
- role: sensor
node_id: 1
scenario: 1
channel: 6
tdm_slot: 1
assertions:
- all_nodes_boot
- no_crashes
- max_boot_time_s: 10
+36
View File
@@ -0,0 +1,36 @@
# Standard 3-node test: 2 sensors + 1 coordinator, star topology, 60s
swarm:
name: standard
duration_s: 60
topology: star
aggregator_port: 5005
nodes:
- role: coordinator
node_id: 0
scenario: 0
channel: 6
edge_tier: 2
is_gateway: true
- role: sensor
node_id: 1
scenario: 2
channel: 6
tdm_slot: 1
- role: sensor
node_id: 2
scenario: 3
channel: 6
tdm_slot: 2
assertions:
- all_nodes_boot
- no_crashes
- tdm_no_collision
- all_nodes_produce_frames
- coordinator_receives_from_all
- fall_detected_by_node_2
- frame_rate_above: 15
- max_boot_time_s: 10