Sub-epic of #192. How satellite work gets a build environment, decided in ADR-0015.
The decision this implements
Split the image, not the build. A satellite substrate (ns3-leo, Hypatia, Silva's ns3-satellite) is a third-party ns-3 module that must be present in the ns-3 tree — an image concern. But nothing in the AntHocNet module is satellite-specific: core/ is one algorithm, the ns-3 adapter is one Ipv4RoutingProtocol, the #203 multi-interface fix made the data path correct for any topology rather than adding a satellite mode, and isl-grid (#214) is an example rather than a build variant. The only real difference between the regimes is which ns-3 modules are enabled, which is one existing configure line naming both sets.
So: one binary, one configure line, scenario differences in examples and flags. Two builds would drift, and a satellite result would stop being comparable to a MANET one — quietly, with both builds still working. See the ADR for the full argument and the rejected alternatives.
Why this is not blocked on #193 — it unblocks it
Publishing a satellite base image now would bake in a substrate choice #193 has not made. But inverted, this is the missing piece: the decisive question in #197/#198/#200 — can a third-party Ipv4RoutingProtocol be installed on this substrate's nodes, or is its forwarding hard-wired? — can only be answered by a build, and no container runtime is available in the agent environment. A parameterised, unpublished image target is that build.
Hence two phases, in order.
Children
| Phase |
Ticket |
What |
| 1 |
(child below) |
Parameterised sat target in docker/Dockerfile.ns3 + a manually-dispatched workflow that builds ns-3 + a candidate substrate and attempts to install AntHocNet on it. Unpublished. This is the spike harness for #197/#198/#200 |
| 2 |
(child below) |
Promote the winner to a published ns3-sat / anthocnet-ns3-sat GHCR image following the existing three-tier tag pattern, once #193 concludes |
Constraints
- Satellite CI runs on one ns-3 version, in the manner of the existing validation-anchor and determinism gates (3.42 only) — not the full
3.36–3.48 matrix. The matrix is already the long pole (the 3.36 leg alone is ~8 min) and the substrates support narrower ranges anyway.
- No substrate is vendored into this repository. The repo deliberately does not vendor a simulator (
AGENTS.md), and a substrate is part of the simulator installation — vendoring would also drag a third party's licence and release cadence into ours.
- The default images do not change. Adding a substrate to them would either constrain the matrix to the substrate's narrower ns-3 support or break the legs outside it, and would make every MANET build pay for a module it never loads.
- Any behavioural claim from a satellite image still goes through the
benchmark-results skill for the noise verdict; an image is a build environment, not a result.
Done when
A satellite substrate can be built and exercised reproducibly from a documented command, docker/README.md describes the resulting image dimension, and the substrate spikes have the environment they need to return a verdict. Phase 2 additionally requires #193 to have chosen.
Related
#192 (parent track), #193 (substrate selection — phase 2 waits on it, phase 1 serves it), #197 / #198 / #200 (the spikes phase 1 unblocks), #195 (own module — a different branch of the track, and the ADR further weakens it), #214 (isl-grid — satellite-shaped scenario needing no special build), ADR-0015, ADR-0002 (the invariant this protects), docker/README.md, .github/workflows/images.yml.
Sub-epic of #192. How satellite work gets a build environment, decided in ADR-0015.
The decision this implements
Split the image, not the build. A satellite substrate (ns3-leo, Hypatia, Silva's
ns3-satellite) is a third-party ns-3 module that must be present in the ns-3 tree — an image concern. But nothing in the AntHocNet module is satellite-specific:core/is one algorithm, the ns-3 adapter is oneIpv4RoutingProtocol, the #203 multi-interface fix made the data path correct for any topology rather than adding a satellite mode, andisl-grid(#214) is an example rather than a build variant. The only real difference between the regimes is which ns-3 modules are enabled, which is one existing configure line naming both sets.So: one binary, one configure line, scenario differences in examples and flags. Two builds would drift, and a satellite result would stop being comparable to a MANET one — quietly, with both builds still working. See the ADR for the full argument and the rejected alternatives.
Why this is not blocked on #193 — it unblocks it
Publishing a satellite base image now would bake in a substrate choice #193 has not made. But inverted, this is the missing piece: the decisive question in #197/#198/#200 — can a third-party
Ipv4RoutingProtocolbe installed on this substrate's nodes, or is its forwarding hard-wired? — can only be answered by a build, and no container runtime is available in the agent environment. A parameterised, unpublished image target is that build.Hence two phases, in order.
Children
sattarget indocker/Dockerfile.ns3+ a manually-dispatched workflow that builds ns-3 + a candidate substrate and attempts to install AntHocNet on it. Unpublished. This is the spike harness for #197/#198/#200ns3-sat/anthocnet-ns3-satGHCR image following the existing three-tier tag pattern, once #193 concludesConstraints
3.36–3.48matrix. The matrix is already the long pole (the 3.36 leg alone is ~8 min) and the substrates support narrower ranges anyway.AGENTS.md), and a substrate is part of the simulator installation — vendoring would also drag a third party's licence and release cadence into ours.benchmark-resultsskill for the noise verdict; an image is a build environment, not a result.Done when
A satellite substrate can be built and exercised reproducibly from a documented command,
docker/README.mddescribes the resulting image dimension, and the substrate spikes have the environment they need to return a verdict. Phase 2 additionally requires #193 to have chosen.Related
#192 (parent track), #193 (substrate selection — phase 2 waits on it, phase 1 serves it), #197 / #198 / #200 (the spikes phase 1 unblocks), #195 (own module — a different branch of the track, and the ADR further weakens it), #214 (
isl-grid— satellite-shaped scenario needing no special build), ADR-0015, ADR-0002 (the invariant this protects),docker/README.md,.github/workflows/images.yml.