@colophon-claims/verify 0.0.0 → 0.2.0
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 +39 -0
- package/dist/admission/application.d.ts +18 -0
- package/dist/admission/application.js +53 -0
- package/dist/admission/contracts.d.ts +506 -0
- package/dist/admission/contracts.js +459 -0
- package/dist/admission/index.d.ts +5 -0
- package/dist/admission/index.js +5 -0
- package/dist/admission/intake.d.ts +75 -0
- package/dist/admission/intake.js +70 -0
- package/dist/admission/result-evaluation.d.ts +18 -0
- package/dist/admission/result-evaluation.js +71 -0
- package/dist/admission/screening-sample.d.ts +56 -0
- package/dist/admission/screening-sample.js +126 -0
- package/dist/admission/verification.d.ts +102 -0
- package/dist/admission/verification.js +844 -0
- package/dist/anchor/check.d.ts +95 -0
- package/dist/anchor/check.js +146 -0
- package/dist/anchor/ports.d.ts +6 -0
- package/dist/anchor/ports.js +354 -0
- package/dist/assets.d.ts +33 -0
- package/dist/assets.js +885 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +20 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.js +205 -0
- package/dist/comparison.d.ts +64 -0
- package/dist/comparison.js +235 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +23 -0
- package/dist/manifest.d.ts +54 -0
- package/dist/manifest.js +240 -0
- package/dist/materialize.d.ts +4 -0
- package/dist/materialize.js +13 -0
- package/dist/profile/admission-receipts.d.ts +11 -0
- package/dist/profile/admission-receipts.js +24 -0
- package/dist/profile/anchor-claims.d.ts +157 -0
- package/dist/profile/anchor-claims.js +330 -0
- package/dist/profile/artifacts.d.ts +261 -0
- package/dist/profile/artifacts.js +139 -0
- package/dist/profile/assembly-ports.d.ts +19 -0
- package/dist/profile/assembly-ports.js +42 -0
- package/dist/profile/binary-judge-manifest.d.ts +121 -0
- package/dist/profile/binary-judge-manifest.js +106 -0
- package/dist/profile/binary-qualification.d.ts +9 -0
- package/dist/profile/binary-qualification.js +58 -0
- package/dist/profile/branding-assets.d.ts +5 -0
- package/dist/profile/branding-assets.js +5 -0
- package/dist/profile/branding.d.ts +24 -0
- package/dist/profile/branding.js +14 -0
- package/dist/profile/claim-consistency.d.ts +26 -0
- package/dist/profile/claim-consistency.js +91 -0
- package/dist/profile/claim.d.ts +327 -0
- package/dist/profile/claim.js +742 -0
- package/dist/profile/errors.d.ts +49 -0
- package/dist/profile/errors.js +78 -0
- package/dist/profile/inspect-assurance.d.ts +16 -0
- package/dist/profile/inspect-assurance.js +30 -0
- package/dist/profile/inspect-disclosure.d.ts +28 -0
- package/dist/profile/inspect-disclosure.js +54 -0
- package/dist/profile/inspect-manifest.d.ts +706 -0
- package/dist/profile/inspect-manifest.js +397 -0
- package/dist/profile/isolation.d.ts +21 -0
- package/dist/profile/isolation.js +31 -0
- package/dist/profile/pinning-evidence.d.ts +41 -0
- package/dist/profile/pinning-evidence.js +43 -0
- package/dist/profile/ports.d.ts +3 -0
- package/dist/profile/ports.js +11 -0
- package/dist/profile/preview-log.d.ts +4 -0
- package/dist/profile/preview-log.js +3 -0
- package/dist/profile/run-results.d.ts +17 -0
- package/dist/profile/run-results.js +23 -0
- package/dist/profile/signing.d.ts +10 -0
- package/dist/profile/signing.js +46 -0
- package/dist/profile/trust.d.ts +13 -0
- package/dist/profile/trust.js +35 -0
- package/dist/profile/venue.d.ts +2 -0
- package/dist/profile/venue.js +2 -0
- package/dist/profile/verdict.d.ts +28 -0
- package/dist/profile/verdict.js +51 -0
- package/dist/reader-instructions.d.ts +41 -0
- package/dist/reader-instructions.js +52 -0
- package/dist/schema.d.ts +380 -0
- package/dist/schema.js +498 -0
- package/dist/verify.d.ts +72 -0
- package/dist/verify.js +1573 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +2 -0
- package/package.json +63 -3
- package/schemas/assembly-row.schema.json +194 -0
- package/schemas/bundle-manifest.schema.json +23 -0
- package/schemas/claim-package.schema.json +279 -0
- package/schemas/dsse-envelope.schema.json +25 -0
- package/schemas/evidence-catalog.schema.json +43 -0
- package/schemas/public-trust.schema.json +44 -0
- package/schemas/verdict-catalog.schema.json +27 -0
- package/scripts/external-verify.py +238 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { evaluateVerdictRule } from "@jinn-network/task-execution-profiles";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { isInspectMultiScorerSelection } from "./inspect-manifest.js";
|
|
4
|
+
export const INSPECT_TASK_PROFILE_URI = "https://product.jinn.network/profiles/inspect-evaluation/1";
|
|
5
|
+
export const INSPECT_EMBEDDED_EVALUATOR_ID = "urn:jinn:benchmark-product:inspect-runtime:same-execution-scorer";
|
|
6
|
+
const InspectProviderEvidenceSchema = z.object({
|
|
7
|
+
surface: z.literal("openai-responses"),
|
|
8
|
+
resolvedModel: z.string().nullable(),
|
|
9
|
+
callCount: z.number().int().nonnegative(),
|
|
10
|
+
usage: z.record(z.string(), z.unknown()).nullable(),
|
|
11
|
+
terminalStatus: z.enum([
|
|
12
|
+
"completed",
|
|
13
|
+
"authentication-failure",
|
|
14
|
+
"rate-limited",
|
|
15
|
+
"timeout",
|
|
16
|
+
"broker-loss",
|
|
17
|
+
"provider-5xx",
|
|
18
|
+
"provider-failure",
|
|
19
|
+
"budget-rejected",
|
|
20
|
+
"method-conflict",
|
|
21
|
+
"capability-rejected",
|
|
22
|
+
"malformed-request",
|
|
23
|
+
"no-call",
|
|
24
|
+
]),
|
|
25
|
+
eventDigest: z.string().regex(/^[a-f0-9]{64}$/).nullable(),
|
|
26
|
+
brokerProtocol: z.literal("jinn.network/model-broker/1"),
|
|
27
|
+
brokerSourceSha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
28
|
+
}).strict();
|
|
29
|
+
export const InspectCellSummaryV1Schema = z.object({
|
|
30
|
+
schema: z.literal("jinn.network/benchmark-product/inspect-cell-summary/1"),
|
|
31
|
+
terminal: z.enum(["scored", "unscorable"]),
|
|
32
|
+
inspectStatus: z.enum(["started", "success", "cancelled", "error"]),
|
|
33
|
+
expectedSamples: z.number().int().nonnegative().nullable(),
|
|
34
|
+
observedSamples: z.number().int().nonnegative(),
|
|
35
|
+
erroredSamples: z.number().int().nonnegative(),
|
|
36
|
+
missingScoreSamples: z.number().int().nonnegative(),
|
|
37
|
+
invalidated: z.boolean(),
|
|
38
|
+
scorer: z.string().min(1),
|
|
39
|
+
verdict: z.enum(["pass", "fail"]).nullable(),
|
|
40
|
+
measurement: z.boolean().nullable(),
|
|
41
|
+
evaluatedAt: z.string().datetime({ offset: true }),
|
|
42
|
+
nativeLogSha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
43
|
+
nativeLogBytes: z.number().int().nonnegative(),
|
|
44
|
+
provider: InspectProviderEvidenceSchema.optional(),
|
|
45
|
+
});
|
|
46
|
+
export const InspectCellSummaryV2Schema = z.object({
|
|
47
|
+
schema: z.literal("jinn.network/benchmark-product/inspect-cell-summary/2"),
|
|
48
|
+
terminal: z.enum(["scored", "unscorable"]),
|
|
49
|
+
inspectStatus: z.enum(["started", "success", "cancelled", "error"]),
|
|
50
|
+
expectedSamples: z.number().int().nonnegative().nullable(),
|
|
51
|
+
observedSamples: z.number().int().nonnegative(),
|
|
52
|
+
erroredSamples: z.number().int().nonnegative(),
|
|
53
|
+
invalidated: z.boolean(),
|
|
54
|
+
scorers: z.array(z.object({
|
|
55
|
+
name: z.string().min(1),
|
|
56
|
+
presentSamples: z.number().int().nonnegative(),
|
|
57
|
+
missingSamples: z.number().int().nonnegative(),
|
|
58
|
+
valueShapes: z.array(z.enum(["null", "boolean", "number", "string", "list", "object"])),
|
|
59
|
+
}).strict()).min(1),
|
|
60
|
+
measurements: z.array(z.object({
|
|
61
|
+
measurementName: z.string().min(1),
|
|
62
|
+
scorerName: z.string().min(1),
|
|
63
|
+
subScoreKey: z.string().min(1).optional(),
|
|
64
|
+
missingSamples: z.number().int().nonnegative(),
|
|
65
|
+
invalidValueSamples: z.number().int().nonnegative(),
|
|
66
|
+
value: z.boolean().nullable(),
|
|
67
|
+
}).strict()).min(1),
|
|
68
|
+
verdict: z.enum(["pass", "fail", "inconclusive"]).nullable(),
|
|
69
|
+
evaluatedAt: z.string().datetime({ offset: true }),
|
|
70
|
+
nativeLogSha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
71
|
+
nativeLogBytes: z.number().int().nonnegative(),
|
|
72
|
+
provider: InspectProviderEvidenceSchema.optional(),
|
|
73
|
+
sandbox: z.object({
|
|
74
|
+
provider: z.literal("jinn-oci"),
|
|
75
|
+
protocol: z.literal("jinn.network/inspect-sandbox-host/1"),
|
|
76
|
+
imageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
77
|
+
environmentCount: z.number().int().nonnegative(),
|
|
78
|
+
operationCount: z.number().int().nonnegative(),
|
|
79
|
+
eventDigest: z.string().regex(/^[a-f0-9]{64}$/),
|
|
80
|
+
}).strict().optional(),
|
|
81
|
+
}).strict();
|
|
82
|
+
export const InspectCellSummarySchema = z.union([InspectCellSummaryV1Schema, InspectCellSummaryV2Schema]);
|
|
83
|
+
const SCORE_SHAPE_ORDER = ["null", "boolean", "number", "string", "list", "object"];
|
|
84
|
+
function equalStrings(left, right) {
|
|
85
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
86
|
+
}
|
|
87
|
+
/** Validate the product projection and return the only verdict authorized by its sealed rule. */
|
|
88
|
+
export function projectInspectCellVerdict(summary, manifest) {
|
|
89
|
+
if (!isInspectMultiScorerSelection(manifest)) {
|
|
90
|
+
throw new TypeError("Inspect summary v2 requires a multi-scorer selection manifest");
|
|
91
|
+
}
|
|
92
|
+
const scorerNames = summary.scorers.map((scorer) => scorer.name);
|
|
93
|
+
if (!equalStrings(scorerNames, manifest.scorers.map((scorer) => scorer.name))) {
|
|
94
|
+
throw new TypeError("Inspect scorer inventory differs from the sealed ordered scorer set");
|
|
95
|
+
}
|
|
96
|
+
for (const scorer of summary.scorers) {
|
|
97
|
+
if (scorer.presentSamples + scorer.missingSamples !== summary.observedSamples) {
|
|
98
|
+
throw new TypeError("Inspect scorer inventory does not account for every observed sample");
|
|
99
|
+
}
|
|
100
|
+
const canonicalShapes = SCORE_SHAPE_ORDER.filter((shape) => scorer.valueShapes.includes(shape));
|
|
101
|
+
if (!equalStrings(scorer.valueShapes, canonicalShapes)) {
|
|
102
|
+
throw new TypeError("Inspect scorer value shapes are duplicated or non-canonical");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (summary.measurements.length !== manifest.scoring.projections.length) {
|
|
106
|
+
throw new TypeError("Inspect summary measurement count differs from the sealed projections");
|
|
107
|
+
}
|
|
108
|
+
const values = {};
|
|
109
|
+
summary.measurements.forEach((measurement, index) => {
|
|
110
|
+
const projection = manifest.scoring.projections[index];
|
|
111
|
+
if (measurement.measurementName !== projection.measurementName
|
|
112
|
+
|| measurement.scorerName !== projection.scorerName
|
|
113
|
+
|| measurement.subScoreKey !== projection.subScoreKey
|
|
114
|
+
|| measurement.missingSamples + measurement.invalidValueSamples > summary.observedSamples) {
|
|
115
|
+
throw new TypeError("Inspect summary measurement differs from its sealed projection");
|
|
116
|
+
}
|
|
117
|
+
if (summary.terminal === "scored") {
|
|
118
|
+
if (measurement.value === null
|
|
119
|
+
|| measurement.missingSamples !== 0
|
|
120
|
+
|| measurement.invalidValueSamples !== 0) {
|
|
121
|
+
throw new TypeError("scored Inspect summary carries an incomplete projected measurement");
|
|
122
|
+
}
|
|
123
|
+
values[measurement.measurementName] = measurement.value;
|
|
124
|
+
}
|
|
125
|
+
else if (measurement.value !== null) {
|
|
126
|
+
throw new TypeError("unscorable Inspect summary carries a projected measurement value");
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
if (summary.terminal === "unscorable")
|
|
130
|
+
return null;
|
|
131
|
+
if (summary.inspectStatus !== "success"
|
|
132
|
+
|| summary.invalidated
|
|
133
|
+
|| summary.erroredSamples !== 0
|
|
134
|
+
|| summary.expectedSamples === null
|
|
135
|
+
|| summary.expectedSamples !== summary.observedSamples) {
|
|
136
|
+
throw new TypeError("scored Inspect summary contradicts its run/sample accounting");
|
|
137
|
+
}
|
|
138
|
+
return evaluateVerdictRule(manifest.scoring.verdictRule, values).verdict;
|
|
139
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type KeyObject } from "node:crypto";
|
|
2
|
+
import type { RunRecord } from "@jinn-network/benchmarking-records";
|
|
3
|
+
import type { AssemblyPorts, InScopeCell } from "@jinn-network/benchmarking-run";
|
|
4
|
+
import type { LocalAdmissionReceiptFact } from "./admission-receipts.js";
|
|
5
|
+
export interface AssemblyPublicKeyRecord {
|
|
6
|
+
readonly keyId: string;
|
|
7
|
+
readonly publicKey: KeyObject;
|
|
8
|
+
}
|
|
9
|
+
export interface BuildAssemblyPortsFromFactsInput {
|
|
10
|
+
readonly runRecord: RunRecord;
|
|
11
|
+
readonly cells: readonly InScopeCell[];
|
|
12
|
+
readonly owner: string;
|
|
13
|
+
readonly runCancelled: boolean;
|
|
14
|
+
readonly receiptsByTaskDigest: ReadonlyMap<string, LocalAdmissionReceiptFact>;
|
|
15
|
+
readonly resolveBytes: (digest: string) => Uint8Array;
|
|
16
|
+
readonly evaluatorKeys: () => ReadonlyMap<string, AssemblyPublicKeyRecord>;
|
|
17
|
+
}
|
|
18
|
+
/** Reconstructs the Matrix verifier ports exclusively from authenticated bundle facts. */
|
|
19
|
+
export declare function buildAssemblyPortsFromFacts(input: BuildAssemblyPortsFromFactsInput): AssemblyPorts;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { verify as cryptoVerify } from "node:crypto";
|
|
2
|
+
import { localAssemblyPorts } from "@jinn-network/benchmarking-local";
|
|
3
|
+
import { dssePreAuthEncoding, parseDsseEnvelope } from "@jinn-network/trust-core";
|
|
4
|
+
import { venueIsolationPostureForPolicy } from "./isolation.js";
|
|
5
|
+
function resolveEvaluatorClaim(resolveBytes, evidenceRef, loadKeys) {
|
|
6
|
+
try {
|
|
7
|
+
const ref = evidenceRef;
|
|
8
|
+
if (typeof ref?.claim !== "string" || typeof ref.verdictDigest !== "string" || !ref.verdictDigest.startsWith("sha256:"))
|
|
9
|
+
return "unresolved";
|
|
10
|
+
const key = loadKeys().get(ref.claim);
|
|
11
|
+
if (key === undefined)
|
|
12
|
+
return "unresolved";
|
|
13
|
+
const envelope = parseDsseEnvelope(resolveBytes(ref.verdictDigest.slice("sha256:".length)));
|
|
14
|
+
const preAuth = Buffer.from(dssePreAuthEncoding(envelope.payloadType, envelope.payloadBytes));
|
|
15
|
+
return envelope.signatures.some((signature) => signature.keyid === key.keyId && cryptoVerify(null, preAuth, key.publicKey, Buffer.from(signature.sig, "base64"))) ? ref.claim : "unresolved";
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return "unresolved";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Reconstructs the Matrix verifier ports exclusively from authenticated bundle facts. */
|
|
22
|
+
export function buildAssemblyPortsFromFacts(input) {
|
|
23
|
+
const baseline = input.runRecord.policy.submissionBaseline;
|
|
24
|
+
const isolation = venueIsolationPostureForPolicy(baseline.isolationPolicy);
|
|
25
|
+
return localAssemblyPorts({
|
|
26
|
+
inputScope: { cellsForRun: () => [...input.cells], ...(input.runCancelled ? { runCancelled: true } : {}) },
|
|
27
|
+
pinning: {
|
|
28
|
+
submissionBaseline: baseline,
|
|
29
|
+
isolationInventory: isolation.inventory,
|
|
30
|
+
evidenceFor: (cellKey) => {
|
|
31
|
+
const cell = input.cells.find((candidate) => candidate.cellKey === cellKey);
|
|
32
|
+
if (cell === undefined || cell.dispatches === 0)
|
|
33
|
+
return { dispatches: 0 };
|
|
34
|
+
const evidence = cell.evidenceRef;
|
|
35
|
+
return evidence === undefined ? { dispatches: cell.dispatches } : { ...evidence, dispatches: cell.dispatches };
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
admission: { receiptFor: (cell) => input.receiptsByTaskDigest.get(cell.taskDigest) },
|
|
39
|
+
cost: { costFor: () => undefined, latencyFor: () => undefined },
|
|
40
|
+
trust: { resolveAgent: async (ref) => ref?.role === "solver" ? input.owner : ref?.role === "evaluator" ? resolveEvaluatorClaim(input.resolveBytes, ref, input.evaluatorKeys) : "unresolved" },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const INSPECT_BINARY_JUDGE_ADAPTER_ID: "inspect-binary-judge";
|
|
3
|
+
export declare const INSPECT_BINARY_JUDGE_LAUNCHER_ID: "inspect-ai-judge";
|
|
4
|
+
export declare const INSPECT_BINARY_JUDGE_LAUNCHER_VERSION: "1";
|
|
5
|
+
export declare const INSPECT_BINARY_JUDGE_SELECTION_SCHEMA: "jinn.network/benchmark-product/inspect-binary-judge-selection/1";
|
|
6
|
+
export declare const INSPECT_SELECTION_CORRELATION_ROLE: "https://product.jinn.network/artifact-roles/inspect/selection-manifest/v1";
|
|
7
|
+
export declare const INSPECT_BINARY_JUDGE_INSPECT_VERSION: "0.3.255";
|
|
8
|
+
export declare const INSPECT_BINARY_JUDGE_INSPECT_EVALS_VERSION: "0.16.0";
|
|
9
|
+
export declare const INSPECT_BINARY_JUDGE_OPENAI_SDK_VERSION: "2.53.0";
|
|
10
|
+
export declare const INSPECT_BINARY_JUDGE_PYTHON_VERSION: "3.11.9";
|
|
11
|
+
export declare const INSPECT_BINARY_JUDGE_OCI_PLATFORM: "linux/amd64";
|
|
12
|
+
export declare const InspectBinaryJudgeArmSchema: z.ZodObject<{
|
|
13
|
+
armId: z.ZodString;
|
|
14
|
+
instrumentSha256: z.ZodString;
|
|
15
|
+
model: z.ZodEnum<{
|
|
16
|
+
"gpt-5.6-luna": "gpt-5.6-luna";
|
|
17
|
+
"gpt-4o-mini-2024-07-18": "gpt-4o-mini-2024-07-18";
|
|
18
|
+
}>;
|
|
19
|
+
generation: z.ZodUnion<readonly [z.ZodObject<{
|
|
20
|
+
reasoningEffort: z.ZodEnum<{
|
|
21
|
+
none: "none";
|
|
22
|
+
low: "low";
|
|
23
|
+
}>;
|
|
24
|
+
maxOutputTokens: z.ZodLiteral<128>;
|
|
25
|
+
store: z.ZodLiteral<false>;
|
|
26
|
+
background: z.ZodLiteral<false>;
|
|
27
|
+
stream: z.ZodLiteral<false>;
|
|
28
|
+
serviceTier: z.ZodLiteral<"default">;
|
|
29
|
+
tools: z.ZodTuple<[], null>;
|
|
30
|
+
fallbackModels: z.ZodTuple<[], null>;
|
|
31
|
+
retries: z.ZodLiteral<0>;
|
|
32
|
+
persistedConversation: z.ZodLiteral<false>;
|
|
33
|
+
metadata: z.ZodNull;
|
|
34
|
+
promptCacheIdentifier: z.ZodNull;
|
|
35
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
36
|
+
temperature: z.ZodLiteral<0>;
|
|
37
|
+
maxOutputTokens: z.ZodLiteral<512>;
|
|
38
|
+
store: z.ZodLiteral<false>;
|
|
39
|
+
background: z.ZodLiteral<false>;
|
|
40
|
+
stream: z.ZodLiteral<false>;
|
|
41
|
+
serviceTier: z.ZodLiteral<"default">;
|
|
42
|
+
tools: z.ZodTuple<[], null>;
|
|
43
|
+
fallbackModels: z.ZodTuple<[], null>;
|
|
44
|
+
retries: z.ZodLiteral<0>;
|
|
45
|
+
persistedConversation: z.ZodLiteral<false>;
|
|
46
|
+
metadata: z.ZodNull;
|
|
47
|
+
promptCacheIdentifier: z.ZodNull;
|
|
48
|
+
}, z.core.$strict>]>;
|
|
49
|
+
}, z.core.$strict>;
|
|
50
|
+
export type InspectBinaryJudgeArm = z.infer<typeof InspectBinaryJudgeArmSchema>;
|
|
51
|
+
/** Portable public selection for the binary judge runtime. Host paths and credentials are absent. */
|
|
52
|
+
export declare const InspectBinaryJudgeSelectionManifestSchema: z.ZodObject<{
|
|
53
|
+
schema: z.ZodLiteral<"jinn.network/benchmark-product/inspect-binary-judge-selection/1">;
|
|
54
|
+
runtime: z.ZodObject<{
|
|
55
|
+
imageDigest: z.ZodString;
|
|
56
|
+
platform: z.ZodLiteral<"linux/amd64">;
|
|
57
|
+
pythonVersion: z.ZodLiteral<"3.11.9">;
|
|
58
|
+
inspectVersion: z.ZodLiteral<"0.3.255">;
|
|
59
|
+
inspectEvalsVersion: z.ZodLiteral<"0.16.0">;
|
|
60
|
+
openaiSdkVersion: z.ZodLiteral<"2.53.0">;
|
|
61
|
+
runtimeHostSourceSha256: z.ZodString;
|
|
62
|
+
workerSourceSha256: z.ZodString;
|
|
63
|
+
brokerSourceSha256: z.ZodString;
|
|
64
|
+
modelProviderSourceSha256: z.ZodString;
|
|
65
|
+
}, z.core.$strict>;
|
|
66
|
+
execution: z.ZodObject<{
|
|
67
|
+
callsPerCell: z.ZodLiteral<1>;
|
|
68
|
+
epochs: z.ZodLiteral<1>;
|
|
69
|
+
inspectScorer: z.ZodLiteral<false>;
|
|
70
|
+
retries: z.ZodLiteral<0>;
|
|
71
|
+
fallbacks: z.ZodLiteral<0>;
|
|
72
|
+
tools: z.ZodTuple<[], null>;
|
|
73
|
+
storage: z.ZodLiteral<false>;
|
|
74
|
+
}, z.core.$strict>;
|
|
75
|
+
requirement: z.ZodObject<{
|
|
76
|
+
key: z.ZodLiteral<"network.jinn.binary-judgment.instrument">;
|
|
77
|
+
valueShape: z.ZodLiteral<"sha256:<64-lowercase-hex>">;
|
|
78
|
+
comparison: z.ZodLiteral<"exact">;
|
|
79
|
+
location: z.ZodLiteral<"submission-effective-requirements">;
|
|
80
|
+
}, z.core.$strict>;
|
|
81
|
+
arms: z.ZodArray<z.ZodObject<{
|
|
82
|
+
armId: z.ZodString;
|
|
83
|
+
instrumentSha256: z.ZodString;
|
|
84
|
+
model: z.ZodEnum<{
|
|
85
|
+
"gpt-5.6-luna": "gpt-5.6-luna";
|
|
86
|
+
"gpt-4o-mini-2024-07-18": "gpt-4o-mini-2024-07-18";
|
|
87
|
+
}>;
|
|
88
|
+
generation: z.ZodUnion<readonly [z.ZodObject<{
|
|
89
|
+
reasoningEffort: z.ZodEnum<{
|
|
90
|
+
none: "none";
|
|
91
|
+
low: "low";
|
|
92
|
+
}>;
|
|
93
|
+
maxOutputTokens: z.ZodLiteral<128>;
|
|
94
|
+
store: z.ZodLiteral<false>;
|
|
95
|
+
background: z.ZodLiteral<false>;
|
|
96
|
+
stream: z.ZodLiteral<false>;
|
|
97
|
+
serviceTier: z.ZodLiteral<"default">;
|
|
98
|
+
tools: z.ZodTuple<[], null>;
|
|
99
|
+
fallbackModels: z.ZodTuple<[], null>;
|
|
100
|
+
retries: z.ZodLiteral<0>;
|
|
101
|
+
persistedConversation: z.ZodLiteral<false>;
|
|
102
|
+
metadata: z.ZodNull;
|
|
103
|
+
promptCacheIdentifier: z.ZodNull;
|
|
104
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
105
|
+
temperature: z.ZodLiteral<0>;
|
|
106
|
+
maxOutputTokens: z.ZodLiteral<512>;
|
|
107
|
+
store: z.ZodLiteral<false>;
|
|
108
|
+
background: z.ZodLiteral<false>;
|
|
109
|
+
stream: z.ZodLiteral<false>;
|
|
110
|
+
serviceTier: z.ZodLiteral<"default">;
|
|
111
|
+
tools: z.ZodTuple<[], null>;
|
|
112
|
+
fallbackModels: z.ZodTuple<[], null>;
|
|
113
|
+
retries: z.ZodLiteral<0>;
|
|
114
|
+
persistedConversation: z.ZodLiteral<false>;
|
|
115
|
+
metadata: z.ZodNull;
|
|
116
|
+
promptCacheIdentifier: z.ZodNull;
|
|
117
|
+
}, z.core.$strict>]>;
|
|
118
|
+
}, z.core.$strict>>;
|
|
119
|
+
snapshotProbeSha256: z.ZodOptional<z.ZodString>;
|
|
120
|
+
}, z.core.$strict>;
|
|
121
|
+
export type InspectBinaryJudgeSelectionManifest = z.infer<typeof InspectBinaryJudgeSelectionManifestSchema>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ACCEPTED_JUDGE_MODEL_IDS, BINARY_JUDGMENT_INSTRUMENT_REQUIREMENT_KEY, BinaryJudgmentGenerationSchema, isDatedSnapshotJudgeModel, judgeGenerationProfile, JUDGE_MODEL_PROFILES, } from "@jinn-network/task-execution-profiles";
|
|
3
|
+
import { compareCodeUnitStrings } from "@jinn-network/task-execution-protocol";
|
|
4
|
+
export const INSPECT_BINARY_JUDGE_ADAPTER_ID = "inspect-binary-judge";
|
|
5
|
+
export const INSPECT_BINARY_JUDGE_LAUNCHER_ID = "inspect-ai-judge";
|
|
6
|
+
export const INSPECT_BINARY_JUDGE_LAUNCHER_VERSION = "1";
|
|
7
|
+
export const INSPECT_BINARY_JUDGE_SELECTION_SCHEMA = "jinn.network/benchmark-product/inspect-binary-judge-selection/1";
|
|
8
|
+
export const INSPECT_SELECTION_CORRELATION_ROLE = "https://product.jinn.network/artifact-roles/inspect/selection-manifest/v1";
|
|
9
|
+
export const INSPECT_BINARY_JUDGE_INSPECT_VERSION = "0.3.255";
|
|
10
|
+
export const INSPECT_BINARY_JUDGE_INSPECT_EVALS_VERSION = "0.16.0";
|
|
11
|
+
export const INSPECT_BINARY_JUDGE_OPENAI_SDK_VERSION = "2.53.0";
|
|
12
|
+
export const INSPECT_BINARY_JUDGE_PYTHON_VERSION = "3.11.9";
|
|
13
|
+
export const INSPECT_BINARY_JUDGE_OCI_PLATFORM = "linux/amd64";
|
|
14
|
+
const Sha256HexSchema = z.string().regex(/^[0-9a-f]{64}$/u);
|
|
15
|
+
const Sha256DigestSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/u);
|
|
16
|
+
export const InspectBinaryJudgeArmSchema = z.strictObject({
|
|
17
|
+
armId: z.string().regex(/^[A-Za-z0-9_-]{1,64}$/u),
|
|
18
|
+
instrumentSha256: Sha256DigestSchema,
|
|
19
|
+
model: z.enum(ACCEPTED_JUDGE_MODEL_IDS),
|
|
20
|
+
generation: BinaryJudgmentGenerationSchema,
|
|
21
|
+
}).superRefine((arm, ctx) => {
|
|
22
|
+
// The third parent-level refinement spec §1.3 requires. The generation union cannot carry its
|
|
23
|
+
// own discriminator, and here the sibling `model` key lives on this arm object, so the arm is
|
|
24
|
+
// the parent. Without this, the permissive union alone would admit a reasoning generation block
|
|
25
|
+
// on a dated snapshot (or vice versa); this is what closes it.
|
|
26
|
+
const modelProfile = JUDGE_MODEL_PROFILES[arm.model];
|
|
27
|
+
const generationProfile = judgeGenerationProfile(arm.generation);
|
|
28
|
+
if (generationProfile !== modelProfile) {
|
|
29
|
+
ctx.addIssue({
|
|
30
|
+
code: "custom",
|
|
31
|
+
path: ["generation"],
|
|
32
|
+
message: `generation must match the ${modelProfile} profile for model ${arm.model}`,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
/** Portable public selection for the binary judge runtime. Host paths and credentials are absent. */
|
|
37
|
+
export const InspectBinaryJudgeSelectionManifestSchema = z.strictObject({
|
|
38
|
+
schema: z.literal(INSPECT_BINARY_JUDGE_SELECTION_SCHEMA),
|
|
39
|
+
runtime: z.strictObject({
|
|
40
|
+
imageDigest: Sha256DigestSchema,
|
|
41
|
+
platform: z.literal(INSPECT_BINARY_JUDGE_OCI_PLATFORM),
|
|
42
|
+
pythonVersion: z.literal(INSPECT_BINARY_JUDGE_PYTHON_VERSION),
|
|
43
|
+
inspectVersion: z.literal(INSPECT_BINARY_JUDGE_INSPECT_VERSION),
|
|
44
|
+
inspectEvalsVersion: z.literal(INSPECT_BINARY_JUDGE_INSPECT_EVALS_VERSION),
|
|
45
|
+
openaiSdkVersion: z.literal(INSPECT_BINARY_JUDGE_OPENAI_SDK_VERSION),
|
|
46
|
+
runtimeHostSourceSha256: Sha256HexSchema,
|
|
47
|
+
workerSourceSha256: Sha256HexSchema,
|
|
48
|
+
brokerSourceSha256: Sha256HexSchema,
|
|
49
|
+
modelProviderSourceSha256: Sha256HexSchema,
|
|
50
|
+
}),
|
|
51
|
+
execution: z.strictObject({
|
|
52
|
+
callsPerCell: z.literal(1),
|
|
53
|
+
epochs: z.literal(1),
|
|
54
|
+
inspectScorer: z.literal(false),
|
|
55
|
+
retries: z.literal(0),
|
|
56
|
+
fallbacks: z.literal(0),
|
|
57
|
+
tools: z.tuple([]),
|
|
58
|
+
storage: z.literal(false),
|
|
59
|
+
}),
|
|
60
|
+
requirement: z.strictObject({
|
|
61
|
+
key: z.literal(BINARY_JUDGMENT_INSTRUMENT_REQUIREMENT_KEY),
|
|
62
|
+
valueShape: z.literal("sha256:<64-lowercase-hex>"),
|
|
63
|
+
comparison: z.literal("exact"),
|
|
64
|
+
location: z.literal("submission-effective-requirements"),
|
|
65
|
+
}),
|
|
66
|
+
arms: z.array(InspectBinaryJudgeArmSchema).min(2),
|
|
67
|
+
// Optional (spec §1.5 rule 2): required when any bound arm's model is a dated snapshot,
|
|
68
|
+
// forbidden otherwise. This selection manifest's digest already flows into
|
|
69
|
+
// `draft.spec.evaluationRuntime.selectionManifestSha256` and from there into the sealed Run at
|
|
70
|
+
// lock, so the probe is bound into the run's identity with no new plumbing — it is a lock input
|
|
71
|
+
// by construction. Because the field is optional and absent on every existing selection, every
|
|
72
|
+
// existing sealed selection stays byte-identical (§0.4).
|
|
73
|
+
snapshotProbeSha256: Sha256DigestSchema.optional(),
|
|
74
|
+
}).superRefine((manifest, context) => {
|
|
75
|
+
const armIds = manifest.arms.map((arm) => arm.armId);
|
|
76
|
+
if (new Set(armIds).size !== armIds.length) {
|
|
77
|
+
context.addIssue({ code: "custom", path: ["arms"], message: "armId values must be unique" });
|
|
78
|
+
}
|
|
79
|
+
const sortedArmIds = [...armIds].sort(compareCodeUnitStrings);
|
|
80
|
+
if (armIds.some((armId, index) => armId !== sortedArmIds[index])) {
|
|
81
|
+
context.addIssue({ code: "custom", path: ["arms"], message: "arms must be code-unit sorted by armId" });
|
|
82
|
+
}
|
|
83
|
+
const instruments = manifest.arms.map((arm) => arm.instrumentSha256);
|
|
84
|
+
if (new Set(instruments).size !== instruments.length) {
|
|
85
|
+
context.addIssue({ code: "custom", path: ["arms"], message: "each judge arm must bind one distinct instrument digest" });
|
|
86
|
+
}
|
|
87
|
+
const generation = JSON.stringify(manifest.arms[0]?.generation);
|
|
88
|
+
if (manifest.arms.some((arm) => JSON.stringify(arm.generation) !== generation)) {
|
|
89
|
+
context.addIssue({ code: "custom", path: ["arms"], message: "all arms must share one identical generation block" });
|
|
90
|
+
}
|
|
91
|
+
const requiresProbe = manifest.arms.some((arm) => isDatedSnapshotJudgeModel(arm.model));
|
|
92
|
+
if (requiresProbe && manifest.snapshotProbeSha256 === undefined) {
|
|
93
|
+
context.addIssue({
|
|
94
|
+
code: "custom",
|
|
95
|
+
path: ["snapshotProbeSha256"],
|
|
96
|
+
message: "snapshotProbeSha256 is required when any bound arm's model is a dated snapshot",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (!requiresProbe && manifest.snapshotProbeSha256 !== undefined) {
|
|
100
|
+
context.addIssue({
|
|
101
|
+
code: "custom",
|
|
102
|
+
path: ["snapshotProbeSha256"],
|
|
103
|
+
message: "snapshotProbeSha256 is forbidden unless a bound arm's model is a dated snapshot",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const BINARY_INSTRUMENT_REPORT_LIMITATIONS: {
|
|
2
|
+
readonly mutableModelAlias: "The gpt-5.6-luna identifier is a mutable provider alias; this evidence does not prove invariant model weights across calls.";
|
|
3
|
+
readonly reviewerKeyPerson: "Distinct reviewer signing keys prove key control, not that the controllers are distinct people.";
|
|
4
|
+
readonly cognitiveBlinding: "Signed visibility and reveal receipts attest the review protocol; they do not technically prove cognitive blinding.";
|
|
5
|
+
readonly operatorOnly: "Truth uses operator-only admission and is not publication-grade two-human unanimous truth.";
|
|
6
|
+
readonly screenedNotIndependentlyLabeled: string;
|
|
7
|
+
};
|
|
8
|
+
/** Portable disclosure projection from the registered binary-instrument method parameters. */
|
|
9
|
+
export declare function binaryInstrumentReportLimitations(parameters: Readonly<Record<string, unknown>>): readonly string[];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { validateBinaryInstrumentParameters } from "@jinn-network/benchmarking-aggregate";
|
|
2
|
+
import { PROMPTED_SCREENING_LIMITATIONS, PROMPTED_SCREENING_PROFILE, } from "../admission/contracts.js";
|
|
3
|
+
export const BINARY_INSTRUMENT_REPORT_LIMITATIONS = {
|
|
4
|
+
mutableModelAlias: "The gpt-5.6-luna identifier is a mutable provider alias; this evidence does not prove invariant model weights across calls.",
|
|
5
|
+
reviewerKeyPerson: "Distinct reviewer signing keys prove key control, not that the controllers are distinct people.",
|
|
6
|
+
cognitiveBlinding: "Signed visibility and reveal receipts attest the review protocol; they do not technically prove cognitive blinding.",
|
|
7
|
+
operatorOnly: "Truth uses operator-only admission and is not publication-grade two-human unanimous truth.",
|
|
8
|
+
// Prose, not the spec's bare kebab identifier `screened-not-independently-labeled` (spec §6.8,
|
|
9
|
+
// ruling C-1): that identifier is the limitation's NAME, and every other entry in this map is a
|
|
10
|
+
// full sentence, rendered on the public page (`assets.ts`) and byte-compared at cold
|
|
11
|
+
// verification (`claim-consistency.ts`). Passes §6.1's overclaim test: no "unanimous", no
|
|
12
|
+
// "independent" as an affirmative claim -- "human reviewers" appears only as the disclosed
|
|
13
|
+
// absence, which is the point of a limitation string.
|
|
14
|
+
screenedNotIndependentlyLabeled: "Truth uses screened-operator-sampled admission: a pinned model screens every item and the "
|
|
15
|
+
+ "operator hand-checks the flagged set plus a random sample; this proves screen-hand "
|
|
16
|
+
+ "agreement on that sample, not independent two-human truth.",
|
|
17
|
+
};
|
|
18
|
+
/** Portable disclosure projection from the registered binary-instrument method parameters. */
|
|
19
|
+
export function binaryInstrumentReportLimitations(parameters) {
|
|
20
|
+
const validation = validateBinaryInstrumentParameters(parameters);
|
|
21
|
+
if (!validation.ok) {
|
|
22
|
+
throw new TypeError(`invalid sealed binary-instrument parameters: ${validation.issues.join("; ")}`);
|
|
23
|
+
}
|
|
24
|
+
return [
|
|
25
|
+
// Absent, or any profile other than dated-snapshot-sampling, means "emit the alias
|
|
26
|
+
// limitation" — today's behavior byte for byte (spec §1.4 clause 2). This is not a default of
|
|
27
|
+
// convenience: the two frozen 144-cell golden fixtures seal parameters with no
|
|
28
|
+
// judgeModelProfile, so they must keep emitting this string in this position to stay green
|
|
29
|
+
// unmodified. Flipping the absent case to "emit nothing" would move those fixtures' bytes and
|
|
30
|
+
// destroy the compatibility proof this program depends on.
|
|
31
|
+
...(parameters["judgeModelProfile"] === "dated-snapshot-sampling"
|
|
32
|
+
? []
|
|
33
|
+
: [BINARY_INSTRUMENT_REPORT_LIMITATIONS.mutableModelAlias]),
|
|
34
|
+
// reviewerKeyPerson and cognitiveBlinding are claims about a two-reviewer protocol; an
|
|
35
|
+
// operator-only run has no reviewers and no visibility receipts at all, so emitting them there
|
|
36
|
+
// is a false limitation (spec §1.4 clause 4). truthAdmission is already a sealed parameter, so
|
|
37
|
+
// this needs no new key.
|
|
38
|
+
...(parameters["truthAdmission"] === "two-human-unanimous"
|
|
39
|
+
? [
|
|
40
|
+
BINARY_INSTRUMENT_REPORT_LIMITATIONS.reviewerKeyPerson,
|
|
41
|
+
BINARY_INSTRUMENT_REPORT_LIMITATIONS.cognitiveBlinding,
|
|
42
|
+
]
|
|
43
|
+
: []),
|
|
44
|
+
...(parameters["truthAdmission"] === "operator-only"
|
|
45
|
+
? [BINARY_INSTRUMENT_REPORT_LIMITATIONS.operatorOnly]
|
|
46
|
+
: []),
|
|
47
|
+
// Appended AFTER the operator-only arm (ruling C-3): the return is a positional array and the
|
|
48
|
+
// two frozen 144-cell goldens depend on the existing entries keeping their indices.
|
|
49
|
+
...(parameters["truthAdmission"] === "screened-operator-sampled"
|
|
50
|
+
? [BINARY_INSTRUMENT_REPORT_LIMITATIONS.screenedNotIndependentlyLabeled]
|
|
51
|
+
: []),
|
|
52
|
+
// Appended only for an authenticated screening-table/v2 closure. Legacy parameter sets omit
|
|
53
|
+
// the profile and therefore retain their exact limitation arrays and sealed Report bytes.
|
|
54
|
+
...(parameters["promptedScreeningProfile"] === PROMPTED_SCREENING_PROFILE
|
|
55
|
+
? PROMPTED_SCREENING_LIMITATIONS
|
|
56
|
+
: []),
|
|
57
|
+
];
|
|
58
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Colophon mark imported from the approved design-system source bundle.
|
|
3
|
+
* Keep this byte-for-byte aligned with `design-system/reference/assets/mark.svg`.
|
|
4
|
+
*/
|
|
5
|
+
export declare const COLOPHON_MARK_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" role=\"img\" aria-label=\"Colophon mark\"><g fill=\"currentColor\"><rect x=\"12.5\" y=\"1.5\" width=\"7\" height=\"7\" transform=\"rotate(45 16 5)\"></rect><rect x=\"2.5\" y=\"19.5\" width=\"7\" height=\"7\" transform=\"rotate(45 6 23)\"></rect><rect x=\"22.5\" y=\"19.5\" width=\"7\" height=\"7\" transform=\"rotate(45 26 23)\"></rect></g></svg>";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Colophon mark imported from the approved design-system source bundle.
|
|
3
|
+
* Keep this byte-for-byte aligned with `design-system/reference/assets/mark.svg`.
|
|
4
|
+
*/
|
|
5
|
+
export const COLOPHON_MARK_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="Colophon mark"><g fill="currentColor"><rect x="12.5" y="1.5" width="7" height="7" transform="rotate(45 16 5)"></rect><rect x="2.5" y="19.5" width="7" height="7" transform="rotate(45 6 23)"></rect><rect x="22.5" y="19.5" width="7" height="7" transform="rotate(45 26 23)"></rect></g></svg>`;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branding isolation for the standalone benchmark product.
|
|
3
|
+
*
|
|
4
|
+
* See docs/superpowers/specs/2026-08-05-benchmark-product-design.md §9
|
|
5
|
+
* ("Branding isolation") for the design rationale this module implements.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The product's identity and attribution — the single source consumed
|
|
9
|
+
* everywhere a product name or attribution appears (CLI banner, GUI chrome,
|
|
10
|
+
* report presentation, claim assets).
|
|
11
|
+
*
|
|
12
|
+
* `attribution` is factual, and appears only in about/verification contexts
|
|
13
|
+
* — never in the product name, primary navigation, category explanation, or
|
|
14
|
+
* hero copy.
|
|
15
|
+
*/
|
|
16
|
+
export interface ProductBranding {
|
|
17
|
+
readonly displayName: string;
|
|
18
|
+
readonly categoryDescriptor: string;
|
|
19
|
+
readonly tagline: string;
|
|
20
|
+
readonly promise: string;
|
|
21
|
+
readonly attribution: string;
|
|
22
|
+
readonly commandName: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const PRODUCT_BRANDING: ProductBranding;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branding isolation for the standalone benchmark product.
|
|
3
|
+
*
|
|
4
|
+
* See docs/superpowers/specs/2026-08-05-benchmark-product-design.md §9
|
|
5
|
+
* ("Branding isolation") for the design rationale this module implements.
|
|
6
|
+
*/
|
|
7
|
+
export const PRODUCT_BRANDING = {
|
|
8
|
+
displayName: "Colophon",
|
|
9
|
+
categoryDescriptor: "Benchmark publishing for agent configurations",
|
|
10
|
+
tagline: "Compare agents on the same work.",
|
|
11
|
+
promise: "Publish benchmark claims people can check.",
|
|
12
|
+
attribution: "Built on Jinn.",
|
|
13
|
+
commandName: "colophon",
|
|
14
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type BenchmarkRecord, type MatrixRecord, type ReportRecord, type RunRecord } from "@jinn-network/benchmarking-records";
|
|
2
|
+
import { type ClaimPackage } from "./claim.js";
|
|
3
|
+
import type { ClaimAnchor } from "./anchor-claims.js";
|
|
4
|
+
export interface ClaimRecordIdentities {
|
|
5
|
+
readonly benchmarkSha256: string;
|
|
6
|
+
readonly runSha256: string;
|
|
7
|
+
readonly matrixSha256: string;
|
|
8
|
+
readonly reportSha256: string | undefined;
|
|
9
|
+
readonly reportEnvelopeSha256: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function assertClaimConsistency(input: {
|
|
12
|
+
readonly claim: ClaimPackage;
|
|
13
|
+
readonly identities: ClaimRecordIdentities;
|
|
14
|
+
readonly benchmarkRecord: BenchmarkRecord;
|
|
15
|
+
readonly runRecord: RunRecord;
|
|
16
|
+
readonly matrixRecord: MatrixRecord;
|
|
17
|
+
readonly reportRecord: ReportRecord;
|
|
18
|
+
readonly draftId: string;
|
|
19
|
+
readonly assurancePreset: string;
|
|
20
|
+
readonly additionalLimitations?: readonly string[];
|
|
21
|
+
readonly rehearsal?: {
|
|
22
|
+
readonly previewCount: number;
|
|
23
|
+
readonly timestamps: readonly string[];
|
|
24
|
+
}; /** anchor-evidence §7.4: the anchors section re-derived from the carried AnchorEvidence bytes, never read from the claim under test. */
|
|
25
|
+
readonly anchors?: readonly ClaimAnchor[];
|
|
26
|
+
}): void;
|