The current design, after the 2026-07 pivot (see the journey). The reframe: stop chasing perception modules and make the load-bearing decision which role, paid by marginal contribution. The agent is a small multi-layer cognition — heuristic execution, a disciplined skill menu, and one learned, credit-driven decision on top.
Motion: A* to a goal cell, collision avoidance, and the relay controllers — hold (a static beacon that keeps the bridge from where it stands) and λ₂-anchor (actively climb local connectivity). Perception, always on: a SLAM / occupancy belief (the neighbour-fused map), a geodesic distance field over that belief (true reach cost with walls respected — not Euclidean), and a decentralized λ̂₂ (Fiedler) estimator — how load-bearing each agent is to the comm graph. These are capabilities, not choices: rich, always available, never selected.
The handful of behaviours the decision toggles between — a disciplined menu, not a flat pile:
One head picks each agent's role — explorer (CVT) vs relay — trained by per-agent marginal credit. Roles are load-bearing and self-sizing: a redundant relay earns ≈0 and flips to exploring, so the right relay count emerges per map instead of being an authored number. This is the deliberate reversal of the deprecated "roles emerge from a flat, homogeneous policy" proposal — our own experiments showed a homogeneous policy will not hold connectivity, because nothing chooses to hold.
L2–L3 are one small network trained with MAPPO under CTDE: a shared actor mapping each agent's local observation to action logits, and a centralized critic that scores the global state during training only (discarded at deployment). The backbone is CNN local perception → GNN message-passing — the comm graph is the bridge along which agents fuse neighbours' features — pooled to a 64-d belief. That pooling makes it size-invariant: one network serves every world and team size.
Each agent is paid its marginal contribution Di = G(team) − G(team without i), not one shared team reward. At cover_r = 0 that is the fresh cells only it covered (coverage) plus its Fiedler-centrality (connectivity). This is the coverage lever: it breaks the huddle (agents clumped — connectivity satisfied, coverage dead) into a sweep, +7 to +23 coverage points at 32²/10, 2–6× over a shared reward (see findings). Under CTDE the central critic still trains on the team return; only the policy advantage becomes per-agent.
Connectivity is held softly — a learned Lagrangian penalty on algebraic connectivity λ₂ — and never a hard action mask, on purpose: the research question is how connectivity breaks under a covert adversary, and a hard mask makes it unbreakable. Credit alone over-spreads and drops connectivity at scale (the new wall); a few explicit relays hold the graph so the rest cover freely. Planned: feed λ̂₂ as a decision input so the load-bearing agents know to hold — targeted holding, not a blunt global penalty (which only slides along the coverage↔connectivity frontier instead of moving it).
| Deprecated (the old stack) | Current |
|---|---|
| Frontier — go to the edge of the known | CVT partition — own & rake a region |
| Shared team reward | Difference-reward credit (per-agent marginal) |
| Role head demoted / emerge-from-flat-policy | Roles load-bearing, credit-driven, self-sizing |
| A* as the coverage motion | A* demoted to transit + warm-start teacher; coverage = the rake |
| Hard connectivity mask | Soft λ₂ + relay backbone (breakable — for the resilience study) |
| Perception-module chase (attention, occupancy, extra channels) | Frozen — proven null levers |
--credit agent switch in the CTDE trainer, 122 tests green, default byte-identical); the explicit relay role (role-picker + hold / λ₂-anchor controllers); the connected-sweep oracle — the god-view Voronoi-partition-plus-relay ceiling that is the coverage denominator, the warm-start teacher, and the scripted baseline in one.