feat(testnet): add cardano_node_adversary as iteration testnet
New testnet that mirrors cardano_node_master and adds the
long-running cardano-adversary daemon. Created as a separate
iteration loop for the adversary roadmap so:
- The scheduled cron continues to target cardano_node_master only.
Findings on the adversary testnet cannot regress the master
baseline because nothing automatic consumes this testnet.
- New adversarial endpoints (Tier 1.2 chain_sync_thrash,
1.3 slow_loris, Tier 2 / 3 / 4) iterate here first, dispatched
manually via:
gh workflow run "Antithesis on cardano-node testnet" \
--ref <branch> -f test=cardano_node_adversary -f duration=1
- Promotion of any change to cardano_node_master happens only
after multiple branch-dispatched runs against this testnet
produce findings_new ≤ master baseline (currently 9), and
with explicit user approval.
Layout:
- testnets/cardano_node_adversary/ — full clone of master plus
one new `adversary` service. Same producers (p1/p2/p3),
relays (relay1/relay2), tracer, tracer-sidecar, sidecar,
tx-generator, asteria-bootstrap, asteria-player, log-tailer.
- adversary service mounts relay1-state for the control socket
and tracer:ro for chainPoints.log; depends_on relay1 +
tracer-sidecar + configurator.
- Image pinned to ghcr.io/cardano-foundation/cardano-node-antithesis/adversary:cc628d5
(current built tag from PR #104). Will be bumped per follow-up
branches as adversary code evolves.
Docs:
- docs/testnets/cardano-node-adversary.md — overview,
scheduling discipline, promotion criteria.
- docs/testnets/index.md — entry pointing at the new page.
- docs/testnets/cardano-node-master.md — sidecar row updated
to drop the now-relocated adversary driver mention.
- mkdocs.yml — nav entry for the new testnet doc.
components/adversary/ is unchanged (the wrapper image keeps
building from the same tree), and components/sidecar/ is
unchanged.
The helper_sdk_lib.sh on main is byte-identical to
tx-generator's; tx-generator's SDK assertions are ingested by
Antithesis successfully, so we keep it as-is and use the first
branch-dispatched run on this new testnet as the diagnostic
for whether the adversary container's assertions are or aren't
reaching the SDK ingest channel.