AST-4 PR #4 review round 2 fail-fast mutation, 2026-09-02T18:06:01Z Mutation: changed the extracted runbook block's `set -euo pipefail` to `set +e`. Expected red: both negative controls observed exit 0 and failed before pointer equality could pass. Restoration: restored `set -euo pipefail`; both focused controls passed. RUN v3.1.3 ❯ tests/runbook.test.ts (3 tests | 2 failed | 1 skipped) 614ms ↓ store runbook > executes the documented --fs emergency rollback without pointer drift × store runbook > leaves every prod pointer byte-for-byte unchanged when the target is absent 249ms → expected +0 not to be +0 // Object.is equality × store runbook > restores every prod pointer byte-for-byte when a pack deletion fails 365ms → expected +0 not to be +0 // Object.is equality ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯ FAIL tests/runbook.test.ts > store runbook > leaves every prod pointer byte-for-byte unchanged when the target is absent AssertionError: expected +0 not to be +0 // Object.is equality ❯ tests/runbook.test.ts:131:28 129| const run = runRollback("0".repeat(64)); 130| 131| expect(run.status).not.toBe(0); | ^ 132| expect(run.stderr).toContain("target Asset Manifest could not be f… 133| expect(await snapshotProdPointers(store)).toEqual(before); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯ FAIL tests/runbook.test.ts > store runbook > restores every prod pointer byte-for-byte when a pack deletion fails AssertionError: expected +0 not to be +0 // Object.is equality ❯ tests/runbook.test.ts:160:28 158| }); 159| 160| expect(run.status).not.toBe(0); | ^ 161| expect(existsSync(failureMarker)).toBe(true); 162| expect(run.stderr).toContain("restoring the original prod pointer … ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯ Test Files 1 failed (1) Tests 2 failed | 1 skipped (3) Start at 14:06:08 Duration 1.53s (transform 51ms, setup 0ms, collect 61ms, tests 614ms, environment 0ms, prepare 24ms) RUN v3.1.3 ✓ tests/runbook.test.ts (3 tests | 1 skipped) 353ms Test Files 1 passed (1) Tests 2 passed | 1 skipped (3) Start at 14:06:25 Duration 1.42s (transform 51ms, setup 0ms, collect 54ms, tests 353ms, environment 0ms, prepare 32ms) Checked 38 files in 18ms. No fixes applied. ✔ no dependency violations found (36 modules, 159 dependencies cruised) node scripts/ratchets.mjs ratchet long-files: 0 (baseline 0) same ratchet todos: 0 (baseline 0) same node scripts/docs-current.mjs --check AGENTS.md generated sections current RUN v3.2.7 ✓ tests/naming.test.ts (5 tests) 3ms ✓ tests/layout.test.ts (5 tests) 2ms ✓ tests/digest.test.ts (5 tests) 4ms ✓ tests/pointers.test.ts (3 tests) 7ms ✓ tests/fs-store.test.ts (10 tests) 27ms stdout | tests/r2.integration.test.ts MISSING: r2 integration (credentials absent) ↓ tests/r2.integration.test.ts (1 test | 1 skipped) ✓ tests/publish.test.ts (14 tests) 183ms ✓ tests/verify.test.ts (9 tests) 280ms ✓ tests/promote.test.ts (10 tests) 488ms ✓ tests/runbook.test.ts (3 tests) 769ms ✓ store runbook > executes the documented --fs emergency rollback without pointer drift 356ms ✓ store runbook > restores every prod pointer byte-for-byte when a pack deletion fails 357ms ✓ tests/cli.test.ts (11 tests) 1055ms ✓ aa-asset CLI > exits 2 on usage with an RFC 9457 problem on stderr 368ms Test Files 10 passed | 1 skipped (11) Tests 75 passed | 1 skipped (76) Start at 14:08:09 Duration 2.08s (transform 268ms, setup 0ms, collect 800ms, tests 2.82s, environment 1ms, prepare 552ms)