From 77fddb9f1a478f5e16fa559e5d3c76481a48d503 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Sun, 8 Nov 2026 01:05:41 +0800 Subject: [PATCH] Verify strict identity coverage of AI rejection proofs --- tests/headless/runs.test.mjs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/headless/runs.test.mjs b/tests/headless/runs.test.mjs index 8807e06..5b1ed2c 100644 --- a/tests/headless/runs.test.mjs +++ b/tests/headless/runs.test.mjs @@ -217,3 +217,16 @@ test('a poll captured before cancellation cannot regress the acknowledged contro f.pollGate.resolve();await engine.settle();assert.equal(engine.getSnapshot().runtime.runs.get(run.id).status,'cancelled');assert.equal(engine.getSnapshot().runtime.runs.get(run.id).cursor,0); await f.clock.advance(1);await engine.settle();assert.equal(engine.getSnapshot().runtime.runs.get(run.id).status,'cancelled');assert.equal(engine.getSnapshot().runtime.runs.get(run.id).cursor,2);await engine.close(); }); + +test('AI action rejection proof must match request, operation, action and run; bare errors remain unknown',async()=>{ + const requestId=id(8800),operationId=id(8801),runId=id(8802),signal=new AbortController().signal; + for(const kind of ['run.start','run.cancel','run.apply']){ + const expectedVersions=kind==='run.cancel'?{}:{[root]:1},payload={protocol_version:2,request_id:requestId,operation_id:operationId,...(kind==='run.start'?{target_incarnation:1,expected_versions:expectedVersions,node_id:'a',model_id:'text',prompt:'Generate',parameters:{},propagate:false}:kind==='run.apply'?{target_canvas_id:root,target_incarnation:1,node_id:'a',output_id:id(8803)}:{})}; + const request={id:requestId,kind,protocolVersion:2,ownerCanvasId:root,...(kind!=='run.start'?{runId}:{}),operationIds:[operationId],canvasIds:Object.keys(expectedVersions),expectedVersions,body:JSON.stringify(payload)}; + const proof={protocol_version:2,request_id:requestId,operation_id:operationId,action:kind,...(kind!=='run.start'?{run_id:runId}:{}),status:'not-applied',terminal:true,error:'rejected'}; + let response={status:200,body:proof};const port=createFoundryRuns({workspaceId:workspace,rootId:root,registry,transport:async()=>response});assert.equal((await port.query(request,signal)).outcome,'not-applied'); + for(const patch of [{request_id:id(8890)},{operation_id:id(8891)},{action:'different'},{terminal:false},...(kind!=='run.start'?[{run_id:id(8892)}]:[])]){response={status:200,body:{...proof,...patch}};assert.equal((await port.query(request,signal)).outcome,'unresolved');} + response={status:403,body:{error:'forbidden'}};const denied=await port.query(request,signal);assert.equal(denied.outcome,'unresolved');assert.equal(denied.blocked,true); + response={status:404,body:{protocol_version:2,request_id:requestId,status:'unknown'}};const unknown=await port.query(request,signal);assert.equal(unknown.outcome,'unresolved');assert.equal(unknown.blocked,undefined); + } +});