Half of this landed in #401 on 2026-09-15. Recounted at b2c823e6 on 2026-09-16.
The four stories exist. What the issue still asks for is the live Ubuntu pass
behind them, and no cassette carries a fail2ban exchange:
$ ls tests/e2e/stories/story-13[4-7].sh
tests/e2e/stories/story-134.sh
tests/e2e/stories/story-135.sh
tests/e2e/stories/story-136.sh
tests/e2e/stories/story-137.sh
$ for f in tests/e2e/cassettes/*.json; do printf '%-45s fail2ban_hits=%s\n' "$(basename $f)" "$(grep -oic fail2ban "$f")"; done
ubuntu-jammy-gpt-oss-120b.json fail2ban_hits=0
ubuntu-noble-gpt-oss-120b.json fail2ban_hits=0
ubuntu-resolute-gpt-oss-120b.json fail2ban_hits=0
The paragraph below is how the tree looked when I filed this, kept so the
thread reads in order. Read the Scope section for what is left.
As filed, 2026-08-17. The fail2ban action family has no end-to-end story. ConfigureFail2banJail, Fail2banBanIp, Fail2banUnbanIp and Fail2banStatus are all absent from tests/e2e/stories/, and grep -li fail2ban tests/e2e/stories/ returns nothing.
The construction path is well covered: crates/sysknife-daemon/src/actions/fail2ban.rs carries 20 unit tests, including the IpAddr::from_str validation that rejects a malformed address before the ActionSpec is built. What is missing is the other half, proof that the planner selects these actions from a natural-language intent on a real Ubuntu host.
Why it is worth doing
fail2ban is a security action family, so the planner picking the wrong action here has a sharper cost than a mislabelled disk query. A story like "ban 203.0.113.7 in the sshd jail" exercises the whole chain: intent to Fail2banBanIp with the right jail and IP params, the daemon's validation, and the approval gate. That is exactly what the E2E suite exists to catch and what unit tests cannot.
Scope
Done in #401. Four stories under tests/e2e/stories/, one per action, each
tagged for the family and the risk level:
$ for f in 134 135 136 137; do sed -n '2p' tests/e2e/stories/story-$f.sh; done
# Story 134 (ubuntu, read-only): Active fail2ban jail status
# Story 135 (ubuntu, medium-risk): Unban a documented IP from sshd
# Story 136 (ubuntu, high-risk): Ban a documented IP in sshd
# Story 137 (ubuntu, high-risk): Enable the sshd fail2ban jail
Left. Record and replay the four on Ubuntu the way the rest of the suite
runs: UBUNTU_RELEASE=noble ./tests/e2e/ubuntu-vm.sh for the live pass, then
commit the cassette so the suite still runs offline. #401 says plainly that its
environment had no QEMU and no VM harness, which is why this half is still here.
Until a cassette carries these four, the stories assert against a planner nobody
has watched answer them.
Difficulty
medium. The harness and the pattern exist; the work is writing the intents and recording a clean pass.
Getting started
CONTRIBUTING.md has the build and test commands, and the E2E section covers the VM harness. No CLA and no copyright waiver. The project is MIT.
As filed, 2026-08-17. The fail2ban action family has no end-to-end story.
ConfigureFail2banJail,Fail2banBanIp,Fail2banUnbanIpandFail2banStatusare all absent fromtests/e2e/stories/, andgrep -li fail2ban tests/e2e/stories/returns nothing.The construction path is well covered:
crates/sysknife-daemon/src/actions/fail2ban.rscarries 20 unit tests, including theIpAddr::from_strvalidation that rejects a malformed address before theActionSpecis built. What is missing is the other half, proof that the planner selects these actions from a natural-language intent on a real Ubuntu host.Why it is worth doing
fail2ban is a security action family, so the planner picking the wrong action here has a sharper cost than a mislabelled disk query. A story like "ban 203.0.113.7 in the sshd jail" exercises the whole chain: intent to
Fail2banBanIpwith the right jail and IP params, the daemon's validation, and the approval gate. That is exactly what the E2E suite exists to catch and what unit tests cannot.Scope
Done in #401. Four stories under
tests/e2e/stories/, one per action, eachtagged for the family and the risk level:
Left. Record and replay the four on Ubuntu the way the rest of the suite
runs:
UBUNTU_RELEASE=noble ./tests/e2e/ubuntu-vm.shfor the live pass, thencommit the cassette so the suite still runs offline. #401 says plainly that its
environment had no QEMU and no VM harness, which is why this half is still here.
Until a cassette carries these four, the stories assert against a planner nobody
has watched answer them.
Difficulty
medium. The harness and the pattern exist; the work is writing the intents and recording a clean pass.Getting started
CONTRIBUTING.md has the build and test commands, and the E2E section covers the VM harness. No CLA and no copyright waiver. The project is MIT.