@primust/verifier 1.0.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/LICENSE +93 -0
- package/dist/bounded-trace.d.ts +46 -0
- package/dist/bounded-trace.d.ts.map +1 -0
- package/dist/bounded-trace.js +558 -0
- package/dist/bounded-trace.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +391 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/key-cache.d.ts +20 -0
- package/dist/key-cache.d.ts.map +1 -0
- package/dist/key-cache.js +68 -0
- package/dist/key-cache.js.map +1 -0
- package/dist/scoped.d.ts +35 -0
- package/dist/scoped.d.ts.map +1 -0
- package/dist/scoped.js +582 -0
- package/dist/scoped.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream_resolver.d.ts +60 -0
- package/dist/upstream_resolver.d.ts.map +1 -0
- package/dist/upstream_resolver.js +126 -0
- package/dist/upstream_resolver.js.map +1 -0
- package/dist/v29-envelope.d.ts +55 -0
- package/dist/v29-envelope.d.ts.map +1 -0
- package/dist/v29-envelope.js +450 -0
- package/dist/v29-envelope.js.map +1 -0
- package/dist/verifier.d.ts +36 -0
- package/dist/verifier.d.ts.map +1 -0
- package/dist/verifier.js +1235 -0
- package/dist/verifier.js.map +1 -0
- package/dist/verifier.test.d.ts +2 -0
- package/dist/verifier.test.d.ts.map +1 -0
- package/dist/verifier.test.js +395 -0
- package/dist/verifier.test.js.map +1 -0
- package/dist/verify-html-template.d.ts +45 -0
- package/dist/verify-html-template.d.ts.map +1 -0
- package/dist/verify-html-template.js +182 -0
- package/dist/verify-html-template.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference TypeScript interpreter for bounded_trace_v1 verification.
|
|
3
|
+
*
|
|
4
|
+
* This is the canonical second-opinion verifier described in PRIMUST_V27 §20.2,
|
|
5
|
+
* ported from verifier-py/src/primust_verify/bounded_trace.py. It is
|
|
6
|
+
* intentionally small and obviously-correct: consumes a BoundedTraceV1 payload
|
|
7
|
+
* plus a ProfileRecord and produces one of the §16.3 canonical downgrade
|
|
8
|
+
* reason codes (or "ok" on success).
|
|
9
|
+
*
|
|
10
|
+
* Crypto used: SHA-256 with RFC 6962-style domain-separated leaves (0x00)
|
|
11
|
+
* and nodes (0x01). Canonical JSON follows RFC 8785 + ECMAScript 7.1.12.1
|
|
12
|
+
* number serialization for cross-language parity.
|
|
13
|
+
*
|
|
14
|
+
* SI-3 (VPEC verifiability): this module's output MUST match the Python
|
|
15
|
+
* reference byte-for-byte across the shared conformance fixture corpus at
|
|
16
|
+
* packages/verifier-py/tests/fixtures/bounded_trace_v1/. The conformance
|
|
17
|
+
* runner in scripts/lane_a_conformance.* enforces this.
|
|
18
|
+
*
|
|
19
|
+
* Zero runtime dependencies besides node:crypto.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from "node:crypto";
|
|
22
|
+
// ── Canonical number + JSON (duplicated for zero-dep reference parity) ──
|
|
23
|
+
export function canonicalNumber(x) {
|
|
24
|
+
if (typeof x !== "number" || Number.isNaN(x) || !Number.isFinite(x)) {
|
|
25
|
+
throw new Error("canonical JSON cannot represent NaN, infinity, or non-numbers");
|
|
26
|
+
}
|
|
27
|
+
if (x === 0)
|
|
28
|
+
return "0";
|
|
29
|
+
// Node/V8 Number.prototype.toString already emits ECMAScript 7.1.12.1
|
|
30
|
+
// form for most values. Python repr() does the same for finite doubles.
|
|
31
|
+
// We normalize a handful of edge cases to match Python exactly:
|
|
32
|
+
// - trim trailing zeros after the decimal
|
|
33
|
+
// - "-0" → "0"
|
|
34
|
+
// - re-express scientific form with explicit "+"/"-" exponent sign
|
|
35
|
+
let s = x.toString();
|
|
36
|
+
const eIdx = s.indexOf("e");
|
|
37
|
+
if (eIdx >= 0) {
|
|
38
|
+
const mantissa = s.slice(0, eIdx);
|
|
39
|
+
const expPart = s.slice(eIdx + 1);
|
|
40
|
+
const sign = expPart.startsWith("-") ? "-" : "+";
|
|
41
|
+
const expDigits = expPart.replace(/^[+-]/, "").replace(/^0+(?=\d)/, "");
|
|
42
|
+
return `${mantissa}e${sign}${expDigits || "0"}`;
|
|
43
|
+
}
|
|
44
|
+
if (s.includes(".")) {
|
|
45
|
+
// Strip trailing zeros, then trailing dot
|
|
46
|
+
s = s.replace(/\.?0+$/, (m) => (m.startsWith(".") ? "" : m));
|
|
47
|
+
}
|
|
48
|
+
if (s === "-0")
|
|
49
|
+
s = "0";
|
|
50
|
+
return s;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Canonical JSON serialization:
|
|
54
|
+
* - object keys sorted lexicographically
|
|
55
|
+
* - UTF-8
|
|
56
|
+
* - separators ",":":", no whitespace
|
|
57
|
+
* - numbers via canonicalNumber
|
|
58
|
+
* - strings via JSON.stringify (same escape rules as Python json with ensure_ascii=False)
|
|
59
|
+
*/
|
|
60
|
+
export function canonicalJson(obj) {
|
|
61
|
+
const s = canonicalJsonString(obj);
|
|
62
|
+
return new TextEncoder().encode(s);
|
|
63
|
+
}
|
|
64
|
+
export function canonicalJsonString(obj) {
|
|
65
|
+
if (obj === null)
|
|
66
|
+
return "null";
|
|
67
|
+
if (typeof obj === "boolean")
|
|
68
|
+
return obj ? "true" : "false";
|
|
69
|
+
if (typeof obj === "number")
|
|
70
|
+
return canonicalNumber(obj);
|
|
71
|
+
if (typeof obj === "string")
|
|
72
|
+
return JSON.stringify(obj);
|
|
73
|
+
if (Array.isArray(obj)) {
|
|
74
|
+
return "[" + obj.map((v) => canonicalJsonString(v)).join(",") + "]";
|
|
75
|
+
}
|
|
76
|
+
if (typeof obj === "object") {
|
|
77
|
+
const keys = Object.keys(obj).sort();
|
|
78
|
+
const parts = keys.map((k) => {
|
|
79
|
+
const v = obj[k];
|
|
80
|
+
return JSON.stringify(k) + ":" + canonicalJsonString(v);
|
|
81
|
+
});
|
|
82
|
+
return "{" + parts.join(",") + "}";
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`canonical_json cannot encode value of type ${typeof obj}`);
|
|
85
|
+
}
|
|
86
|
+
// ── Merkle helpers (RFC 6962 domain separation) ──
|
|
87
|
+
function sha256(bytes) {
|
|
88
|
+
const h = createHash("sha256");
|
|
89
|
+
h.update(bytes);
|
|
90
|
+
return new Uint8Array(h.digest());
|
|
91
|
+
}
|
|
92
|
+
function leafHash(payload) {
|
|
93
|
+
const prefixed = new Uint8Array(payload.length + 1);
|
|
94
|
+
prefixed[0] = 0x00;
|
|
95
|
+
prefixed.set(payload, 1);
|
|
96
|
+
return sha256(prefixed);
|
|
97
|
+
}
|
|
98
|
+
function nodeHash(left, right) {
|
|
99
|
+
const prefixed = new Uint8Array(1 + left.length + right.length);
|
|
100
|
+
prefixed[0] = 0x01;
|
|
101
|
+
prefixed.set(left, 1);
|
|
102
|
+
prefixed.set(right, 1 + left.length);
|
|
103
|
+
return sha256(prefixed);
|
|
104
|
+
}
|
|
105
|
+
function toHex(bytes) {
|
|
106
|
+
let out = "";
|
|
107
|
+
for (const b of bytes) {
|
|
108
|
+
out += b.toString(16).padStart(2, "0");
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
export function buildMerkleRoot(leaves) {
|
|
113
|
+
if (leaves.length === 0) {
|
|
114
|
+
throw new Error("cannot build Merkle root over empty leaf list");
|
|
115
|
+
}
|
|
116
|
+
let level = leaves.map((l) => leafHash(l));
|
|
117
|
+
while (level.length > 1) {
|
|
118
|
+
if (level.length % 2 === 1) {
|
|
119
|
+
level.push(level[level.length - 1]);
|
|
120
|
+
}
|
|
121
|
+
const next = [];
|
|
122
|
+
for (let i = 0; i < level.length; i += 2) {
|
|
123
|
+
next.push(nodeHash(level[i], level[i + 1]));
|
|
124
|
+
}
|
|
125
|
+
level = next;
|
|
126
|
+
}
|
|
127
|
+
return "sha256:" + toHex(level[0]);
|
|
128
|
+
}
|
|
129
|
+
// ── Canonical reason codes (§16.3) ──
|
|
130
|
+
export const REASONS = [
|
|
131
|
+
"profile_not_found",
|
|
132
|
+
"profile_signature_invalid",
|
|
133
|
+
"profile_not_empirical",
|
|
134
|
+
"profile_expired",
|
|
135
|
+
"profile_revoked",
|
|
136
|
+
"profile_no_freshness_window",
|
|
137
|
+
"profile_trace_mismatch",
|
|
138
|
+
"runtime_not_supported",
|
|
139
|
+
"trace_schema_unknown",
|
|
140
|
+
"missing_merkle_root",
|
|
141
|
+
"merkle_inclusion_failed",
|
|
142
|
+
"threshold_violation",
|
|
143
|
+
"runtime_section_missing",
|
|
144
|
+
"retrieval_section_missing",
|
|
145
|
+
// v28.5 §4 — closed-API lifecycle downgrade codes. Mirrors the
|
|
146
|
+
// primust_verify (Python) 1.0.3 vocabulary so cross-verifier
|
|
147
|
+
// conformance holds. The TS verifier consults
|
|
148
|
+
// `model_profiles.lifecycle_state` (mig 123) BEFORE the legacy
|
|
149
|
+
// profile_class check; rows with non-empirical lifecycle states
|
|
150
|
+
// downgrade to `execution` with the listed reason regardless of class.
|
|
151
|
+
"closed_api_pre_cohort",
|
|
152
|
+
"closed_api_pre_promote",
|
|
153
|
+
"closed_api_v2_promoted",
|
|
154
|
+
"profile_deprecated",
|
|
155
|
+
"unknown_lifecycle_state",
|
|
156
|
+
];
|
|
157
|
+
// v28.5 §1 lifecycle state vocabulary recognized by the verifier.
|
|
158
|
+
// Mirrors primust_verify.bounded_trace._KNOWN_LIFECYCLE_STATES
|
|
159
|
+
// byte-for-byte. Unknown values fail closed.
|
|
160
|
+
const KNOWN_LIFECYCLE_STATES = new Set([
|
|
161
|
+
"v1_placeholder",
|
|
162
|
+
"v2_run_complete",
|
|
163
|
+
"v2_staged",
|
|
164
|
+
"cohort_validated",
|
|
165
|
+
"v2_empirical_closed_api",
|
|
166
|
+
"deprecated",
|
|
167
|
+
]);
|
|
168
|
+
// v28.5 §4 state-behavior table — non-empirical lifecycle → execution
|
|
169
|
+
// with the listed reason. v2_empirical_closed_api is intentionally
|
|
170
|
+
// absent: it's the only state that lets the verifier proceed.
|
|
171
|
+
const LIFECYCLE_DOWNGRADE_REASON = {
|
|
172
|
+
v1_placeholder: "closed_api_pre_cohort",
|
|
173
|
+
v2_run_complete: "closed_api_pre_cohort",
|
|
174
|
+
v2_staged: "closed_api_pre_cohort",
|
|
175
|
+
cohort_validated: "closed_api_pre_promote",
|
|
176
|
+
deprecated: "profile_deprecated",
|
|
177
|
+
};
|
|
178
|
+
// ── Verification steps ──
|
|
179
|
+
function asDate(x) {
|
|
180
|
+
if (!x)
|
|
181
|
+
return null;
|
|
182
|
+
if (x instanceof Date)
|
|
183
|
+
return x;
|
|
184
|
+
if (typeof x === "string") {
|
|
185
|
+
const d = new Date(x);
|
|
186
|
+
if (!isNaN(d.getTime()))
|
|
187
|
+
return d;
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
function checkProfile(profile, now) {
|
|
192
|
+
if (!profile || Object.keys(profile).length === 0) {
|
|
193
|
+
return { ok: false, reason: "profile_not_found" };
|
|
194
|
+
}
|
|
195
|
+
const sig = String(profile.profile_signature ?? profile.signature ?? "");
|
|
196
|
+
if (sig.includes("PLACEHOLDER") || sig.includes("UNSIGNED_PENDING")) {
|
|
197
|
+
return { ok: false, reason: "profile_signature_invalid" };
|
|
198
|
+
}
|
|
199
|
+
const status = String(profile.status ?? "active").toLowerCase();
|
|
200
|
+
if (status === "revoked" || status === "suspended") {
|
|
201
|
+
return { ok: false, reason: "profile_revoked" };
|
|
202
|
+
}
|
|
203
|
+
// v28.5 §4 — closed-API lifecycle gate. Mirrors primust_verify
|
|
204
|
+
// (Python) _check_profile. Runs BEFORE profile_class so a closed-API
|
|
205
|
+
// row that is profile_class='empirical' but still in cohort_validated
|
|
206
|
+
// lifecycle correctly downgrades to execution with closed_api_pre_promote
|
|
207
|
+
// rather than verifying as operator_bound. Open-weight rows have
|
|
208
|
+
// lifecycle_state=NULL/undefined per mig 123 and skip this gate,
|
|
209
|
+
// falling through to the legacy profile_class path.
|
|
210
|
+
const lifecycle = profile.lifecycle_state;
|
|
211
|
+
if (lifecycle !== null && lifecycle !== undefined) {
|
|
212
|
+
const ls = String(lifecycle).toLowerCase();
|
|
213
|
+
if (!KNOWN_LIFECYCLE_STATES.has(ls)) {
|
|
214
|
+
return { ok: false, reason: "unknown_lifecycle_state" };
|
|
215
|
+
}
|
|
216
|
+
const downgrade = LIFECYCLE_DOWNGRADE_REASON[ls];
|
|
217
|
+
if (downgrade !== undefined) {
|
|
218
|
+
return { ok: false, reason: downgrade };
|
|
219
|
+
}
|
|
220
|
+
// ls === 'v2_empirical_closed_api' — eligible if remaining gates pass.
|
|
221
|
+
}
|
|
222
|
+
const cls = String(profile.profile_class ?? "placeholder").toLowerCase();
|
|
223
|
+
if (cls === "revoked")
|
|
224
|
+
return { ok: false, reason: "profile_revoked" };
|
|
225
|
+
if (cls === "synthetic" || cls === "placeholder") {
|
|
226
|
+
return { ok: false, reason: "profile_not_empirical" };
|
|
227
|
+
}
|
|
228
|
+
if (cls === "expired")
|
|
229
|
+
return { ok: false, reason: "profile_expired" };
|
|
230
|
+
if (cls !== "empirical")
|
|
231
|
+
return { ok: false, reason: "profile_not_empirical" };
|
|
232
|
+
const validFrom = asDate(profile.freshness_valid_from);
|
|
233
|
+
const validUntil = asDate(profile.freshness_valid_until);
|
|
234
|
+
if (!validFrom || !validUntil) {
|
|
235
|
+
return { ok: false, reason: "profile_no_freshness_window" };
|
|
236
|
+
}
|
|
237
|
+
const graceDays = Number(profile.freshness_grace_days) || 0;
|
|
238
|
+
const graceMs = graceDays * 24 * 60 * 60 * 1000;
|
|
239
|
+
if (now.getTime() > validUntil.getTime() + graceMs) {
|
|
240
|
+
return { ok: false, reason: "profile_expired" };
|
|
241
|
+
}
|
|
242
|
+
if (now.getTime() < validFrom.getTime()) {
|
|
243
|
+
return { ok: false, reason: "profile_expired" };
|
|
244
|
+
}
|
|
245
|
+
return { ok: true, reason: "ok" };
|
|
246
|
+
}
|
|
247
|
+
function asDict(v) {
|
|
248
|
+
if (v && typeof v === "object" && !Array.isArray(v)) {
|
|
249
|
+
return v;
|
|
250
|
+
}
|
|
251
|
+
if (typeof v === "string") {
|
|
252
|
+
try {
|
|
253
|
+
const parsed = JSON.parse(v);
|
|
254
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
255
|
+
return parsed;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
/* ignore */
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return {};
|
|
263
|
+
}
|
|
264
|
+
function checkRuntime(trace, profile) {
|
|
265
|
+
const runtime = asDict(trace.runtime);
|
|
266
|
+
const kernel = runtime.kernel_profile_id;
|
|
267
|
+
const gpu = runtime.gpu_class;
|
|
268
|
+
const supportedRaw = profile.supported_runtime_classes;
|
|
269
|
+
const supported = new Set(Array.isArray(supportedRaw) ? supportedRaw : []);
|
|
270
|
+
if (supported.size > 0) {
|
|
271
|
+
if (kernel && supported.has(kernel))
|
|
272
|
+
return { ok: true, reason: "ok" };
|
|
273
|
+
if (gpu && supported.has(gpu))
|
|
274
|
+
return { ok: true, reason: "ok" };
|
|
275
|
+
return { ok: false, reason: "runtime_not_supported" };
|
|
276
|
+
}
|
|
277
|
+
// Legacy profile_data.calibrated_gpu_classes (pre-Sprint-2 shape)
|
|
278
|
+
const profileData = asDict(profile.profile_data);
|
|
279
|
+
const calibrated = profileData.calibrated_gpu_classes;
|
|
280
|
+
if (calibrated && typeof calibrated === "object") {
|
|
281
|
+
const keys = Array.isArray(calibrated)
|
|
282
|
+
? calibrated
|
|
283
|
+
: Object.keys(calibrated);
|
|
284
|
+
if (gpu && keys.includes(gpu))
|
|
285
|
+
return { ok: true, reason: "ok" };
|
|
286
|
+
if (kernel && keys.includes(kernel))
|
|
287
|
+
return { ok: true, reason: "ok" };
|
|
288
|
+
}
|
|
289
|
+
return { ok: false, reason: "runtime_not_supported" };
|
|
290
|
+
}
|
|
291
|
+
function recomputeMerkleRoot(operators) {
|
|
292
|
+
const leaves = operators.map((op) => canonicalJson({ v: "bounded_trace_v1", op }));
|
|
293
|
+
return buildMerkleRoot(leaves);
|
|
294
|
+
}
|
|
295
|
+
function compareThresholds(trace, profile) {
|
|
296
|
+
const runtime = asDict(trace.runtime);
|
|
297
|
+
const gpu = runtime.gpu_class;
|
|
298
|
+
const profileData = asDict(profile.profile_data);
|
|
299
|
+
let opThresholds = {};
|
|
300
|
+
const calibrated = profileData.calibrated_gpu_classes;
|
|
301
|
+
if (calibrated &&
|
|
302
|
+
typeof calibrated === "object" &&
|
|
303
|
+
!Array.isArray(calibrated) &&
|
|
304
|
+
gpu &&
|
|
305
|
+
gpu in calibrated) {
|
|
306
|
+
const gpuBlock = calibrated[gpu];
|
|
307
|
+
if (gpuBlock && typeof gpuBlock === "object") {
|
|
308
|
+
const ops = gpuBlock.operators;
|
|
309
|
+
if (ops && typeof ops === "object" && !Array.isArray(ops)) {
|
|
310
|
+
opThresholds = ops;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (Object.keys(opThresholds).length === 0) {
|
|
315
|
+
const legacyOps = profileData.operators;
|
|
316
|
+
if (legacyOps && typeof legacyOps === "object" && !Array.isArray(legacyOps)) {
|
|
317
|
+
opThresholds = legacyOps;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (Object.keys(opThresholds).length === 0) {
|
|
321
|
+
return {
|
|
322
|
+
ok: false,
|
|
323
|
+
violations: [{ reason: "no_operator_thresholds_in_profile" }],
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
let marginFactor = 1.0;
|
|
327
|
+
const safetyMargin = profile.safety_margin;
|
|
328
|
+
if (typeof safetyMargin === "number" && !Number.isNaN(safetyMargin)) {
|
|
329
|
+
marginFactor = 1.0 + safetyMargin;
|
|
330
|
+
}
|
|
331
|
+
const absOrViolation = (raw) => {
|
|
332
|
+
// Returns the absolute value for finite numeric stats; null when the
|
|
333
|
+
// field is missing OR when the supplied value is not a real finite
|
|
334
|
+
// number. Mirrors _abs_or_violation() in bounded_trace.py — crafted
|
|
335
|
+
// traces can't smuggle NaN/infinity past a naive `>`-comparison
|
|
336
|
+
// (NaN > x is False in ECMAScript) and negative values named *_abs
|
|
337
|
+
// are coerced to their magnitude before comparison.
|
|
338
|
+
if (raw === null || raw === undefined)
|
|
339
|
+
return null;
|
|
340
|
+
if (typeof raw !== "number")
|
|
341
|
+
return null;
|
|
342
|
+
if (Number.isNaN(raw) || !Number.isFinite(raw))
|
|
343
|
+
return null;
|
|
344
|
+
return Math.abs(raw);
|
|
345
|
+
};
|
|
346
|
+
const violations = [];
|
|
347
|
+
const tops = Array.isArray(trace.operators) ? trace.operators : [];
|
|
348
|
+
for (const rawOp of tops) {
|
|
349
|
+
const op = asDict(rawOp);
|
|
350
|
+
const opType = op.operator_type;
|
|
351
|
+
const thresholds = opType && typeof opType === "string" ? opThresholds[opType] : undefined;
|
|
352
|
+
if (!thresholds) {
|
|
353
|
+
violations.push({
|
|
354
|
+
operator_index: op.operator_index,
|
|
355
|
+
operator_type: opType,
|
|
356
|
+
stat: "operator_type",
|
|
357
|
+
observed: opType,
|
|
358
|
+
allowed: Object.keys(opThresholds),
|
|
359
|
+
});
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const stats = asDict(op.stats);
|
|
363
|
+
const p99 = thresholds.p99;
|
|
364
|
+
const p99_99 = thresholds.p99_99;
|
|
365
|
+
const rawP99 = stats.p99_abs;
|
|
366
|
+
const rawMax = stats.max_abs;
|
|
367
|
+
const observedP99 = absOrViolation(rawP99);
|
|
368
|
+
const observedMax = absOrViolation(rawMax);
|
|
369
|
+
if (rawP99 !== null && rawP99 !== undefined && observedP99 === null) {
|
|
370
|
+
violations.push({
|
|
371
|
+
operator_index: op.operator_index,
|
|
372
|
+
operator_type: opType,
|
|
373
|
+
stat: "p99_abs",
|
|
374
|
+
observed: rawP99,
|
|
375
|
+
allowed: "finite non-negative number",
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
else if (observedP99 !== null &&
|
|
379
|
+
typeof p99 === "number" &&
|
|
380
|
+
observedP99 > p99 * marginFactor) {
|
|
381
|
+
violations.push({
|
|
382
|
+
operator_index: op.operator_index,
|
|
383
|
+
operator_type: opType,
|
|
384
|
+
stat: "p99_abs",
|
|
385
|
+
observed: observedP99,
|
|
386
|
+
allowed: p99 * marginFactor,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
if (rawMax !== null && rawMax !== undefined && observedMax === null) {
|
|
390
|
+
violations.push({
|
|
391
|
+
operator_index: op.operator_index,
|
|
392
|
+
operator_type: opType,
|
|
393
|
+
stat: "max_abs",
|
|
394
|
+
observed: rawMax,
|
|
395
|
+
allowed: "finite non-negative number",
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
else if (observedMax !== null &&
|
|
399
|
+
typeof p99_99 === "number" &&
|
|
400
|
+
observedMax > p99_99 * marginFactor) {
|
|
401
|
+
violations.push({
|
|
402
|
+
operator_index: op.operator_index,
|
|
403
|
+
operator_type: opType,
|
|
404
|
+
stat: "max_abs",
|
|
405
|
+
observed: observedMax,
|
|
406
|
+
allowed: p99_99 * marginFactor,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return { ok: violations.length === 0, violations };
|
|
411
|
+
}
|
|
412
|
+
// ── Public entry point ──
|
|
413
|
+
export function verifyBoundedTrace(trace, profile, options = {}) {
|
|
414
|
+
const now = options.now ?? new Date();
|
|
415
|
+
// 1. Trace schema version
|
|
416
|
+
const schema = trace.trace_schema_version;
|
|
417
|
+
if (schema !== "bounded_trace_v1") {
|
|
418
|
+
return {
|
|
419
|
+
valid: false,
|
|
420
|
+
proof_level: "execution",
|
|
421
|
+
reason: "trace_schema_unknown",
|
|
422
|
+
disclosed_operator_count: 0,
|
|
423
|
+
verified_merkle_paths: 0,
|
|
424
|
+
details: { trace_schema_version: schema },
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
// 1a. Profile / trace identity binding. The trace must declare it was
|
|
428
|
+
// produced against the same profile we're verifying it against; otherwise
|
|
429
|
+
// an attacker could pair a low-stat trace with a sibling empirical
|
|
430
|
+
// profile that happens to have lenient thresholds. Only fires when the
|
|
431
|
+
// caller has actually supplied a profile (i.e. profile.profile_id is
|
|
432
|
+
// populated); an empty profile dict falls through to checkProfile so
|
|
433
|
+
// the caller sees profile_not_found instead. Mirrors bounded_trace.py.
|
|
434
|
+
const profileProfileId = profile.profile_id;
|
|
435
|
+
const traceProfileId = trace.profile_id;
|
|
436
|
+
if (profileProfileId !== undefined &&
|
|
437
|
+
profileProfileId !== null &&
|
|
438
|
+
traceProfileId !== profileProfileId) {
|
|
439
|
+
return {
|
|
440
|
+
valid: false,
|
|
441
|
+
proof_level: "execution",
|
|
442
|
+
reason: "profile_trace_mismatch",
|
|
443
|
+
disclosed_operator_count: 0,
|
|
444
|
+
verified_merkle_paths: 0,
|
|
445
|
+
details: {
|
|
446
|
+
trace_profile_id: traceProfileId,
|
|
447
|
+
profile_profile_id: profileProfileId,
|
|
448
|
+
},
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
// 2. Missing Merkle root
|
|
452
|
+
const claimedRoot = trace.merkle_root;
|
|
453
|
+
if (typeof claimedRoot !== "string" || !claimedRoot.startsWith("sha256:")) {
|
|
454
|
+
return {
|
|
455
|
+
valid: false,
|
|
456
|
+
proof_level: "execution",
|
|
457
|
+
reason: "missing_merkle_root",
|
|
458
|
+
disclosed_operator_count: 0,
|
|
459
|
+
verified_merkle_paths: 0,
|
|
460
|
+
details: { merkle_root: claimedRoot },
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
// 3. Merkle inclusion — reconstruct root from disclosed operators.
|
|
464
|
+
// Matches the Python reference: if operator_count is declared and
|
|
465
|
+
// disagrees with operators.length, the trace is claiming partial
|
|
466
|
+
// disclosure, which Sprint 3+ does not yet support (no inclusion
|
|
467
|
+
// proofs). Refuse with merkle_inclusion_failed.
|
|
468
|
+
const operators = Array.isArray(trace.operators) ? trace.operators : [];
|
|
469
|
+
const declaredCount = trace.operator_count;
|
|
470
|
+
if (typeof declaredCount === "number" &&
|
|
471
|
+
Number.isInteger(declaredCount) &&
|
|
472
|
+
declaredCount !== operators.length) {
|
|
473
|
+
return {
|
|
474
|
+
valid: false,
|
|
475
|
+
proof_level: "execution",
|
|
476
|
+
reason: "merkle_inclusion_failed",
|
|
477
|
+
disclosed_operator_count: operators.length,
|
|
478
|
+
verified_merkle_paths: 0,
|
|
479
|
+
details: {
|
|
480
|
+
declared_operator_count: declaredCount,
|
|
481
|
+
disclosed_operator_count: operators.length,
|
|
482
|
+
error: "operator_count_mismatch_without_inclusion_proofs",
|
|
483
|
+
},
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
let recomputed;
|
|
487
|
+
try {
|
|
488
|
+
recomputed = recomputeMerkleRoot(operators);
|
|
489
|
+
}
|
|
490
|
+
catch (exc) {
|
|
491
|
+
return {
|
|
492
|
+
valid: false,
|
|
493
|
+
proof_level: "execution",
|
|
494
|
+
reason: "merkle_inclusion_failed",
|
|
495
|
+
disclosed_operator_count: operators.length,
|
|
496
|
+
verified_merkle_paths: 0,
|
|
497
|
+
details: { error: String(exc) },
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
if (recomputed !== claimedRoot) {
|
|
501
|
+
return {
|
|
502
|
+
valid: false,
|
|
503
|
+
proof_level: "execution",
|
|
504
|
+
reason: "merkle_inclusion_failed",
|
|
505
|
+
disclosed_operator_count: operators.length,
|
|
506
|
+
verified_merkle_paths: 0,
|
|
507
|
+
details: { claimed: claimedRoot, recomputed },
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
// 4. Profile policy
|
|
511
|
+
const policy = checkProfile(profile, now);
|
|
512
|
+
if (!policy.ok) {
|
|
513
|
+
return {
|
|
514
|
+
valid: false,
|
|
515
|
+
proof_level: "execution",
|
|
516
|
+
reason: policy.reason,
|
|
517
|
+
disclosed_operator_count: operators.length,
|
|
518
|
+
verified_merkle_paths: operators.length,
|
|
519
|
+
details: { profile_class: profile.profile_class },
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
// 5. Runtime compatibility
|
|
523
|
+
const runtime = checkRuntime(trace, profile);
|
|
524
|
+
if (!runtime.ok) {
|
|
525
|
+
return {
|
|
526
|
+
valid: false,
|
|
527
|
+
proof_level: "execution",
|
|
528
|
+
reason: runtime.reason,
|
|
529
|
+
disclosed_operator_count: operators.length,
|
|
530
|
+
verified_merkle_paths: operators.length,
|
|
531
|
+
details: { trace_runtime: trace.runtime },
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
// 6. Threshold comparison
|
|
535
|
+
const thresholds = compareThresholds(trace, profile);
|
|
536
|
+
if (!thresholds.ok) {
|
|
537
|
+
return {
|
|
538
|
+
valid: false,
|
|
539
|
+
proof_level: "execution",
|
|
540
|
+
reason: "threshold_violation",
|
|
541
|
+
disclosed_operator_count: operators.length,
|
|
542
|
+
verified_merkle_paths: operators.length,
|
|
543
|
+
details: { violations: thresholds.violations },
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
return {
|
|
547
|
+
valid: true,
|
|
548
|
+
proof_level: "operator_bound",
|
|
549
|
+
reason: "thresholds_verified",
|
|
550
|
+
disclosed_operator_count: operators.length,
|
|
551
|
+
verified_merkle_paths: operators.length,
|
|
552
|
+
details: {
|
|
553
|
+
profile_id: profile.profile_id,
|
|
554
|
+
profile_class: profile.profile_class,
|
|
555
|
+
},
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=bounded-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-trace.js","sourceRoot":"","sources":["../src/bounded-trace.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* primust-verify CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* primust-verify vpec_<id>.json
|
|
7
|
+
* primust-verify vpec_<id>.json --production
|
|
8
|
+
* primust-verify vpec_<id>.json --trust-root ./my-pubkey.pem
|
|
9
|
+
* primust-verify vpec_<id>.json --skip-network
|
|
10
|
+
* primust-verify vpec_<id>.json --json
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* 0 = valid (production)
|
|
14
|
+
* 1 = invalid / tampered
|
|
15
|
+
* 2 = valid but sandbox-only (or system error)
|
|
16
|
+
*/
|
|
17
|
+
export declare function main(args?: string[]): Promise<number>;
|
|
18
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAoOH,wBAAsB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmK3D"}
|