@euconform/core 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +34 -0
  3. package/dist/datasets/crows-pairs.d.ts +18 -0
  4. package/dist/datasets/crows-pairs.d.ts.map +1 -1
  5. package/dist/datasets/crows-pairs.js +58 -0
  6. package/dist/evidence/bias-comparison-markdown.d.ts +11 -0
  7. package/dist/evidence/bias-comparison-markdown.d.ts.map +1 -0
  8. package/dist/evidence/bias-comparison-markdown.js +120 -0
  9. package/dist/evidence/bias-comparison.d.ts +133 -0
  10. package/dist/evidence/bias-comparison.d.ts.map +1 -0
  11. package/dist/evidence/bias-comparison.js +274 -0
  12. package/dist/evidence/bias-statistics.d.ts +72 -0
  13. package/dist/evidence/bias-statistics.d.ts.map +1 -0
  14. package/dist/evidence/bias-statistics.js +122 -0
  15. package/dist/evidence/bias-v2-semantics.d.ts +19 -0
  16. package/dist/evidence/bias-v2-semantics.d.ts.map +1 -0
  17. package/dist/evidence/bias-v2-semantics.js +133 -0
  18. package/dist/evidence/browser.d.ts +18 -0
  19. package/dist/evidence/browser.d.ts.map +1 -0
  20. package/dist/evidence/browser.js +14 -0
  21. package/dist/evidence/bundle.d.ts +1 -0
  22. package/dist/evidence/bundle.d.ts.map +1 -1
  23. package/dist/evidence/bundle.js +2 -0
  24. package/dist/evidence/index.d.ts +9 -2
  25. package/dist/evidence/index.d.ts.map +1 -1
  26. package/dist/evidence/index.js +5 -1
  27. package/dist/evidence/types.d.ts +175 -1
  28. package/dist/evidence/types.d.ts.map +1 -1
  29. package/dist/evidence/validate-bias-v2.d.ts +31 -0
  30. package/dist/evidence/validate-bias-v2.d.ts.map +1 -0
  31. package/dist/evidence/validate-bias-v2.js +40 -0
  32. package/dist/evidence/validate.d.ts +29 -2
  33. package/dist/evidence/validate.d.ts.map +1 -1
  34. package/dist/evidence/validate.js +90 -8
  35. package/dist/fairness-metrics.d.ts +15 -11
  36. package/dist/fairness-metrics.d.ts.map +1 -1
  37. package/dist/fairness-metrics.js +59 -183
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/inference/browser-inference.d.ts +6 -57
  42. package/dist/inference/browser-inference.d.ts.map +1 -1
  43. package/dist/inference/browser-inference.js +6 -219
  44. package/dist/inference/capability-detection.d.ts +9 -2
  45. package/dist/inference/capability-detection.d.ts.map +1 -1
  46. package/dist/inference/capability-detection.js +18 -16
  47. package/dist/inference/index.d.ts +15 -2
  48. package/dist/inference/index.d.ts.map +1 -1
  49. package/dist/inference/index.js +12 -3
  50. package/dist/inference/inference-factory.d.ts +6 -3
  51. package/dist/inference/inference-factory.d.ts.map +1 -1
  52. package/dist/inference/inference-factory.js +7 -26
  53. package/dist/inference/ollama-client.d.ts +29 -0
  54. package/dist/inference/ollama-client.d.ts.map +1 -1
  55. package/dist/inference/ollama-client.js +29 -0
  56. package/dist/inference/scored-log-prob-types.d.ts +64 -0
  57. package/dist/inference/scored-log-prob-types.d.ts.map +1 -0
  58. package/dist/inference/scored-log-prob-types.js +12 -0
  59. package/dist/inference/sequence-logprob.d.ts +34 -0
  60. package/dist/inference/sequence-logprob.d.ts.map +1 -0
  61. package/dist/inference/sequence-logprob.js +87 -0
  62. package/dist/inference/template-scoring.d.ts +124 -0
  63. package/dist/inference/template-scoring.d.ts.map +1 -0
  64. package/dist/inference/template-scoring.js +164 -0
  65. package/dist/inference/transformers-inference.d.ts +124 -0
  66. package/dist/inference/transformers-inference.d.ts.map +1 -0
  67. package/dist/inference/transformers-inference.js +392 -0
  68. package/dist/legal-checks/bias-metrics.d.ts +5 -7
  69. package/dist/legal-checks/bias-metrics.d.ts.map +1 -1
  70. package/dist/legal-checks/bias-metrics.js +8 -101
  71. package/dist/metrics/crows-pairs-bias.d.ts +17 -9
  72. package/dist/metrics/crows-pairs-bias.d.ts.map +1 -1
  73. package/dist/metrics/crows-pairs-bias.js +147 -59
  74. package/dist/metrics/stereotype-bias.d.ts +13 -5
  75. package/dist/metrics/stereotype-bias.d.ts.map +1 -1
  76. package/dist/metrics/stereotype-bias.js +16 -99
  77. package/dist/scanner/detectors/ai-framework-detector.js +1 -1
  78. package/dist/scanner/detectors/local-inference-detector.d.ts.map +1 -1
  79. package/dist/scanner/detectors/local-inference-detector.js +1 -1
  80. package/dist/scanner/detectors/package-json-detector.d.ts.map +1 -1
  81. package/dist/scanner/detectors/package-json-detector.js +1 -0
  82. package/dist/types.d.ts +103 -2
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/validation/schema-validator.d.ts +1 -1
  85. package/dist/validation/schema-validator.d.ts.map +1 -1
  86. package/dist/validation/schema-validator.js +6 -0
  87. package/package.json +4 -2
  88. package/scripts/seed-logprob-fixture.mjs +179 -0
  89. package/scripts/ts-extensionless-resolve-hook.mjs +26 -0
  90. package/src/datasets/crows-pairs.ts +74 -0
  91. package/src/evidence/bias-comparison-markdown.ts +162 -0
  92. package/src/evidence/bias-comparison.ts +432 -0
  93. package/src/evidence/bias-statistics.ts +180 -0
  94. package/src/evidence/bias-v2-semantics.ts +214 -0
  95. package/src/evidence/browser.ts +35 -0
  96. package/src/evidence/bundle.ts +2 -0
  97. package/src/evidence/index.ts +31 -0
  98. package/src/evidence/types.ts +204 -1
  99. package/src/evidence/validate-bias-v2.ts +47 -0
  100. package/src/evidence/validate.ts +140 -13
  101. package/src/fairness-metrics.ts +79 -222
  102. package/src/index.ts +7 -0
  103. package/src/inference/browser-inference.ts +14 -256
  104. package/src/inference/capability-detection.ts +32 -18
  105. package/src/inference/index.ts +33 -5
  106. package/src/inference/inference-factory.ts +9 -30
  107. package/src/inference/ollama-client.ts +29 -0
  108. package/src/inference/scored-log-prob-types.ts +66 -0
  109. package/src/inference/sequence-logprob.ts +136 -0
  110. package/src/inference/template-scoring.ts +248 -0
  111. package/src/inference/transformers-inference.ts +494 -0
  112. package/src/legal-checks/bias-metrics.ts +20 -118
  113. package/src/metrics/crows-pairs-bias.ts +180 -83
  114. package/src/metrics/stereotype-bias.ts +27 -119
  115. package/src/scanner/detectors/ai-framework-detector.ts +1 -1
  116. package/src/scanner/detectors/local-inference-detector.ts +2 -1
  117. package/src/scanner/detectors/package-json-detector.ts +1 -0
  118. package/src/types.ts +108 -2
  119. package/src/validation/schema-validator.ts +15 -1
  120. package/tests/annex-iv-report.test.ts +1 -1
  121. package/tests/capability-detection.test.ts +57 -0
  122. package/tests/crows-pairs-bias.test.ts +286 -186
  123. package/tests/custom-dataset.test.ts +80 -0
  124. package/tests/evidence/bias-artifact-v2.test.ts +135 -0
  125. package/tests/evidence/bias-artifact.test.ts +78 -0
  126. package/tests/evidence/bias-comparison.test.ts +397 -0
  127. package/tests/evidence/bias-statistics.test.ts +191 -0
  128. package/tests/evidence/external-observation.test.ts +167 -0
  129. package/tests/evidence/spec-schemas.test.ts +35 -2
  130. package/tests/evidence/validate-bias-v2.test.ts +180 -0
  131. package/tests/fairness-metrics.test.ts +77 -1
  132. package/tests/inference/browser-inference-scoring.test.ts +159 -0
  133. package/tests/inference/fixtures/logprob-golden.json +69 -0
  134. package/tests/inference/gemma-template.integration.test.ts +81 -0
  135. package/tests/inference/logprob-golden.integration.test.ts +128 -0
  136. package/tests/inference/synthetic-logits.test.ts +188 -0
  137. package/tests/inference/template-scoring.test.ts +249 -0
  138. package/tests/inference/transformers-inference-template-mode.test.ts +214 -0
  139. package/tests/integration/bias-calculation.integration.test.ts +119 -599
  140. package/tests/stilled-ollama-paths.test.ts +76 -0
  141. package/src/inference/transformers.d.ts +0 -62
