@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.
- package/CHANGELOG.md +31 -0
- package/README.md +23 -8
- package/dist/completeness/index.d.ts +3 -3
- package/dist/completeness/index.js.map +1 -1
- package/dist/experimental/v2/index.d.ts +152 -0
- package/dist/experimental/v2/index.js +433 -0
- package/dist/experimental/v2/index.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/population-coverage/index.d.ts +3 -0
- package/dist/population-coverage/index.js +109 -0
- package/dist/population-coverage/index.js.map +1 -0
- package/package.json +19 -8
- package/schema/experimental/assessment-summary-evaluation-0.1.0.schema.json +174 -0
|
@@ -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
|