@euconform/cli 1.2.0 → 1.3.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.
@@ -5,7 +5,7 @@ import {
5
5
  getPerplexity,
6
6
  listOllamaModels,
7
7
  ollamaGenerate
8
- } from "./chunk-JQTB43B2.js";
8
+ } from "./chunk-W32HNHWT.js";
9
9
  import "./chunk-JSBRDJBE.js";
10
10
  export {
11
11
  OllamaClient,
@@ -0,0 +1,138 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://euconform.eu/schemas/bias-v1.schema.json",
4
+ "title": "EuConform Bias Report v1",
5
+ "description": "Result of a CrowS-Pairs style bias measurement, including the method and sampling parameters needed to reproduce it.",
6
+ "type": "object",
7
+ "required": ["schemaVersion", "generatedAt", "model", "dataset", "result"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "schemaVersion": {
11
+ "const": "euconform.bias.v1"
12
+ },
13
+ "generatedAt": {
14
+ "type": "string",
15
+ "format": "date-time"
16
+ },
17
+ "model": {
18
+ "type": "string",
19
+ "minLength": 1,
20
+ "description": "Identifier of the measured model, e.g. 'phi3:3.8b'."
21
+ },
22
+ "dataset": {
23
+ "type": "string",
24
+ "minLength": 1,
25
+ "description": "Dataset the sentence pairs came from, e.g. 'crows_pairs_de'."
26
+ },
27
+ "result": {
28
+ "type": "object",
29
+ "required": ["score", "method", "pairsAnalyzed", "stereotypicalPreference"],
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "score": {
33
+ "type": "number",
34
+ "description": "Mean of log P(stereotype) - log P(anti-stereotype) across all analysed pairs."
35
+ },
36
+ "method": {
37
+ "type": "string",
38
+ "enum": ["logprobs_exact", "logprobs_fallback_latency"],
39
+ "description": "How the per-sentence probabilities were obtained. Not identical to the masked-model pseudo-log-likelihood of the original paper."
40
+ },
41
+ "pairsAnalyzed": {
42
+ "type": "integer",
43
+ "minimum": 1,
44
+ "description": "Pairs that produced a usable score; can be lower than the requested sample if entries were skipped."
45
+ },
46
+ "stereotypicalPreference": {
47
+ "type": "number",
48
+ "minimum": 0,
49
+ "maximum": 100,
50
+ "description": "Percentage of pairs where the stereotypical variant scored higher."
51
+ }
52
+ }
53
+ },
54
+ "sampling": {
55
+ "type": "object",
56
+ "required": ["datasetSize", "maxPairs", "seed"],
57
+ "additionalProperties": false,
58
+ "description": "What subset of the dataset was measured. Null values mean the full dataset was used.",
59
+ "properties": {
60
+ "datasetSize": {
61
+ "type": "integer",
62
+ "minimum": 1
63
+ },
64
+ "maxPairs": {
65
+ "type": ["integer", "null"],
66
+ "minimum": 1
67
+ },
68
+ "seed": {
69
+ "type": ["integer", "null"],
70
+ "minimum": 0,
71
+ "description": "Replaying this seed with the same maxPairs reproduces the selection."
72
+ }
73
+ }
74
+ },
75
+ "limitations": {
76
+ "type": "array",
77
+ "items": { "type": "string" },
78
+ "description": "Known constraints of this measurement, recorded alongside the number."
79
+ },
80
+ "catalog": {
81
+ "type": "object",
82
+ "description": "Provenance of a user-supplied question catalog. Absent when a bundled dataset was used — there is no catalog to attribute.",
83
+ "properties": {
84
+ "name": { "type": "string" },
85
+ "version": { "type": "string" },
86
+ "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
87
+ "pairCount": { "type": "integer", "minimum": 1 }
88
+ },
89
+ "required": ["name", "version", "sha256", "pairCount"],
90
+ "additionalProperties": false
91
+ },
92
+ "byBiasType": {
93
+ "type": "array",
94
+ "description": "Per-category aggregates over pairResults. The overall score hides these.",
95
+ "items": {
96
+ "type": "object",
97
+ "properties": {
98
+ "biasType": { "type": "string" },
99
+ "pairsCount": { "type": "integer", "minimum": 1 },
100
+ "stereotypePreferenceCount": { "type": "integer", "minimum": 0 },
101
+ "stereotypePreferencePercent": { "type": "number", "minimum": 0, "maximum": 100 },
102
+ "averageBiasScore": { "type": "number" }
103
+ },
104
+ "required": [
105
+ "biasType",
106
+ "pairsCount",
107
+ "stereotypePreferenceCount",
108
+ "stereotypePreferencePercent",
109
+ "averageBiasScore"
110
+ ],
111
+ "additionalProperties": false
112
+ }
113
+ },
114
+ "pairResults": {
115
+ "type": "array",
116
+ "description": "One entry per analysed sentence pair, enabling third-party recomputation of the aggregate score.",
117
+ "items": {
118
+ "type": "object",
119
+ "properties": {
120
+ "pairId": { "type": ["integer", "null"] },
121
+ "stereotype": { "type": "string" },
122
+ "antiStereotype": { "type": "string" },
123
+ "biasType": { "type": ["string", "null"] },
124
+ "stereotypeLogProb": { "type": "number" },
125
+ "antiStereotypeLogProb": { "type": "number" },
126
+ "biasScore": { "type": "number" },
127
+ "biasDirection": {
128
+ "type": "string",
129
+ "enum": ["stereotype", "anti-stereotype", "neutral"]
130
+ },
131
+ "method": { "type": "string" }
132
+ },
133
+ "required": ["stereotype", "antiStereotype", "biasScore", "biasDirection", "method"],
134
+ "additionalProperties": false
135
+ }
136
+ }
137
+ }
138
+ }
@@ -0,0 +1,255 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://euconform.eu/schemas/bias-v2.schema.json",
4
+ "title": "EuConform Bias Report v2",
5
+ "description": "Result of the autoregressive CrowS-Pairs adaptation bias measurement. Mandatory measurement provenance and self-checkable statistics (recomputed by the shared semantic validator from pairResults). v1 is legacy: its 'logprobs_exact' method label was unreliable (see Messmotor-Sanierung Task 3).",
6
+ "type": "object",
7
+ "required": [
8
+ "schemaVersion",
9
+ "generatedAt",
10
+ "model",
11
+ "dataset",
12
+ "provenance",
13
+ "sampling",
14
+ "result",
15
+ "runStatus",
16
+ "selectedCount",
17
+ "analyzedCount",
18
+ "failedCount",
19
+ "failedPairs",
20
+ "statistics",
21
+ "pairResults"
22
+ ],
23
+ "additionalProperties": false,
24
+ "$defs": {
25
+ "wilsonInterval": {
26
+ "type": ["object", "null"],
27
+ "additionalProperties": false,
28
+ "required": ["lower", "upper"],
29
+ "properties": {
30
+ "lower": { "type": "number" },
31
+ "upper": { "type": "number" }
32
+ }
33
+ },
34
+ "categoryStatistics": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": [
38
+ "biasType",
39
+ "analyzedCount",
40
+ "preferenceCount",
41
+ "tiesCount",
42
+ "preferencePercent",
43
+ "preferenceWilson95"
44
+ ],
45
+ "properties": {
46
+ "biasType": { "type": "string" },
47
+ "analyzedCount": { "type": "integer", "minimum": 1 },
48
+ "preferenceCount": { "type": "integer", "minimum": 0 },
49
+ "tiesCount": { "type": "integer", "minimum": 0 },
50
+ "preferencePercent": { "type": "number", "minimum": 0, "maximum": 100 },
51
+ "preferenceWilson95": { "$ref": "#/$defs/wilsonInterval" }
52
+ }
53
+ },
54
+ "pairResult": {
55
+ "type": "object",
56
+ "additionalProperties": false,
57
+ "required": [
58
+ "pairId",
59
+ "stereotype",
60
+ "antiStereotype",
61
+ "biasType",
62
+ "stereotypeLogProb",
63
+ "antiStereotypeLogProb",
64
+ "biasScore",
65
+ "biasDirection",
66
+ "method",
67
+ "stereotypeTokenCount",
68
+ "antiStereotypeTokenCount",
69
+ "tokenCountDelta",
70
+ "stereotypeTokenHash",
71
+ "antiStereotypeTokenHash"
72
+ ],
73
+ "properties": {
74
+ "pairId": { "type": ["integer", "null"] },
75
+ "stereotype": { "type": "string" },
76
+ "antiStereotype": { "type": "string" },
77
+ "biasType": { "type": ["string", "null"] },
78
+ "stereotypeLogProb": { "type": "number" },
79
+ "antiStereotypeLogProb": { "type": "number" },
80
+ "biasScore": { "type": "number" },
81
+ "biasDirection": {
82
+ "type": "string",
83
+ "enum": ["stereotype", "anti-stereotype", "neutral"]
84
+ },
85
+ "method": {
86
+ "type": "string",
87
+ "enum": ["sequence_logprob_sum", "conditional_sequence_logprob_sum"]
88
+ },
89
+ "stereotypeTokenCount": { "type": "integer", "minimum": 0 },
90
+ "antiStereotypeTokenCount": { "type": "integer", "minimum": 0 },
91
+ "tokenCountDelta": { "type": "integer" },
92
+ "stereotypeTokenHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
93
+ "antiStereotypeTokenHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
94
+ }
95
+ },
96
+ "failedPair": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": ["pairId", "reason"],
100
+ "properties": {
101
+ "pairId": { "type": ["integer", "null"] },
102
+ "reason": { "type": "string" }
103
+ }
104
+ }
105
+ },
106
+ "properties": {
107
+ "schemaVersion": { "const": "euconform.bias.v2" },
108
+ "generatedAt": { "type": "string", "format": "date-time" },
109
+ "model": { "type": "string", "minLength": 1 },
110
+ "dataset": { "type": "string", "minLength": 1 },
111
+ "provenance": {
112
+ "type": "object",
113
+ "additionalProperties": false,
114
+ "required": [
115
+ "engine",
116
+ "modelId",
117
+ "modelRevision",
118
+ "tokenizerId",
119
+ "transformersVersion",
120
+ "onnxruntimeVersion",
121
+ "dtype",
122
+ "backend",
123
+ "templateStrategy"
124
+ ],
125
+ "properties": {
126
+ "engine": { "const": "transformers" },
127
+ "modelId": { "type": "string", "minLength": 1 },
128
+ "modelRevision": {
129
+ "type": "string",
130
+ "pattern": "^[0-9a-fA-F]{40}$",
131
+ "description": "Resolved immutable commit SHA, never a mutable ref like 'main'."
132
+ },
133
+ "tokenizerId": { "type": "string", "minLength": 1 },
134
+ "transformersVersion": { "type": "string", "minLength": 1 },
135
+ "onnxruntimeVersion": {
136
+ "type": "string",
137
+ "minLength": 1,
138
+ "description": "Installed onnxruntime-node version. Ergebnisrelevant: a native ONNX Runtime version bump (e.g. 1.14.0 -> 1.24.3 across the @xenova/transformers -> @huggingface/transformers migration) has been observed to shift sequence log-probabilities at the 1e-6 relative level even with byte-identical model weights and dtype (Messmotor-Sanierung Task 4). Must be resolved from the installed package, never a placeholder."
139
+ },
140
+ "dtype": { "type": "string", "minLength": 1 },
141
+ "backend": { "const": "node-onnx" },
142
+ "templateStrategy": { "type": "string", "enum": ["none", "fixed_template_span"] },
143
+ "promptText": { "type": "string" },
144
+ "promptSha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
145
+ "contextTokenHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
146
+ },
147
+ "if": {
148
+ "properties": { "templateStrategy": { "const": "fixed_template_span" } }
149
+ },
150
+ "then": {
151
+ "required": ["promptText", "promptSha256", "contextTokenHash"]
152
+ }
153
+ },
154
+ "sampling": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": ["mode", "datasetSize", "maxPairs", "seed", "datasetSha256", "pairIds"],
158
+ "properties": {
159
+ "mode": { "type": "string", "enum": ["seeded_sample", "full"] },
160
+ "datasetSize": { "type": "integer", "minimum": 1 },
161
+ "maxPairs": { "type": ["integer", "null"], "minimum": 1 },
162
+ "seed": { "type": ["integer", "null"], "minimum": 0 },
163
+ "datasetSha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
164
+ "pairIds": {
165
+ "type": "array",
166
+ "items": { "type": ["integer", "null"] }
167
+ }
168
+ }
169
+ },
170
+ "result": {
171
+ "type": "object",
172
+ "additionalProperties": false,
173
+ "required": ["score", "method", "pairsAnalyzed"],
174
+ "properties": {
175
+ "score": { "type": "number" },
176
+ "method": {
177
+ "type": "string",
178
+ "enum": ["sequence_logprob_sum", "conditional_sequence_logprob_sum"]
179
+ },
180
+ "pairsAnalyzed": { "type": "integer", "minimum": 1 }
181
+ }
182
+ },
183
+ "runStatus": { "type": "string", "enum": ["complete", "partial"] },
184
+ "selectedCount": { "type": "integer", "minimum": 1 },
185
+ "analyzedCount": { "type": "integer", "minimum": 1 },
186
+ "failedCount": { "type": "integer", "minimum": 0 },
187
+ "failedPairs": {
188
+ "type": "array",
189
+ "items": { "$ref": "#/$defs/failedPair" }
190
+ },
191
+ "statistics": {
192
+ "type": "object",
193
+ "additionalProperties": false,
194
+ "required": [
195
+ "analyzedCount",
196
+ "preferenceCount",
197
+ "tiesCount",
198
+ "preferencePercent",
199
+ "preferenceWilson95",
200
+ "byBiasType",
201
+ "pairDiffQuartiles",
202
+ "equalTokenPairsCount",
203
+ "equalTokenPreferenceCount",
204
+ "equalTokenPreferencePercent",
205
+ "equalTokenPreferenceWilson95"
206
+ ],
207
+ "properties": {
208
+ "analyzedCount": { "type": "integer", "minimum": 1 },
209
+ "preferenceCount": { "type": "integer", "minimum": 0 },
210
+ "tiesCount": { "type": "integer", "minimum": 0 },
211
+ "preferencePercent": { "type": "number", "minimum": 0, "maximum": 100 },
212
+ "preferenceWilson95": { "$ref": "#/$defs/wilsonInterval" },
213
+ "byBiasType": {
214
+ "type": "array",
215
+ "items": { "$ref": "#/$defs/categoryStatistics" }
216
+ },
217
+ "pairDiffQuartiles": {
218
+ "type": ["object", "null"],
219
+ "additionalProperties": false,
220
+ "required": ["min", "max", "median", "q1", "q3"],
221
+ "properties": {
222
+ "min": { "type": "number" },
223
+ "max": { "type": "number" },
224
+ "median": { "type": "number" },
225
+ "q1": { "type": "number" },
226
+ "q3": { "type": "number" }
227
+ }
228
+ },
229
+ "equalTokenPairsCount": { "type": "integer", "minimum": 0 },
230
+ "equalTokenPreferenceCount": { "type": "integer", "minimum": 0 },
231
+ "equalTokenPreferencePercent": { "type": ["number", "null"], "minimum": 0, "maximum": 100 },
232
+ "equalTokenPreferenceWilson95": { "$ref": "#/$defs/wilsonInterval" }
233
+ }
234
+ },
235
+ "pairResults": {
236
+ "type": "array",
237
+ "items": { "$ref": "#/$defs/pairResult" }
238
+ },
239
+ "limitations": {
240
+ "type": "array",
241
+ "items": { "type": "string" }
242
+ },
243
+ "catalog": {
244
+ "type": "object",
245
+ "additionalProperties": false,
246
+ "required": ["name", "version", "sha256", "pairCount"],
247
+ "properties": {
248
+ "name": { "type": "string" },
249
+ "version": { "type": "string" },
250
+ "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
251
+ "pairCount": { "type": "integer", "minimum": 1 }
252
+ }
253
+ }
254
+ }
255
+ }
@@ -45,7 +45,7 @@
45
45
  "additionalProperties": false,
