@openpond/evals 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,6 +44,24 @@ Subpath exports are available at `/harness`, `/tasksets`, `/benchmarks`, `/grade
44
44
  not a hosted client. It does not execute OpenPond Desktop or Sandbox sessions,
45
45
  resolve credentials, or persist artifacts.
46
46
 
47
+ ## Ordinary graders
48
+
49
+ `gradeTaskEvidence` returns a sealed ordinary Taskset grade with the complete
50
+ grader population, weighted score, hard gates and explicit unavailable status.
51
+ `verifyTaskGrade` checks retained results against the exact admitted task,
52
+ attempt evidence and graders, including each component hash and aggregation.
53
+ `aggregateGraderScores` provides the same policy to native grading adapters.
54
+ Ordinary grades do not require or manufacture a Reward binding.
55
+
56
+ `evaluateDeterministicGrader` and `portableDeterministicCheck` from `/graders`
57
+ provide the shared local/portable interpretation of ordinary checks. They retain
58
+ explicit exact-text normalization, final-answer extraction, structured JSON,
59
+ artifact and runtime-event requirements, and structural state comparisons.
60
+ Native test/diff checks declare their expected output field when exported.
61
+ Empty, unsupported or unavailable checks remain unscorable rather than earning
62
+ a zero or a passing reward. Desktop grade components preserve null scores and
63
+ display them as not scored.
64
+
47
65
  ## Authored Taskset metrics
48
66
 
49
67
  `@openpond/evals/metrics` exports the shared `TasksetMetricPolicySchema` and
@@ -0,0 +1,110 @@
1
+ import { contentHash } from "@openpond/harness";
2
+ import { validateTaskSchema, validateTaskValue } from "./task-schema.js";
3
+ /** Local and portable execution interpret the same declared checks. Missing or
4
+ * unsupported checks are unscorable; an empty check cannot earn a reward. */
5
+ export function evaluateDeterministicGrader(input) {
6
+ const { grader, task, evidence } = input;
7
+ const config = grader.config;
8
+ if (grader.kind === "content") {
9
+ const outputField = text(config.outputField) ?? "text";
10
+ const actual = text(evidence.output[outputField]);
11
+ if (config.operator === "exact_equals") {
12
+ const expected = text(config.expectedValue);
13
+ if (expected === null)
14
+ return unavailable("Exact content grading requires an expected value.");
15
+ const normalize = (value) => {
16
+ const unicode = config.normalizeUnicode === true ? value.normalize("NFC") : value;
17
+ return config.trimWhitespace === true ? unicode.trim() : unicode;
18
+ };
19
+ return outcome(actual !== null && normalize(actual) === normalize(expected));
20
+ }
21
+ if (config.operator !== undefined && config.operator !== "final_answer_equals_expected")
22
+ return unavailable("Unsupported content grader operator.");
23
+ if (config.operator === undefined && (config.includes !== undefined || config.excludes !== undefined)) {
24
+ const includes = strings(config.includes), excludes = strings(config.excludes);
25
+ if (!includes.length && !excludes.length)
26
+ return unavailable("Content grading requires a nonempty check.");
27
+ const value = typeof evidence.output.text === "string" ? evidence.output.text : JSON.stringify(evidence.output);
28
+ return outcome(includes.every(item => value.includes(item)) && excludes.every(item => !value.includes(item)));
29
+ }
30
+ const expected = text(config.expectedValue) ?? text(task.expectedOutput?.[text(config.expectedField) ?? "text"]);
31
+ const normalize = config.operator === "final_answer_equals_expected" ? normalizeFinalAnswer : normalizeContent;
32
+ if (expected === null || !normalize(expected))
33
+ return unavailable("Content grading requires a nonempty expected value.");
34
+ return outcome(actual !== null && normalize(actual) === normalize(expected));
35
+ }
36
+ if (grader.kind === "schema") {
37
+ if (config.operator !== undefined && config.operator !== "json_schema_subset")
38
+ return unavailable("Unsupported schema grader operator.");
39
+ const schema = config.operator === "json_schema_subset" ? config.schema : config.jsonSchema;
40
+ if (schema !== undefined) {
41
+ const checked = validateTaskSchema(schema);
42
+ if (!checked.valid)
43
+ return unavailable(checked.issues[0].message);
44
+ let value = evidence.output;
45
+ if (config.operator === "json_schema_subset") {
46
+ const encoded = evidence.output[text(config.jsonField) ?? "text"];
47
+ if (typeof encoded === "string") {
48
+ try {
49
+ value = JSON.parse(encoded.trim().replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/, ""));
50
+ }
51
+ catch {
52
+ return outcome(false, "The model output was not valid JSON.");
53
+ }
54
+ }
55
+ }
56
+ const checkedValue = validateTaskValue(schema, value);
57
+ return outcome(checkedValue.valid, checkedValue.valid ? undefined : checkedValue.issues.map(issue => issue.message).join(" "));
58
+ }
59
+ const required = strings(config.requiredKeys);
60
+ if (!required.length)
61
+ return unavailable("Schema grading requires a JSON Schema or explicit required keys.");
62
+ return outcome(required.every(key => Object.hasOwn(evidence.output, key)));
63
+ }
64
+ if (grader.kind === "artifact") {
65
+ const contains = text(config.refIncludes);
66
+ if (!contains)
67
+ return unavailable("Artifact grading requires a declared artifact reference.");
68
+ return outcome(evidence.artifactRefs.some(ref => ref.includes(contains)));
69
+ }
70
+ if (grader.kind === "runtime_event") {
71
+ const required = strings(config.requiredEvents);
72
+ if (!required.length)
73
+ return unavailable("Runtime event grading requires declared events.");
74
+ return outcome(required.every(event => evidence.runtimeEventRefs.some(ref => ref.includes(event))));
75
+ }
76
+ if (config.operator === "output_field_equals") {
77
+ const field = text(config.outputField);
78
+ if (!field || !Object.hasOwn(config, "expectedValue"))
79
+ return unavailable("Output comparison requires a field and expected value.");
80
+ return outcome(Object.hasOwn(evidence.output, field) && contentHash(evidence.output[field]) === contentHash(config.expectedValue));
81
+ }
82
+ if (config.operator !== undefined)
83
+ return unavailable("Unsupported state grader operator.");
84
+ const fields = strings(config.fields);
85
+ const compared = fields.length ? fields : Object.keys(task.expectedOutput ?? {});
86
+ if (!compared.length || compared.some(field => !task.expectedOutput || !Object.hasOwn(task.expectedOutput, field)))
87
+ return unavailable("State grading requires expected values for every compared field.");
88
+ return outcome(compared.every(field => Object.hasOwn(evidence.output, field) && contentHash(evidence.output[field]) === contentHash(task.expectedOutput[field])));
89
+ }
90
+ /** Encode native artifact/test checks without changing their meaning in transit. */
91
+ export function portableDeterministicCheck(grader) {
92
+ if (grader.kind === "file") {
93
+ const { pathIncludes, ...config } = grader.config;
94
+ return { kind: "artifact", config: { ...config, ...(pathIncludes === undefined ? {} : { refIncludes: pathIncludes }) } };
95
+ }
96
+ if (grader.kind === "diff" || grader.kind === "test")
97
+ return { kind: "state", config: { operator: "output_field_equals", outputField: grader.kind === "test" ? "testsPassed" : "diffAccepted", expectedValue: true } };
98
+ return { kind: grader.kind, config: grader.config };
99
+ }
100
+ function outcome(passed, feedback) { return { score: Number(passed), passed, feedback: feedback ?? (passed ? "Deterministic grader passed." : "Deterministic grader failed.") }; }
101
+ function unavailable(feedback) { return { score: null, passed: false, feedback }; }
102
+ function text(value) { return typeof value === "string" ? value : null; }
103
+ function strings(value) { return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim().length > 0) : []; }
104
+ function normalizeContent(value) { return value.normalize("NFKC").trim().replace(/[,,]/g, "").replace(/[.\s]+$/g, "").replace(/\s+/g, " "); }
105
+ function normalizeFinalAnswer(value) {
106
+ const boxed = [...value.matchAll(/\\boxed\{([^{}]+)\}/g)].at(-1)?.[1];
107
+ const hashAnswer = value.match(/####\s*([^\n\r]+)/)?.[1];
108
+ const label = value.match(/(?:final\s+answer|answer)\s*(?::|is|=)\s*([^\n\r]+)/i)?.[1];
109
+ return normalizeContent((boxed ?? hashAnswer ?? label ?? value).normalize("NFKC").trim().replace(/^\$+|\$+$/g, "").replace(/^\\\(|\\\)$/g, ""));
110
+ }
package/dist/graders.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { FailureClassSchema, ReleaseHashSchema, ReleaseIdSchema, contentHash } from "@openpond/harness";
3
- import { validateTaskSchema, validateTaskValue } from "./task-schema.js";
3
+ import { evaluateDeterministicGrader } from "./deterministic-graders.js";
4
+ export { evaluateDeterministicGrader, portableDeterministicCheck } from "./deterministic-graders.js";
4
5
  export const GraderEvidenceContentSchema = z.object({
5
6
  schemaVersion: z.literal("openpond.graderEvidence.v1"),
6
7
  graderId: ReleaseIdSchema,
@@ -43,55 +44,15 @@ export async function gradeEvidence(input) {
43
44
  }));
44
45
  }
45
46
  function gradeDeterministic(grader, task, attempt) {
46
- let passed = false;
47
- const config = grader.config;
48
- if (grader.kind === "content") {
49
- const outputField = string(config.outputField) ?? "text";
50
- const actual = string(attempt.output[outputField]);
51
- const expected = string(config.expectedValue) ?? string(task.expectedOutput?.[string(config.expectedField) ?? "text"]);
52
- if (expected === null || !normalize(expected))
53
- return unavailable("Content grading requires a nonempty expected value.");
54
- passed = actual !== null && expected !== null && normalize(actual) === normalize(expected);
55
- }
56
- else if (grader.kind === "schema") {
57
- if (config.jsonSchema !== undefined) {
58
- const schema = validateTaskSchema(config.jsonSchema);
59
- if (!schema.valid)
60
- return unavailable(schema.issues[0].message);
61
- passed = validateTaskValue(config.jsonSchema, attempt.output).valid;
62
- }
63
- else {
64
- const required = strings(config.requiredKeys);
65
- if (!required.length)
66
- return unavailable("Schema grading requires a JSON Schema or explicit required keys.");
67
- passed = required.every((key) => Object.hasOwn(attempt.output, key));
68
- }
69
- }
70
- else if (grader.kind === "artifact") {
71
- const contains = string(config.refIncludes) ?? "";
72
- if (!contains)
73
- return unavailable("Artifact grading requires a declared artifact reference.");
74
- passed = attempt.artifactRefs.some((ref) => ref.includes(contains));
75
- }
76
- else if (grader.kind === "runtime_event") {
77
- const requiredEvents = strings(config.requiredEvents);
78
- if (!requiredEvents.length)
79
- return unavailable("Runtime event grading requires declared events.");
80
- passed = requiredEvents.every((required) => attempt.runtimeEventRefs.some((ref) => ref.includes(required)));
81
- }
82
- else {
83
- const fields = strings(config.fields);
84
- const compared = fields.length ? fields : Object.keys(task.expectedOutput ?? {});
85
- if (!compared.length || compared.some((field) => !task.expectedOutput || !Object.hasOwn(task.expectedOutput, field)))
86
- return unavailable("State grading requires expected values for every compared field.");
87
- passed = compared.every((field) => Object.hasOwn(attempt.output, field) && contentHash(attempt.output[field]) === contentHash(task.expectedOutput[field]));
88
- }
47
+ const result = evaluateDeterministicGrader({ grader, task, evidence: attempt });
48
+ if (result.score === null)
49
+ return unavailable(result.feedback);
89
50
  return {
90
- score: passed ? 1 : 0,
91
- passed,
51
+ score: result.score,
52
+ passed: result.passed,
92
53
  rewardEligible: grader.rewardEligible,
93
- failureClass: passed ? null : "policy_failure",
94
- feedback: [passed ? "Deterministic grader passed." : "Deterministic grader failed."],
54
+ failureClass: result.passed ? null : "policy_failure",
55
+ feedback: [result.feedback],
95
56
  visibleEvidenceRefs: [...attempt.runtimeEventRefs, ...attempt.artifactRefs],
96
57
  privilegedEvidenceRefs: grader.privileged ? [task.privilegedContextRef].filter((ref) => ref !== null) : [],
97
58
  };
@@ -109,6 +70,73 @@ function evidence(grader, result) {
109
70
  function unavailable(message) {
110
71
  return { score: null, passed: false, rewardEligible: false, failureClass: "grader_failure", feedback: [message], visibleEvidenceRefs: [], privilegedEvidenceRefs: [] };
111
72
  }
112
- function string(value) { return typeof value === "string" ? value : null; }
113
- function strings(value) { return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim().length > 0) : []; }
114
- function normalize(value) { return value.normalize("NFKC").trim().replace(/[,,]/g, "").replace(/[.\s]+$/g, "").replace(/\s+/g, " "); }
73
+ const GradeSummarySchema = z.object({
74
+ score: z.number().min(0).max(1).nullable(), passed: z.boolean(),
75
+ rewardEligible: z.boolean(), failureClass: FailureClassSchema.nullable(),
76
+ gradingStatus: z.enum(["scored", "unscorable", "not_configured"]),
77
+ }).strict();
78
+ /** Shared ordinary grading policy. Results must match the declared population;
79
+ * missing checks cannot disappear from the denominator or the hard gates. */
80
+ export function aggregateGraderScores(input) {
81
+ const ids = new Set(input.graders.map(grader => grader.id));
82
+ if (ids.size !== input.graders.length || input.components.length !== input.graders.length)
83
+ throw new Error("Grade population differs from its declared graders.");
84
+ const components = new Map(input.components.map(item => [item.graderId, item]));
85
+ if (components.size !== input.components.length)
86
+ throw new Error("Grade population contains duplicate graders.");
87
+ let weighted = 0;
88
+ let totalWeight = 0;
89
+ let hardGateFailed = false;
90
+ let passed = true;
91
+ let eligible = false;
92
+ let unavailable = false;
93
+ let infrastructure = !!input.infrastructureError;
94
+ for (const grader of input.graders) {
95
+ const item = components.get(grader.id);
96
+ if (!item || item.graderVersion !== grader.version)
97
+ throw new Error("Grade identity differs from its declared grader.");
98
+ if (!Number.isFinite(grader.weight) || grader.weight < 0 || (item.score !== null && (!Number.isFinite(item.score) || item.score < 0 || item.score > 1)))
99
+ throw new Error("Grade scores and weights must be finite and within their declared range.");
100
+ infrastructure ||= item.failureClass === "infrastructure_failure";
101
+ unavailable ||= item.score === null || (item.failureClass !== null && item.failureClass !== "policy_failure");
102
+ hardGateFailed ||= grader.hardGate && !item.passed;
103
+ passed &&= item.passed;
104
+ eligible ||= grader.rewardEligible && item.rewardEligible;
105
+ totalWeight += grader.weight;
106
+ weighted += (item.score ?? 0) * grader.weight;
107
+ }
108
+ const score = infrastructure || unavailable || totalWeight <= 0 ? null : hardGateFailed ? 0 : weighted / totalWeight;
109
+ passed = score !== null && !hardGateFailed && passed;
110
+ return GradeSummarySchema.parse({ score, passed, rewardEligible: score !== null && eligible,
111
+ failureClass: infrastructure ? "infrastructure_failure" : score === null ? "grader_failure" : passed ? null : "policy_failure",
112
+ gradingStatus: !input.graders.length && !infrastructure ? "not_configured" : score === null ? "unscorable" : "scored" });
113
+ }
114
+ export const TaskGradeSchema = GradeSummarySchema.extend({
115
+ schemaVersion: z.literal("openpond.taskGrade.v1"),
116
+ taskHash: ReleaseHashSchema, evidenceHash: ReleaseHashSchema, graderSetHash: ReleaseHashSchema,
117
+ components: z.array(GraderEvidenceSchema).max(1_000), contentHash: ReleaseHashSchema,
118
+ }).strict();
119
+ export async function gradeTaskEvidence(input) {
120
+ const components = await gradeEvidence(input);
121
+ const content = { schemaVersion: "openpond.taskGrade.v1",
122
+ taskHash: contentHash(input.task), evidenceHash: contentHash(input.evidence), graderSetHash: contentHash(input.graders), components,
123
+ ...aggregateGraderScores({ graders: input.graders, components, infrastructureError: input.evidence.infrastructureError }) };
124
+ return TaskGradeSchema.parse({ ...content, contentHash: contentHash(content) });
125
+ }
126
+ /** Verify retained results against the exact admitted inputs without rerunning
127
+ * graders. The storage owner supplies the trusted artifact, not the caller. */
128
+ export function verifyTaskGrade(value, input) {
129
+ const result = TaskGradeSchema.parse(value);
130
+ const { contentHash: hash, ...content } = result;
131
+ if (hash !== contentHash(content) || result.taskHash !== contentHash(input.task) || result.evidenceHash !== contentHash(input.evidence) || result.graderSetHash !== contentHash(input.graders))
132
+ throw new Error("Task grade differs from its admitted task, evidence or graders.");
133
+ for (const component of result.components) {
134
+ const { contentHash: componentHash, ...body } = component;
135
+ if (componentHash !== contentHash(body))
136
+ throw new Error("Grader evidence integrity failed.");
137
+ }
138
+ const summary = aggregateGraderScores({ graders: input.graders, components: result.components, infrastructureError: input.evidence.infrastructureError });
139
+ if (contentHash(GradeSummarySchema.parse({ score: result.score, passed: result.passed, rewardEligible: result.rewardEligible, failureClass: result.failureClass, gradingStatus: result.gradingStatus })) !== contentHash(summary))
140
+ throw new Error("Task grade summary differs from its grader evidence.");
141
+ return result;
142
+ }
@@ -0,0 +1,23 @@
1
+ import type { DeterministicGraderSpec, TaskRecord } from "./tasksets.js";
2
+ export type DeterministicGrade = {
3
+ score: number | null;
4
+ passed: boolean;
5
+ feedback: string;
6
+ };
7
+ /** Local and portable execution interpret the same declared checks. Missing or
8
+ * unsupported checks are unscorable; an empty check cannot earn a reward. */
9
+ export declare function evaluateDeterministicGrader(input: {
10
+ grader: Pick<DeterministicGraderSpec, "kind" | "config">;
11
+ task: Pick<TaskRecord, "expectedOutput">;
12
+ evidence: {
13
+ output: Record<string, unknown>;
14
+ artifactRefs: string[];
15
+ runtimeEventRefs: string[];
16
+ };
17
+ }): DeterministicGrade;
18
+ /** Encode native artifact/test checks without changing their meaning in transit. */
19
+ export declare function portableDeterministicCheck(grader: {
20
+ kind: DeterministicGraderSpec["kind"] | "file" | "diff" | "test";
21
+ config: Record<string, unknown>;
22
+ }): Pick<DeterministicGraderSpec, "kind" | "config">;
23
+ //# sourceMappingURL=deterministic-graders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministic-graders.d.ts","sourceRoot":"","sources":["../../../../src/deterministic-graders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGzE,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F;6EAC6E;AAC7E,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACzD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACzC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACnG,GAAG,kBAAkB,CAoErB;AAED,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAO1M"}
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import type { GraderSpec, TaskRecord } from "./tasksets.js";
3
+ export { evaluateDeterministicGrader, portableDeterministicCheck } from "./deterministic-graders.js";
3
4
  export declare const GraderEvidenceContentSchema: z.ZodObject<{
4
5
  schemaVersion: z.ZodLiteral<"openpond.graderEvidence.v1">;
5
6
  graderId: z.ZodString;
@@ -67,4 +68,77 @@ export declare function gradeEvidence(input: {
67
68
  customVerifier?: CustomVerifierRunner;
68
69
  }): Promise<GraderEvidence[]>;
69
70
  export type GraderEvidence = z.infer<typeof GraderEvidenceSchema>;
71
+ declare const GradeSummarySchema: z.ZodObject<{
72
+ score: z.ZodNullable<z.ZodNumber>;
73
+ passed: z.ZodBoolean;
74
+ rewardEligible: z.ZodBoolean;
75
+ failureClass: z.ZodNullable<z.ZodEnum<{
76
+ policy_failure: "policy_failure";
77
+ grader_failure: "grader_failure";
78
+ environment_failure: "environment_failure";
79
+ infrastructure_failure: "infrastructure_failure";
80
+ timeout: "timeout";
81
+ cancelled: "cancelled";
82
+ }>>;
83
+ gradingStatus: z.ZodEnum<{
84
+ scored: "scored";
85
+ unscorable: "unscorable";
86
+ not_configured: "not_configured";
87
+ }>;
88
+ }, z.core.$strict>;
89
+ /** Shared ordinary grading policy. Results must match the declared population;
90
+ * missing checks cannot disappear from the denominator or the hard gates. */
91
+ export declare function aggregateGraderScores(input: {
92
+ graders: ReadonlyArray<Pick<GraderSpec, "id" | "version" | "weight" | "hardGate" | "rewardEligible">>;
93
+ components: ReadonlyArray<Pick<GraderEvidence, "graderId" | "graderVersion" | "score" | "passed" | "rewardEligible" | "failureClass">>;
94
+ infrastructureError?: string | null;
95
+ }): z.infer<typeof GradeSummarySchema>;
96
+ export declare const TaskGradeSchema: z.ZodObject<{
97
+ score: z.ZodNullable<z.ZodNumber>;
98
+ passed: z.ZodBoolean;
99
+ rewardEligible: z.ZodBoolean;
100
+ failureClass: z.ZodNullable<z.ZodEnum<{
101
+ policy_failure: "policy_failure";
102
+ grader_failure: "grader_failure";
103
+ environment_failure: "environment_failure";
104
+ infrastructure_failure: "infrastructure_failure";
105
+ timeout: "timeout";
106
+ cancelled: "cancelled";
107
+ }>>;
108
+ gradingStatus: z.ZodEnum<{
109
+ scored: "scored";
110
+ unscorable: "unscorable";
111
+ not_configured: "not_configured";
112
+ }>;
113
+ schemaVersion: z.ZodLiteral<"openpond.taskGrade.v1">;
114
+ taskHash: z.ZodString;
115
+ evidenceHash: z.ZodString;
116
+ graderSetHash: z.ZodString;
117
+ components: z.ZodArray<z.ZodObject<{
118
+ schemaVersion: z.ZodLiteral<"openpond.graderEvidence.v1">;
119
+ graderId: z.ZodString;
120
+ graderVersion: z.ZodString;
121
+ score: z.ZodNullable<z.ZodNumber>;
122
+ passed: z.ZodBoolean;
123
+ rewardEligible: z.ZodBoolean;
124
+ failureClass: z.ZodNullable<z.ZodEnum<{
125
+ policy_failure: "policy_failure";
126
+ grader_failure: "grader_failure";
127
+ environment_failure: "environment_failure";
128
+ infrastructure_failure: "infrastructure_failure";
129
+ timeout: "timeout";
130
+ cancelled: "cancelled";
131
+ }>>;
132
+ feedback: z.ZodArray<z.ZodString>;
133
+ visibleEvidenceRefs: z.ZodArray<z.ZodString>;
134
+ privilegedEvidenceRefs: z.ZodArray<z.ZodString>;
135
+ contentHash: z.ZodString;
136
+ }, z.core.$strict>>;
137
+ contentHash: z.ZodString;
138
+ }, z.core.$strict>;
139
+ export type TaskGrade = z.infer<typeof TaskGradeSchema>;
140
+ export declare function gradeTaskEvidence(input: Parameters<typeof gradeEvidence>[0]): Promise<TaskGrade>;
141
+ /** Verify retained results against the exact admitted inputs without rerunning
142
+ * graders. The storage owner supplies the trusted artifact, not the caller. */
143
+ export declare function verifyTaskGrade(value: unknown, input: Pick<Parameters<typeof gradeEvidence>[0], "task" | "evidence" | "graders">): TaskGrade;
70
144
  //# sourceMappingURL=graders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graders.d.ts","sourceRoot":"","sources":["../../../../src/graders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAA2B,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGrF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;kBAW7B,CAAC;AACZ,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;kBAAkF,CAAC;AAEpH,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,GAAG,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC;AAC/O,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,GAAG,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC;AAEvP,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwB5B;AA+DD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"graders.d.ts","sourceRoot":"","sources":["../../../../src/graders.ts"],"names":[],"mappings":"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"}
@@ -1421,10 +1421,10 @@ export declare const LearningResourceKindSchema: z.ZodEnum<{
1421
1421
  policy: "policy";
1422
1422
  feedback: "feedback";
1423
1423
  reward: "reward";
1424
+ evidence: "evidence";
1424
1425
  source: "source";
1425
1426
  asset: "asset";
1426
1427
  decision: "decision";
1427
- evidence: "evidence";
1428
1428
  binding: "binding";
1429
1429
  batch: "batch";
1430
1430
  grade: "grade";
@@ -1422,10 +1422,10 @@ export declare const LearningReadRequestSchema: z.ZodDiscriminatedUnion<[z.ZodOb
1422
1422
  policy: "policy";
1423
1423
  feedback: "feedback";
1424
1424
  reward: "reward";
1425
+ evidence: "evidence";
1425
1426
  source: "source";
1426
1427
  asset: "asset";
1427
1428
  decision: "decision";
1428
- evidence: "evidence";
1429
1429
  binding: "binding";
1430
1430
  batch: "batch";
1431
1431
  grade: "grade";
@@ -1444,10 +1444,10 @@ export declare const LearningReadRequestSchema: z.ZodDiscriminatedUnion<[z.ZodOb
1444
1444
  policy: "policy";
1445
1445
  feedback: "feedback";
1446
1446
  reward: "reward";
1447
+ evidence: "evidence";
1447
1448
  source: "source";
1448
1449
  asset: "asset";
1449
1450
  decision: "decision";
1450
- evidence: "evidence";
1451
1451
  binding: "binding";
1452
1452
  batch: "batch";
1453
1453
  grade: "grade";
@@ -18,8 +18,8 @@ export declare const EvidenceReferenceSchema: z.ZodObject<{
18
18
  kind: z.ZodEnum<{
19
19
  artifact: "artifact";
20
20
  attempt: "attempt";
21
- trace: "trace";
22
21
  grader: "grader";
22
+ trace: "trace";
23
23
  rollout: "rollout";
24
24
  checkpoint: "checkpoint";
25
25
  }>;
@@ -54,8 +54,8 @@ export declare const TelemetryExportBundleContentSchema: z.ZodObject<{
54
54
  source: z.ZodEnum<{
55
55
  environment: "environment";
56
56
  evaluation: "evaluation";
57
- runtime: "runtime";
58
57
  grader: "grader";
58
+ runtime: "runtime";
59
59
  optimizer: "optimizer";
60
60
  control_plane: "control_plane";
61
61
  }>;
@@ -122,8 +122,8 @@ export declare const TelemetryExportBundleContentSchema: z.ZodObject<{
122
122
  kind: z.ZodEnum<{
123
123
  artifact: "artifact";
124
124
  attempt: "attempt";
125
- trace: "trace";
126
125
  grader: "grader";
126
+ trace: "trace";
127
127
  rollout: "rollout";
128
128
  checkpoint: "checkpoint";
129
129
  }>;
@@ -202,8 +202,8 @@ export declare const TelemetryExportBundleSchema: z.ZodObject<{
202
202
  source: z.ZodEnum<{
203
203
  environment: "environment";
204
204
  evaluation: "evaluation";
205
- runtime: "runtime";
206
205
  grader: "grader";
206
+ runtime: "runtime";
207
207
  optimizer: "optimizer";
208
208
  control_plane: "control_plane";
209
209
  }>;
@@ -270,8 +270,8 @@ export declare const TelemetryExportBundleSchema: z.ZodObject<{
270
270
  kind: z.ZodEnum<{
271
271
  artifact: "artifact";
272
272
  attempt: "attempt";
273
- trace: "trace";
274
273
  grader: "grader";
274
+ trace: "trace";
275
275
  rollout: "rollout";
276
276
  checkpoint: "checkpoint";
277
277
  }>;
@@ -10,8 +10,8 @@ export declare const TelemetryVisibilitySchema: z.ZodEnum<{
10
10
  export declare const TelemetrySourceSchema: z.ZodEnum<{
11
11
  environment: "environment";
12
12
  evaluation: "evaluation";
13
- runtime: "runtime";
14
13
  grader: "grader";
14
+ runtime: "runtime";
15
15
  optimizer: "optimizer";
16
16
  control_plane: "control_plane";
17
17
  }>;
@@ -50,8 +50,8 @@ export declare const RunTelemetryEventSchema: z.ZodObject<{
50
50
  source: z.ZodEnum<{
51
51
  environment: "environment";
52
52
  evaluation: "evaluation";
53
- runtime: "runtime";
54
53
  grader: "grader";
54
+ runtime: "runtime";
55
55
  optimizer: "optimizer";
56
56
  control_plane: "control_plane";
57
57
  }>;
@@ -192,8 +192,8 @@ export declare const RunTelemetryBatchSchema: z.ZodObject<{
192
192
  source: z.ZodEnum<{
193
193
  environment: "environment";
194
194
  evaluation: "evaluation";
195
- runtime: "runtime";
196
195
  grader: "grader";
196
+ runtime: "runtime";
197
197
  optimizer: "optimizer";
198
198
  control_plane: "control_plane";
199
199
  }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openpond/evals",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Portable Tasksets, graders, evaluation runs, receipts, conformance fixtures, and Work evidence for OpenPond Harnesses",
5
5
  "license": "MIT",
6
6
  "type": "module",