PRAWN — RECORDED LOCAL REPAIR Recorded 14 October 2026. One deliberately broken missing-import fixture. The video replays captured output with reading pauses; it is not real-time screen footage. Local paths are replaced with [demo]. Test output and source bytes are otherwise unchanged. An initial transport request used an unsupported tool alias and was rejected before repair. The corrected request below was the only repair invocation for this fixture. ORIGINAL SOURCE — digest.mjs export function sha256(text) { return createHash('sha256').update(text, 'utf8').digest('hex'); } BASELINE: node --test --test-reporter=tap digest.test.mjs TAP version 13 # Subtest: empty input matches the standard SHA-256 vector not ok 1 - empty input matches the standard SHA-256 vector --- duration_ms: 0.653792 location: '[demo]/digest.test.mjs:5:1' failureType: 'testCodeFailure' error: 'createHash is not defined' code: 'ERR_TEST_FAILURE' name: 'ReferenceError' stack: |- sha256 (file://[demo]/digest.mjs:2:3) TestContext. (file://[demo]/digest.test.mjs:6:16) Test.runInAsyncScope (node:async_hooks:206:9) Test.run (node:internal/test_runner/test:796:25) Test.processPendingSubtests (node:internal/test_runner/test:526:18) node:internal/test_runner/harness:255:12 node:internal/process/task_queues:140:7 AsyncResource.runInAsyncScope (node:async_hooks:206:9) AsyncResource.runMicrotask (node:internal/process/task_queues:137:8) ... # Subtest: abc matches the standard SHA-256 vector not ok 2 - abc matches the standard SHA-256 vector --- duration_ms: 0.059875 location: '[demo]/digest.test.mjs:9:1' failureType: 'testCodeFailure' error: 'createHash is not defined' code: 'ERR_TEST_FAILURE' name: 'ReferenceError' stack: |- sha256 (file://[demo]/digest.mjs:2:3) TestContext. (file://[demo]/digest.test.mjs:10:16) Test.runInAsyncScope (node:async_hooks:206:9) Test.run (node:internal/test_runner/test:796:25) Test.processPendingSubtests (node:internal/test_runner/test:526:18) Test.postRun (node:internal/test_runner/test:889:19) Test.run (node:internal/test_runner/test:835:12) async Test.processPendingSubtests (node:internal/test_runner/test:526:7) ... # Subtest: repeated calls are deterministic and input-sensitive not ok 3 - repeated calls are deterministic and input-sensitive --- duration_ms: 0.053958 location: '[demo]/digest.test.mjs:13:1' failureType: 'testCodeFailure' error: 'createHash is not defined' code: 'ERR_TEST_FAILURE' name: 'ReferenceError' stack: |- sha256 (file://[demo]/digest.mjs:2:3) TestContext. (file://[demo]/digest.test.mjs:14:16) Test.runInAsyncScope (node:async_hooks:206:9) Test.run (node:internal/test_runner/test:796:25) Test.processPendingSubtests (node:internal/test_runner/test:526:18) Test.postRun (node:internal/test_runner/test:889:19) Test.run (node:internal/test_runner/test:835:12) async Test.processPendingSubtests (node:internal/test_runner/test:526:7) ... 1..3 # tests 3 # suites 0 # pass 0 # fail 3 # cancelled 0 # skipped 0 # todo 0 # duration_ms 47.447875 Exit code: 1 REPAIR SETTINGS { "targetFile": "digest.mjs", "testCommand": "node --test --test-reporter=tap digest.test.mjs", "applyFix": true, "compactResponse": true, "allowCloudEscalation": false, "allowLocalModel": true, "contextFiles": [ "digest.test.mjs" ] } REPAIR RESULT { "kind": "TIER0_VERIFIED_APPLIED", "verification": "PASS", "applied": true, "targetFile": "digest.mjs", "repairsApplied": [ "AUTO_IMPORTED_NODE_CRYPTO" ], "executionMs": 1, "originalSha256": "fca9112db4b11b97b5f58d6e996119bc391e0e43264cee37daad8826dd7ba2b1", "replacementCode": "import { createHash } from 'node:crypto';\n\nexport function sha256(text) {\n return createHash('sha256').update(text, 'utf8').digest('hex');\n}\n", "replacementSha256": "393856b0d1ca7c70ce28cdc8ab1fcd2a1ce3a309594c5cdba9c6773914dab43a" } PATCH --- before/digest.mjs +++ after/digest.mjs @@ -1,3 +1,5 @@ +import { createHash } from 'node:crypto'; + export function sha256(text) { return createHash('sha256').update(text, 'utf8').digest('hex'); } INDEPENDENT RERUN: node --test --test-reporter=tap digest.test.mjs TAP version 13 # Subtest: empty input matches the standard SHA-256 vector ok 1 - empty input matches the standard SHA-256 vector --- duration_ms: 0.598209 ... # Subtest: abc matches the standard SHA-256 vector ok 2 - abc matches the standard SHA-256 vector --- duration_ms: 0.050291 ... # Subtest: repeated calls are deterministic and input-sensitive ok 3 - repeated calls are deterministic and input-sensitive --- duration_ms: 0.135167 ... 1..3 # tests 3 # suites 0 # pass 3 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 30.035 Exit code: 0 MEASUREMENTS AND LIMITS { "runId": "prawn-demo-20261014", "baseline": { "tests": 3, "passed": 0, "failed": 3, "exitCode": 1 }, "independentVerification": { "tests": 3, "passed": 3, "failed": 0, "exitCode": 0 }, "testsUnchanged": true, "repairKind": "TIER0_VERIFIED_APPLIED", "engineReportedTransformMs": 1, "measuredMcpCallMs": 61.495, "independentTestMs": 54.756, "afterSha256": "393856b0d1ca7c70ce28cdc8ab1fcd2a1ce3a309594c5cdba9c6773914dab43a", "cloudModelRequests": 0, "repairApiSpendUsd": 0, "comparativeSavings": "not measured", "limitations": "One synthetic missing-import fixture, not general repair accuracy, production safety, rollback verification or client compatibility. Transform timing excludes transport and tests. Recording includes readability pauses." }