RUN v3.2.7 /tmp/circe-pr3-evidence × recovery.test.ts > D1: clean restart preserves the presented confirmation gate 13ms → expected [] to deeply equal [ 'B' ] × recovery.test.ts > D2: restart after the presented gate settles does not address older work 4ms → expected 'CANCELLED' to be 'AWAITING_CONFIRMATION' // Object.is equality × recovery.test.ts > D3: accepted command ids cannot suppress another interaction 4ms → expected [] to have a length of 1 but got +0 × recovery.test.ts > D4: interaction identity prefixes cannot import foreign effects 2ms → expected 1 to be +0 // Object.is equality × recovery.test.ts > D5: lost final command outcome still preserves payload conflict detection 7ms → promise resolved "{ semanticEvents: [], …(8) }" instead of rejecting × recovery.test.ts > D6: a crash after acceptance alone cannot silently consume an unexecuted command 2ms → expected false to be true // Object.is equality × recovery.test.ts > D7: crash-before-ack batch receipts retain the actual dispatched operation key 2ms → expected [ Array(2) ] to deeply equal [ Array(2) ] × recovery.test.ts > D8: completed effect payload/failure survives clean restart (failed=false) 4ms → expected { …(12) } to match object { status: 'SUCCEEDED', …(1) } (15 matching properties omitted from actual) × recovery.test.ts > D8: completed effect payload/failure survives clean restart (failed=true) 3ms → expected { …(12) } to match object { status: 'FAILED', failure: { …(2) } } (14 matching properties omitted from actual) × recovery.test.ts > D9: crash during a multi-target freeze cannot silently finish a partial effect set 3ms → expected false to be true // Object.is equality × recovery.test.ts > D10: restart clears an in-flight validation reservation that has no surviving worker 4ms → expected [] to have a length of 1 but got +0 × recovery.test.ts > D11: a completed effect recovered before the terminal transaction record cannot authorize a new continuation 7ms → the given combination of arguments (undefined and string) is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a string ✓ recovery.test.ts > D12 control: completed same-payload replay keeps original result without invoking 2ms ✓ recovery.test.ts > D13 control: restart resumes the complete paused effect set without changing its targets 2ms ✓ recovery.test.ts > D14 control: a settled named continuation is rejected without a restart 1ms ⎯⎯⎯⎯⎯⎯ Failed Tests 12 ⎯⎯⎯⎯⎯⎯⎯ FAIL recovery.test.ts > D1: clean restart preserves the presented confirmation gate AssertionError: expected [] to deeply equal [ 'B' ] - Expected + Received - [ - "B", - ] + [] ❯ recovery.test.ts:124:96 122| const second=rig({journal:prefix(j),descriptor:gate}); 123| await second.runtime.command({kind:'confirm',commandId:'yes'}); 124| expect(second.invokes.flatMap(req=>req.bindings.flatMap((b:any)=>b.re… | ^ 125| expect(second.runtime.state().presentedGateId).toBe(b.transactions.fi… 126| }); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/12]⎯ FAIL recovery.test.ts > D2: restart after the presented gate settles does not address older work AssertionError: expected 'CANCELLED' to be 'AWAITING_CONFIRMATION' // Object.is equality Expected: "AWAITING_CONFIRMATION" Received: "CANCELLED" ❯ recovery.test.ts:135:80 133| const second=rig({journal:prefix(j),descriptor:gate}); 134| await second.runtime.command({kind:'cancel',commandId:'no'}); 135| expect(second.runtime.state().transactions.get(a.transactions[0]!.id)… | ^ 136| }); 137| it('D3: accepted command ids cannot suppress another interaction',asyn… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/12]⎯ FAIL recovery.test.ts > D3: accepted command ids cannot suppress another interaction AssertionError: expected [] to have a length of 1 but got +0 - Expected + Received - 1 + 0 ❯ recovery.test.ts:140:20 138| const j=createInMemoryJournal();await rig({journal:j,interactionId:'A… 139| const b=rig({journal:prefix(j),interactionId:'B'});await b.runtime.co… 140| expect(b.invokes).toHaveLength(1);expect(b.runtime.state().intents.si… | ^ 141| }); 142| it('D4: interaction identity prefixes cannot import foreign effects',a… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/12]⎯ FAIL recovery.test.ts > D4: interaction identity prefixes cannot import foreign effects AssertionError: expected 1 to be +0 // Object.is equality - Expected + Received - 0 + 1 ❯ recovery.test.ts:145:41 143| const j=createInMemoryJournal();await rig({journal:j,interactionId:'A… 144| const b=rig({journal:prefix(j),interactionId:'A'}); 145| expect(b.runtime.state().effects.size).toBe(0); | ^ 146| }); 147| it('D5: lost final command outcome still preserves payload conflict de… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/12]⎯ FAIL recovery.test.ts > D5: lost final command outcome still preserves payload conflict detection AssertionError: promise resolved "{ semanticEvents: [], …(8) }" instead of rejecting - Expected + Received - Error { - "message": "rejected promise", + { + "calls": [], + "effects": [ + { + "arguments": {}, + "bindings": [ + { + "phrase": undefined, + "provenance": { + "at": "2026-09-22T09:00:00.000Z", + "conclusion": "a|tasks|task|A", + "confidence": 1, + "inputs": [], + "rule": "compile.v1", + }, + "refs": [ + { + "authority": "a", + "id": "A", + "namespace": "tasks", + "type": "task", + }, + ], + "slot": "targets", + }, + ], + "capability": "task.resume", + "endedAt": "2026-09-22T09:00:00.000Z", + "failure": undefined, + "id": "effect:interaction:durable:1", + "intentId": "intent:1", + "intentRevision": 1, + "preconditions": [ + { + "ref": { + "authority": "a", + "id": "A", + "namespace": "tasks", + "type": "task", + }, + "token": { + "authority": "a", + "observedAt": "2026-09-22T09:00:00.000Z", + "token": "1", + }, + }, + ], + "receipt": { + "dispatchedAt": "2026-09-22T09:00:00.000Z", + "effectId": "effect:interaction:durable:1", + "executor": "exec", + "idempotencyKey": "effect:interaction:durable:1", + }, + "status": "SUCCEEDED", + "transactionId": "tx:1", + }, + ], + "intents": [ + { + "arguments": {}, + "bindings": [ + { + "expectations": [ + { + "ref": { + "authority": "a", + "id": "A", + "namespace": "tasks", + "type": "task", + }, + "token": { + "authority": "a", + "observedAt": "2026-09-22T09:00:00.000Z", + "token": "1", + }, + }, + ], + "origins": [], + "provenance": { + "at": "2026-09-22T09:00:00.000Z", + "conclusion": "a|tasks|task|A", + "confidence": 1, + "inputs": [], + "rule": "compile.v1", + }, + "refs": [ + { + "authority": "a", + "id": "A", + "namespace": "tasks", + "type": "task", + }, + ], + "slot": "targets", + }, + ], + "capability": "task.resume", + "createdAt": "2026-09-22T09:00:00.000Z", + "id": "intent:1", + "provenance": { + "at": "2026-09-22T09:00:00.000Z", + "conclusion": "task.resume", + "confidence": 1, + "inputs": [], + "rule": "compile.v1", + }, + "readUsage": [], + "revision": 1, + }, + ], + "provenance": [], + "references": [], + "reply": { + "kind": "none", + }, + "scope": [], + "semanticEvents": [], + "transactions": [ + { + "commandId": "p", + "commandKey": "command:p", + "confirmation": { + "at": "2026-09-22T09:00:00.000Z", + "intentRevision": 1, + }, + "createdAt": "2026-09-22T09:00:00.000Z", + "effects": [ + "effect:interaction:durable:1", + ], + "history": [ + { + "at": "2026-09-22T09:00:00.000Z", + "cause": "p", + "state": "DRAFT", + }, + ], + "id": "tx:1", + "intentId": "intent:1", + "paused": false, + "pendingCommitRevision": undefined, + "pinnedScopeIds": [], + "state": "SUCCEEDED", + "updatedAt": "2026-09-22T09:00:00.000Z", + }, + ], } ❯ recovery.test.ts:151:63 149| const cutoff=j.entries().findIndex(e=>e.kind==='command-outcome'); 150| const second=rig({journal:prefix(j,cutoff)}); 151| await expect(second.runtime.command(proposal('p',[ref('B')]))).reject… | ^ 152| expect(second.invokes).toHaveLength(0); 153| }); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/12]⎯ FAIL recovery.test.ts > D6: a crash after acceptance alone cannot silently consume an unexecuted command AssertionError: expected false to be true // Object.is equality - Expected + Received - true + false ❯ recovery.test.ts:161:68 159| // Either complete the recorded but unstarted command, or expose an e… 160| // recoverable failure. An empty cached result is neither. 161| expect(replay.intents.length>0 || (replay.errors?.length ?? 0)>0).toB… | ^ 162| }); 163| it('D7: crash-before-ack batch receipts retain the actual dispatched o… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/12]⎯ FAIL recovery.test.ts > D7: crash-before-ack batch receipts retain the actual dispatched operation key AssertionError: expected [ Array(2) ] to deeply equal [ Array(2) ] - Expected + Received [ "effect:interaction:durable:1", - "effect:interaction:durable:1", + "effect:interaction:durable:2", ] ❯ recovery.test.ts:169:53 167| const actualKey=first.invokes[0].idempotencyKey; 168| for(const effect of second.runtime.state().effects.values())await sec… 169| expect(second.reconciles.map(r=>r.idempotencyKey)).toEqual([actualKey… | ^ 170| expect(second.reconciles.map(r=>r.executor)).toEqual(['exec','exec']); 171| expect(second.invokes).toHaveLength(0); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/12]⎯ FAIL recovery.test.ts > D8: completed effect payload/failure survives clean restart (failed=false) AssertionError: expected { …(12) } to match object { status: 'SUCCEEDED', …(1) } (15 matching properties omitted from actual) - Expected + Received { - "result": { - "receiptNumber": "r-1", - }, "status": "SUCCEEDED", } ❯ recovery.test.ts:178:49 176| const original=await first.runtime.command(proposal('p'));const id=or… 177| const second=rig({journal:prefix(j)}); 178| expect(second.runtime.state().effects.get(id)).toMatchObject(failed?{… | ^ 179| }); 180| it('D9: crash during a multi-target freeze cannot silently finish a pa… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/12]⎯ FAIL recovery.test.ts > D8: completed effect payload/failure survives clean restart (failed=true) AssertionError: expected { …(12) } to match object { status: 'FAILED', failure: { …(2) } } (14 matching properties omitted from actual) - Expected + Received { - "failure": { - "detail": "server denied", - "kind": "EXECUTION_ERROR", - }, + "failure": undefined, "status": "FAILED", } ❯ recovery.test.ts:178:49 176| const original=await first.runtime.command(proposal('p'));const id=or… 177| const second=rig({journal:prefix(j)}); 178| expect(second.runtime.state().effects.get(id)).toMatchObject(failed?{… | ^ 179| }); 180| it('D9: crash during a multi-target freeze cannot silently finish a pa… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/12]⎯ FAIL recovery.test.ts > D9: crash during a multi-target freeze cannot silently finish a partial effect set AssertionError: expected false to be true // Object.is equality - Expected + Received - true + false ❯ recovery.test.ts:187:58 185| const state=second.runtime.state(),tx=state.transactions.get(txid)!; 186| const targets=tx.effects.flatMap(id=>state.effects.get(id)!.bindings.… 187| expect(tx.state!=='SUCCEEDED' || targets.includes('B')).toBe(true); | ^ 188| }); 189| it('D10: restart clears an in-flight validation reservation that has n… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/12]⎯ FAIL recovery.test.ts > D10: restart clears an in-flight validation reservation that has no surviving worker AssertionError: expected [] to have a length of 1 but got +0 - Expected + Received - 1 + 0 ❯ recovery.test.ts:197:25 195| await second.runtime.command({kind:'resume',commandId:'resume',transa… 196| await second.runtime.command({kind:'confirm',commandId:'confirm-again… 197| expect(second.invokes).toHaveLength(1); | ^ 198| }); 199| it('D11: a completed effect recovered before the terminal transaction … ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/12]⎯ FAIL recovery.test.ts > D11: a completed effect recovered before the terminal transaction record cannot authorize a new continuation AssertionError: the given combination of arguments (undefined and string) is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a string ❯ recovery.test.ts:204:27 202| const second=rig({journal:prefix(j,outcome+1)}); 203| const continued=await second.runtime.command({...proposal('continue')… 204| expect(continued.errors).toContain('STALE_INTENT'); | ^ 205| expect(second.invokes).toHaveLength(0); 206| }); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/12]⎯ Test Files 1 failed (1) Tests 12 failed | 3 passed (15) Start at 02:57:24 Duration 618ms (transform 181ms, setup 0ms, collect 193ms, tests 60ms, environment 0ms, prepare 82ms)