@disclosureos/scoring 2.0.0-beta.2 → 2.0.0-beta.4
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 +33 -0
- package/README.md +70 -36
- package/dist/compellingness/index.d.ts +7 -12
- package/dist/compellingness/index.js +7 -26
- package/dist/compellingness/index.js.map +1 -1
- package/dist/experimental/v2/index.d.ts +226 -1
- package/dist/experimental/v2/index.js +493 -10
- package/dist/experimental/v2/index.js.map +1 -1
- package/dist/index.js +7 -26
- package/dist/index.js.map +1 -1
- package/package.json +11 -7
- package/schema/experimental/provider-score-policy-0.1.0.schema.json +307 -0
- package/schema/experimental/provider-score-result-0.1.0.schema.json +343 -0
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/experimental/v2/assessment-summary.ts","../../../src/experimental/v2/provider-scoring.ts","../../../src/experimental/v2/summary-evaluation.ts"],"names":["id","digest","sha256","text","z","pin","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\";\n\nconst text = z.string().min(1).regex(/\\S/);\nconst id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*(?![\\s\\S])/);\nconst finite = z.number().finite();\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 artifact = z.strictObject({\n ref: id,\n title: text,\n mediaType: text,\n ...pin.shape,\n});\nconst subjectKind = z.enum([\n \"case\",\n \"record\",\n \"claim\",\n \"measurement\",\n \"product\",\n \"source\",\n \"collection\",\n]);\nconst direction = z.enum([\"higher\", \"lower\", \"none\"]);\nconst grade = z.strictObject({ id, label: text, min: finite, max: finite });\n\nexport const PROVIDER_SCORE_POLICY_SCHEMA_ID =\n \"urn:disclosureos:experimental:provider-score-policy:0.1.0\";\nexport const PROVIDER_SCORE_RESULT_SCHEMA_ID =\n \"urn:disclosureos:experimental:provider-score-result:0.1.0\";\n\n/** A provider-defined method, not a DisclosureOS universal case grade. */\nexport const ProviderScorePolicySchema = z.strictObject({\n kind: z.literal(\"provider_score_policy\"),\n schemaVersion: z.literal(\"0.1.0\"),\n id: text,\n version: text,\n title: text,\n metric: z.strictObject({ id: text, label: text, question: text }),\n subjectKinds: z.array(subjectKind).min(1),\n method: z.strictObject({\n description: text,\n artifacts: z\n .array(\n z.strictObject({\n ref: id,\n id: text,\n version: text,\n mediaType: text,\n ...pin.shape,\n })\n )\n .min(1),\n }),\n applicability: text,\n missingData: z.strictObject({\n handling: z.enum([\"withhold\", \"allow_partial\"]),\n description: text,\n }),\n limitations: z.array(text).min(1),\n scale: z.discriminatedUnion(\"kind\", [\n z.strictObject({\n kind: z.literal(\"numeric\"),\n min: finite,\n max: finite,\n direction,\n unit: text,\n grades: z.array(grade),\n }),\n z.strictObject({\n kind: z.literal(\"ordinal\"),\n direction,\n levels: z\n .array(z.strictObject({ id, label: text, description: text }))\n .min(2),\n }),\n ]),\n});\nexport type ProviderScorePolicy = z.infer<typeof ProviderScorePolicySchema>;\n\n/** Common evidence inputs and the provider's derivation are deliberately separate. */\nexport const ProviderScoreResultSchema = z.strictObject({\n kind: z.literal(\"provider_score_result\"),\n schemaVersion: z.literal(\"0.1.0\"),\n id,\n provider: z.strictObject({\n id: text,\n name: text,\n url: z\n .url()\n .regex(/^https?:\\/\\//i)\n .optional(),\n }),\n producedAt: z.iso.datetime({ offset: true }),\n policy: z.strictObject({ id: text, version: text, ...pin.shape }),\n subject: z.strictObject({ kind: subjectKind, id: text }),\n inputScope: z.strictObject({ id: text, description: text }),\n inputs: z.array(artifact).min(1),\n derivation: z.array(artifact),\n applicability: z.strictObject({\n status: z.enum([\"applicable\", \"not_applicable\", \"undetermined\"]),\n reason: text,\n }),\n missingInputs: z.array(z.strictObject({ ref: id, description: text })),\n limitations: z.array(text),\n outcome: z.discriminatedUnion(\"status\", [\n z.strictObject({\n status: z.literal(\"scored\"),\n value: z.union([finite, id]),\n gradeId: id.optional(),\n explanation: text,\n }),\n z.strictObject({\n status: z.literal(\"unavailable\"),\n reasonCode: z.enum([\n \"missing_inputs\",\n \"not_applicable\",\n \"undetermined\",\n \"not_calculated\",\n ]),\n explanation: text,\n }),\n ]),\n});\nexport type ProviderScoreResult = z.infer<typeof ProviderScoreResultSchema>;\n\nexport function providerScorePolicyJsonSchema(): Record<string, unknown> {\n return {\n ...z.toJSONSchema(ProviderScorePolicySchema, { target: \"draft-2020-12\" }),\n $id: PROVIDER_SCORE_POLICY_SCHEMA_ID,\n };\n}\nexport function providerScoreResultJsonSchema(): Record<string, unknown> {\n return {\n ...z.toJSONSchema(ProviderScoreResultSchema, { target: \"draft-2020-12\" }),\n $id: PROVIDER_SCORE_RESULT_SCHEMA_ID,\n };\n}\n\ntype Status = \"passed\" | \"failed\" | \"not_checked\";\nexport interface ProviderScoringIssue {\n code: string;\n pointer: string;\n message: string;\n}\nfunction structuralIssues(error: z.ZodError): ProviderScoringIssue[] {\n return error.issues.map((issue) => ({\n code: \"PROVIDER_SCORE.STRUCTURE\",\n pointer:\n \"/\" +\n issue.path\n .map((p) => String(p).replace(/~/g, \"~0\").replace(/\\//g, \"~1\"))\n .join(\"/\"),\n message: issue.message,\n }));\n}\nfunction duplicateIssues(\n values: readonly string[],\n pointer: string,\n issues: ProviderScoringIssue[]\n) {\n const seen = new Set<string>();\n values.forEach((value, index) => {\n if (seen.has(value))\n issues.push({\n code: \"PROVIDER_SCORE.DUPLICATE\",\n pointer: `${pointer}/${index}`,\n message: \"Identifiers must be unique within this list\",\n });\n seen.add(value);\n });\n}\n\nexport interface ProviderScorePolicyValidation {\n success: boolean;\n checks: { structural: Status; semantic: Status };\n issues: ProviderScoringIssue[];\n policy: ProviderScorePolicy | null;\n}\n\n/** JSON Schema covers structure; this checks bounds, identifiers and complete non-overlapping grade bands. */\nexport function validateProviderScorePolicy(\n input: unknown\n): ProviderScorePolicyValidation {\n const parsed = ProviderScorePolicySchema.safeParse(input);\n if (!parsed.success)\n return {\n success: false,\n checks: { structural: \"failed\", semantic: \"not_checked\" },\n issues: structuralIssues(parsed.error),\n policy: null,\n };\n const policy = parsed.data;\n const issues: ProviderScoringIssue[] = [];\n duplicateIssues(policy.subjectKinds, \"/subjectKinds\", issues);\n duplicateIssues(\n policy.method.artifacts.map((a) => a.ref),\n \"/method/artifacts\",\n issues\n );\n if (policy.scale.kind === \"numeric\") {\n const scale = policy.scale;\n if (scale.min >= scale.max)\n issues.push({\n code: \"PROVIDER_SCORE.SCALE\",\n pointer: \"/scale\",\n message: \"Numeric scale minimum must be less than its maximum\",\n });\n duplicateIssues(\n scale.grades.map((g) => g.id),\n \"/scale/grades\",\n issues\n );\n scale.grades.forEach((band, index) => {\n const previous = scale.grades[index - 1];\n if (\n band.min >= band.max ||\n band.min < scale.min ||\n band.max > scale.max ||\n band.min !== (previous?.max ?? scale.min) ||\n (index === scale.grades.length - 1 && band.max !== scale.max)\n ) {\n issues.push({\n code: \"PROVIDER_SCORE.GRADE_BANDS\",\n pointer: `/scale/grades/${index}`,\n message:\n \"Grade bands must be ordered, contiguous and cover the scale exactly; lower bounds are inclusive, upper bounds exclusive except the final maximum\",\n });\n }\n });\n } else\n duplicateIssues(\n policy.scale.levels.map((level) => level.id),\n \"/scale/levels\",\n issues\n );\n return {\n success: issues.length === 0,\n checks: {\n structural: \"passed\",\n semantic: issues.length ? \"failed\" : \"passed\",\n },\n issues,\n policy: issues.length ? null : policy,\n };\n}\n\n/** Assign a provider's declared band, without recomputing or endorsing its score. */\nexport function providerScoreGrade(\n policy: ProviderScorePolicy,\n value: number | string\n): { id: string; label: string } | null {\n if (!validateProviderScorePolicy(policy).success) return null;\n if (policy.scale.kind === \"ordinal\") {\n const level = policy.scale.levels.find((entry) => entry.id === value);\n return level ? { id: level.id, label: level.label } : null;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n const bands = policy.scale.grades;\n const band = bands.find(\n (entry, index) =>\n value >= entry.min &&\n (value < entry.max || (index === bands.length - 1 && value === entry.max))\n );\n return band ? { id: band.id, label: band.label } : null;\n}\n\nexport interface ProviderScoreEvaluationOptions {\n policyBytes?: Uint8Array;\n inputFiles?: ReadonlyMap<string, Uint8Array>;\n derivationFiles?: ReadonlyMap<string, Uint8Array>;\n methodFiles?: ReadonlyMap<string, Uint8Array>;\n}\nexport interface ProviderScoreEvaluation {\n success: boolean;\n checks: { structural: Status; semantic: Status; external: Status };\n issues: ProviderScoringIssue[];\n files: {\n ref: string;\n status: Status;\n expectedSha256: string;\n expectedByteLength: number;\n actualSha256?: string;\n actualByteLength?: number;\n }[];\n policy: ProviderScorePolicy | null;\n result: ProviderScoreResult | null;\n grade: { id: string; label: string } | null;\n policyExecution: \"not_checked\";\n providerAuthentication: \"not_checked\";\n scientificValidity: \"not_checked\";\n subjectResolution: \"not_checked\";\n}\nasync function sha256(bytes: Uint8Array): Promise<string> {\n return [\n ...new Uint8Array(\n await globalThis.crypto.subtle.digest(\"SHA-256\", Uint8Array.from(bytes))\n ),\n ]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\nfunction snapshot(files: ReadonlyMap<string, Uint8Array> | undefined) {\n return new Map(\n [...(files ?? [])].map(([ref, bytes]) => [ref, Uint8Array.from(bytes)])\n );\n}\n\n/** Checks declarations and supplied bytes only. Does not fetch, execute a policy, resolve a subject or authenticate a provider. */\nexport async function evaluateProviderScore(\n input: unknown,\n options: ProviderScoreEvaluationOptions = {}\n): Promise<ProviderScoreEvaluation> {\n const evaluation: ProviderScoreEvaluation = {\n success: false,\n checks: {\n structural: \"passed\",\n semantic: \"not_checked\",\n external: \"not_checked\",\n },\n issues: [],\n files: [],\n policy: null,\n result: null,\n grade: null,\n policyExecution: \"not_checked\",\n providerAuthentication: \"not_checked\",\n scientificValidity: \"not_checked\",\n subjectResolution: \"not_checked\",\n };\n const parsed = ProviderScoreResultSchema.safeParse(input);\n if (!parsed.success) {\n evaluation.checks.structural = \"failed\";\n evaluation.issues = structuralIssues(parsed.error);\n return evaluation;\n }\n const result = parsed.data;\n evaluation.result = result;\n const policyBytes =\n options.policyBytes && Uint8Array.from(options.policyBytes);\n const inputFiles = snapshot(options.inputFiles),\n derivationFiles = snapshot(options.derivationFiles),\n methodFiles = snapshot(options.methodFiles);\n const issue = (code: string, pointer: string, message: string) =>\n evaluation.issues.push({\n code: `PROVIDER_SCORE.${code}`,\n pointer,\n message,\n });\n duplicateIssues(\n [...result.inputs, ...result.derivation, ...result.missingInputs].map(\n (entry) => entry.ref\n ),\n \"/artifactRefs\",\n evaluation.issues\n );\n async function checkFile(\n ref: string,\n declared: z.infer<typeof pin>,\n bytes: Uint8Array | undefined,\n pointer: string\n ) {\n const check: ProviderScoreEvaluation[\"files\"][number] = {\n ref,\n status: \"not_checked\",\n expectedSha256: declared.sha256,\n expectedByteLength: declared.byteLength,\n };\n evaluation.files.push(check);\n if (!bytes) {\n issue(\"MISSING_FILE\", pointer, \"Declared bytes were not supplied\");\n return false;\n }\n check.actualByteLength = bytes.byteLength;\n if (check.actualByteLength !== declared.byteLength) {\n check.status = \"failed\";\n issue(\n \"PIN_MISMATCH\",\n pointer,\n \"Supplied bytes do not match the declared length\"\n );\n return false;\n }\n try {\n check.actualSha256 = await sha256(bytes);\n } catch {\n issue(\n \"HASH_UNAVAILABLE\",\n pointer,\n \"SHA-256 could not be computed in this environment\"\n );\n return false;\n }\n check.status =\n check.actualByteLength === declared.byteLength &&\n check.actualSha256 === declared.sha256\n ? \"passed\"\n : \"failed\";\n if (check.status === \"failed\")\n issue(\n \"PIN_MISMATCH\",\n pointer,\n \"Supplied bytes do not match the declared digest and length\"\n );\n return check.status === \"passed\";\n }\n const policyMatches = await checkFile(\n \"policy\",\n result.policy,\n policyBytes,\n \"/policy\"\n );\n if (!policyMatches) {\n evaluation.checks.external = evaluation.files.some(\n (file) => file.status === \"failed\"\n )\n ? \"failed\"\n : \"not_checked\";\n if (\n evaluation.issues.some(\n (entry) => entry.code === \"PROVIDER_SCORE.DUPLICATE\"\n )\n )\n evaluation.checks.semantic = \"failed\";\n return evaluation;\n }\n let policyInput: unknown;\n try {\n const serialized = new TextDecoder(\"utf-8\", {\n fatal: true,\n ignoreBOM: true,\n }).decode(policyBytes);\n policyInput = JSON.parse(serialized);\n } catch {\n issue(\n \"POLICY_JSON\",\n \"/policy\",\n \"Policy bytes must contain valid UTF-8 JSON without a byte-order mark\"\n );\n evaluation.checks.structural = \"failed\";\n evaluation.checks.external = \"passed\";\n return evaluation;\n }\n const policyValidation = validateProviderScorePolicy(policyInput);\n if (!policyValidation.success || !policyValidation.policy) {\n evaluation.checks.structural = policyValidation.checks.structural;\n evaluation.checks.semantic = policyValidation.checks.semantic;\n evaluation.issues.push(\n ...policyValidation.issues.map((entry) => ({\n ...entry,\n pointer: `/policy${entry.pointer}`,\n }))\n );\n return evaluation;\n }\n const policy = policyValidation.policy;\n evaluation.policy = policy;\n if (\n policy.id !== result.policy.id ||\n policy.version !== result.policy.version\n )\n issue(\n \"POLICY_IDENTITY\",\n \"/policy\",\n \"Policy identity and revision must match the pinned document\"\n );\n if (!policy.subjectKinds.includes(result.subject.kind))\n issue(\n \"SUBJECT_KIND\",\n \"/subject/kind\",\n \"The policy does not apply to this subject kind\"\n );\n if (result.outcome.status === \"scored\") {\n if (result.applicability.status !== \"applicable\")\n issue(\n \"APPLICABILITY\",\n \"/applicability\",\n \"A score requires an applicable policy\"\n );\n if (\n result.missingInputs.length &&\n policy.missingData.handling === \"withhold\"\n )\n issue(\n \"MISSING_INPUTS\",\n \"/missingInputs\",\n \"This policy withholds a score when required inputs are missing\"\n );\n const value = result.outcome.value;\n if (policy.scale.kind === \"numeric\") {\n if (\n typeof value !== \"number\" ||\n value < policy.scale.min ||\n value > policy.scale.max\n )\n issue(\n \"VALUE\",\n \"/outcome/value\",\n \"Value must be a finite number within the policy scale\"\n );\n } else if (\n typeof value !== \"string\" ||\n !policy.scale.levels.some((entry) => entry.id === value)\n )\n issue(\n \"VALUE\",\n \"/outcome/value\",\n \"Value must identify a declared ordinal level\"\n );\n evaluation.grade = providerScoreGrade(policy, value);\n if (\n result.outcome.gradeId !== undefined &&\n result.outcome.gradeId !== evaluation.grade?.id\n )\n issue(\n \"GRADE\",\n \"/outcome/gradeId\",\n \"Declared grade does not match the policy band or ordinal level\"\n );\n } else {\n const reason = result.outcome.reasonCode;\n if (\n (reason === \"missing_inputs\" && !result.missingInputs.length) ||\n (reason === \"not_applicable\" &&\n result.applicability.status !== \"not_applicable\") ||\n (reason === \"undetermined\" &&\n result.applicability.status !== \"undetermined\")\n )\n issue(\n \"UNAVAILABLE_REASON\",\n \"/outcome/reasonCode\",\n \"Unavailable reason must agree with the recorded applicability or missing inputs\"\n );\n if (\n (result.applicability.status === \"not_applicable\" &&\n reason !== \"not_applicable\") ||\n (result.applicability.status === \"undetermined\" &&\n reason !== \"undetermined\")\n )\n issue(\n \"UNAVAILABLE_REASON\",\n \"/outcome/reasonCode\",\n \"Unavailable reason must retain the policy applicability state\"\n );\n }\n evaluation.checks.semantic = evaluation.issues.length ? \"failed\" : \"passed\";\n for (const [index, entry] of policy.method.artifacts.entries())\n await checkFile(\n `method:${entry.ref}`,\n entry,\n methodFiles.get(entry.ref),\n `/policy/method/artifacts/${index}`\n );\n for (const [index, entry] of result.inputs.entries())\n await checkFile(\n `input:${entry.ref}`,\n entry,\n inputFiles.get(entry.ref),\n `/inputs/${index}`\n );\n for (const [index, entry] of result.derivation.entries())\n await checkFile(\n `derivation:${entry.ref}`,\n entry,\n derivationFiles.get(entry.ref),\n `/derivation/${index}`\n );\n evaluation.checks.external = evaluation.files.some(\n (file) => file.status === \"failed\"\n )\n ? \"failed\"\n : evaluation.files.every((file) => file.status === \"passed\")\n ? \"passed\"\n : \"not_checked\";\n evaluation.success =\n evaluation.checks.semantic === \"passed\" &&\n evaluation.checks.external === \"passed\";\n return evaluation;\n}\n\nexport interface ProviderScoreComparison {\n eligibleForComparison: boolean;\n status: \"eligible_for_comparison\" | \"not_eligible\";\n reasons: string[];\n left: ProviderScoreEvaluation;\n right: ProviderScoreEvaluation;\n sharedInputDigests: string[];\n statisticalIndependence: \"not_checked\";\n}\n\n/** Conservative eligibility for inspecting declared results side by side; never computes a winner, average or scientific equivalence. */\nexport async function compareProviderScores(\n leftInput: unknown,\n rightInput: unknown,\n options: {\n left?: ProviderScoreEvaluationOptions;\n right?: ProviderScoreEvaluationOptions;\n } = {}\n): Promise<ProviderScoreComparison> {\n const [left, right] = await Promise.all([\n evaluateProviderScore(leftInput, options.left),\n evaluateProviderScore(rightInput, options.right),\n ]);\n const reasons: string[] = [];\n const a = left.result,\n b = right.result;\n if (!left.success || !right.success) reasons.push(\"unverified_result\");\n if (a && b) {\n if (a.outcome.status !== \"scored\" || b.outcome.status !== \"scored\")\n reasons.push(\"unavailable_result\");\n if (\n a.policy.id !== b.policy.id ||\n a.policy.version !== b.policy.version ||\n a.policy.sha256 !== b.policy.sha256 ||\n a.policy.byteLength !== b.policy.byteLength\n )\n reasons.push(\"different_policy\");\n if (a.subject.id !== b.subject.id || a.subject.kind !== b.subject.kind)\n reasons.push(\"different_subject\");\n if (\n a.inputScope.id !== b.inputScope.id ||\n a.inputScope.description !== b.inputScope.description\n )\n reasons.push(\"different_input_scope\");\n const basis = (value: ProviderScoreResult) =>\n JSON.stringify(\n value.inputs\n .map((entry) => [\n entry.ref,\n entry.sha256,\n entry.byteLength,\n entry.mediaType,\n ])\n .sort((x, y) => String(x[0]).localeCompare(String(y[0])))\n );\n if (basis(a) !== basis(b)) reasons.push(\"different_inputs\");\n if (a.missingInputs.length || b.missingInputs.length)\n reasons.push(\"incomplete_inputs\");\n }\n const sharedInputDigests =\n a && b\n ? [\n ...new Set(\n a.inputs\n .map((entry) => entry.sha256)\n .filter((digest) =>\n b.inputs.some((entry) => entry.sha256 === digest)\n )\n ),\n ].sort()\n : [];\n return {\n eligibleForComparison: reasons.length === 0,\n status: reasons.length ? \"not_eligible\" : \"eligible_for_comparison\",\n reasons,\n left,\n right,\n sharedInputDigests,\n statisticalIndependence: \"not_checked\",\n };\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.js
CHANGED
|
@@ -206,29 +206,6 @@ function reduceClaims(weighted) {
|
|
|
206
206
|
contested: anyAnomaly && anyNone
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
|
-
function observableMagnitude(claim) {
|
|
210
|
-
return ASSESSMENT_LEVEL_WEIGHTS[claim.level] * (claim.confidence ?? 1);
|
|
211
|
-
}
|
|
212
|
-
function domainStats(group, evaluatorWeight) {
|
|
213
|
-
if (!group) return EMPTY_STATS;
|
|
214
|
-
let point = 0;
|
|
215
|
-
let low = 0;
|
|
216
|
-
let high = 0;
|
|
217
|
-
let contested = false;
|
|
218
|
-
for (const claims of Object.values(group)) {
|
|
219
|
-
if (!claims || claims.length === 0) continue;
|
|
220
|
-
const weighted = claims.map((c) => ({
|
|
221
|
-
magnitude: observableMagnitude(c),
|
|
222
|
-
weight: (c.confidence ?? 1) * evaluatorWeight(c)
|
|
223
|
-
}));
|
|
224
|
-
const stats = reduceClaims(weighted);
|
|
225
|
-
if (stats.point > point) point = stats.point;
|
|
226
|
-
if (stats.low > low) low = stats.low;
|
|
227
|
-
if (stats.high > high) high = stats.high;
|
|
228
|
-
if (stats.contested) contested = true;
|
|
229
|
-
}
|
|
230
|
-
return { point, low, high, contested };
|
|
231
|
-
}
|
|
232
209
|
function originStats(origin, prefixes, evaluatorWeight) {
|
|
233
210
|
if (!origin || origin.length === 0) return EMPTY_STATS;
|
|
234
211
|
const weighted = origin.map((c) => ({
|
|
@@ -238,12 +215,16 @@ function originStats(origin, prefixes, evaluatorWeight) {
|
|
|
238
215
|
return reduceClaims(weighted);
|
|
239
216
|
}
|
|
240
217
|
function score(observation, options) {
|
|
218
|
+
const assessments = observation.observableAssessments;
|
|
219
|
+
const hasDescriptiveClaims = [assessments?.technology, assessments?.biologics].some((group) => Object.values(group ?? {}).some((claims) => claims && claims.length > 0));
|
|
220
|
+
if (hasDescriptiveClaims) {
|
|
221
|
+
throw new Error("Descriptive observable assessments cannot produce anomaly strength. Use V2 attributed assessments and profile evaluation; this is not a zero or absent result.");
|
|
222
|
+
}
|
|
241
223
|
const weights = options?.weights ?? DEFAULT_WEIGHTS;
|
|
242
224
|
const prosaicPrefixes = options?.prosaicPrefixes ?? DEFAULT_PROSAIC_OCS_PREFIXES;
|
|
243
225
|
const evaluatorWeight = options?.evaluatorWeight ?? UNIFORM_TRUST;
|
|
244
|
-
const
|
|
245
|
-
const
|
|
246
|
-
const biologics = domainStats(assessments?.biologics, evaluatorWeight);
|
|
226
|
+
const technology = EMPTY_STATS;
|
|
227
|
+
const biologics = EMPTY_STATS;
|
|
247
228
|
const origin = originStats(observation.origin, prosaicPrefixes, evaluatorWeight);
|
|
248
229
|
const totalWeight = weights.technology + weights.biologics + weights.origin;
|
|
249
230
|
const combine = (t, b, o) => totalWeight > 0 ? (t * weights.technology + b * weights.biologics + o * weights.origin) / totalWeight : 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/completeness/field-paths.ts","../src/completeness/index.ts","../src/compellingness/calibration.ts","../src/compellingness/index.ts","../src/schema.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { recordsJsonSchema } from '@disclosureos/records';\n\n/** A leaf field path derived from the records JSON Schema. */\nexport interface FieldPath {\n /** Dot-path into an `Observation` (e.g. `location.latitude`). */\n path: string;\n /** True only when every segment along the path is schema-required. */\n required: boolean;\n}\n\ninterface SchemaNode {\n $ref?: string;\n properties?: Record<string, SchemaNode>;\n required?: string[];\n type?: string | string[];\n}\n\nfunction refName(ref: string): string {\n return ref.replace('#/$defs/', '');\n}\n\n/**\n * Walk the committed records JSON Schema and enumerate every leaf field path on\n * `Observation`. Objects are recursed (resolving `$ref` into `$defs`); arrays,\n * enums, scalars, and `record`/`anyOf` nodes are treated as leaves. This is the\n * single source of completeness coverage — there is no hand-maintained path list\n * (so adding a field to the schema automatically extends completeness).\n */\nexport function deriveFieldPaths(schema?: Record<string, unknown>): FieldPath[] {\n const root = (schema ?? recordsJsonSchema()) as Record<string, unknown> & {\n $ref?: string;\n $defs?: Record<string, SchemaNode>;\n };\n const defs = root.$defs ?? {};\n const out: FieldPath[] = [];\n\n function resolve(node: SchemaNode): SchemaNode {\n let cur: SchemaNode = node;\n const seen = new Set<string>();\n while (cur.$ref) {\n const name = refName(cur.$ref);\n if (seen.has(name)) break;\n seen.add(name);\n cur = defs[name] ?? {};\n }\n return cur;\n }\n\n function walk(node: SchemaNode, prefix: string, required: boolean, visited: Set<string>): void {\n const refn = node.$ref ? refName(node.$ref) : undefined;\n // Cycle guard: a recursive $ref re-entering an in-progress def becomes a leaf.\n if (refn && visited.has(refn)) {\n if (prefix) out.push({ path: prefix, required });\n return;\n }\n const resolved = resolve(node);\n const props = resolved.properties;\n if (props && Object.keys(props).length > 0) {\n const nextVisited = refn ? new Set([...visited, refn]) : visited;\n const req = new Set(resolved.required ?? []);\n for (const [key, child] of Object.entries(props)) {\n const childPath = prefix ? `${prefix}.${key}` : key;\n walk(child, childPath, required && req.has(key), nextVisited);\n }\n return;\n }\n if (prefix) out.push({ path: prefix, required });\n }\n\n if (root.$ref) {\n walk({ $ref: root.$ref }, '', true, new Set());\n }\n return out;\n}\n","import { z } from 'zod';\nimport type { Observation } from '@disclosureos/records';\nimport { deriveFieldPaths } from './field-paths';\nimport type { FieldPath } from './field-paths';\n\nexport type { FieldPath } from './field-paths';\nexport { deriveFieldPaths } from './field-paths';\n\nexport const CompletenessResultSchema = z\n .object({\n total: z.number().int().describe('Total leaf field paths defined by the records schema.'),\n present: z.number().int().describe('How many of those paths carry a value.'),\n percentage: z.number().int().describe('present / total, as a 0–100 integer.'),\n missing: z.array(z.string()).describe('Paths that are absent or empty.'),\n requiredTotal: z.number().int().describe('Count of schema-required leaf paths.'),\n requiredPresent: z.number().int().describe('How many required paths carry a value.'),\n requiredPercentage: z\n .number()\n .int()\n .describe('requiredPresent / requiredTotal, as a 0–100 integer.'),\n })\n .meta({ id: 'CompletenessResult' })\n .describe('How fully an observation populates the records schema.');\n\nexport type CompletenessResult = z.infer<typeof CompletenessResultSchema>;\n\nexport interface CompletenessOptions {\n /** Override the derived field-path set (defaults to the records schema). */\n paths?: FieldPath[];\n}\n\nfunction getNested(obj: Record<string, unknown>, path: string): unknown {\n let current: unknown = obj;\n for (const part of path.split('.')) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction isPresent(value: unknown): boolean {\n if (value == null) return false;\n if (typeof value === 'string') return value.length > 0;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n}\n\n// Field paths are stable for a given schema version, so derive once and reuse.\nlet cachedPaths: FieldPath[] | null = null;\nfunction defaultPaths(): FieldPath[] {\n return (cachedPaths ??= deriveFieldPaths());\n}\n\nfunction pct(present: number, total: number): number {\n return total > 0 ? Math.round((present / total) * 100) : 0;\n}\n\n/**\n * Count populated legacy schema field paths. A present value is not necessarily\n * valid, documented, applicable or independently analyzable. Prefer the public\n * getPopulationCoverage name for new callers; legacy behavior remains unchanged.\n */\nexport function getCompleteness(\n observation: Observation | Record<string, unknown>,\n options?: CompletenessOptions,\n): CompletenessResult {\n const record = observation as Record<string, unknown>;\n const paths = options?.paths ?? defaultPaths();\n const missing: string[] = [];\n let present = 0;\n let requiredTotal = 0;\n let requiredPresent = 0;\n\n for (const field of paths) {\n const ok = isPresent(getNested(record, field.path));\n if (ok) present++;\n else missing.push(field.path);\n if (field.required) {\n requiredTotal++;\n if (ok) requiredPresent++;\n }\n }\n\n return {\n total: paths.length,\n present,\n percentage: pct(present, paths.length),\n missing,\n requiredTotal,\n requiredPresent,\n requiredPercentage: pct(requiredPresent, requiredTotal),\n };\n}\n","import type { Observation } from '@disclosureos/records';\nimport { parseEvidenceRef, parseSensorRef } from '@disclosureos/records/shared';\nimport type { CalibrationStatus, SensorManifest } from '@disclosureos/instruments';\nimport type { EvaluatorWeightInput } from './index';\n\n/**\n * Trust multiplier per calibration maturity level, plus the `unresolved`\n * baseline for claims whose sensor evidence does not resolve to a manifest\n * entry (no `sensorRef`, unknown org, unknown sensor, or no calibration block).\n */\nexport type CalibrationTrustWeights = Record<CalibrationStatus | 'unresolved', number>;\n\n/**\n * Conservative default gradient: instruments with real calibration provenance\n * earn *credit* over unresolved sensors — nothing is ever penalized below the\n * baseline, so adopting the hook can only reward organizations that publish\n * manifests, never punish records that predate them.\n *\n * @experimental The shape is stable; these specific values are a reference\n * policy that may be re-tuned in a minor release. Pin your own `weights` via\n * {@link CalibrationTrustOptions} if you need stable numbers.\n */\nexport const CALIBRATION_TRUST_WEIGHTS: CalibrationTrustWeights = {\n unresolved: 1,\n none: 1,\n candidate_identified: 1.05,\n in_practice: 1.15,\n documented: 1.25,\n};\n\nexport interface CalibrationTrustOptions {\n /** Override the trust gradient (defaults to {@link CALIBRATION_TRUST_WEIGHTS}). */\n weights?: CalibrationTrustWeights;\n /**\n * A base trust policy composed (multiplied) with the calibration credit —\n * e.g. an evaluator-identity policy. Defaults to uniform 1.0.\n */\n evaluatorWeight?: (claim: EvaluatorWeightInput) => number;\n}\n\n/**\n * Build an `evaluatorWeight` hook (see `ScoreOptions.evaluatorWeight`) that\n * credits claims backed by instruments with published calibration provenance.\n *\n * Resolution chain, per claim: `evidenceRefs` (`\"sensor:<id>\"`) → the\n * observation's `sensorEvidence.sensors[]` reading → its `sensorRef`\n * (`\"<org-slug>:<sensor-id>\"`) → the matching manifest entry's\n * `calibration.status`. When a claim cites several sensor readings, the\n * strongest instrument backing wins. Claims with no resolvable sensor\n * evidence get the `unresolved` baseline.\n *\n * Like every `evaluatorWeight` policy, this shifts only the consensus point\n * estimate — `range` and `contested` still report the honest spread of what\n * evaluators actually asserted.\n *\n * ```ts\n * const result = score(observation, {\n * evaluatorWeight: calibrationTrust(observation, [navyManifest]),\n * });\n * ```\n */\nexport function calibrationTrust(\n observation: Observation,\n manifests: readonly SensorManifest[],\n options?: CalibrationTrustOptions,\n): (claim: EvaluatorWeightInput) => number {\n const weights = options?.weights ?? CALIBRATION_TRUST_WEIGHTS;\n const base = options?.evaluatorWeight ?? ((): number => 1);\n\n // Pre-resolve each in-record sensor reading to its manifest calibration status.\n const statusBySensorId = new Map<string, CalibrationStatus>();\n for (const reading of observation.sensorEvidence?.sensors ?? []) {\n if (!reading.sensorRef) continue;\n const ref = parseSensorRef(reading.sensorRef);\n if (!ref) continue;\n const entry = manifests\n .find((manifest) => manifest.orgSlug === ref.orgSlug)\n ?.sensors.find((sensor) => sensor.id === ref.sensorId);\n const status = entry?.calibration?.status;\n if (status) statusBySensorId.set(reading.id, status);\n }\n\n return (claim) => {\n let credit = weights.unresolved;\n for (const evidence of claim.evidenceRefs ?? []) {\n const parsed = parseEvidenceRef(evidence);\n if (!parsed || parsed.kind !== 'sensor') continue;\n const status = statusBySensorId.get(parsed.id);\n const weight = status === undefined ? weights.unresolved : weights[status];\n if (weight > credit) credit = weight;\n }\n return base(claim) * credit;\n };\n}\n","import { z } from 'zod';\nimport type { Observation } from '@disclosureos/records';\nimport type { AssessmentLevel, ObservableClaim } from '@disclosureos/observables';\nimport type { OriginClaim } from '@disclosureos/origins';\n// Side-effect imports register the `observableAssessments` and `origin` slots on\n// `Observation` via module augmentation, so they are typed below.\nimport '@disclosureos/observables';\nimport '@disclosureos/origins';\n\nexport { calibrationTrust, CALIBRATION_TRUST_WEIGHTS } from './calibration';\nexport type { CalibrationTrustWeights, CalibrationTrustOptions } from './calibration';\n\n/** Methodology version stamped on every {@link ScoreResult}. Bump on weight/formula changes. */\nexport const SCORING_VERSION = '2.0.0' as const;\n\n/**\n * Ordinal anomaly strength per evidentiary tier. A `confirmed` signal counts\n * fully; `not_indicated` contributes nothing. Multiplied by the assessment's\n * confidence (default 1 when unstated). Exported so consumers can render the\n * methodology; override semantics may come in a future minor release.\n */\nexport const ASSESSMENT_LEVEL_WEIGHTS: Record<AssessmentLevel, number> = {\n not_indicated: 0,\n reported: 0.25,\n documented: 0.5,\n measured: 0.75,\n confirmed: 1,\n};\n\n/**\n * OCS id prefixes treated as prosaic (well-explained). A confident *prosaic*\n * classification means the case is explained, so it contributes no anomaly\n * signal. Overridable per {@link score} call. Default is the OCS \"Prosaic\"\n * branch (`1.1.1`).\n */\nexport const DEFAULT_PROSAIC_OCS_PREFIXES: readonly string[] = ['1.1.1'];\n\nexport const CompellingnessWeightsSchema = z\n .object({\n technology: z.number().min(0).describe('Weight of the technology-anomaly signal.'),\n biologics: z.number().min(0).describe('Weight of the biologics-anomaly signal.'),\n origin: z.number().min(0).describe('Weight of the (non-prosaic) origin-confidence signal.'),\n })\n .meta({ id: 'CompellingnessWeights' })\n .describe('Relative weights for the compellingness components. Need not sum to 1 — normalized internally.');\n\nexport type CompellingnessWeights = z.infer<typeof CompellingnessWeightsSchema>;\n\n/**\n * Fixed default weights, exposed as a transparent, overridable data object (not a\n * config system). Partners can propose alternate weight sets without an API change.\n *\n * @experimental The *shape* (`CompellingnessWeights`) is stable, but these specific\n * default values are a reference methodology that may be re-tuned in a minor release.\n * Pin your own `weights` via {@link ScoreOptions} if you need stable numbers.\n */\nexport const DEFAULT_WEIGHTS: CompellingnessWeights = {\n technology: 0.45,\n biologics: 0.35,\n origin: 0.2,\n};\n\nexport const ScoreResultSchema = z\n .object({\n score: z.number().min(0).max(1).describe('Overall compellingness (consensus point estimate), 0–1.'),\n range: z\n .object({\n low: z.number().min(0).max(1).describe('Most-skeptical reading of the strongest-anomaly signal across competing claims.'),\n high: z.number().min(0).max(1).describe('Most-anomalous reading of the strongest-anomaly signal across competing claims.'),\n })\n .describe(\n 'Spread of the score across competing claims — wide range signals disagreement. Bounds are '\n + 'computed per-signal under the same strongest-anomaly (max) reduction as the point estimate, '\n + 'not a global min/max over every claim.',\n ),\n contested: z\n .boolean()\n .describe('True when claims disagree on *direction* (some assert anomaly, some assert none).'),\n components: z\n .object({\n technology: z.number().min(0).max(1),\n biologics: z.number().min(0).max(1),\n origin: z.number().min(0).max(1),\n })\n .describe('Per-signal consensus contributions before weighting.'),\n weights: CompellingnessWeightsSchema,\n scoringVersion: z.string().describe('Methodology version that produced this score.'),\n })\n .meta({ id: 'ScoreResult' })\n .describe('A reference compellingness score for an observation, with a contestedness range.');\n\nexport type ScoreResult = z.infer<typeof ScoreResultSchema>;\n\n/** The minimal claim shape the trust hook sees (it never needs the full body). */\nexport type EvaluatorWeightInput = {\n evaluatedBy?: string | undefined;\n evidenceRefs?: string[] | undefined;\n};\n\nexport interface ScoreOptions {\n weights?: CompellingnessWeights;\n /** Override the prosaic OCS prefixes (defaults to {@link DEFAULT_PROSAIC_OCS_PREFIXES}). */\n prosaicPrefixes?: readonly string[];\n /**\n * Trust applied to each claim's vote in the consensus point estimate (default\n * 1.0 — uniform). This is where a future trust policy (e.g.\n * weighting verified/official evaluators higher) plugs in here without changing\n * the formula. Range/contestedness are NOT affected — they report the honest\n * spread of what evaluators actually asserted.\n *\n * @experimental The hook signature is stable, but the default trust *policy*\n * (uniform 1.0) is deliberately unopinionated and is a separate, ongoing design\n * task; a future built-in policy may change the default.\n */\n evaluatorWeight?: (claim: EvaluatorWeightInput) => number;\n}\n\nconst UNIFORM_TRUST = (): number => 1;\n\nfunction isProsaic(id: string, prefixes: readonly string[]): boolean {\n return prefixes.some((p) => id === p || id.startsWith(`${p}.`));\n}\n\nfunction round(n: number): number {\n return Math.round(n * 1e4) / 1e4;\n}\n\ntype Weighted = { magnitude: number; weight: number };\n\ninterface ClaimStats {\n /** Trust-weighted mean magnitude (the consensus point). */\n point: number;\n /** Min asserted magnitude (most skeptical). */\n low: number;\n /** Max asserted magnitude (most anomalous). */\n high: number;\n /** Claims disagree on direction (some > 0, some === 0). */\n contested: boolean;\n}\n\nconst EMPTY_STATS: ClaimStats = { point: 0, low: 0, high: 0, contested: false };\n\nfunction reduceClaims(weighted: Weighted[]): ClaimStats {\n if (weighted.length === 0) return EMPTY_STATS;\n let wsum = 0;\n let msum = 0;\n let low = Infinity;\n let high = -Infinity;\n let anyAnomaly = false;\n let anyNone = false;\n for (const { magnitude, weight } of weighted) {\n wsum += weight;\n msum += magnitude * weight;\n if (magnitude < low) low = magnitude;\n if (magnitude > high) high = magnitude;\n if (magnitude > 0) anyAnomaly = true;\n else anyNone = true;\n }\n return {\n point: wsum > 0 ? msum / wsum : 0,\n low,\n high,\n contested: anyAnomaly && anyNone,\n };\n}\n\n/** Asserted anomaly magnitude of one observable claim, in [0,1]. */\nfunction observableMagnitude(claim: ObservableClaim): number {\n return ASSESSMENT_LEVEL_WEIGHTS[claim.level] * (claim.confidence ?? 1);\n}\n\n/**\n * Strongest established anomaly within a domain — the \"is there *any* anomaly?\" reduction.\n * `point`/`low`/`high` are each a **max across observables** of that observable's claim-list\n * stat. So `low` is \"the most-skeptical reading of the strongest-anomaly observable,\" not a\n * global floor across all observables — consistent with the point estimate's max reduction.\n */\nfunction domainStats(\n group: Partial<Record<string, ObservableClaim[]>> | undefined,\n evaluatorWeight: (claim: EvaluatorWeightInput) => number,\n): ClaimStats {\n if (!group) return EMPTY_STATS;\n let point = 0;\n let low = 0;\n let high = 0;\n let contested = false;\n for (const claims of Object.values(group)) {\n if (!claims || claims.length === 0) continue;\n const weighted = claims.map<Weighted>((c) => ({\n magnitude: observableMagnitude(c),\n weight: (c.confidence ?? 1) * evaluatorWeight(c),\n }));\n const stats = reduceClaims(weighted);\n if (stats.point > point) point = stats.point;\n if (stats.low > low) low = stats.low;\n if (stats.high > high) high = stats.high;\n if (stats.contested) contested = true;\n }\n return { point, low, high, contested };\n}\n\n/** Confidence in a *non-prosaic* origin, reduced across competing classifications. */\nfunction originStats(\n origin: OriginClaim[] | undefined,\n prefixes: readonly string[],\n evaluatorWeight: (claim: EvaluatorWeightInput) => number,\n): ClaimStats {\n if (!origin || origin.length === 0) return EMPTY_STATS;\n const weighted = origin.map<Weighted>((c) => ({\n magnitude: isProsaic(c.primaryHypothesis, prefixes) ? 0 : c.confidence,\n weight: c.confidence * evaluatorWeight(c),\n }));\n return reduceClaims(weighted);\n}\n\n/**\n * Reference compellingness scorer. Combines the strongest technology- and\n * biologics-anomaly signals (from `observableAssessments`) with the confidence in\n * a *non-prosaic* origin classification (from `origin`), under transparent,\n * overridable weights. Each slot is a *list* of competing claims, so the scorer\n * reports a consensus `score`, the `range` of readings across claims, and whether\n * the case is `contested` (evaluators disagree on direction). This answers \"how\n * strongly does this case bear on the two public questions — anomalous\n * tech/biologics, and a non-mundane origin?\" — distinct from completeness.\n */\nexport function score(observation: Observation, options?: ScoreOptions): ScoreResult {\n const weights = options?.weights ?? DEFAULT_WEIGHTS;\n const prosaicPrefixes = options?.prosaicPrefixes ?? DEFAULT_PROSAIC_OCS_PREFIXES;\n const evaluatorWeight = options?.evaluatorWeight ?? UNIFORM_TRUST;\n\n const assessments = observation.observableAssessments;\n const technology = domainStats(assessments?.technology, evaluatorWeight);\n const biologics = domainStats(assessments?.biologics, evaluatorWeight);\n const origin = originStats(observation.origin, prosaicPrefixes, evaluatorWeight);\n\n const totalWeight = weights.technology + weights.biologics + weights.origin;\n const combine = (t: number, b: number, o: number): number =>\n totalWeight > 0\n ? (t * weights.technology + b * weights.biologics + o * weights.origin) / totalWeight\n : 0;\n\n return {\n score: round(combine(technology.point, biologics.point, origin.point)),\n range: {\n low: round(combine(technology.low, biologics.low, origin.low)),\n high: round(combine(technology.high, biologics.high, origin.high)),\n },\n contested: technology.contested || biologics.contested || origin.contested,\n components: {\n technology: round(technology.point),\n biologics: round(biologics.point),\n origin: round(origin.point),\n },\n weights,\n scoringVersion: SCORING_VERSION,\n };\n}\n\nexport interface RankedObservation<T extends Observation = Observation> {\n observation: T;\n result: ScoreResult;\n}\n\n/**\n * Score a set of observations and return them sorted most-compelling first — the\n * \"float the strongest cases to the top\" use case.\n */\nexport function rankByCompellingness<T extends Observation>(\n observations: readonly T[],\n options?: ScoreOptions,\n): RankedObservation<T>[] {\n return observations\n .map((observation) => ({ observation, result: score(observation, options) }))\n .sort((a, b) => b.result.score - a.result.score);\n}\n","import { z } from 'zod';\nimport { jsonSchemaEnvelope, schemaId } from '@disclosureos/records/shared';\nimport { CompletenessResultSchema } from './completeness';\nimport { ScoreResultSchema, CompellingnessWeightsSchema } from './compellingness';\n\nexport const SCORING_SCHEMA_VERSION = '2.0.0';\n\nexport const SCORING_SCHEMA_ID = schemaId('scoring', 'scoring', SCORING_SCHEMA_VERSION);\n\n/**\n * Emit the JSON Schema (draft 2020-12) for the scoring output shapes\n * ({@link CompletenessResultSchema}, {@link ScoreResultSchema}) so downstream\n * consumers (and other languages) can validate stored scores.\n */\nexport function scoringJsonSchema(): Record<string, unknown> {\n const bundle = z.toJSONSchema(\n z.object({\n completeness: CompletenessResultSchema,\n compellingness: ScoreResultSchema,\n weights: CompellingnessWeightsSchema,\n }),\n { target: 'draft-2020-12' },\n ) as Record<string, unknown>;\n return jsonSchemaEnvelope(bundle, { id: SCORING_SCHEMA_ID, version: SCORING_SCHEMA_VERSION });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/completeness/field-paths.ts","../src/completeness/index.ts","../src/compellingness/calibration.ts","../src/compellingness/index.ts","../src/schema.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { recordsJsonSchema } from '@disclosureos/records';\n\n/** A leaf field path derived from the records JSON Schema. */\nexport interface FieldPath {\n /** Dot-path into an `Observation` (e.g. `location.latitude`). */\n path: string;\n /** True only when every segment along the path is schema-required. */\n required: boolean;\n}\n\ninterface SchemaNode {\n $ref?: string;\n properties?: Record<string, SchemaNode>;\n required?: string[];\n type?: string | string[];\n}\n\nfunction refName(ref: string): string {\n return ref.replace('#/$defs/', '');\n}\n\n/**\n * Walk the committed records JSON Schema and enumerate every leaf field path on\n * `Observation`. Objects are recursed (resolving `$ref` into `$defs`); arrays,\n * enums, scalars, and `record`/`anyOf` nodes are treated as leaves. This is the\n * single source of completeness coverage — there is no hand-maintained path list\n * (so adding a field to the schema automatically extends completeness).\n */\nexport function deriveFieldPaths(schema?: Record<string, unknown>): FieldPath[] {\n const root = (schema ?? recordsJsonSchema()) as Record<string, unknown> & {\n $ref?: string;\n $defs?: Record<string, SchemaNode>;\n };\n const defs = root.$defs ?? {};\n const out: FieldPath[] = [];\n\n function resolve(node: SchemaNode): SchemaNode {\n let cur: SchemaNode = node;\n const seen = new Set<string>();\n while (cur.$ref) {\n const name = refName(cur.$ref);\n if (seen.has(name)) break;\n seen.add(name);\n cur = defs[name] ?? {};\n }\n return cur;\n }\n\n function walk(node: SchemaNode, prefix: string, required: boolean, visited: Set<string>): void {\n const refn = node.$ref ? refName(node.$ref) : undefined;\n // Cycle guard: a recursive $ref re-entering an in-progress def becomes a leaf.\n if (refn && visited.has(refn)) {\n if (prefix) out.push({ path: prefix, required });\n return;\n }\n const resolved = resolve(node);\n const props = resolved.properties;\n if (props && Object.keys(props).length > 0) {\n const nextVisited = refn ? new Set([...visited, refn]) : visited;\n const req = new Set(resolved.required ?? []);\n for (const [key, child] of Object.entries(props)) {\n const childPath = prefix ? `${prefix}.${key}` : key;\n walk(child, childPath, required && req.has(key), nextVisited);\n }\n return;\n }\n if (prefix) out.push({ path: prefix, required });\n }\n\n if (root.$ref) {\n walk({ $ref: root.$ref }, '', true, new Set());\n }\n return out;\n}\n","import { z } from 'zod';\nimport type { Observation } from '@disclosureos/records';\nimport { deriveFieldPaths } from './field-paths';\nimport type { FieldPath } from './field-paths';\n\nexport type { FieldPath } from './field-paths';\nexport { deriveFieldPaths } from './field-paths';\n\nexport const CompletenessResultSchema = z\n .object({\n total: z.number().int().describe('Total leaf field paths defined by the records schema.'),\n present: z.number().int().describe('How many of those paths carry a value.'),\n percentage: z.number().int().describe('present / total, as a 0–100 integer.'),\n missing: z.array(z.string()).describe('Paths that are absent or empty.'),\n requiredTotal: z.number().int().describe('Count of schema-required leaf paths.'),\n requiredPresent: z.number().int().describe('How many required paths carry a value.'),\n requiredPercentage: z\n .number()\n .int()\n .describe('requiredPresent / requiredTotal, as a 0–100 integer.'),\n })\n .meta({ id: 'CompletenessResult' })\n .describe('How fully an observation populates the records schema.');\n\nexport type CompletenessResult = z.infer<typeof CompletenessResultSchema>;\n\nexport interface CompletenessOptions {\n /** Override the derived field-path set (defaults to the records schema). */\n paths?: FieldPath[];\n}\n\nfunction getNested(obj: Record<string, unknown>, path: string): unknown {\n let current: unknown = obj;\n for (const part of path.split('.')) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction isPresent(value: unknown): boolean {\n if (value == null) return false;\n if (typeof value === 'string') return value.length > 0;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n}\n\n// Field paths are stable for a given schema version, so derive once and reuse.\nlet cachedPaths: FieldPath[] | null = null;\nfunction defaultPaths(): FieldPath[] {\n return (cachedPaths ??= deriveFieldPaths());\n}\n\nfunction pct(present: number, total: number): number {\n return total > 0 ? Math.round((present / total) * 100) : 0;\n}\n\n/**\n * Count populated legacy schema field paths. A present value is not necessarily\n * valid, documented, applicable or independently analyzable. Prefer the public\n * getPopulationCoverage name for new callers; legacy behavior remains unchanged.\n */\nexport function getCompleteness(\n observation: Observation | Record<string, unknown>,\n options?: CompletenessOptions,\n): CompletenessResult {\n const record = observation as Record<string, unknown>;\n const paths = options?.paths ?? defaultPaths();\n const missing: string[] = [];\n let present = 0;\n let requiredTotal = 0;\n let requiredPresent = 0;\n\n for (const field of paths) {\n const ok = isPresent(getNested(record, field.path));\n if (ok) present++;\n else missing.push(field.path);\n if (field.required) {\n requiredTotal++;\n if (ok) requiredPresent++;\n }\n }\n\n return {\n total: paths.length,\n present,\n percentage: pct(present, paths.length),\n missing,\n requiredTotal,\n requiredPresent,\n requiredPercentage: pct(requiredPresent, requiredTotal),\n };\n}\n","import type { Observation } from '@disclosureos/records';\nimport { parseEvidenceRef, parseSensorRef } from '@disclosureos/records/shared';\nimport type { CalibrationStatus, SensorManifest } from '@disclosureos/instruments';\nimport type { EvaluatorWeightInput } from './index';\n\n/**\n * Trust multiplier per calibration maturity level, plus the `unresolved`\n * baseline for claims whose sensor evidence does not resolve to a manifest\n * entry (no `sensorRef`, unknown org, unknown sensor, or no calibration block).\n */\nexport type CalibrationTrustWeights = Record<CalibrationStatus | 'unresolved', number>;\n\n/**\n * Conservative default gradient: instruments with real calibration provenance\n * earn *credit* over unresolved sensors — nothing is ever penalized below the\n * baseline, so adopting the hook can only reward organizations that publish\n * manifests, never punish records that predate them.\n *\n * @experimental The shape is stable; these specific values are a reference\n * policy that may be re-tuned in a minor release. Pin your own `weights` via\n * {@link CalibrationTrustOptions} if you need stable numbers.\n */\nexport const CALIBRATION_TRUST_WEIGHTS: CalibrationTrustWeights = {\n unresolved: 1,\n none: 1,\n candidate_identified: 1.05,\n in_practice: 1.15,\n documented: 1.25,\n};\n\nexport interface CalibrationTrustOptions {\n /** Override the trust gradient (defaults to {@link CALIBRATION_TRUST_WEIGHTS}). */\n weights?: CalibrationTrustWeights;\n /**\n * A base trust policy composed (multiplied) with the calibration credit —\n * e.g. an evaluator-identity policy. Defaults to uniform 1.0.\n */\n evaluatorWeight?: (claim: EvaluatorWeightInput) => number;\n}\n\n/**\n * Build an `evaluatorWeight` hook (see `ScoreOptions.evaluatorWeight`) that\n * credits claims backed by instruments with published calibration provenance.\n *\n * Resolution chain, per claim: `evidenceRefs` (`\"sensor:<id>\"`) → the\n * observation's `sensorEvidence.sensors[]` reading → its `sensorRef`\n * (`\"<org-slug>:<sensor-id>\"`) → the matching manifest entry's\n * `calibration.status`. When a claim cites several sensor readings, the\n * strongest instrument backing wins. Claims with no resolvable sensor\n * evidence get the `unresolved` baseline.\n *\n * Like every `evaluatorWeight` policy, this shifts only the consensus point\n * estimate — `range` and `contested` still report the honest spread of what\n * evaluators actually asserted.\n *\n * ```ts\n * const result = score(observation, {\n * evaluatorWeight: calibrationTrust(observation, [navyManifest]),\n * });\n * ```\n */\nexport function calibrationTrust(\n observation: Observation,\n manifests: readonly SensorManifest[],\n options?: CalibrationTrustOptions,\n): (claim: EvaluatorWeightInput) => number {\n const weights = options?.weights ?? CALIBRATION_TRUST_WEIGHTS;\n const base = options?.evaluatorWeight ?? ((): number => 1);\n\n // Pre-resolve each in-record sensor reading to its manifest calibration status.\n const statusBySensorId = new Map<string, CalibrationStatus>();\n for (const reading of observation.sensorEvidence?.sensors ?? []) {\n if (!reading.sensorRef) continue;\n const ref = parseSensorRef(reading.sensorRef);\n if (!ref) continue;\n const entry = manifests\n .find((manifest) => manifest.orgSlug === ref.orgSlug)\n ?.sensors.find((sensor) => sensor.id === ref.sensorId);\n const status = entry?.calibration?.status;\n if (status) statusBySensorId.set(reading.id, status);\n }\n\n return (claim) => {\n let credit = weights.unresolved;\n for (const evidence of claim.evidenceRefs ?? []) {\n const parsed = parseEvidenceRef(evidence);\n if (!parsed || parsed.kind !== 'sensor') continue;\n const status = statusBySensorId.get(parsed.id);\n const weight = status === undefined ? weights.unresolved : weights[status];\n if (weight > credit) credit = weight;\n }\n return base(claim) * credit;\n };\n}\n","import { z } from 'zod';\nimport type { Observation } from '@disclosureos/records';\nimport type { AssessmentLevel } from '@disclosureos/observables';\nimport type { OriginClaim } from '@disclosureos/origins';\n// Side-effect imports register the `observableAssessments` and `origin` slots on\n// `Observation` via module augmentation, so they are typed below.\nimport '@disclosureos/observables';\nimport '@disclosureos/origins';\n\nexport { calibrationTrust, CALIBRATION_TRUST_WEIGHTS } from './calibration';\nexport type { CalibrationTrustWeights, CalibrationTrustOptions } from './calibration';\n\n/** Methodology version stamped on every {@link ScoreResult}. Bump on weight/formula changes. */\nexport const SCORING_VERSION = '2.0.0' as const;\n\n/**\n * Ordinal support-tier values retained as transparent methodology data.\n * These values do not establish anomaly strength. The scorer rejects descriptive\n * observable assessments rather than applying this table to the V2 vocabulary.\n */\nexport const ASSESSMENT_LEVEL_WEIGHTS: Record<AssessmentLevel, number> = {\n not_indicated: 0,\n reported: 0.25,\n documented: 0.5,\n measured: 0.75,\n confirmed: 1,\n};\n\n/**\n * OCS id prefixes treated as prosaic (well-explained). A confident *prosaic*\n * classification means the case is explained, so it contributes no anomaly\n * signal. Overridable per {@link score} call. Default is the OCS \"Prosaic\"\n * branch (`1.1.1`).\n */\nexport const DEFAULT_PROSAIC_OCS_PREFIXES: readonly string[] = ['1.1.1'];\n\nexport const CompellingnessWeightsSchema = z\n .object({\n technology: z.number().min(0).describe('Weight of the technology-anomaly signal.'),\n biologics: z.number().min(0).describe('Weight of the biologics-anomaly signal.'),\n origin: z.number().min(0).describe('Weight of the (non-prosaic) origin-confidence signal.'),\n })\n .meta({ id: 'CompellingnessWeights' })\n .describe('Relative weights for the compellingness components. Need not sum to 1 — normalized internally.');\n\nexport type CompellingnessWeights = z.infer<typeof CompellingnessWeightsSchema>;\n\n/**\n * Fixed default weights, exposed as a transparent, overridable data object (not a\n * config system). Partners can propose alternate weight sets without an API change.\n *\n * @experimental The *shape* (`CompellingnessWeights`) is stable, but these specific\n * default values are a reference methodology that may be re-tuned in a minor release.\n * Pin your own `weights` via {@link ScoreOptions} if you need stable numbers.\n */\nexport const DEFAULT_WEIGHTS: CompellingnessWeights = {\n technology: 0.45,\n biologics: 0.35,\n origin: 0.2,\n};\n\nexport const ScoreResultSchema = z\n .object({\n score: z.number().min(0).max(1).describe('Overall compellingness (consensus point estimate), 0–1.'),\n range: z\n .object({\n low: z.number().min(0).max(1).describe('Most-skeptical reading of the strongest-anomaly signal across competing claims.'),\n high: z.number().min(0).max(1).describe('Most-anomalous reading of the strongest-anomaly signal across competing claims.'),\n })\n .describe(\n 'Spread of the score across competing claims — wide range signals disagreement. Bounds are '\n + 'computed per-signal under the same strongest-anomaly (max) reduction as the point estimate, '\n + 'not a global min/max over every claim.',\n ),\n contested: z\n .boolean()\n .describe('True when claims disagree on *direction* (some assert anomaly, some assert none).'),\n components: z\n .object({\n technology: z.number().min(0).max(1),\n biologics: z.number().min(0).max(1),\n origin: z.number().min(0).max(1),\n })\n .describe('Per-signal consensus contributions before weighting.'),\n weights: CompellingnessWeightsSchema,\n scoringVersion: z.string().describe('Methodology version that produced this score.'),\n })\n .meta({ id: 'ScoreResult' })\n .describe('A reference compellingness score for an observation, with a contestedness range.');\n\nexport type ScoreResult = z.infer<typeof ScoreResultSchema>;\n\n/** The minimal claim shape the trust hook sees (it never needs the full body). */\nexport type EvaluatorWeightInput = {\n evaluatedBy?: string | undefined;\n evidenceRefs?: string[] | undefined;\n};\n\nexport interface ScoreOptions {\n weights?: CompellingnessWeights;\n /** Override the prosaic OCS prefixes (defaults to {@link DEFAULT_PROSAIC_OCS_PREFIXES}). */\n prosaicPrefixes?: readonly string[];\n /**\n * Trust applied to each claim's vote in the consensus point estimate (default\n * 1.0 — uniform). This is where a future trust policy (e.g.\n * weighting verified/official evaluators higher) plugs in here without changing\n * the formula. Range/contestedness are NOT affected — they report the honest\n * spread of what evaluators actually asserted.\n *\n * @experimental The hook signature is stable, but the default trust *policy*\n * (uniform 1.0) is deliberately unopinionated and is a separate, ongoing design\n * task; a future built-in policy may change the default.\n */\n evaluatorWeight?: (claim: EvaluatorWeightInput) => number;\n}\n\nconst UNIFORM_TRUST = (): number => 1;\n\nfunction isProsaic(id: string, prefixes: readonly string[]): boolean {\n return prefixes.some((p) => id === p || id.startsWith(`${p}.`));\n}\n\nfunction round(n: number): number {\n return Math.round(n * 1e4) / 1e4;\n}\n\ntype Weighted = { magnitude: number; weight: number };\n\ninterface ClaimStats {\n /** Trust-weighted mean magnitude (the consensus point). */\n point: number;\n /** Min asserted magnitude (most skeptical). */\n low: number;\n /** Max asserted magnitude (most anomalous). */\n high: number;\n /** Claims disagree on direction (some > 0, some === 0). */\n contested: boolean;\n}\n\nconst EMPTY_STATS: ClaimStats = { point: 0, low: 0, high: 0, contested: false };\n\nfunction reduceClaims(weighted: Weighted[]): ClaimStats {\n if (weighted.length === 0) return EMPTY_STATS;\n let wsum = 0;\n let msum = 0;\n let low = Infinity;\n let high = -Infinity;\n let anyAnomaly = false;\n let anyNone = false;\n for (const { magnitude, weight } of weighted) {\n wsum += weight;\n msum += magnitude * weight;\n if (magnitude < low) low = magnitude;\n if (magnitude > high) high = magnitude;\n if (magnitude > 0) anyAnomaly = true;\n else anyNone = true;\n }\n return {\n point: wsum > 0 ? msum / wsum : 0,\n low,\n high,\n contested: anyAnomaly && anyNone,\n };\n}\n\n/** Confidence in a *non-prosaic* origin, reduced across competing classifications. */\nfunction originStats(\n origin: OriginClaim[] | undefined,\n prefixes: readonly string[],\n evaluatorWeight: (claim: EvaluatorWeightInput) => number,\n): ClaimStats {\n if (!origin || origin.length === 0) return EMPTY_STATS;\n const weighted = origin.map<Weighted>((c) => ({\n magnitude: isProsaic(c.primaryHypothesis, prefixes) ? 0 : c.confidence,\n weight: c.confidence * evaluatorWeight(c),\n }));\n return reduceClaims(weighted);\n}\n\n/**\n * Reference scorer for origin-only inputs. Descriptive observable support tiers\n * cannot supply anomaly strength, so any nonempty observable claim list is rejected.\n * Use attributed V2 assessments and profile evaluation for research results.\n * Rejection is not a zero score or a finding that a characteristic is absent.\n */\nexport function score(observation: Observation, options?: ScoreOptions): ScoreResult {\n const assessments = observation.observableAssessments;\n const hasDescriptiveClaims = [assessments?.technology, assessments?.biologics]\n .some((group) => Object.values(group ?? {}).some((claims) => claims && claims.length > 0));\n if (hasDescriptiveClaims) {\n throw new Error('Descriptive observable assessments cannot produce anomaly strength. Use V2 attributed assessments and profile evaluation; this is not a zero or absent result.');\n }\n const weights = options?.weights ?? DEFAULT_WEIGHTS;\n const prosaicPrefixes = options?.prosaicPrefixes ?? DEFAULT_PROSAIC_OCS_PREFIXES;\n const evaluatorWeight = options?.evaluatorWeight ?? UNIFORM_TRUST;\n\n const technology = EMPTY_STATS;\n const biologics = EMPTY_STATS;\n const origin = originStats(observation.origin, prosaicPrefixes, evaluatorWeight);\n\n const totalWeight = weights.technology + weights.biologics + weights.origin;\n const combine = (t: number, b: number, o: number): number =>\n totalWeight > 0\n ? (t * weights.technology + b * weights.biologics + o * weights.origin) / totalWeight\n : 0;\n\n return {\n score: round(combine(technology.point, biologics.point, origin.point)),\n range: {\n low: round(combine(technology.low, biologics.low, origin.low)),\n high: round(combine(technology.high, biologics.high, origin.high)),\n },\n contested: technology.contested || biologics.contested || origin.contested,\n components: {\n technology: round(technology.point),\n biologics: round(biologics.point),\n origin: round(origin.point),\n },\n weights,\n scoringVersion: SCORING_VERSION,\n };\n}\n\nexport interface RankedObservation<T extends Observation = Observation> {\n observation: T;\n result: ScoreResult;\n}\n\n/**\n * Score a set of observations and return them sorted most-compelling first — the\n * \"float the strongest cases to the top\" use case.\n */\nexport function rankByCompellingness<T extends Observation>(\n observations: readonly T[],\n options?: ScoreOptions,\n): RankedObservation<T>[] {\n return observations\n .map((observation) => ({ observation, result: score(observation, options) }))\n .sort((a, b) => b.result.score - a.result.score);\n}\n","import { z } from 'zod';\nimport { jsonSchemaEnvelope, schemaId } from '@disclosureos/records/shared';\nimport { CompletenessResultSchema } from './completeness';\nimport { ScoreResultSchema, CompellingnessWeightsSchema } from './compellingness';\n\nexport const SCORING_SCHEMA_VERSION = '2.0.0';\n\nexport const SCORING_SCHEMA_ID = schemaId('scoring', 'scoring', SCORING_SCHEMA_VERSION);\n\n/**\n * Emit the JSON Schema (draft 2020-12) for the scoring output shapes\n * ({@link CompletenessResultSchema}, {@link ScoreResultSchema}) so downstream\n * consumers (and other languages) can validate stored scores.\n */\nexport function scoringJsonSchema(): Record<string, unknown> {\n const bundle = z.toJSONSchema(\n z.object({\n completeness: CompletenessResultSchema,\n compellingness: ScoreResultSchema,\n weights: CompellingnessWeightsSchema,\n }),\n { target: 'draft-2020-12' },\n ) as Record<string, unknown>;\n return jsonSchemaEnvelope(bundle, { id: SCORING_SCHEMA_ID, version: SCORING_SCHEMA_VERSION });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@disclosureos/scoring",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0-beta.4",
|
|
4
|
+
"description": "Provider scoring contracts, attributed assessment summaries and reference scoring utilities for DisclosureOS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -48,7 +48,11 @@
|
|
|
48
48
|
"./experimental/v2": {
|
|
49
49
|
"types": "./dist/experimental/v2/index.d.ts",
|
|
50
50
|
"import": "./dist/experimental/v2/index.js"
|
|
51
|
-
}
|
|
51
|
+
},
|
|
52
|
+
"./experimental/v2/provider-score-policy/schema": "./schema/experimental/provider-score-policy-0.1.0.schema.json",
|
|
53
|
+
"./experimental/v2/provider-score-policy/schema/0.1.0": "./schema/experimental/provider-score-policy-0.1.0.schema.json",
|
|
54
|
+
"./experimental/v2/provider-score-result/schema": "./schema/experimental/provider-score-result-0.1.0.schema.json",
|
|
55
|
+
"./experimental/v2/provider-score-result/schema/0.1.0": "./schema/experimental/provider-score-result-0.1.0.schema.json"
|
|
52
56
|
},
|
|
53
57
|
"main": "./dist/index.js",
|
|
54
58
|
"types": "./dist/index.d.ts",
|
|
@@ -61,10 +65,10 @@
|
|
|
61
65
|
],
|
|
62
66
|
"dependencies": {
|
|
63
67
|
"zod": "4.4.3",
|
|
64
|
-
"@disclosureos/instruments": "2.0.0-beta.
|
|
65
|
-
"@disclosureos/
|
|
66
|
-
"@disclosureos/
|
|
67
|
-
"@disclosureos/records": "2.0.0-beta.
|
|
68
|
+
"@disclosureos/instruments": "2.0.0-beta.4",
|
|
69
|
+
"@disclosureos/origins": "2.0.0-beta.4",
|
|
70
|
+
"@disclosureos/observables": "2.0.0-beta.4",
|
|
71
|
+
"@disclosureos/records": "2.0.0-beta.4"
|
|
68
72
|
},
|
|
69
73
|
"devDependencies": {
|
|
70
74
|
"@types/node": "^20",
|