asteria-stub: minimal test-composer host for property experimentation
New `components/asteria-stub/` ships a tiny Debian image with
cardano-cli (+ liblmdb0 runtime), jq, and bash. Its only job is to
host composer scripts at `/opt/antithesis/test/v1/stub/`:
- parallel_driver_heartbeat.sh — short tick, emits Sometimes
- eventually_alive.sh — post-fault: pings p1/p2/p3, Always
- finally_alive.sh — post-workload: pings p1/p2/p3, Always
The container itself just `sleep infinity`s. This is intentional:
the stub is the experimentation harness for evolving property checks
before touching the real asteria-player. Real game logic stays in
PR #67's `components/asteria-player/`.
Conventions adopted from the working sidecar template:
- cardano-cli ping uses `-j --magic 42 --host X --port Y --tip
--quiet -c1`. Without `-j --tip` the cli has no query target and
exits non-zero.
- SDK output goes to /tmp/sdk.jsonl (default path) on a tmpfs
mount; Antithesis introspects that path. A named-volume
convention (e.g. ANTITHESIS_OUTPUT_DIR=/sdk) is not picked up.
- liblmdb0 must be apt-installed; cardano-cli loads liblmdb.so.0
at start regardless of subcommand.
On failure, eventually_alive / finally_alive emit a self-classifying
JSON detail with the failing host, exit code, and the cardano-cli
stderr — so the next failure self-diagnoses without another round
trip.
Image referenced by content digest in
testnets/cardano_node_master/docker-compose.yaml; the publish-images
workflow builds and pushes both `:asteria-stub-v3` and
`:<full-commit>` on PR. Bootstrap relied on a paired git tag so the
script could resolve the friendly name back to a commit; once
merged, the digest pin is the only contract.