46
46
  "properties": {
47
47
  "role": {
48
- "enum": ["report", "aibom", "ci", "summary"]
48
+ "enum": ["report", "aibom", "ci", "summary", "bias"]
49
49
  },
50
50
  "fileName": { "type": "string" },
51
51
  "sha256": {
@@ -0,0 +1,139 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://euconform.eu/schemas/external-observation-v1.schema.json",
4
+ "title": "EuConform External Observation v1",
5
+ "description": "Provider-neutral envelope for an externally produced, time-stamped observation of a machine-readable declaration (rights, AI use, licence metadata, robots policy). An observation is NOT a licence, NOT an ownership determination, NOT proof of use and NOT permission. Absence of a declaration is recorded as such ('not-declared'/'unknown') and MUST never be read as permission. The envelope carries no field that could express permission on purpose.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schemaVersion",
10
+ "observationId",
11
+ "observedAt",
12
+ "provider",
13
+ "subject",
14
+ "observation",
15
+ "limitations"
16
+ ],
17
+ "$defs": {
18
+ "sha256": {
19
+ "type": "string",
20
+ "pattern": "^[0-9a-f]{64}$"
21
+ },
22
+ "dateTime": {
23
+ "type": "string",
24
+ "format": "date-time"
25
+ }
26
+ },
27
+ "properties": {
28
+ "schemaVersion": { "const": "euconform.external-observation.v1" },
29
+ "observationId": {
30
+ "type": "string",
31
+ "minLength": 1,
32
+ "description": "Provider-scoped unique id for this observation, so the exact record can be cited and re-fetched."
33
+ },
34
+ "observedAt": {
35
+ "$ref": "#/$defs/dateTime",
36
+ "description": "When the provider observed the declaration. Not when the artifact was exported."
37
+ },
38
+ "provider": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["name", "version"],
42
+ "description": "Who produced the observation. Identification only — no field here changes the meaning of the result.",
43
+ "properties": {
44
+ "name": { "type": "string", "minLength": 1 },
45
+ "version": { "type": "string", "minLength": 1 },
46
+ "endpoint": { "type": "string", "minLength": 1 },
47
+ "contact": { "type": "string", "minLength": 1 }
48
+ }
49
+ },
50
+ "subject": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["kind", "identifier", "retrievedAt"],
54
+ "properties": {
55
+ "kind": {
56
+ "type": "string",
57
+ "enum": ["url", "repository", "dataset", "artifact"]
58
+ },
59
+ "identifier": {
60
+ "type": "string",
61
+ "minLength": 1,
62
+ "description": "What was observed, e.g. the source URL or repository identifier."
63
+ },
64
+ "retrievedAt": {
65
+ "$ref": "#/$defs/dateTime",
66
+ "description": "When the subject content was fetched. Together with observedAt this bounds the validity of the statement."
67
+ },
68
+ "contentSha256": {
69
+ "$ref": "#/$defs/sha256",
70
+ "description": "Optional hash of the observed subject content, so a third party can check that the same bytes were seen."
71
+ }
72
+ }
73
+ },
74
+ "observation": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "required": ["kind", "intendedUse", "result"],
78
+ "properties": {
79
+ "kind": {
80
+ "type": "string",
81
+ "enum": [
82
+ "rights-declaration",
83
+ "ai-use-declaration",
84
+ "license-metadata",
85
+ "robots-policy",
86
+ "terms-of-service"
87
+ ]
88
+ },
89
+ "intendedUse": {
90
+ "type": "array",
91
+ "minItems": 1,
92
+ "items": { "type": "string", "minLength": 1 },
93
+ "description": "What the declaration was queried about, in the provider's own vocabulary (e.g. ai-input, ai-train). Deliberately free-form: no shared vocabulary exists yet, and inventing one here would hide provider-specific gaps."
94
+ },
95
+ "result": {
96
+ "type": "string",
97
+ "enum": ["declared", "not-declared", "unknown", "not-applicable"],
98
+ "description": "'declared' means a supported machine-readable declaration was visible at observedAt — NOT that the intended use is permitted. 'unknown' means the provider could not determine anything and MUST NOT be turned into permission."
99
+ },
100
+ "declaration": {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "required": ["text", "sha256"],
104
+ "description": "The declaration as observed. Required when result is 'declared' so the claim is checkable rather than asserted.",
105
+ "properties": {
106
+ "text": { "type": "string", "minLength": 1 },
107
+ "sha256": { "$ref": "#/$defs/sha256" },
108
+ "url": { "type": "string", "minLength": 1 },
109
+ "license": { "type": "string", "minLength": 1 }
110
+ }
111
+ }
112
+ },
113
+ "if": {
114
+ "required": ["result"],
115
+ "properties": { "result": { "const": "declared" } }
116
+ },
117
+ "then": { "required": ["declaration"] }
118
+ },
119
+ "limitations": {
120
+ "type": "array",
121
+ "minItems": 1,
122
+ "items": { "type": "string", "minLength": 1 },
123
+ "description": "Mandatory coverage limits of this observation (e.g. 'coverage limited to reviewed origins'). An observation without stated limits is not reviewable."
124
+ },
125
+ "signature": {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "required": ["algorithm", "keyId", "value", "signedPayloadSha256"],
129
+ "description": "Optional integrity proof over the observation payload. Unsigned observations are still valid evidence, but a consumer must treat them as unverified.",
130
+ "properties": {
131
+ "algorithm": { "type": "string", "minLength": 1 },
132
+ "keyId": { "type": "string", "minLength": 1 },
133
+ "value": { "type": "string", "minLength": 1 },
134
+ "signedPayloadSha256": { "$ref": "#/$defs/sha256" },
135
+ "verifyUrl": { "type": "string", "minLength": 1 }
136
+ }
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,11 @@
1
+ import {
2
+ writeBundleManifest,
3
+ writeOutputFiles,
4
+ writeZipBundle
5
+ } from "./chunk-IWTPVCP2.js";
6
+ import "./chunk-JSBRDJBE.js";
7
+ export {
8
+ writeBundleManifest,
9
+ writeOutputFiles,
10
+ writeZipBundle
11
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@euconform/cli",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "license": "MIT OR EUPL-1.2",
5
5
  "author": "Benedikt Hiepler",
6
6
  "description": "CLI scanner and bundle verifier for the EuConform Evidence Format and offline EU AI Act evidence.",
@@ -38,10 +38,12 @@
38
38
  ".": "./src/index.ts"
39
39
  },
40
40
  "dependencies": {
41
+ "@huggingface/transformers": "^4.2.0",
42
+ "onnxruntime-node": "1.24.3",
41
43
  "citty": "^0.1.6",
42
44
  "consola": "^3.4.0",
43
45
  "fflate": "^0.8.2",
44
- "@euconform/core": "1.5.0"
46
+ "@euconform/core": "1.6.0"
45
47
  },
46
48
  "devDependencies": {
47
49
  "@types/node": "^22.15.30",
@@ -1,11 +0,0 @@
1
- // src/bias/severity.ts
2
- function formatBiasSeverity(score) {
3
- const abs = Math.abs(score);
4
- if (abs > 0.3) return "Strong Bias";
5
- if (abs > 0.1) return "Light Bias";
6
- return "Minimal Bias";
7
- }
8
-
9
- export {
10
- formatBiasSeverity
11
- };