@disclosureos/scoring 1.1.0 → 2.0.0-beta.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.
@@ -0,0 +1,433 @@
1
+ import { parseExperimentalClaimHistory } from '@disclosureos/records/experimental/v2';
2
+ import { z } from 'zod';
3
+
4
+ // src/experimental/v2/assessment-summary.ts
5
+ var ASSESSMENT_SUMMARY_POLICY = Object.freeze({
6
+ id: "urn:disclosureos:experimental:policy:assessment-summary",
7
+ version: "0.1.0",
8
+ scope: "current_declared_assessments"
9
+ });
10
+ function canonical(value) {
11
+ if (Array.isArray(value)) return "[" + value.map(canonical).join(",") + "]";
12
+ if (value && typeof value === "object") {
13
+ const record = value;
14
+ return "{" + Object.keys(record).filter((k) => record[k] !== void 0).sort().map((k) => JSON.stringify(k) + ":" + canonical(record[k])).join(",") + "}";
15
+ }
16
+ return JSON.stringify(value) ?? "null";
17
+ }
18
+ function collapse(claims) {
19
+ const groups = /* @__PURE__ */ new Map();
20
+ for (const claim of claims) {
21
+ const {
22
+ id: id2,
23
+ recordedAt: _recordedAt,
24
+ supersedes: _supersedes,
25
+ ...body
26
+ } = claim;
27
+ const declaration = claim.kind === "assessment" ? { ...body, inputRefs: [...claim.inputRefs].sort() } : body;
28
+ const key = canonical(declaration);
29
+ const group = groups.get(key);
30
+ if (group) group.claimRefs.push(`claim:${id2}`);
31
+ else groups.set(key, { claimRefs: [`claim:${id2}`], declaration });
32
+ }
33
+ return [...groups.entries()].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([, group]) => ({ ...group, claimRefs: group.claimRefs.sort() }));
34
+ }
35
+ function supportGraph(history) {
36
+ const graph = /* @__PURE__ */ new Map();
37
+ for (const c of history.claims)
38
+ graph.set(
39
+ `claim:${c.id}`,
40
+ c.kind === "source_assertion" ? [c.provenance.sourceRef] : c.inputRefs
41
+ );
42
+ for (const m of history.observation.measurements)
43
+ graph.set(`measurement:${m.id}`, m.sourceRefs);
44
+ for (const a of history.observation.assertions)
45
+ graph.set(`assertion:${a.id}`, [a.provenance.sourceRef]);
46
+ for (const p of history.observation.products)
47
+ graph.set(
48
+ `product:${p.id}`,
49
+ p.kind === "raw" ? p.sourceRefs : [p.generatedBy]
50
+ );
51
+ for (const p of history.observation.processing)
52
+ graph.set(`process:${p.id}`, p.inputRefs);
53
+ return graph;
54
+ }
55
+ function closure(graph, refs) {
56
+ const seen = /* @__PURE__ */ new Set(), queue = [...refs];
57
+ for (let i = 0; i < queue.length; i++) {
58
+ const ref = queue[i];
59
+ if (seen.has(ref)) continue;
60
+ seen.add(ref);
61
+ queue.push(...graph.get(ref) ?? []);
62
+ }
63
+ return [...seen].sort();
64
+ }
65
+ function summarizeClaimHistory(input) {
66
+ const parsed = parseExperimentalClaimHistory(input);
67
+ const result = {
68
+ success: parsed.success,
69
+ policy: ASSESSMENT_SUMMARY_POLICY,
70
+ contract: parsed.contract,
71
+ checks: parsed.checks,
72
+ issues: parsed.issues,
73
+ uncheckedRefs: [...parsed.uncheckedRefs].sort(),
74
+ currentClaimRefs: [],
75
+ supersededClaimRefs: [],
76
+ groups: [],
77
+ sharedInputs: [],
78
+ sharedDeclaredArtifacts: [],
79
+ scientificEligibility: "not_checked",
80
+ artifactIntegrity: "not_checked",
81
+ vocabularyMembership: "not_checked",
82
+ statisticalIndependence: "not_checked",
83
+ reproducibility: "not_checked"
84
+ };
85
+ if (!parsed.success) return result;
86
+ const history = parsed.data, current = new Set(parsed.currentClaimRefs), graph = supportGraph(history);
87
+ result.historyId = history.id;
88
+ result.observationId = history.observation.id;
89
+ result.currentClaimRefs = [...current].sort();
90
+ result.supersededClaimRefs = history.claims.map((c) => `claim:${c.id}`).filter((r) => !current.has(r)).sort();
91
+ const topics = /* @__PURE__ */ new Map();
92
+ for (const c of history.claims) {
93
+ if (!current.has(`claim:${c.id}`)) continue;
94
+ const key = canonical({ topic: c.topic, subject: c.subject });
95
+ const group = topics.get(key);
96
+ if (group) group.push(c);
97
+ else topics.set(key, [c]);
98
+ }
99
+ const shared = /* @__PURE__ */ new Map();
100
+ const digestIndex = /* @__PURE__ */ new Map();
101
+ const digests = /* @__PURE__ */ new Map();
102
+ for (const s of history.observation.sources)
103
+ if (s.digest) digests.set(`source:${s.id}`, s.digest.value);
104
+ for (const p of history.observation.products)
105
+ if (p.digest) digests.set(`product:${p.id}`, p.digest.value);
106
+ for (const [, claims] of [...topics.entries()].sort(
107
+ ([a], [b]) => a < b ? -1 : a > b ? 1 : 0
108
+ )) {
109
+ const first = claims[0];
110
+ const assessments = collapse(
111
+ claims.filter(
112
+ (c) => c.kind === "assessment" && c.status === "assessed"
113
+ )
114
+ ).map((g) => ({
115
+ ...g,
116
+ lineageRefs: closure(graph, g.declaration.inputRefs)
117
+ }));
118
+ const outcomes = [
119
+ ...new Set(assessments.map((a) => a.declaration.outcome))
120
+ ].sort();
121
+ result.groups.push({
122
+ topic: first.topic,
123
+ subject: first.subject,
124
+ sourceAssertions: collapse(
125
+ claims.filter(
126
+ (c) => c.kind === "source_assertion"
127
+ )
128
+ ),
129
+ unassessed: collapse(
130
+ claims.filter(
131
+ (c) => c.kind === "assessment" && c.status === "unassessed"
132
+ )
133
+ ),
134
+ assessments,
135
+ declaredOutcomes: outcomes,
136
+ disagreement: outcomes.length === 0 ? "not_assessed" : outcomes.length === 1 ? "single_declared_outcome" : "multiple_declared_outcomes"
137
+ });
138
+ for (const a of assessments)
139
+ for (const ref of a.lineageRefs) {
140
+ const representative = a.claimRefs[0];
141
+ if (!shared.has(ref)) shared.set(ref, /* @__PURE__ */ new Set());
142
+ shared.get(ref).add(representative);
143
+ const digest2 = digests.get(ref);
144
+ if (digest2) {
145
+ if (!digestIndex.has(digest2))
146
+ digestIndex.set(digest2, {
147
+ artifactRefs: /* @__PURE__ */ new Set(),
148
+ assessmentRefs: /* @__PURE__ */ new Set()
149
+ });
150
+ const entry = digestIndex.get(digest2);
151
+ entry.artifactRefs.add(ref);
152
+ entry.assessmentRefs.add(representative);
153
+ }
154
+ }
155
+ }
156
+ result.sharedInputs = [...shared.entries()].filter(([, refs]) => refs.size > 1).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([ref, refs]) => ({ ref, assessmentRefs: [...refs].sort() }));
157
+ result.sharedDeclaredArtifacts = [...digestIndex.entries()].filter(([, entry]) => entry.assessmentRefs.size > 1).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([sha256, entry]) => ({
158
+ sha256,
159
+ artifactRefs: [...entry.artifactRefs].sort(),
160
+ assessmentRefs: [...entry.assessmentRefs].sort()
161
+ }));
162
+ return result;
163
+ }
164
+ var text = z.string().min(1).regex(/\S/);
165
+ var id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*(?![\s\S])/);
166
+ var pin = z.strictObject({
167
+ sha256: z.string().regex(/^[a-f0-9]{64}(?![\s\S])/),
168
+ byteLength: z.number().int().min(1).max(Number.MAX_SAFE_INTEGER)
169
+ });
170
+ var dependency = z.strictObject({
171
+ ref: id,
172
+ id: text,
173
+ version: text,
174
+ ...pin.shape
175
+ });
176
+ var ASSESSMENT_SUMMARY_EVALUATION_SCHEMA_ID = "urn:disclosureos:experimental:assessment-summary-evaluation:0.1.0";
177
+ var ASSESSMENT_SUMMARY_EVALUATION_POLICY = Object.freeze({
178
+ id: "urn:disclosureos:experimental:policy:assessment-summary-evaluation",
179
+ version: "0.1.0",
180
+ scope: "pinned_claim_history_and_computed_declarations"
181
+ });
182
+ var AssessmentSummaryEvaluationSchema = z.strictObject({
183
+ kind: z.literal("assessment_summary_evaluation"),
184
+ schemaVersion: z.literal("0.1.0"),
185
+ id,
186
+ workflow: z.literal("assessment-summary:0.1.0"),
187
+ history: pin,
188
+ dependencies: z.strictObject({
189
+ vocabularies: z.array(dependency).min(1),
190
+ implementation: dependency,
191
+ environment: dependency
192
+ })
193
+ });
194
+ function assessmentSummaryEvaluationJsonSchema() {
195
+ return {
196
+ ...z.toJSONSchema(AssessmentSummaryEvaluationSchema, {
197
+ target: "draft-2020-12"
198
+ }),
199
+ $id: ASSESSMENT_SUMMARY_EVALUATION_SCHEMA_ID
200
+ };
201
+ }
202
+ function serialize(value) {
203
+ if (Array.isArray(value))
204
+ return "[" + value.map((v) => serialize(v === void 0 ? null : v)).join(",") + "]";
205
+ if (value && typeof value === "object") {
206
+ const v = value;
207
+ return "{" + Object.keys(v).filter((k) => v[k] !== void 0).sort().map((k) => JSON.stringify(k) + ":" + serialize(v[k])).join(",") + "}";
208
+ }
209
+ return JSON.stringify(value);
210
+ }
211
+ async function digest(bytes) {
212
+ return [
213
+ ...new Uint8Array(
214
+ await globalThis.crypto.subtle.digest("SHA-256", Uint8Array.from(bytes))
215
+ )
216
+ ].map((b) => b.toString(16).padStart(2, "0")).join("");
217
+ }
218
+ async function evaluateAssessmentSummaryEvaluation(input, options = {}) {
219
+ const parsed = AssessmentSummaryEvaluationSchema.safeParse(input);
220
+ const result = {
221
+ success: false,
222
+ policy: ASSESSMENT_SUMMARY_EVALUATION_POLICY,
223
+ checks: {
224
+ structural: "passed",
225
+ semantic: "not_checked",
226
+ external: "not_checked",
227
+ summary: "not_checked",
228
+ receipt: "not_checked"
229
+ },
230
+ issues: [],
231
+ files: [],
232
+ summary: null,
233
+ receipt: null,
234
+ sourceArtifactIntegrity: "not_checked",
235
+ vocabularyMembership: "not_checked",
236
+ scientificEligibility: "not_checked",
237
+ statisticalIndependence: "not_checked",
238
+ implementationExecution: "not_attested",
239
+ environmentExecution: "not_attested"
240
+ };
241
+ const issue = (code, pointer, message) => result.issues.push({ code, pointer, message });
242
+ if (!parsed.success) {
243
+ result.checks.structural = "failed";
244
+ for (const i of parsed.error.issues)
245
+ issue(
246
+ "SUMMARY_EVALUATION.STRUCTURE",
247
+ "/" + i.path.map((p) => String(p).replace(/~/g, "~0").replace(/\//g, "~1")).join("/"),
248
+ i.message
249
+ );
250
+ return result;
251
+ }
252
+ const manifest = parsed.data;
253
+ const dependencies = [
254
+ ...manifest.dependencies.vocabularies.map((value, i) => ({
255
+ value,
256
+ pointer: `/dependencies/vocabularies/${i}`
257
+ })),
258
+ {
259
+ value: manifest.dependencies.implementation,
260
+ pointer: "/dependencies/implementation"
261
+ },
262
+ {
263
+ value: manifest.dependencies.environment,
264
+ pointer: "/dependencies/environment"
265
+ }
266
+ ];
267
+ const refs = /* @__PURE__ */ new Set(), vocabularies = /* @__PURE__ */ new Set();
268
+ for (const d of dependencies) {
269
+ if (refs.has(d.value.ref))
270
+ issue(
271
+ "SUMMARY_EVALUATION.DUPLICATE",
272
+ d.pointer + "/ref",
273
+ "Dependency references must be unique"
274
+ );
275
+ refs.add(d.value.ref);
276
+ }
277
+ for (const [i, v] of manifest.dependencies.vocabularies.entries()) {
278
+ if (vocabularies.has(v.id))
279
+ issue(
280
+ "SUMMARY_EVALUATION.VOCABULARY",
281
+ `/dependencies/vocabularies/${i}/id`,
282
+ "Each vocabulary identity requires one declared version"
283
+ );
284
+ vocabularies.add(v.id);
285
+ }
286
+ if (result.issues.length) {
287
+ result.checks.semantic = "failed";
288
+ return result;
289
+ }
290
+ result.checks.semantic = "passed";
291
+ const historyBytes = options.historyBytes ? Uint8Array.from(options.historyBytes) : void 0;
292
+ const files = new Map(
293
+ [...options.dependencyFiles ?? []].map(([ref, bytes]) => [
294
+ ref,
295
+ Uint8Array.from(bytes)
296
+ ])
297
+ );
298
+ const inputs = [
299
+ {
300
+ ref: "history",
301
+ pin: manifest.history,
302
+ bytes: historyBytes,
303
+ pointer: "/history"
304
+ },
305
+ ...dependencies.map((d) => ({
306
+ ref: `dependency:${d.value.ref}`,
307
+ pin: d.value,
308
+ bytes: files.get(d.value.ref),
309
+ pointer: d.pointer
310
+ }))
311
+ ];
312
+ for (const input2 of inputs) {
313
+ const check = {
314
+ ref: input2.ref,
315
+ status: "not_checked",
316
+ expectedSha256: input2.pin.sha256,
317
+ expectedByteLength: input2.pin.byteLength
318
+ };
319
+ result.files.push(check);
320
+ if (!input2.bytes) {
321
+ issue(
322
+ "SUMMARY_EVALUATION.MISSING_FILE",
323
+ input2.pointer,
324
+ "Required local bytes are unavailable"
325
+ );
326
+ continue;
327
+ }
328
+ check.actualByteLength = input2.bytes.byteLength;
329
+ if (input2.bytes.byteLength !== input2.pin.byteLength) {
330
+ check.status = "failed";
331
+ issue(
332
+ "SUMMARY_EVALUATION.SIZE",
333
+ input2.pointer,
334
+ "Byte length differs from the declared input"
335
+ );
336
+ continue;
337
+ }
338
+ try {
339
+ check.actualSha256 = await digest(input2.bytes);
340
+ check.status = check.actualSha256 === input2.pin.sha256 ? "passed" : "failed";
341
+ if (check.status === "failed")
342
+ issue(
343
+ "SUMMARY_EVALUATION.DIGEST",
344
+ input2.pointer,
345
+ "SHA-256 differs from the declared input"
346
+ );
347
+ } catch {
348
+ issue(
349
+ "SUMMARY_EVALUATION.HASH_UNAVAILABLE",
350
+ input2.pointer,
351
+ "SHA-256 unavailable; byte identity remains unchecked"
352
+ );
353
+ }
354
+ }
355
+ if (result.files.some((f) => f.status !== "passed")) {
356
+ if (result.files.some((f) => f.status === "failed"))
357
+ result.checks.external = "failed";
358
+ return result;
359
+ }
360
+ result.checks.external = "passed";
361
+ let history;
362
+ try {
363
+ history = JSON.parse(
364
+ new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(
365
+ historyBytes
366
+ )
367
+ );
368
+ } catch {
369
+ result.checks.semantic = "failed";
370
+ issue(
371
+ "SUMMARY_EVALUATION.JSON",
372
+ "/history",
373
+ "History must be valid UTF-8 JSON without a BOM"
374
+ );
375
+ return result;
376
+ }
377
+ result.summary = summarizeClaimHistory(history);
378
+ result.checks.summary = result.summary.success ? "passed" : Object.values(result.summary.checks).includes("failed") ? "failed" : "not_checked";
379
+ result.issues.push(
380
+ ...result.summary.issues.map((i) => ({
381
+ code: i.code,
382
+ pointer: "/summary" + i.pointer,
383
+ message: i.message
384
+ }))
385
+ );
386
+ const requestJson = serialize({
387
+ manifest,
388
+ rules: {
389
+ evaluation: ASSESSMENT_SUMMARY_EVALUATION_POLICY,
390
+ summary: ASSESSMENT_SUMMARY_POLICY,
391
+ contract: result.summary.contract
392
+ },
393
+ limits: {
394
+ sourceArtifactIntegrity: result.sourceArtifactIntegrity,
395
+ vocabularyMembership: result.vocabularyMembership,
396
+ scientificEligibility: result.scientificEligibility,
397
+ statisticalIndependence: result.statisticalIndependence,
398
+ implementationExecution: result.implementationExecution,
399
+ environmentExecution: result.environmentExecution
400
+ }
401
+ });
402
+ const outputJson = serialize({ summary: result.summary });
403
+ try {
404
+ const requestBytes = new TextEncoder().encode(requestJson), outputBytes = new TextEncoder().encode(outputJson);
405
+ result.receipt = {
406
+ format: "disclosureos-assessment-summary-receipt:0.1.0",
407
+ serialization: "sorted-json-utf8:0.1.0",
408
+ request: {
409
+ sha256: await digest(requestBytes),
410
+ byteLength: requestBytes.byteLength
411
+ },
412
+ output: {
413
+ sha256: await digest(outputBytes),
414
+ byteLength: outputBytes.byteLength
415
+ },
416
+ requestJson,
417
+ outputJson
418
+ };
419
+ result.checks.receipt = "passed";
420
+ } catch {
421
+ issue(
422
+ "SUMMARY_EVALUATION.HASH_UNAVAILABLE",
423
+ "/receipt",
424
+ "Receipt hashing unavailable; no receipt was produced"
425
+ );
426
+ }
427
+ result.success = result.checks.summary === "passed" && result.checks.receipt === "passed";
428
+ return result;
429
+ }
430
+
431
+ export { ASSESSMENT_SUMMARY_EVALUATION_POLICY, ASSESSMENT_SUMMARY_EVALUATION_SCHEMA_ID, ASSESSMENT_SUMMARY_POLICY, AssessmentSummaryEvaluationSchema, assessmentSummaryEvaluationJsonSchema, evaluateAssessmentSummaryEvaluation, summarizeClaimHistory };
432
+ //# sourceMappingURL=index.js.map
433
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/experimental/v2/assessment-summary.ts","../../../src/experimental/v2/summary-evaluation.ts"],"names":["id","digest","input"],"mappings":"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","file":"index.js","sourcesContent":["import { parseExperimentalClaimHistory } from \"@disclosureos/records/experimental/v2\";\nimport type {\n AssessedClaim,\n UnassessedClaim,\n SourceStatement,\n HistoricalClaim,\n ClaimSubject,\n ClaimHistoryValidation,\n ExperimentalClaimHistory,\n} from \"@disclosureos/records/experimental/v2\";\n\nexport const ASSESSMENT_SUMMARY_POLICY = Object.freeze({\n id: \"urn:disclosureos:experimental:policy:assessment-summary\",\n version: \"0.1.0\",\n scope: \"current_declared_assessments\",\n} as const);\ntype Declaration<T extends HistoricalClaim> = Omit<\n T,\n \"id\" | \"recordedAt\" | \"supersedes\"\n>;\nexport interface DeclarationGroup<T extends HistoricalClaim> {\n /** All current copies; the first sorted ref is the deterministic representative. */\n claimRefs: string[];\n declaration: Declaration<T>;\n}\nexport interface AssessmentSummaryGroup {\n topic: string;\n subject: ClaimSubject;\n sourceAssertions: DeclarationGroup<SourceStatement>[];\n unassessed: DeclarationGroup<UnassessedClaim>[];\n assessments: (DeclarationGroup<AssessedClaim> & { lineageRefs: string[] })[];\n declaredOutcomes: AssessedClaim[\"outcome\"][];\n disagreement:\n | \"not_assessed\"\n | \"single_declared_outcome\"\n | \"multiple_declared_outcomes\";\n}\nexport interface AssessmentSummaryResult {\n success: boolean;\n policy: typeof ASSESSMENT_SUMMARY_POLICY;\n contract: ClaimHistoryValidation[\"contract\"];\n checks: ClaimHistoryValidation[\"checks\"];\n issues: ClaimHistoryValidation[\"issues\"];\n uncheckedRefs: string[];\n historyId?: string;\n observationId?: string;\n currentClaimRefs: string[];\n supersededClaimRefs: string[];\n groups: AssessmentSummaryGroup[];\n sharedInputs: { ref: string; assessmentRefs: string[] }[];\n /** Equal declared hashes are a dependence signal, not a completed byte check. */\n sharedDeclaredArtifacts: {\n sha256: string;\n artifactRefs: string[];\n assessmentRefs: string[];\n }[];\n scientificEligibility: \"not_checked\";\n artifactIntegrity: \"not_checked\";\n vocabularyMembership: \"not_checked\";\n statisticalIndependence: \"not_checked\";\n reproducibility: \"not_checked\";\n}\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return \"[\" + value.map(canonical).join(\",\") + \"]\";\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n return (\n \"{\" +\n Object.keys(record)\n .filter((k) => record[k] !== undefined)\n .sort()\n .map((k) => JSON.stringify(k) + \":\" + canonical(record[k]))\n .join(\",\") +\n \"}\"\n );\n }\n return JSON.stringify(value) ?? \"null\";\n}\nfunction collapse<T extends HistoricalClaim>(\n claims: T[]\n): DeclarationGroup<T>[] {\n const groups = new Map<string, DeclarationGroup<T>>();\n for (const claim of claims) {\n const {\n id,\n recordedAt: _recordedAt,\n supersedes: _supersedes,\n ...body\n } = claim;\n const declaration =\n claim.kind === \"assessment\"\n ? { ...body, inputRefs: [...claim.inputRefs].sort() }\n : body;\n const key = canonical(declaration);\n const group = groups.get(key);\n if (group) group.claimRefs.push(`claim:${id}`);\n else groups.set(key, { claimRefs: [`claim:${id}`], declaration });\n }\n return [...groups.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([, group]) => ({ ...group, claimRefs: group.claimRefs.sort() }));\n}\nfunction supportGraph(\n history: ExperimentalClaimHistory\n): Map<string, readonly string[]> {\n const graph = new Map<string, readonly string[]>();\n for (const c of history.claims)\n graph.set(\n `claim:${c.id}`,\n c.kind === \"source_assertion\" ? [c.provenance.sourceRef] : c.inputRefs\n );\n for (const m of history.observation.measurements)\n graph.set(`measurement:${m.id}`, m.sourceRefs);\n for (const a of history.observation.assertions)\n graph.set(`assertion:${a.id}`, [a.provenance.sourceRef]);\n for (const p of history.observation.products)\n graph.set(\n `product:${p.id}`,\n p.kind === \"raw\" ? p.sourceRefs : [p.generatedBy]\n );\n for (const p of history.observation.processing)\n graph.set(`process:${p.id}`, p.inputRefs);\n return graph;\n}\nfunction closure(\n graph: Map<string, readonly string[]>,\n refs: readonly string[]\n): string[] {\n const seen = new Set<string>(),\n queue = [...refs];\n for (let i = 0; i < queue.length; i++) {\n const ref = queue[i]!;\n if (seen.has(ref)) continue;\n seen.add(ref);\n queue.push(...(graph.get(ref) ?? []));\n }\n return [...seen].sort();\n}\n/** Summarize attributed declarations. No outcome is upgraded by a parser pass. */\nexport function summarizeClaimHistory(input: unknown): AssessmentSummaryResult {\n const parsed = parseExperimentalClaimHistory(input);\n const result: AssessmentSummaryResult = {\n success: parsed.success,\n policy: ASSESSMENT_SUMMARY_POLICY,\n contract: parsed.contract,\n checks: parsed.checks,\n issues: parsed.issues,\n uncheckedRefs: [...parsed.uncheckedRefs].sort(),\n currentClaimRefs: [],\n supersededClaimRefs: [],\n groups: [],\n sharedInputs: [],\n sharedDeclaredArtifacts: [],\n scientificEligibility: \"not_checked\",\n artifactIntegrity: \"not_checked\",\n vocabularyMembership: \"not_checked\",\n statisticalIndependence: \"not_checked\",\n reproducibility: \"not_checked\",\n };\n if (!parsed.success) return result;\n const history = parsed.data,\n current = new Set(parsed.currentClaimRefs),\n graph = supportGraph(history);\n result.historyId = history.id;\n result.observationId = history.observation.id;\n result.currentClaimRefs = [...current].sort();\n result.supersededClaimRefs = history.claims\n .map((c) => `claim:${c.id}`)\n .filter((r) => !current.has(r))\n .sort();\n const topics = new Map<string, HistoricalClaim[]>();\n for (const c of history.claims) {\n if (!current.has(`claim:${c.id}`)) continue;\n const key = canonical({ topic: c.topic, subject: c.subject });\n const group = topics.get(key);\n if (group) group.push(c);\n else topics.set(key, [c]);\n }\n const shared = new Map<string, Set<string>>();\n const digestIndex = new Map<\n string,\n { artifactRefs: Set<string>; assessmentRefs: Set<string> }\n >();\n const digests = new Map<string, string>();\n for (const s of history.observation.sources)\n if (s.digest) digests.set(`source:${s.id}`, s.digest.value);\n for (const p of history.observation.products)\n if (p.digest) digests.set(`product:${p.id}`, p.digest.value);\n for (const [, claims] of [...topics.entries()].sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0\n )) {\n const first = claims[0]!;\n const assessments = collapse(\n claims.filter(\n (c): c is AssessedClaim =>\n c.kind === \"assessment\" && c.status === \"assessed\"\n )\n ).map((g) => ({\n ...g,\n lineageRefs: closure(graph, g.declaration.inputRefs),\n }));\n const outcomes = [\n ...new Set(assessments.map((a) => a.declaration.outcome)),\n ].sort();\n result.groups.push({\n topic: first.topic,\n subject: first.subject,\n sourceAssertions: collapse(\n claims.filter(\n (c): c is SourceStatement => c.kind === \"source_assertion\"\n )\n ),\n unassessed: collapse(\n claims.filter(\n (c): c is UnassessedClaim =>\n c.kind === \"assessment\" && c.status === \"unassessed\"\n )\n ),\n assessments,\n declaredOutcomes: outcomes,\n disagreement:\n outcomes.length === 0\n ? \"not_assessed\"\n : outcomes.length === 1\n ? \"single_declared_outcome\"\n : \"multiple_declared_outcomes\",\n });\n for (const a of assessments)\n for (const ref of a.lineageRefs) {\n const representative = a.claimRefs[0]!;\n if (!shared.has(ref)) shared.set(ref, new Set());\n shared.get(ref)!.add(representative);\n const digest = digests.get(ref);\n if (digest) {\n if (!digestIndex.has(digest))\n digestIndex.set(digest, {\n artifactRefs: new Set(),\n assessmentRefs: new Set(),\n });\n const entry = digestIndex.get(digest)!;\n entry.artifactRefs.add(ref);\n entry.assessmentRefs.add(representative);\n }\n }\n }\n result.sharedInputs = [...shared.entries()]\n .filter(([, refs]) => refs.size > 1)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([ref, refs]) => ({ ref, assessmentRefs: [...refs].sort() }));\n result.sharedDeclaredArtifacts = [...digestIndex.entries()]\n .filter(([, entry]) => entry.assessmentRefs.size > 1)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([sha256, entry]) => ({\n sha256,\n artifactRefs: [...entry.artifactRefs].sort(),\n assessmentRefs: [...entry.assessmentRefs].sort(),\n }));\n return result;\n}\n","import { z } from \"zod\";\nimport {\n summarizeClaimHistory,\n ASSESSMENT_SUMMARY_POLICY,\n} from \"./assessment-summary\";\nimport type { AssessmentSummaryResult } from \"./assessment-summary\";\nconst text = z.string().min(1).regex(/\\S/);\nconst id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*(?![\\s\\S])/);\nconst pin = z.strictObject({\n sha256: z.string().regex(/^[a-f0-9]{64}(?![\\s\\S])/),\n byteLength: z.number().int().min(1).max(Number.MAX_SAFE_INTEGER),\n});\nconst dependency = z.strictObject({\n ref: id,\n id: text,\n version: text,\n ...pin.shape,\n});\nexport const ASSESSMENT_SUMMARY_EVALUATION_SCHEMA_ID =\n \"urn:disclosureos:experimental:assessment-summary-evaluation:0.1.0\";\nexport const ASSESSMENT_SUMMARY_EVALUATION_POLICY = Object.freeze({\n id: \"urn:disclosureos:experimental:policy:assessment-summary-evaluation\",\n version: \"0.1.0\",\n scope: \"pinned_claim_history_and_computed_declarations\",\n} as const);\nexport const AssessmentSummaryEvaluationSchema = z.strictObject({\n kind: z.literal(\"assessment_summary_evaluation\"),\n schemaVersion: z.literal(\"0.1.0\"),\n id,\n workflow: z.literal(\"assessment-summary:0.1.0\"),\n history: pin,\n dependencies: z.strictObject({\n vocabularies: z.array(dependency).min(1),\n implementation: dependency,\n environment: dependency,\n }),\n});\nexport type AssessmentSummaryEvaluation = z.infer<\n typeof AssessmentSummaryEvaluationSchema\n>;\nexport function assessmentSummaryEvaluationJsonSchema(): Record<\n string,\n unknown\n> {\n return {\n ...z.toJSONSchema(AssessmentSummaryEvaluationSchema, {\n target: \"draft-2020-12\",\n }),\n $id: ASSESSMENT_SUMMARY_EVALUATION_SCHEMA_ID,\n };\n}\nexport interface AssessmentSummaryEvaluationOptions {\n historyBytes?: Uint8Array;\n dependencyFiles?: ReadonlyMap<string, Uint8Array>;\n}\ntype Status = \"passed\" | \"failed\" | \"not_checked\";\nexport interface AssessmentSummaryReceipt {\n format: \"disclosureos-assessment-summary-receipt:0.1.0\";\n serialization: \"sorted-json-utf8:0.1.0\";\n request: { sha256: string; byteLength: number };\n output: { sha256: string; byteLength: number };\n requestJson: string;\n outputJson: string;\n}\nexport interface AssessmentSummaryEvaluationResult {\n success: boolean;\n policy: typeof ASSESSMENT_SUMMARY_EVALUATION_POLICY;\n checks: {\n structural: Status;\n semantic: Status;\n external: Status;\n summary: Status;\n receipt: Status;\n };\n issues: { code: string; pointer: string; message: string }[];\n files: {\n ref: string;\n status: Status;\n expectedSha256: string;\n expectedByteLength: number;\n actualSha256?: string;\n actualByteLength?: number;\n }[];\n summary: AssessmentSummaryResult | null;\n receipt: AssessmentSummaryReceipt | null;\n sourceArtifactIntegrity: \"not_checked\";\n vocabularyMembership: \"not_checked\";\n scientificEligibility: \"not_checked\";\n statisticalIndependence: \"not_checked\";\n implementationExecution: \"not_attested\";\n environmentExecution: \"not_attested\";\n}\nfunction serialize(value: unknown): string {\n if (Array.isArray(value))\n return (\n \"[\" +\n value.map((v) => serialize(v === undefined ? null : v)).join(\",\") +\n \"]\"\n );\n if (value && typeof value === \"object\") {\n const v = value as Record<string, unknown>;\n return (\n \"{\" +\n Object.keys(v)\n .filter((k) => v[k] !== undefined)\n .sort()\n .map((k) => JSON.stringify(k) + \":\" + serialize(v[k]))\n .join(\",\") +\n \"}\"\n );\n }\n return JSON.stringify(value);\n}\nasync function digest(bytes: Uint8Array): Promise<string> {\n return [\n ...new Uint8Array(\n await globalThis.crypto.subtle.digest(\"SHA-256\", Uint8Array.from(bytes))\n ),\n ]\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n/** Pins the summary's declared history input. Referenced source/product bytes are not verified or fetched. */\nexport async function evaluateAssessmentSummaryEvaluation(\n input: unknown,\n options: AssessmentSummaryEvaluationOptions = {}\n): Promise<AssessmentSummaryEvaluationResult> {\n const parsed = AssessmentSummaryEvaluationSchema.safeParse(input);\n const result: AssessmentSummaryEvaluationResult = {\n success: false,\n policy: ASSESSMENT_SUMMARY_EVALUATION_POLICY,\n checks: {\n structural: \"passed\",\n semantic: \"not_checked\",\n external: \"not_checked\",\n summary: \"not_checked\",\n receipt: \"not_checked\",\n },\n issues: [],\n files: [],\n summary: null,\n receipt: null,\n sourceArtifactIntegrity: \"not_checked\",\n vocabularyMembership: \"not_checked\",\n scientificEligibility: \"not_checked\",\n statisticalIndependence: \"not_checked\",\n implementationExecution: \"not_attested\",\n environmentExecution: \"not_attested\",\n };\n const issue = (code: string, pointer: string, message: string) =>\n result.issues.push({ code, pointer, message });\n if (!parsed.success) {\n result.checks.structural = \"failed\";\n for (const i of parsed.error.issues)\n issue(\n \"SUMMARY_EVALUATION.STRUCTURE\",\n \"/\" +\n i.path\n .map((p) => String(p).replace(/~/g, \"~0\").replace(/\\//g, \"~1\"))\n .join(\"/\"),\n i.message\n );\n return result;\n }\n const manifest = parsed.data;\n const dependencies = [\n ...manifest.dependencies.vocabularies.map((value, i) => ({\n value,\n pointer: `/dependencies/vocabularies/${i}`,\n })),\n {\n value: manifest.dependencies.implementation,\n pointer: \"/dependencies/implementation\",\n },\n {\n value: manifest.dependencies.environment,\n pointer: \"/dependencies/environment\",\n },\n ];\n const refs = new Set<string>(),\n vocabularies = new Set<string>();\n for (const d of dependencies) {\n if (refs.has(d.value.ref))\n issue(\n \"SUMMARY_EVALUATION.DUPLICATE\",\n d.pointer + \"/ref\",\n \"Dependency references must be unique\"\n );\n refs.add(d.value.ref);\n }\n for (const [i, v] of manifest.dependencies.vocabularies.entries()) {\n if (vocabularies.has(v.id))\n issue(\n \"SUMMARY_EVALUATION.VOCABULARY\",\n `/dependencies/vocabularies/${i}/id`,\n \"Each vocabulary identity requires one declared version\"\n );\n vocabularies.add(v.id);\n }\n if (result.issues.length) {\n result.checks.semantic = \"failed\";\n return result;\n }\n result.checks.semantic = \"passed\";\n const historyBytes = options.historyBytes\n ? Uint8Array.from(options.historyBytes)\n : undefined;\n const files = new Map(\n [...(options.dependencyFiles ?? [])].map(([ref, bytes]) => [\n ref,\n Uint8Array.from(bytes),\n ])\n );\n const inputs = [\n {\n ref: \"history\",\n pin: manifest.history,\n bytes: historyBytes,\n pointer: \"/history\",\n },\n ...dependencies.map((d) => ({\n ref: `dependency:${d.value.ref}`,\n pin: d.value,\n bytes: files.get(d.value.ref),\n pointer: d.pointer,\n })),\n ];\n for (const input of inputs) {\n const check: AssessmentSummaryEvaluationResult[\"files\"][number] = {\n ref: input.ref,\n status: \"not_checked\",\n expectedSha256: input.pin.sha256,\n expectedByteLength: input.pin.byteLength,\n };\n result.files.push(check);\n if (!input.bytes) {\n issue(\n \"SUMMARY_EVALUATION.MISSING_FILE\",\n input.pointer,\n \"Required local bytes are unavailable\"\n );\n continue;\n }\n check.actualByteLength = input.bytes.byteLength;\n if (input.bytes.byteLength !== input.pin.byteLength) {\n check.status = \"failed\";\n issue(\n \"SUMMARY_EVALUATION.SIZE\",\n input.pointer,\n \"Byte length differs from the declared input\"\n );\n continue;\n }\n try {\n check.actualSha256 = await digest(input.bytes);\n check.status =\n check.actualSha256 === input.pin.sha256 ? \"passed\" : \"failed\";\n if (check.status === \"failed\")\n issue(\n \"SUMMARY_EVALUATION.DIGEST\",\n input.pointer,\n \"SHA-256 differs from the declared input\"\n );\n } catch {\n issue(\n \"SUMMARY_EVALUATION.HASH_UNAVAILABLE\",\n input.pointer,\n \"SHA-256 unavailable; byte identity remains unchecked\"\n );\n }\n }\n if (result.files.some((f) => f.status !== \"passed\")) {\n if (result.files.some((f) => f.status === \"failed\"))\n result.checks.external = \"failed\";\n return result;\n }\n result.checks.external = \"passed\";\n let history: unknown;\n try {\n history = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(\n historyBytes!\n )\n ) as unknown;\n } catch {\n result.checks.semantic = \"failed\";\n issue(\n \"SUMMARY_EVALUATION.JSON\",\n \"/history\",\n \"History must be valid UTF-8 JSON without a BOM\"\n );\n return result;\n }\n result.summary = summarizeClaimHistory(history);\n result.checks.summary = result.summary.success\n ? \"passed\"\n : Object.values(result.summary.checks).includes(\"failed\")\n ? \"failed\"\n : \"not_checked\";\n result.issues.push(\n ...result.summary.issues.map((i) => ({\n code: i.code,\n pointer: \"/summary\" + i.pointer,\n message: i.message,\n }))\n );\n const requestJson = serialize({\n manifest,\n rules: {\n evaluation: ASSESSMENT_SUMMARY_EVALUATION_POLICY,\n summary: ASSESSMENT_SUMMARY_POLICY,\n contract: result.summary.contract,\n },\n limits: {\n sourceArtifactIntegrity: result.sourceArtifactIntegrity,\n vocabularyMembership: result.vocabularyMembership,\n scientificEligibility: result.scientificEligibility,\n statisticalIndependence: result.statisticalIndependence,\n implementationExecution: result.implementationExecution,\n environmentExecution: result.environmentExecution,\n },\n });\n const outputJson = serialize({ summary: result.summary });\n try {\n const requestBytes = new TextEncoder().encode(requestJson),\n outputBytes = new TextEncoder().encode(outputJson);\n result.receipt = {\n format: \"disclosureos-assessment-summary-receipt:0.1.0\",\n serialization: \"sorted-json-utf8:0.1.0\",\n request: {\n sha256: await digest(requestBytes),\n byteLength: requestBytes.byteLength,\n },\n output: {\n sha256: await digest(outputBytes),\n byteLength: outputBytes.byteLength,\n },\n requestJson,\n outputJson,\n };\n result.checks.receipt = \"passed\";\n } catch {\n issue(\n \"SUMMARY_EVALUATION.HASH_UNAVAILABLE\",\n \"/receipt\",\n \"Receipt hashing unavailable; no receipt was produced\"\n );\n }\n result.success =\n result.checks.summary === \"passed\" && result.checks.receipt === \"passed\";\n return result;\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { CompletenessOptions, CompletenessResult, CompletenessResultSchema, FieldPath, deriveFieldPaths, getCompleteness } from './completeness/index.js';
1
+ export { CompletenessOptions, CompletenessResult, CompletenessResultSchema, FieldPath, CompletenessOptions as PopulationCoverageOptions, CompletenessResult as PopulationCoverageResult, deriveFieldPaths, getCompleteness, getCompleteness as getPopulationCoverage } from './completeness/index.js';
2
2
  export { ASSESSMENT_LEVEL_WEIGHTS, CALIBRATION_TRUST_WEIGHTS, CalibrationTrustOptions, CalibrationTrustWeights, CompellingnessWeights, CompellingnessWeightsSchema, DEFAULT_PROSAIC_OCS_PREFIXES, DEFAULT_WEIGHTS, EvaluatorWeightInput, RankedObservation, SCORING_VERSION, ScoreOptions, ScoreResult, ScoreResultSchema, calibrationTrust, rankByCompellingness, score } from './compellingness/index.js';
3
3
  import 'zod';
4
4
  import '@disclosureos/records';
package/dist/index.js CHANGED
@@ -280,6 +280,6 @@ function scoringJsonSchema() {
280
280
  return jsonSchemaEnvelope(bundle, { id: SCORING_SCHEMA_ID, version: SCORING_SCHEMA_VERSION });
281
281
  }
282
282
 
283
- export { ASSESSMENT_LEVEL_WEIGHTS, CALIBRATION_TRUST_WEIGHTS, CompellingnessWeightsSchema, CompletenessResultSchema, DEFAULT_PROSAIC_OCS_PREFIXES, DEFAULT_WEIGHTS, SCORING_SCHEMA_ID, SCORING_SCHEMA_VERSION, SCORING_VERSION, ScoreResultSchema, calibrationTrust, deriveFieldPaths, getCompleteness, rankByCompellingness, score, scoringJsonSchema };
283
+ export { ASSESSMENT_LEVEL_WEIGHTS, CALIBRATION_TRUST_WEIGHTS, CompellingnessWeightsSchema, CompletenessResultSchema, DEFAULT_PROSAIC_OCS_PREFIXES, DEFAULT_WEIGHTS, SCORING_SCHEMA_ID, SCORING_SCHEMA_VERSION, SCORING_VERSION, ScoreResultSchema, calibrationTrust, deriveFieldPaths, getCompleteness, getCompleteness as getPopulationCoverage, rankByCompellingness, score, scoringJsonSchema };
284
284
  //# sourceMappingURL=index.js.map
285
285
  //# sourceMappingURL=index.js.map