From bc96d250b5a32485b32ff749414a6dc294bed9c3 Mon Sep 17 00:00:00 2001 From: Christopher Tso Date: Sat, 10 Oct 2026 18:52:50 +1100 Subject: [PATCH] fix(contract): emit script grader checks --- .../scripts/check-repo-materialization.ts | 18 +++++++++++------ .../scripts/check-script-grader-payload.ts | 20 ++++++++++++------- examples/contract/scripts/check-workspace.ts | 18 +++++++++++------ 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/examples/contract/scripts/check-repo-materialization.ts b/examples/contract/scripts/check-repo-materialization.ts index f6fc573e8..755f4aff5 100644 --- a/examples/contract/scripts/check-repo-materialization.ts +++ b/examples/contract/scripts/check-repo-materialization.ts @@ -21,19 +21,25 @@ interface GraderPayload { readonly workspace_path?: string | null; } -interface Assertion { +interface Check { readonly text: string; - readonly passed: boolean; + readonly pass: boolean; + readonly reason: string; readonly evidence?: string; } const payloadText = readFileSync(0, 'utf8'); const payload = JSON.parse(payloadText) as GraderPayload; const workspacePath = payload.workspace_path ?? process.env.AGENTV_WORKSPACE_PATH; -const assertions: Assertion[] = []; +const checks: Check[] = []; function push(text: string, passed: boolean, evidence?: string): void { - assertions.push({ text, passed, ...(evidence ? { evidence } : {}) }); + checks.push({ + text, + pass: passed, + reason: evidence ?? (passed ? 'Check passed' : 'Check failed'), + ...(evidence ? { evidence } : {}), + }); } function runGit(repoPath: string, args: readonly string[]): string { @@ -59,7 +65,7 @@ function collectStrings(value: unknown, strings: string[]): void { if (!workspacePath) { push('workspace_path is provided', false, 'workspace_path was missing from the grader payload'); - console.log(JSON.stringify({ assertions })); + console.log(JSON.stringify({ checks })); process.exit(0); } @@ -127,4 +133,4 @@ push( fileInputWasSubstituted ? undefined : `Marker ${FILE_INPUT_MARKER} not found in grader payload`, ); -console.log(JSON.stringify({ assertions })); +console.log(JSON.stringify({ checks })); diff --git a/examples/contract/scripts/check-script-grader-payload.ts b/examples/contract/scripts/check-script-grader-payload.ts index af30ef0b4..5be48f865 100644 --- a/examples/contract/scripts/check-script-grader-payload.ts +++ b/examples/contract/scripts/check-script-grader-payload.ts @@ -9,16 +9,22 @@ import { readFileSync } from 'node:fs'; -interface Assertion { +interface Check { readonly text: string; - readonly passed: boolean; + readonly pass: boolean; + readonly reason: string; readonly evidence?: string; } -const assertions: Assertion[] = []; +const checks: Check[] = []; function push(text: string, passed: boolean, evidence?: string): void { - assertions.push({ text, passed, ...(evidence ? { evidence } : {}) }); + checks.push({ + text, + pass: passed, + reason: evidence ?? (passed ? 'Check passed' : 'Check failed'), + ...(evidence ? { evidence } : {}), + }); } function isRecord(value: unknown): value is Record { @@ -49,14 +55,14 @@ try { const parsed = JSON.parse(readFileSync(0, 'utf8')) as unknown; if (!isRecord(parsed)) { push('stdin payload is a JSON object', false, `Received ${typeof parsed}`); - console.log(JSON.stringify({ assertions })); + console.log(JSON.stringify({ checks })); process.exit(0); } payload = parsed; } catch (error) { const message = error instanceof Error ? error.message : String(error); push('stdin payload is valid JSON', false, message); - console.log(JSON.stringify({ assertions })); + console.log(JSON.stringify({ checks })); process.exit(0); } @@ -145,4 +151,4 @@ push( hasOwn(payload, 'answer') ? 'Unexpected answer field found in payload' : undefined, ); -console.log(JSON.stringify({ assertions })); +console.log(JSON.stringify({ checks })); diff --git a/examples/contract/scripts/check-workspace.ts b/examples/contract/scripts/check-workspace.ts index 09769d3ba..4123258b1 100644 --- a/examples/contract/scripts/check-workspace.ts +++ b/examples/contract/scripts/check-workspace.ts @@ -14,23 +14,29 @@ interface GraderPayload { readonly workspace_path?: string | null; } -interface Assertion { +interface Check { readonly text: string; - readonly passed: boolean; + readonly pass: boolean; + readonly reason: string; readonly evidence?: string; } const payload = JSON.parse(readFileSync(0, 'utf8')) as GraderPayload; const workspacePath = payload.workspace_path ?? process.env.AGENTV_WORKSPACE_PATH; -const assertions: Assertion[] = []; +const checks: Check[] = []; function push(text: string, passed: boolean, evidence?: string): void { - assertions.push({ text, passed, ...(evidence ? { evidence } : {}) }); + checks.push({ + text, + pass: passed, + reason: evidence ?? (passed ? 'Check passed' : 'Check failed'), + ...(evidence ? { evidence } : {}), + }); } if (!workspacePath) { push('workspace_path is provided', false, 'workspace_path was missing from the grader payload'); - console.log(JSON.stringify({ assertions })); + console.log(JSON.stringify({ checks })); process.exit(0); } @@ -67,4 +73,4 @@ if (markerExists) { } } -console.log(JSON.stringify({ assertions })); +console.log(JSON.stringify({ checks }));