Apr 23, 5-6 PM (7)
Apr 23, 6-7 PM (7)
Apr 23, 7-8 PM (11)
Apr 23, 8-9 PM (14)
Apr 23, 9-10 PM (6)
Apr 23, 10-11 PM (28)
Apr 23, 11-12 AM (18)
Apr 24, 12-1 AM (7)
Apr 24, 1-2 AM (4)
Apr 24, 2-3 AM (7)
Apr 24, 3-4 AM (5)
Apr 24, 4-5 AM (8)
Apr 24, 5-6 AM (13)
Apr 24, 6-7 AM (12)
Apr 24, 7-8 AM (33)
Apr 24, 8-9 AM (40)
Apr 24, 9-10 AM (41)
Apr 24, 10-11 AM (72)
Apr 24, 11-12 PM (57)
Apr 24, 12-1 PM (100)
Apr 24, 1-2 PM (57)
Apr 24, 2-3 PM (35)
Apr 24, 3-4 PM (19)
Apr 24, 4-5 PM (17)
Apr 24, 5-6 PM (38)
Apr 24, 6-7 PM (27)
Apr 24, 7-8 PM (12)
Apr 24, 8-9 PM (42)
Apr 24, 9-10 PM (17)
Apr 24, 10-11 PM (30)
Apr 24, 11-12 AM (16)
Apr 25, 12-1 AM (8)
Apr 25, 1-2 AM (1)
Apr 25, 2-3 AM (10)
Apr 25, 3-4 AM (5)
Apr 25, 4-5 AM (3)
Apr 25, 5-6 AM (13)
Apr 25, 6-7 AM (1)
Apr 25, 7-8 AM (4)
Apr 25, 8-9 AM (24)
Apr 25, 9-10 AM (17)
Apr 25, 10-11 AM (4)
Apr 25, 11-12 PM (4)
Apr 25, 12-1 PM (13)
Apr 25, 1-2 PM (3)
Apr 25, 2-3 PM (10)
Apr 25, 3-4 PM (6)
Apr 25, 4-5 PM (10)
Apr 25, 5-6 PM (16)
Apr 25, 6-7 PM (13)
Apr 25, 7-8 PM (30)
Apr 25, 8-9 PM (55)
Apr 25, 9-10 PM (13)
Apr 25, 10-11 PM (21)
Apr 25, 11-12 AM (22)
Apr 26, 12-1 AM (5)
Apr 26, 1-2 AM (0)
Apr 26, 2-3 AM (2)
Apr 26, 3-4 AM (5)
Apr 26, 4-5 AM (2)
Apr 26, 5-6 AM (2)
Apr 26, 6-7 AM (3)
Apr 26, 7-8 AM (8)
Apr 26, 8-9 AM (3)
Apr 26, 9-10 AM (0)
Apr 26, 10-11 AM (2)
Apr 26, 11-12 PM (1)
Apr 26, 12-1 PM (6)
Apr 26, 1-2 PM (4)
Apr 26, 2-3 PM (14)
Apr 26, 3-4 PM (14)
Apr 26, 4-5 PM (0)
Apr 26, 5-6 PM (13)
Apr 26, 6-7 PM (13)
Apr 26, 7-8 PM (7)
Apr 26, 8-9 PM (7)
Apr 26, 9-10 PM (5)
Apr 26, 10-11 PM (27)
Apr 26, 11-12 AM (21)
Apr 27, 12-1 AM (7)
Apr 27, 1-2 AM (7)
Apr 27, 2-3 AM (9)
Apr 27, 3-4 AM (9)
Apr 27, 4-5 AM (5)
Apr 27, 5-6 AM (13)
Apr 27, 6-7 AM (7)
Apr 27, 7-8 AM (82)
Apr 27, 8-9 AM (47)
Apr 27, 9-10 AM (33)
Apr 27, 10-11 AM (62)
Apr 27, 11-12 PM (80)
Apr 27, 12-1 PM (66)
Apr 27, 1-2 PM (44)
Apr 27, 2-3 PM (52)
Apr 27, 3-4 PM (42)
Apr 27, 4-5 PM (36)
Apr 27, 5-6 PM (26)
Apr 27, 6-7 PM (13)
Apr 27, 7-8 PM (26)
Apr 27, 8-9 PM (13)
Apr 27, 9-10 PM (15)
Apr 27, 10-11 PM (42)
Apr 27, 11-12 AM (28)
Apr 28, 12-1 AM (17)
Apr 28, 1-2 AM (8)
Apr 28, 2-3 AM (4)
Apr 28, 3-4 AM (5)
Apr 28, 4-5 AM (5)
Apr 28, 5-6 AM (8)
Apr 28, 6-7 AM (8)
Apr 28, 7-8 AM (37)
Apr 28, 8-9 AM (54)
Apr 28, 9-10 AM (59)
Apr 28, 10-11 AM (53)
Apr 28, 11-12 PM (56)
Apr 28, 12-1 PM (49)
Apr 28, 1-2 PM (54)
Apr 28, 2-3 PM (69)
Apr 28, 3-4 PM (31)
Apr 28, 4-5 PM (14)
Apr 28, 5-6 PM (47)
Apr 28, 6-7 PM (9)
Apr 28, 7-8 PM (9)
Apr 28, 8-9 PM (14)
Apr 28, 9-10 PM (20)
Apr 28, 10-11 PM (34)
Apr 28, 11-12 AM (29)
Apr 29, 12-1 AM (13)
Apr 29, 1-2 AM (1)
Apr 29, 2-3 AM (1)
Apr 29, 3-4 AM (6)
Apr 29, 4-5 AM (1)
Apr 29, 5-6 AM (4)
Apr 29, 6-7 AM (12)
Apr 29, 7-8 AM (45)
Apr 29, 8-9 AM (70)
Apr 29, 9-10 AM (49)
Apr 29, 10-11 AM (28)
Apr 29, 11-12 PM (51)
Apr 29, 12-1 PM (39)
Apr 29, 1-2 PM (21)
Apr 29, 2-3 PM (66)
Apr 29, 3-4 PM (25)
Apr 29, 4-5 PM (36)
Apr 29, 5-6 PM (16)
Apr 29, 6-7 PM (10)
Apr 29, 7-8 PM (14)
Apr 29, 8-9 PM (13)
Apr 29, 9-10 PM (17)
Apr 29, 10-11 PM (25)
Apr 29, 11-12 AM (29)
Apr 30, 12-1 AM (6)
Apr 30, 1-2 AM (8)
Apr 30, 2-3 AM (1)
Apr 30, 3-4 AM (6)
Apr 30, 4-5 AM (2)
Apr 30, 5-6 AM (8)
Apr 30, 6-7 AM (15)
Apr 30, 7-8 AM (17)
Apr 30, 8-9 AM (100)
Apr 30, 9-10 AM (19)
Apr 30, 10-11 AM (50)
Apr 30, 11-12 PM (120)
Apr 30, 12-1 PM (62)
Apr 30, 1-2 PM (44)
Apr 30, 2-3 PM (117)
Apr 30, 3-4 PM (29)
Apr 30, 4-5 PM (29)
Apr 30, 5-6 PM (0)
3,952 commits this week Apr 23, 2026 - Apr 30, 2026
tools: antithesis-overview — publish skill + docs in repo (#103)
Adds tools/antithesis-overview/, a Claude Code skill that lists
recent Antithesis runs for a given GitHub repo and publishes a
Markdown digest as a secret gh gist with clickable commit and
report links. The skill is parametric — tenant, repo, hours-back,
requester are all flags — so anyone with access to this repo can
clone, symlink the tool into ~/.claude/skills, and run it against
their own SUT.

Layout mirrors tools/query-logs/: SKILL.md + README.md +
assets/. The runtime depends on antithesis-triage.js which we
vendor at v3.0.0 from antithesishq/antithesis-skills.

Adds docs/overview.md as the user-facing guide and threads it
through the mkdocs nav and the existing triage.md cross-references.

Why publish it here rather than keep it in a personal dotfiles
repo: this is a project-specific workaround for the lack of an
Antithesis runs API, and discovery is easier when the tool sits
next to the existing query-logs tool the team already uses. The
skill is interview-driven so every operator drives it the same way.

Future scriptable replacement is tracked in #97.
feat(adversary): close SDK instrumentation gap (#102)
The adversary container was the only post-PR-D composer template
without SDK assertions. Constitution rule II requires every
non-trivial composer command to emit at least one Antithesis SDK
assertion per meaningful control-flow moment.

Adds three composer files alongside the existing parallel driver:

- components/adversary/composer/chain-sync-client/helper_sdk_lib.sh
  — copy of components/tx-generator/composer/tx-generator/helper_sdk_lib.sh.
  Provides sdk_reachable, sdk_sometimes, sdk_always, sdk_unreachable
  shell helpers writing to $ANTITHESIS_OUTPUT_DIR/sdk.jsonl.

- components/adversary/composer/chain-sync-client/eventually_adversary_active.sh
  — short single-shot validator (sleep 15, one bounded {"ready":null}
  probe, ≤1 min total). Emits sdk_sometimes true "adversary_ready" on
  success, sdk_sometimes false "adversary_not_ready_after_settle" on
  failure.

- components/adversary/composer/chain-sync-client/finally_adversary_summary.sh
  — diagnostic dump: one snapshot, sdk_reachable "adversary_summary"
  with the JSON response embedded as details. Always exits 0.

Rewrites parallel_driver_flaky_chain_sync.sh to source the helper
and emit:

- sdk_reachable "adversary_chain_sync_flap_started" on entry
- sdk_sometimes true "adversary_chain_sync_flap_completed" on ok=true
- sdk_sometimes false "adversary_no_chain_points" on no-chain-points-yet
- sdk_unreachable "adversary_misconfigured_no_points_file" on no-chain-points-file
- sdk_unreachable "adversary_misconfigured_no_producers" on no-producers
- sdk_unreachable "adversary_endpoint_not_implemented" on not-implemented
- sdk_unreachable "adversary_unexpected_response" on parsing failure

Drive-by fix in the same script: replace `nc -U -q 1` with
`nc -U -N`. The image ships netcat-openbsd; `-q` is GNU-only and
silently failed under the old image (always returned empty body).
The fix makes the daemon's response actually reachable from the
composer.

components/adversary/nix/docker-image.nix:

- chmod 0755 also on eventually_*.sh / finally_*.sh (mirrors tx-generator).
- writeShellScriptBin wrappers `eventually_adversary_active` and
  `finally_adversary_summary` so the antithesis composer can invoke
  them by short name.

End-to-end smoke verified locally: docker exec adv parallel_driver_flaky_chain_sync /
eventually_adversary_active / finally_adversary_summary all exit 0
and write five distinct SDK assertions to sdk.jsonl.