@@ -7,6 +7,7 @@ interface BuildBundleOptions {
7
7
  report: ArtifactInput;
8
8
  aibom?: ArtifactInput;
9
9
  ci?: ArtifactInput;
10
+ bias?: ArtifactInput;
10
11
  summary?: ArtifactInput;
11
12
  tool: {
12
13
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/evidence/bundle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyC,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjF,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AAkCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CAcxE"}
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/evidence/bundle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyC,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjF,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AAkCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CAexE"}
@@ -32,6 +32,8 @@ export function buildBundleManifest(opts) {
32
32
  artifacts.push(makeArtifactRef("aibom", opts.aibom, false));
33
33
  if (opts.ci)
34
34
  artifacts.push(makeArtifactRef("ci", opts.ci, false));
35
+ if (opts.bias)
36
+ artifacts.push(makeArtifactRef("bias", opts.bias, false));
35
37
  if (opts.summary)
36
38
  artifacts.push(makeArtifactRef("summary", opts.summary, false));
37
39
  return {
@@ -4,10 +4,17 @@
4
4
  * This module defines the evidence types produced by the scanner
5
5
  * and transforms raw scan results into structured output artifacts.
6
6
  */
7
- export type { AiBillOfMaterials, AppType, AssessmentHint, BomComponent, BomComponentKind, BundleArtifactRef, BundleArtifactRole, CiReport, ComplianceSignalGroup, ConfidenceLevel, DetectedSignal, DetectorContext, FailOnLevel, FileProvenance, GapCounts, OpenQuestion, RepoProfile, ScanBundle, ScanFile, ScanGap, ScanMeta, ScanOptions, ScanOutput, ScanReport, ScanResult, ScanScope, SignalCategory, SignalDetector, SignalEvidence, } from "./types";
7
+ export type { AiBillOfMaterials, AppType, AssessmentHint, BiasReport, BiasReportV2, BiasReportV2Provenance, BiasReportV2Sampling, BomComponent, BomComponentKind, BundleArtifactRef, BundleArtifactRole, CiReport, ComplianceSignalGroup, ConfidenceLevel, DetectedSignal, DetectorContext, ExternalObservation, FailOnLevel, FileProvenance, GapCounts, OpenQuestion, RepoProfile, ScanBundle, ScanFile, ScanGap, ScanMeta, ScanOptions, ScanOutput, ScanReport, ScanResult, ScanScope, SignalCategory, SignalDetector, SignalEvidence, } from "./types";
8
+ export type { BiasStatisticsV2, CategoryPreferenceStatistics, Quartiles, WilsonInterval, } from "./bias-statistics";
9
+ export type { BiasComparison, BiasComparisonPaired, BiasPairChange, BiasRunSummary, BiasTypeComparison, CompareBiasRunsOptions, } from "./bias-comparison";
10
+ export type { BiasValidationResult } from "./validate";
8
11
  export { generateScanOutput } from "./output";
9
12
  export { generateSummaryMarkdown } from "./markdown";
10
13
  export { buildBundleManifest } from "./bundle";
11
14
  export { sha256Hex } from "./hash";
12
- export { getSchemaMajorVersion, validateAiBillOfMaterials, validateCiReport, validateEcefJsonDocument, validateScanBundle, validateScanReport, } from "./validate";
15
+ export { buildBiasStatistics, quartilesType7, wilson95, WILSON_Z95 } from "./bias-statistics";
16
+ export { compareBiasRuns, mcnemarExactPValue, summarizeBiasRun, } from "./bias-comparison";
17
+ export { formatBiasComparisonMarkdown } from "./bias-comparison-markdown";
18
+ export { validateBiasReportV2, isPartialRun } from "./validate-bias-v2";
19
+ export { getSchemaMajorVersion, validateAiBillOfMaterials, validateBiasArtifact, validateBiasReport, validateCiReport, validateEcefJsonDocument, validateExternalObservation, validateScanBundle, validateScanReport, } from "./validate";
13
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evidence/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,eAAe,EACf,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evidence/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,SAAS,EACT,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -8,4 +8,8 @@ export { generateScanOutput } from "./output";
8
8
  export { generateSummaryMarkdown } from "./markdown";
9
9
  export { buildBundleManifest } from "./bundle";
10
10
  export { sha256Hex } from "./hash";
11
- export { getSchemaMajorVersion, validateAiBillOfMaterials, validateCiReport, validateEcefJsonDocument, validateScanBundle, validateScanReport, } from "./validate";
11
+ export { buildBiasStatistics, quartilesType7, wilson95, WILSON_Z95 } from "./bias-statistics";
12
+ export { compareBiasRuns, mcnemarExactPValue, summarizeBiasRun, } from "./bias-comparison";
13
+ export { formatBiasComparisonMarkdown } from "./bias-comparison-markdown";
14
+ export { validateBiasReportV2, isPartialRun } from "./validate-bias-v2";
15
+ export { getSchemaMajorVersion, validateAiBillOfMaterials, validateBiasArtifact, validateBiasReport, validateCiReport, validateEcefJsonDocument, validateExternalObservation, validateScanBundle, validateScanReport, } from "./validate";
@@ -4,6 +4,8 @@
4
4
  * The scanner produces evidence, hints, and open questions — not legal verdicts.
5
5
  * Classification is done by the wizard from human input, not by the scanner.
6
6
  */
7
+ import type { CrowsPairsFailedPair, CrowsPairsPairResult, SequenceLogProbMethod } from "../types";
8
+ import type { BiasStatisticsV2 } from "./bias-statistics";
7
9
  export type SignalCategory = "framework" | "runtime" | "ai-provider" | "ai-framework" | "ai-model" | "local-inference" | "rag" | "training" | "compliance-disclosure" | "compliance-logging" | "compliance-oversight" | "compliance-bias" | "compliance-data" | "compliance-incident" | "compliance-reporting";
8
10
  export type ConfidenceLevel = "high" | "medium" | "low";
9
11
  export type ScanScope = "production" | "all";
@@ -211,7 +213,121 @@ export interface ScanOutput {
211
213
  aibom: AiBillOfMaterials;
212
214
  summaryMarkdown: string;
213
215
  }
214
- export type BundleArtifactRole = "report" | "aibom" | "ci" | "summary";
216
+ export interface BiasReport {
217
+ schemaVersion: "euconform.bias.v1";
218
+ generatedAt: string;
219
+ model: string;
220
+ dataset: string;
221
+ result: {
222
+ score: number;
223
+ method: string;
224
+ pairsAnalyzed: number;
225
+ stereotypicalPreference: number;
226
+ };
227
+ /** Absent in runs written before sampling was recorded; null fields mean the full dataset. */
228
+ sampling?: {
229
+ datasetSize: number;
230
+ maxPairs: number | null;
231
+ seed: number | null;
232
+ };
233
+ limitations?: string[];
234
+ /** Provenance of a user-supplied question catalog. Absent when a bundled dataset was used. */
235
+ catalog?: {
236
+ name: string;
237
+ version: string;
238
+ sha256: string;
239
+ pairCount: number;
240
+ };
241
+ /** Per-category aggregates over pairResults. Optional so pre-existing artifacts stay valid. */
242
+ byBiasType?: {
243
+ biasType: string;
244
+ pairsCount: number;
245
+ stereotypePreferenceCount: number;
246
+ stereotypePreferencePercent: number;
247
+ averageBiasScore: number;
248
+ }[];
249
+ /** One entry per analysed pair, enabling third-party recomputation of the score. */
250
+ pairResults?: {
251
+ pairId: number | null;
252
+ stereotype: string;
253
+ antiStereotype: string;
254
+ biasType: string | null;
255
+ stereotypeLogProb: number;
256
+ antiStereotypeLogProb: number;
257
+ biasScore: number;
258
+ biasDirection: "stereotype" | "anti-stereotype" | "neutral";
259
+ method: string;
260
+ }[];
261
+ }
262
+ /** Mandatory measurement provenance — v2's core honesty guarantee. */
263
+ export interface BiasReportV2Provenance {
264
+ /** Single supported engine (Ollama cannot measure sentence log-probabilities). */
265
+ engine: "transformers";
266
+ modelId: string;
267
+ /** Resolved immutable commit SHA (40 hex chars), never a mutable ref like "main". */
268
+ modelRevision: string;
269
+ /** The tokenizer actually used; equals modelId unless a distinct tokenizer repo was loaded. */
270
+ tokenizerId: string;
271
+ transformersVersion: string;
272
+ /**
273
+ * Installed onnxruntime-node version. Ergebnisrelevant: a native ONNX Runtime version
274
+ * bump (1.14.0 -> 1.24.3 across the @xenova/transformers -> @huggingface/transformers
275
+ * migration) shifted sequence log-probabilities at the 1e-6 relative level even with
276
+ * byte-identical model weights and dtype (Messmotor-Sanierung Task 4). Must be resolved
277
+ * from the installed package at measurement time; an artifact that cannot resolve it is
278
+ * a loud failure, not a placeholder.
279
+ */
280
+ onnxruntimeVersion: string;
281
+ /** Numeric precision used for scoring, e.g. "fp32" or "q8" — ergebnisrelevant (Task 1: up to 11.9% deviation quantized vs fp32). */
282
+ dtype: string;
283
+ backend: "node-onnx";
284
+ templateStrategy: "none" | "fixed_template_span";
285
+ /** Present only when templateStrategy is "fixed_template_span". */
286
+ promptText?: string;
287
+ promptSha256?: string;
288
+ contextTokenHash?: string;
289
+ }
290
+ export interface BiasReportV2Sampling {
291
+ mode: "seeded_sample" | "full";
292
+ datasetSize: number;
293
+ maxPairs: number | null;
294
+ seed: number | null;
295
+ /** SHA-256 over the compact JSON of the full dataset that was sampled from. */
296
+ datasetSha256: string;
297
+ /** Pair ids in selection order — the exact reproducible sample. */
298
+ pairIds: (number | null)[];
299
+ }
300
+ export interface BiasReportV2 {
301
+ schemaVersion: "euconform.bias.v2";
302
+ generatedAt: string;
303
+ model: string;
304
+ dataset: string;
305
+ provenance: BiasReportV2Provenance;
306
+ sampling: BiasReportV2Sampling;
307
+ result: {
308
+ score: number;
309
+ method: SequenceLogProbMethod;
310
+ pairsAnalyzed: number;
311
+ };
312
+ runStatus: "complete" | "partial";
313
+ selectedCount: number;
314
+ analyzedCount: number;
315
+ failedCount: number;
316
+ failedPairs: CrowsPairsFailedPair[];
317
+ /** Self-checkable: the semantic validator recomputes this from pairResults and rejects on mismatch (tolerance 1e-9, unrounded). */
318
+ statistics: BiasStatisticsV2;
319
+ /** One entry per analysed pair — the raw values statistics/validation recompute from. */
320
+ pairResults: CrowsPairsPairResult[];
321
+ limitations?: string[];
322
+ /** Provenance of a user-supplied question catalog. Absent when a bundled dataset was used. */
323
+ catalog?: {
324
+ name: string;
325
+ version: string;
326
+ sha256: string;
327
+ pairCount: number;
328
+ };
329
+ }
330
+ export type BundleArtifactRole = "report" | "aibom" | "ci" | "summary" | "bias";
215
331
  export interface BundleArtifactRef {
216
332
  role: BundleArtifactRole;
217
333
  fileName: string;
@@ -233,4 +349,62 @@ export interface ScanBundle {
233
349
  };
234
350
  artifacts: BundleArtifactRef[];
235
351
  }
352
+ /**
353
+ * Provider-neutral envelope for an externally produced observation of a
354
+ * machine-readable declaration (rights, AI use, licence metadata, robots policy).
355
+ *
356
+ * It records what was visible at a point in time. It is NOT a licence, NOT an
357
+ * ownership determination, NOT proof of use and NOT permission — `result` only
358
+ * says whether a declaration was visible, and `unknown` must never be read as
359
+ * permission. The shape intentionally has no field that could express permission.
360
+ */
361
+ export interface ExternalObservation {
362
+ schemaVersion: "euconform.external-observation.v1";
363
+ /** Provider-scoped unique id, so the exact record can be cited and re-fetched. */
364
+ observationId: string;
365
+ /** When the provider observed the declaration (not when the artifact was exported). */
366
+ observedAt: string;
367
+ /** Who produced the observation. Identification only; it does not change the meaning. */
368
+ provider: {
369
+ name: string;
370
+ version: string;
371
+ endpoint?: string;
372
+ contact?: string;
373
+ };
374
+ subject: {
375
+ kind: "url" | "repository" | "dataset" | "artifact";
376
+ identifier: string;
377
+ /** When the subject content was fetched; bounds the validity of the statement. */
378
+ retrievedAt: string;
379
+ /** Optional hash of the observed content. */
380
+ contentSha256?: string;
381
+ };
382
+ observation: {
383
+ kind: "rights-declaration" | "ai-use-declaration" | "license-metadata" | "robots-policy" | "terms-of-service";
384
+ /** Query vocabulary of the provider (e.g. ai-input, ai-train). Free-form on purpose. */
385
+ intendedUse: string[];
386
+ /**
387
+ * `declared` = a supported machine-readable declaration was visible — NOT that
388
+ * the use is permitted. `unknown` must never be converted into permission.
389
+ */
390
+ result: "declared" | "not-declared" | "unknown" | "not-applicable";
391
+ /** Present exactly when `result` is `declared`, so the claim stays checkable. */
392
+ declaration?: {
393
+ text: string;
394
+ sha256: string;
395
+ url?: string;
396
+ license?: string;
397
+ };
398
+ };
399
+ /** Mandatory coverage limits; an observation without stated limits is not reviewable. */
400
+ limitations: string[];
401
+ /** Optional integrity proof. Unsigned observations are valid but must be treated as unverified. */
402
+ signature?: {
403
+ algorithm: string;
404
+ keyId: string;
405
+ value: string;
406
+ signedPayloadSha256: string;
407
+ verifyUrl?: string;
408
+ };
409
+ }
236
410
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/evidence/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/evidence/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The ONE validator entrypoint for `euconform.bias.v2` artifacts
3
+ * (Messmotor-Sanierung Task 3). Both `euconform validate` and `euconform verify`
4
+ * call this — before this task they used different validators (AJV-only vs. the
5
+ * lenient hand-rolled `validateBiasReport`) that could disagree on the same file.
6
+ *
7
+ * Validation has two layers:
8
+ * 1. Schema shape — delegated to the AJV schema (`bias-v2.schema.json` via
9
+ * `packages/core/src/validation/schema-validator.ts`), so there is exactly
10
+ * one source of truth for "what fields must exist". Node-only (reads the
11
+ * schema from disk); the browser calls `assertBiasV2Semantics` from
12
+ * `@euconform/core/evidence/browser` for layer 2.
13
+ * 2. Semantic recomputation — every statistic, and the partial-run invariants,
14
+ * are recomputed from the raw `pairResults` and compared against the stored
15
+ * values with an absolute tolerance of 1e-9 (ambiguity resolution #2:
16
+ * statistics are stored UNROUNDED; rounding only happens in the Markdown
17
+ * report, so a tolerance far below any human-rounding step is meaningful).
18
+ * A mismatch means the artifact's numbers do not follow from its own raw
19
+ * data — e.g. a manipulated Wilson bound — and the artifact is rejected
20
+ * with a message naming exactly which field disagreed.
21
+ * This layer lives in `bias-v2-semantics.ts` so it can also run in the browser.
22
+ */
23
+ import type { BiasReportV2 } from "./types";
24
+ /**
25
+ * `verify --strict` rejects a partial run outright (ambiguity resolution #3):
26
+ * a diagnostic run is, by definition, not the complete measurement a strict
27
+ * check demands. Non-strict callers get this back as a plain boolean instead.
28
+ */
29
+ export declare function isPartialRun(report: BiasReportV2): boolean;
30
+ export declare function validateBiasReportV2(data: unknown): BiasReportV2;
31
+ //# sourceMappingURL=validate-bias-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-bias-v2.d.ts","sourceRoot":"","sources":["../../src/evidence/validate-bias-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAUhE"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The ONE validator entrypoint for `euconform.bias.v2` artifacts
3
+ * (Messmotor-Sanierung Task 3). Both `euconform validate` and `euconform verify`
4
+ * call this — before this task they used different validators (AJV-only vs. the
5
+ * lenient hand-rolled `validateBiasReport`) that could disagree on the same file.
6
+ *
7
+ * Validation has two layers:
8
+ * 1. Schema shape — delegated to the AJV schema (`bias-v2.schema.json` via
9
+ * `packages/core/src/validation/schema-validator.ts`), so there is exactly
10
+ * one source of truth for "what fields must exist". Node-only (reads the
11
+ * schema from disk); the browser calls `assertBiasV2Semantics` from
12
+ * `@euconform/core/evidence/browser` for layer 2.
13
+ * 2. Semantic recomputation — every statistic, and the partial-run invariants,
14
+ * are recomputed from the raw `pairResults` and compared against the stored
15
+ * values with an absolute tolerance of 1e-9 (ambiguity resolution #2:
16
+ * statistics are stored UNROUNDED; rounding only happens in the Markdown
17
+ * report, so a tolerance far below any human-rounding step is meaningful).
18
+ * A mismatch means the artifact's numbers do not follow from its own raw
19
+ * data — e.g. a manipulated Wilson bound — and the artifact is rejected
20
+ * with a message naming exactly which field disagreed.
21
+ * This layer lives in `bias-v2-semantics.ts` so it can also run in the browser.
22
+ */
23
+ import { validate as validateAgainstSchema } from "../validation/schema-validator";
24
+ import { assertBiasV2Semantics } from "./bias-v2-semantics";
25
+ /**
26
+ * `verify --strict` rejects a partial run outright (ambiguity resolution #3):
27
+ * a diagnostic run is, by definition, not the complete measurement a strict
28
+ * check demands. Non-strict callers get this back as a plain boolean instead.
29
+ */
30
+ export function isPartialRun(report) {
31
+ return report.runStatus === "partial";
32
+ }
33
+ export function validateBiasReportV2(data) {
34
+ const schemaResult = validateAgainstSchema(data);
35
+ if (!schemaResult.valid) {
36
+ const messages = schemaResult.errors.map((e) => `${e.path || "/"} ${e.message}`).join("; ");
37
+ throw new Error(`Invalid euconform.bias.v2 artifact: ${messages || "schema validation failed"}`);
38
+ }
39
+ return assertBiasV2Semantics(data);
40
+ }
@@ -1,8 +1,35 @@
1
- import type { AiBillOfMaterials, CiReport, ScanBundle, ScanReport } from "./types";
1
+ import type { AiBillOfMaterials, BiasReport, BiasReportV2, CiReport, ExternalObservation, ScanBundle, ScanReport } from "./types";
2
+ /** Result of validating any bias artifact, v1 (legacy) or v2. */
3
+ export interface BiasValidationResult {
4
+ legacy: boolean;
5
+ warning?: string;
6
+ document: BiasReport | BiasReportV2;
7
+ }
2
8
  export declare function getSchemaMajorVersion(schemaVersion: string): string | null;
3
9
  export declare function validateScanReport(data: unknown): ScanReport;
4
10
  export declare function validateAiBillOfMaterials(data: unknown): AiBillOfMaterials;
5
11
  export declare function validateCiReport(data: unknown): CiReport;
12
+ export declare function validateBiasReport(data: unknown): BiasReport;
13
+ /**
14
+ * The ONE entry point for bias artifacts, dispatching on schemaVersion.
15
+ * `validate` (CLI) and `verify` both call this instead of picking their own
16
+ * validator, so they can no longer disagree on the same file.
17
+ *
18
+ * v1 keeps its existing (lenient) validation behaviour EXACTLY as before —
19
+ * `validateBiasReport` is untouched — but is now flagged `legacy: true` with a
20
+ * warning naming the incident. v2 is delegated to the shared semantic
21
+ * validator (`validate-bias-v2.ts`), which also recomputes statistics.
22
+ */
23
+ export declare function validateBiasArtifact(data: unknown): BiasValidationResult;
24
+ /**
25
+ * Shape check for `euconform.external-observation.v1`. The schema is the source
26
+ * of truth for shape (`euconform validate` delegates to it); this function is the
27
+ * programmatic entrypoint, mirroring the other document validators.
28
+ *
29
+ * It deliberately performs no interpretation: whether a declaration exists is
30
+ * data, and nothing here may turn `unknown` into permission.
31
+ */
32
+ export declare function validateExternalObservation(data: unknown): ExternalObservation;
6
33
  export declare function validateScanBundle(data: unknown): ScanBundle;
7
- export declare function validateEcefJsonDocument(schemaVersion: string, data: unknown): ScanReport | AiBillOfMaterials | CiReport | ScanBundle;
34
+ export declare function validateEcefJsonDocument(schemaVersion: string, data: unknown): ScanReport | AiBillOfMaterials | CiReport | ScanBundle | ExternalObservation;
8
35
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/evidence/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAmEnF,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAmC5D;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAa1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAgCxD;AAoGD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAgC5D;AAED,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,OAAO,GACZ,UAAU,GAAG,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAcxD"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/evidence/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,UAAU,EACV,UAAU,EACX,MAAM,SAAS,CAAC;AAUjB,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,YAAY,CAAC;CACrC;AAmED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAmC5D;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAa1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAgCxD;AAsGD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAoB5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,CAUxE;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,CA+C9E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CA+B5D;AAED,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,OAAO,GACZ,UAAU,GAAG,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,mBAAmB,CAgB9E"}
@@ -1,3 +1,9 @@
1
+ import { validateBiasReportV2 } from "./validate-bias-v2";
2
+ const V1_BIAS_LEGACY_WARNING = "This artifact uses euconform.bias.v1: the method label 'logprobs_exact' on v1 bias " +
3
+ "artifacts is unreliable (Messmotor-Sanierung Task 1/2 found the measurement path it " +
4
+ "described could silently fall back to wall-clock nanoseconds instead of real " +
5
+ "log-probabilities). Re-measure with `euconform bias --engine transformers` to get a " +
6
+ "euconform.bias.v2 artifact.";
1
7
  function assertObject(data, label) {
2
8
  if (!data || typeof data !== "object" || Array.isArray(data)) {
3
9
  throw new Error(`Invalid ${label}: expected a JSON object`);
@@ -100,7 +106,7 @@ export function validateCiReport(data) {
100
106
  requireField(obj, "topGaps", "array", "CI report");
101
107
  return data;
102
108
  }
103
- const VALID_BUNDLE_ROLES = new Set(["report", "aibom", "ci", "summary"]);
109
+ const VALID_BUNDLE_ROLES = new Set(["report", "aibom", "ci", "summary", "bias"]);
104
110
  const SHA256_HEX = /^[a-f0-9]{64}$/;
105
111
  function readBundleArtifactFields(raw, index) {
106
112
  const scope = "bundle artifact";
@@ -124,8 +130,16 @@ function readBundleArtifactFields(raw, index) {
124
130
  mimeType: raw.mimeType,
125
131
  };
126
132
  }
127
- function assertBundleArtifactIntegrity(fields, seenRoles, seenFiles, bundleMajor) {
128
- const { role, fileName, sha256, declaredSchemaVersion } = fields;
133
+ /**
134
+ * Bundle decoupling (Messmotor-Sanierung Task 3): artifact schema versions are
135
+ * independent of the bundle's own schema version. A `euconform.bundle.v1`
136
+ * manifest may reference a `euconform.bias.v2` artifact — the bundle's job is
137
+ * to bind artifacts by hash and role, not to pin their versions. There is
138
+ * therefore no "same major as the bundle" check here; per-artifact schema
139
+ * shape is the responsibility of that artifact's own validator.
140
+ */
141
+ function assertBundleArtifactIntegrity(fields, seenRoles, seenFiles) {
142
+ const { role, fileName, sha256 } = fields;
129
143
  if (!VALID_BUNDLE_ROLES.has(role)) {
130
144
  throw new Error(`Invalid bundle artifact: unsupported role '${role}'`);
131
145
  }
@@ -138,9 +152,6 @@ function assertBundleArtifactIntegrity(fields, seenRoles, seenFiles, bundleMajor
138
152
  if (seenFiles.has(fileName)) {
139
153
  throw new Error(`Invalid bundle artifact: duplicate fileName '${fileName}'`);
140
154
  }
141
- if (declaredSchemaVersion && bundleMajor && majorVersion(declaredSchemaVersion) !== bundleMajor) {
142
- throw new Error(`Invalid bundle artifact: '${fileName}' uses schemaVersion '${declaredSchemaVersion}' with a different major than the bundle`);
143
- }
144
155
  }
145
156
  function validateBundleHeader(obj) {
146
157
  requireSchemaVersion(obj, "euconform.bundle.v1", "bundle");
@@ -152,6 +163,76 @@ function validateBundleHeader(obj) {
152
163
  requireField(target, "name", "string", "bundle", "target.name");
153
164
  requireField(target, "rootPath", "string", "bundle", "target.rootPath");
154
165
  }
166
+ export function validateBiasReport(data) {
167
+ const obj = assertObject(data, "bias report");
168
+ requireSchemaVersion(obj, "euconform.bias.v1", "bias report");
169
+ requireField(obj, "generatedAt", "string", "bias report");
170
+ requireField(obj, "model", "string", "bias report");
171
+ requireField(obj, "dataset", "string", "bias report");
172
+ const result = requireField(obj, "result", "object", "bias report");
173
+ requireField(result, "score", "number", "bias report", "result.score");
174
+ requireField(result, "method", "string", "bias report", "result.method");
175
+ requireField(result, "pairsAnalyzed", "number", "bias report", "result.pairsAnalyzed");
176
+ requireField(result, "stereotypicalPreference", "number", "bias report", "result.stereotypicalPreference");
177
+ return data;
178
+ }
179
+ /**
180
+ * The ONE entry point for bias artifacts, dispatching on schemaVersion.
181
+ * `validate` (CLI) and `verify` both call this instead of picking their own
182
+ * validator, so they can no longer disagree on the same file.
183
+ *
184
+ * v1 keeps its existing (lenient) validation behaviour EXACTLY as before —
185
+ * `validateBiasReport` is untouched — but is now flagged `legacy: true` with a
186
+ * warning naming the incident. v2 is delegated to the shared semantic
187
+ * validator (`validate-bias-v2.ts`), which also recomputes statistics.
188
+ */
189
+ export function validateBiasArtifact(data) {
190
+ const obj = assertObject(data, "bias report");
191
+ if (obj.schemaVersion === "euconform.bias.v2") {
192
+ return { legacy: false, document: validateBiasReportV2(data) };
193
+ }
194
+ return {
195
+ legacy: true,
196
+ warning: V1_BIAS_LEGACY_WARNING,
197
+ document: validateBiasReport(data),
198
+ };
199
+ }
200
+ /**
201
+ * Shape check for `euconform.external-observation.v1`. The schema is the source
202
+ * of truth for shape (`euconform validate` delegates to it); this function is the
203
+ * programmatic entrypoint, mirroring the other document validators.
204
+ *
205
+ * It deliberately performs no interpretation: whether a declaration exists is
206
+ * data, and nothing here may turn `unknown` into permission.
207
+ */
208
+ export function validateExternalObservation(data) {
209
+ const label = "external observation";
210
+ const obj = assertObject(data, label);
211
+ requireSchemaVersion(obj, "euconform.external-observation.v1", label);
212
+ requireField(obj, "observationId", "string", label);
213
+ requireField(obj, "observedAt", "string", label);
214
+ const provider = requireField(obj, "provider", "object", label);
215
+ requireField(provider, "name", "string", label, "provider.name");
216
+ requireField(provider, "version", "string", label, "provider.version");
217
+ const subject = requireField(obj, "subject", "object", label);
218
+ requireField(subject, "kind", "string", label, "subject.kind");
219
+ requireField(subject, "identifier", "string", label, "subject.identifier");
220
+ requireField(subject, "retrievedAt", "string", label, "subject.retrievedAt");
221
+ const observation = requireField(obj, "observation", "object", label);
222
+ requireField(observation, "kind", "string", label, "observation.kind");
223
+ requireStringArray(observation, "intendedUse", label, "observation.intendedUse");
224
+ const result = requireField(observation, "result", "string", label, "observation.result");
225
+ if (result === "declared") {
226
+ const declaration = requireField(observation, "declaration", "object", label, "observation.declaration");
227
+ requireField(declaration, "text", "string", label, "observation.declaration.text");
228
+ requireField(declaration, "sha256", "string", label, "observation.declaration.sha256");
229
+ }
230
+ const limitations = requireStringArray(obj, "limitations", label);
231
+ if (limitations.length === 0) {
232
+ throw new Error(`Invalid ${label}: 'limitations' must name at least one coverage limit — an observation without stated limits is not reviewable`);
233
+ }
234
+ return data;
235
+ }
155
236
  export function validateScanBundle(data) {
156
237
  const obj = assertObject(data, "bundle");
157
238
  validateBundleHeader(obj);
@@ -161,12 +242,11 @@ export function validateScanBundle(data) {
161
242
  }
162
243
  const seenRoles = new Set();
163
244
  const seenFiles = new Set();
164
- const bundleMajor = majorVersion("euconform.bundle.v1");
165
245
  let hasRequiredReport = false;
166
246
  for (let index = 0; index < artifacts.length; index++) {
167
247
  const raw = assertObject(artifacts[index], "bundle artifact");
168
248
  const fields = readBundleArtifactFields(raw, index);
169
- assertBundleArtifactIntegrity(fields, seenRoles, seenFiles, bundleMajor);
249
+ assertBundleArtifactIntegrity(fields, seenRoles, seenFiles);
170
250
  seenRoles.add(fields.role);
171
251
  seenFiles.add(fields.fileName);
172
252
  if (fields.role === "report") {
@@ -189,6 +269,8 @@ export function validateEcefJsonDocument(schemaVersion, data) {
189
269
  return validateCiReport(data);
190
270
  case "euconform.bundle.v1":
191
271
  return validateScanBundle(data);
272
+ case "euconform.external-observation.v1":
273
+ return validateExternalObservation(data);
192
274
  default:
193
275
  throw new Error(`Unsupported EuConform Evidence Format schemaVersion '${schemaVersion}'`);
194
276
  }
@@ -2,9 +2,8 @@
2
2
  * Fairness Metrics for AI Bias Detection
3
3
  * Based on EU AI Act requirements for non-discrimination
4
4
  */
5
- import type { BrowserInference } from "./inference/browser-inference";
6
- import { type InferenceResult } from "./inference/inference-factory";
7
- import type { OllamaClient } from "./inference/ollama-client";
5
+ import type { SequenceLogProbProvider } from "./inference";
6
+ import type { InferenceResult } from "./inference/inference-factory";
8
7
  import type { BiasTestConfig, BiasTestResult, FairnessMetric, PredictionData } from "./types";
9
8
  /**
10
9
  * Calculate Disparate Impact Ratio
@@ -42,22 +41,27 @@ export declare function runFairnessAnalysis(data: PredictionData[], modelId: str
42
41
  * Run CrowS-Pairs bias analysis using the specified inference client
43
42
  * This is the preferred method for bias detection as it uses the CrowS-Pairs methodology
44
43
  */
45
- export declare function runCrowsPairsBiasAnalysis(config: BiasTestConfig, inferenceClient: BrowserInference | OllamaClient): Promise<BiasTestResult>;
44
+ export declare function runCrowsPairsBiasAnalysis(config: BiasTestConfig, inferenceClient: SequenceLogProbProvider): Promise<BiasTestResult>;
46
45
  /**
47
- * Run CrowS-Pairs bias analysis using InferenceFactory with automatic method detection
48
- * This version provides method metadata and automatic best method selection
46
+ * @deprecated Uses the removed Ollama logprob path; see bias --engine transformers.
47
+ * `InferenceFactory.createBiasCalculation` auto-selected between browser and
48
+ * Ollama engines, which no longer measures anything honest for Ollama — that
49
+ * auto-selection logic needs a real redesign (Task 3+), not a throw-or-convert
50
+ * fix, so this entry point is stilled rather than converted.
49
51
  */
50
- export declare function runCrowsPairsBiasAnalysisWithFactory(config: BiasTestConfig, statusCallback?: (status: string) => void): Promise<InferenceResult<BiasTestResult>>;
52
+ export declare function runCrowsPairsBiasAnalysisWithFactory(_config: BiasTestConfig, _statusCallback?: (status: string) => void): Promise<InferenceResult<BiasTestResult>>;
51
53
  /**
52
54
  * Run comprehensive bias analysis including both traditional metrics and CrowS-Pairs
53
55
  * Combines prediction-based fairness metrics with CrowS-Pairs stereotypical bias detection
54
56
  */
55
- export declare function runComprehensiveBiasAnalysis(predictionData: PredictionData[], crowsPairsConfig: BiasTestConfig, inferenceClient: BrowserInference | OllamaClient, protectedAttribute: string): Promise<BiasTestResult>;
57
+ export declare function runComprehensiveBiasAnalysis(predictionData: PredictionData[], crowsPairsConfig: BiasTestConfig, inferenceClient: SequenceLogProbProvider, protectedAttribute: string): Promise<BiasTestResult>;
56
58
  /**
57
- * Run comprehensive bias analysis using InferenceFactory with automatic method detection
58
- * Combines prediction-based fairness metrics with CrowS-Pairs stereotypical bias detection
59
+ * @deprecated Uses the removed Ollama logprob path via InferenceFactory's
60
+ * auto-selection; see bias --engine transformers. Stilled for the same reason
61
+ * as `runCrowsPairsBiasAnalysisWithFactory` — the factory's engine
62
+ * auto-selection needs a real redesign, not a throw-or-convert fix.
59
63
  */
60
- export declare function runComprehensiveBiasAnalysisWithFactory(predictionData: PredictionData[], crowsPairsConfig: BiasTestConfig, protectedAttribute: string, statusCallback?: (status: string) => void): Promise<InferenceResult<BiasTestResult>>;
64
+ export declare function runComprehensiveBiasAnalysisWithFactory(_predictionData: PredictionData[], _crowsPairsConfig: BiasTestConfig, _protectedAttribute: string, _statusCallback?: (status: string) => void): Promise<InferenceResult<BiasTestResult>>;
61
65
  /**
62
66
  * Generate simulated loan prediction data for demo purposes
63
67
  */
@@ -1 +1 @@
1
- {"version":3,"file":"fairness-metrics.d.ts","sourceRoot":"","sources":["../src/fairness-metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9F;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CA0BtE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CAsBlF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CAkDpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CAmCvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EAAE,EACtB,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,MAAM,GACzB,cAAc,CAoBhB;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,gBAAgB,GAAG,YAAY,GAC/C,OAAO,CAAC,cAAc,CAAC,CA+BzB;AAED;;;GAGG;AACH,wBAAsB,oCAAoC,CACxD,MAAM,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GACxC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAgD1C;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,cAAc,EAAE,cAAc,EAAE,EAChC,gBAAgB,EAAE,cAAc,EAChC,eAAe,EAAE,gBAAgB,GAAG,YAAY,EAChD,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,cAAc,CAAC,CAqDzB;AAED;;;GAGG;AACH,wBAAsB,uCAAuC,CAC3D,cAAc,EAAE,cAAc,EAAE,EAChC,gBAAgB,EAAE,cAAc,EAChC,kBAAkB,EAAE,MAAM,EAC1B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GACxC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAkF1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,SAAO,GAAG,cAAc,EAAE,CAmBjE"}
1
+ {"version":3,"file":"fairness-metrics.d.ts","sourceRoot":"","sources":["../src/fairness-metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9F;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CA0BtE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CAsBlF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CAkDpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,CAmCvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EAAE,EACtB,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,MAAM,GACzB,cAAc,CAoBhB;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,cAAc,CAAC,CAsBzB;AAED;;;;;;GAMG;AACH,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GACzC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAI1C;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,cAAc,EAAE,cAAc,EAAE,EAChC,gBAAgB,EAAE,cAAc,EAChC,eAAe,EAAE,uBAAuB,EACxC,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,cAAc,CAAC,CAqCzB;AAED;;;;;GAKG;AACH,wBAAsB,uCAAuC,CAC3D,eAAe,EAAE,cAAc,EAAE,EACjC,iBAAiB,EAAE,cAAc,EACjC,mBAAmB,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GACzC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAI1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,SAAO,GAAG,cAAc,EAAE,CAmBjE"}