Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ table below.

| Area | Why it matters | Difficulty |
|---|---|---|
| **Ubuntu LTS support** | The current suite is 83 Ubuntu stories. Committed live-VM evidence covers 79 of those Ubuntu stories on each LTS release, with a committed replay twin that reproduces each run: 22.04, 24.04 and 26.04 all at 79/79. The four additional stories are not yet included in a committed live-VM run. `ubuntu-vm.sh` accepts `UBUNTU_RELEASE=jammy\|noble\|resolute`. Remaining: story coverage for the cross-family actions, and one Debian-only action still has no story: `GrubSetKargs`. | medium |
| **Ubuntu LTS support** | The current suite is 84 Ubuntu stories. Committed live-VM evidence covers 79 of those Ubuntu stories on each LTS release, with a committed replay twin that reproduces each run: 22.04, 24.04 and 26.04 all at 79/79. The five additional stories are not yet included in a committed live-VM run. `ubuntu-vm.sh` accepts `UBUNTU_RELEASE=jammy\|noble\|resolute`. Remaining: story coverage for the cross-family actions, and every Debian-only action has a story. | medium |
| **Distro detection coverage** | Robust `/etc/os-release` parsing for every release we claim to support. Pure-function tests against real fixture files, no integration mocks. The existing fixtures at the bottom of `crates/sysknife-core/src/distro.rs` show the shape. | easy |
| **Action catalogue gaps** | Add a typed action (for example `EnableFirewallZone`). Small and isolated, and every PR carries the policy entry, the risk level and the tests. | easy |
| **E2E story coverage** | Real prompts, real LLM, real daemon. The suite is 137 stories: 54 atomic + 83 Ubuntu. What is left is the cross-family middle: of the action names available on both families, 61 are still untouched by any story, plus 10 Fedora-only and 1 Ubuntu-only ones. See #233 for the clustered map. | medium |
| **E2E story coverage** | Real prompts, real LLM, real daemon. The suite is 138 stories: 54 atomic + 84 Ubuntu. What is left is the cross-family middle: of the action names available on both families, 61 are still untouched by any story, plus 10 Fedora-only and 0 Ubuntu-only ones. See #233 for the clustered map. | medium |
| **Fedora Atomic validation** | The action families exist and `DistroId::is_supported()` returns true for Atomic 41 and up. Nobody has run `tests/e2e/atomic-vm.sh` against a current release. Needs Fedora Atomic hardware or a VM host. | tedious |
| **Demo recording on real hardware** | Replace the bundled demo GIF with a 30-second recording on real Ubuntu 26.04 with rollback visible. | easy |

Expand Down
6 changes: 3 additions & 3 deletions docs/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,13 @@ SysKnife, not an afterthought.

> **ℹ️ Distro support**
>
> The current suite is 83 Ubuntu stories. All three Ubuntu LTS releases have a
> The current suite is 84 Ubuntu stories. All three Ubuntu LTS releases have a
> committed live-VM run covering 79 of those Ubuntu stories, in
> `tests/evidence/story-runs/`:
> 22.04, 24.04 and 26.04 all at 79/79. The four additional stories are not yet
> 22.04, 24.04 and 26.04 all at 79/79. The five additional stories are not yet
> included in a committed live-VM run. Each run has a replay twin that
> reproduces it, serving every call with zero misses.
> One Debian-only action still has no story.
> Every Debian-only action has a story.
> Fedora Atomic is supported by the rpm-ostree action family, but a current
> Silverblue 44 VM run is a release gate. Plain Fedora remains experimental
> until the `dnf` action family ships.
Expand Down
21 changes: 21 additions & 0 deletions tests/e2e/stories/story-138.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
# Story 138 (ubuntu, high-risk): Append quiet and remove splash in GRUB
# Intent: "in GRUB, append quiet to the kernel command line and delete splash"
# Distro: ubuntu
set -euo pipefail
INTENT="in GRUB, append quiet to the kernel command line and delete splash"
echo "=== Story 138 (ubuntu): GrubSetKargs ==="
PLAN=$(sysknife --dry-run --json "$INTENT" 2>/tmp/sysknife-story-138-stderr.log)
echo "$PLAN" | jq .

STEP_COUNT=$(echo "$PLAN" | jq '.plan.steps | length')
if [[ "$STEP_COUNT" != "1" ]]; then echo "FAIL: expected 1 step, got $STEP_COUNT"; exit 1; fi
STEP=$(echo "$PLAN" | jq '.plan.steps[0] | select(.action == "GrubSetKargs")')
if [[ -z "$STEP" || "$STEP" == "null" ]]; then echo "FAIL: expected GrubSetKargs"; exit 1; fi
RISK=$(echo "$STEP" | jq -r '.risk')
if [[ "$RISK" != "high" ]]; then echo "FAIL: expected risk high, got $RISK"; exit 1; fi
APPEND=$(echo "$STEP" | jq -c '.params.append')
if [[ "$APPEND" != '["quiet"]' ]]; then echo "FAIL: expected append=[\"quiet\"], got $APPEND"; exit 1; fi
DELETE=$(echo "$STEP" | jq -c '.params.delete')
if [[ "$DELETE" != '["splash"]' ]]; then echo "FAIL: expected delete=[\"splash\"], got $DELETE"; exit 1; fi
echo "PASS: Story 138"
Loading
Loading