{
  "part": 6,
  "title": "Timestamped status backups + pruning",
  "reset": "standard",
  "steps": [
    { "id": "6.1", "title": "Confirm pruning keeps only the newest N",
      "config": { "mutations": [ { "op": "set", "path": "statusFileBackups", "value": "2" } ], "restore": "none" },
      "actions": [
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_1" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "sleep", "seconds": 1 },
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_2" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "sleep", "seconds": 1 },
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_3" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "sleep", "seconds": 1 },
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_4" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "list_matching", "dir": "{SN}", "pattern": "^sneakernet_target\\.status\\.[0-9_.-]+$",
          "capture": { "name": "BACKUP_COUNT", "reduce": "count" } }
      ],
      "assertions": [
        { "type": "count_equals", "var": "BACKUP_COUNT", "n": 2, "message": "exactly 2 timestamped backup files remain (the two most recent)" }
      ]
    },
    { "id": "6.2a", "title": "Edge value: statusFileBackups: 0 keeps none", "depends_on": ["6.1"],
      "config": { "mutations": [ { "op": "set", "path": "statusFileBackups", "value": "0" } ], "restore": "none" },
      "actions": [
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_5" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "list_matching", "dir": "{SN}", "pattern": "^sneakernet_target\\.status\\.[0-9_.-]+$",
          "capture": { "name": "BACKUP_COUNT_ZERO", "reduce": "count" } }
      ],
      "assertions": [
        { "type": "count_equals", "var": "BACKUP_COUNT_ZERO", "n": 0, "message": "statusFileBackups: 0 keeps no backups at all" }
      ]
    },
    { "id": "6.2b", "title": "Edge value: statusFileBackups: -1 disables pruning (accumulates)", "depends_on": ["6.2a"],
      "config": { "mutations": [ { "op": "set", "path": "statusFileBackups", "value": "-1", "style": "single" } ], "restore": "none" },
      "actions": [
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_6" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "sleep", "seconds": 1 },
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part6_7" },
        { "do": "empty_dir", "path": "{TRANSPORT}" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": 0 },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 1, "expect_exit": 0 },
        { "do": "list_matching", "dir": "{SN}", "pattern": "^sneakernet_target\\.status\\.[0-9_.-]+$",
          "capture": { "name": "BACKUP_COUNT_UNLIMITED", "reduce": "count" } }
      ],
      "assertions": [
        { "type": "count_equals", "var": "BACKUP_COUNT_UNLIMITED", "n": 2, "message": "starting from 0 (Step 6.2a) and running 2 more cycles with statusFileBackups: -1, both backups accumulate - none are pruned" }
      ]
    },
    { "id": "6.2-cleanup", "title": "Restore statusFileBackups: 5", "depends_on": ["6.2b"], "config": { "restore": "none", "mutations": [
        { "op": "set", "path": "statusFileBackups", "value": "5" }
      ] } }
  ]
}
