eval-quality 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +142 -67
- package/corpus/dev/README.md +17 -11
- package/corpus/dev/compile-seal-example/brief.json +1 -1
- package/corpus/dev/compile-seal-example/contract.json +1 -1
- package/corpus/dev/contracts/absent-collection-locations.json +1 -1
- package/corpus/dev/contracts/absent-sibling-groups.json +1 -1
- package/corpus/dev/contracts/absent-success-indicator.json +1 -1
- package/corpus/dev/contracts/empty-channel-roles.json +1 -1
- package/corpus/dev/contracts/empty-collection-locations.json +1 -1
- package/corpus/dev/contracts/empty-request-shapes.json +1 -1
- package/corpus/dev/contracts/empty-sibling-groups.json +1 -1
- package/corpus/dev/contracts/no-collection-quantifier.json +1 -1
- package/corpus/dev/contracts/no-operation-inventory.json +1 -1
- package/corpus/dev/contracts/no-read-back-relation.json +1 -1
- package/corpus/dev/contracts/no-state-change-marker.json +1 -1
- package/corpus/dev/contracts/no-type-violating-step.json +1 -1
- package/corpus/dev/contracts/per-key-split-oracles.json +1 -1
- package/corpus/dev/contracts/satisfied-declarations.json +1 -1
- package/corpus/dev/contracts/single-required-response-key.json +1 -1
- package/corpus/dev/contracts/split-indicator-oracle.json +1 -1
- package/corpus/dev/contracts/unaddressed-parameter-sibling.json +1 -1
- package/corpus/dev/contracts/unnamed-reference-set.json +1 -1
- package/corpus/dev/contracts/wrong-cardinality-form.json +1 -1
- package/corpus/dev/index.json +1 -1
- package/dist/application/index.d.ts +2 -0
- package/dist/application/index.js +1 -0
- package/dist/application/score.d.ts +48 -0
- package/dist/application/score.js +186 -0
- package/dist/cli/arguments.d.ts +7 -3
- package/dist/cli/arguments.js +73 -5
- package/dist/cli/exit-codes.d.ts +6 -2
- package/dist/cli/exit-codes.js +8 -9
- package/dist/cli/main.js +9 -0
- package/dist/cli/render.d.ts +1 -1
- package/dist/cli/render.js +6 -4
- package/dist/cli/run.d.ts +13 -3
- package/dist/cli/run.js +136 -16
- package/dist/core/canonical/canonicalize.d.ts +12 -0
- package/dist/core/canonical/canonicalize.js +18 -4
- package/dist/core/compile/bindings.d.ts +70 -0
- package/dist/core/compile/bindings.js +317 -0
- package/dist/core/compile/compile.d.ts +5 -0
- package/dist/core/compile/compile.js +9 -0
- package/dist/core/compile/expression-legality.d.ts +49 -0
- package/dist/core/compile/expression-legality.js +105 -31
- package/dist/core/compile/forbidden-inputs.d.ts +8 -1
- package/dist/core/compile/forbidden-inputs.js +16 -3
- package/dist/core/compile/interface-inventory.d.ts +23 -1
- package/dist/core/compile/interface-inventory.js +32 -3
- package/dist/core/compile/reachability.d.ts +18 -1
- package/dist/core/compile/reachability.js +46 -1
- package/dist/core/compile/sensitivity-witness.d.ts +1 -1
- package/dist/core/compile/sensitivity-witness.js +1 -1
- package/dist/core/emit/emit.d.ts +9 -0
- package/dist/core/emit/emit.js +214 -0
- package/dist/core/emit/private-artifact-digest.d.ts +11 -0
- package/dist/core/emit/private-artifact-digest.js +31 -0
- package/dist/core/evaluate/evidence-resolution.d.ts +11 -1
- package/dist/core/evaluate/evidence-resolution.js +4 -1
- package/dist/core/failure-codes.d.ts +2 -2
- package/dist/core/failure-codes.js +4 -2
- package/dist/core/ingest/conditions.d.ts +201 -0
- package/dist/core/ingest/conditions.js +48 -0
- package/dist/core/ingest/index.d.ts +13 -0
- package/dist/core/ingest/index.js +11 -0
- package/dist/core/ingest/ingest.d.ts +68 -0
- package/dist/core/ingest/ingest.js +310 -0
- package/dist/core/lineage/stage-table.d.ts +21 -4
- package/dist/core/lineage/stage-table.js +35 -3
- package/dist/core/preflight/witness-evidence.js +10 -0
- package/dist/core/schemas/artifact.d.ts +385 -14
- package/dist/core/schemas/constraint-ledger.js +40 -0
- package/dist/core/schemas/defect-signature.d.ts +273 -0
- package/dist/core/schemas/defect-signature.js +127 -0
- package/dist/core/schemas/eval-contract.d.ts +33 -0
- package/dist/core/schemas/eval-contract.js +14 -0
- package/dist/core/schemas/evidence-artifact.d.ts +99 -19
- package/dist/core/schemas/evidence-artifact.js +64 -8
- package/dist/core/schemas/plan.d.ts +112 -0
- package/dist/core/schemas/plan.js +67 -2
- package/dist/core/schemas/probe-qualification.d.ts +168 -0
- package/dist/core/schemas/probe-qualification.js +106 -0
- package/dist/core/schemas/probe.d.ts +312 -0
- package/dist/core/schemas/probe.js +6 -2
- package/dist/core/schemas/scoring-policy.d.ts +1 -0
- package/dist/core/schemas/scoring-policy.js +6 -1
- package/dist/core/schemas/sealed-evaluator-brief.d.ts +1 -0
- package/dist/core/schemas/sealed-evaluator-brief.js +4 -1
- package/dist/core/schemas/sealed-run-record.d.ts +30 -3
- package/dist/core/schemas/sealed-run-record.js +37 -5
- package/dist/core/score/binding-order.d.ts +31 -0
- package/dist/core/score/binding-order.js +88 -0
- package/dist/core/score/bindings.d.ts +93 -0
- package/dist/core/score/bindings.js +297 -0
- package/dist/core/score/ladder-table.d.ts +23 -0
- package/dist/core/score/ladder-table.js +109 -0
- package/dist/core/score/ladder.d.ts +229 -0
- package/dist/core/score/ladder.js +464 -0
- package/dist/core/score/mode-agreement.d.ts +30 -0
- package/dist/core/score/mode-agreement.js +16 -0
- package/dist/core/score/outcome-table.d.ts +17 -0
- package/dist/core/score/outcome-table.js +172 -0
- package/dist/core/score/outcome.d.ts +466 -0
- package/dist/core/score/outcome.js +562 -0
- package/dist/core/score/qualification.d.ts +83 -0
- package/dist/core/score/qualification.js +615 -0
- package/dist/core/score/quotation.d.ts +79 -0
- package/dist/core/score/quotation.js +201 -0
- package/dist/core/score/reduce-trials.d.ts +80 -0
- package/dist/core/score/reduce-trials.js +90 -0
- package/dist/core/score/score.d.ts +72 -0
- package/dist/core/score/score.js +581 -0
- package/dist/core/score/selection.d.ts +80 -0
- package/dist/core/score/selection.js +98 -0
- package/dist/core/score/strength.d.ts +49 -0
- package/dist/core/score/strength.js +193 -0
- package/dist/core/score/witness.d.ts +117 -0
- package/dist/core/score/witness.js +315 -0
- package/dist/core/seal/derived-reference.d.ts +1 -1
- package/dist/core/seal/derived-reference.js +236 -28
- package/dist/core/seal/seal.js +8 -3
- package/dist/core/stage-contracts.d.ts +62 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +1 -0
- package/package.json +12 -3
- package/schemas/eval-contract.schema.json +100 -2
- package/schemas/evidence-artifact.schema.json +96 -9
- package/schemas/probe.schema.json +508 -3
- package/schemas/scoring-policy.schema.json +8 -1
- package/schemas/sealed-evaluator-brief.schema.json +11 -1
- package/schemas/sealed-run-record.schema.json +19 -2
|
@@ -1069,13 +1069,23 @@
|
|
|
1069
1069
|
}
|
|
1070
1070
|
],
|
|
1071
1071
|
"description": "The temporal clause: the identifier of an earlier step, or `null`. That the named step carries no clause of its own is AD-39's one-level bound, which fires `nested-temporal-clause` at compile time and is deliberately not enforced here, so the code keeps a shape to fire on."
|
|
1072
|
+
},
|
|
1073
|
+
"cardinality": {
|
|
1074
|
+
"type": "string",
|
|
1075
|
+
"enum": [
|
|
1076
|
+
"exactly-one",
|
|
1077
|
+
"at-most-one",
|
|
1078
|
+
"any"
|
|
1079
|
+
],
|
|
1080
|
+
"description": "AD-39's declared selector cardinality (owed item 2): `exactly-one` or `at-most-one` when the step expects a single matching observation, `any` when several are legitimate. Several matches under `exactly-one`/`at-most-one` is the named ambiguity condition; a reference selection function returns it as data. Required rather than optional, which makes this a BREAKING `schemaVersion` bump under AD-11: adding an optional field is additive, and this field is not optional."
|
|
1072
1081
|
}
|
|
1073
1082
|
},
|
|
1074
1083
|
"required": [
|
|
1075
1084
|
"stepId",
|
|
1076
1085
|
"operationId",
|
|
1077
1086
|
"inputBinding",
|
|
1078
|
-
"after"
|
|
1087
|
+
"after",
|
|
1088
|
+
"cardinality"
|
|
1079
1089
|
],
|
|
1080
1090
|
"additionalProperties": false
|
|
1081
1091
|
},
|
|
@@ -1148,11 +1158,71 @@
|
|
|
1148
1158
|
"type": "null"
|
|
1149
1159
|
}
|
|
1150
1160
|
]
|
|
1161
|
+
},
|
|
1162
|
+
"principals": {
|
|
1163
|
+
"anyOf": [
|
|
1164
|
+
{
|
|
1165
|
+
"type": "object",
|
|
1166
|
+
"propertyNames": {
|
|
1167
|
+
"type": "string",
|
|
1168
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
1169
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
1170
|
+
},
|
|
1171
|
+
"additionalProperties": {
|
|
1172
|
+
"type": "object",
|
|
1173
|
+
"properties": {
|
|
1174
|
+
"kind": {
|
|
1175
|
+
"type": "string",
|
|
1176
|
+
"minLength": 1
|
|
1177
|
+
}
|
|
1178
|
+
},
|
|
1179
|
+
"required": [
|
|
1180
|
+
"kind"
|
|
1181
|
+
],
|
|
1182
|
+
"additionalProperties": false
|
|
1183
|
+
}
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
"type": "null"
|
|
1187
|
+
}
|
|
1188
|
+
],
|
|
1189
|
+
"description": "Owed item 3: the principals a `{ principal }` input binding may name. Caller-keyed by name, which makes a duplicate declaration unrepresentable, and valueless, since AD-19 forbids a credential value in a declaration and AD-18 keeps the name an opaque label. `null`, `{}`, and a populated map are three distinct answers, on `referenceSets`' own reasoning. A binding naming a key absent here still parses; it fires `undeclared-mandatory-input` at compile time in strict mode, because a cross-subtree constraint reaching from `interactionPlan` into this field cannot survive the export. Required, not optional, which makes this and `resources` below together the eval contract's `schemaVersion` 2 -> 3 BREAKING bump under AD-11, whose rule is that \"adding an optional field is a `schemaVersion` bump recorded in the field's own description; removing or retyping is breaking\". `null` is the legal spelling for a contract declaring none, but `TestData` is a `strictObject` and the key itself must be present, so no version-2 contract parses."
|
|
1190
|
+
},
|
|
1191
|
+
"resources": {
|
|
1192
|
+
"anyOf": [
|
|
1193
|
+
{
|
|
1194
|
+
"type": "object",
|
|
1195
|
+
"propertyNames": {
|
|
1196
|
+
"type": "string",
|
|
1197
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
1198
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
1199
|
+
},
|
|
1200
|
+
"additionalProperties": {
|
|
1201
|
+
"type": "object",
|
|
1202
|
+
"properties": {
|
|
1203
|
+
"kind": {
|
|
1204
|
+
"type": "string",
|
|
1205
|
+
"minLength": 1
|
|
1206
|
+
}
|
|
1207
|
+
},
|
|
1208
|
+
"required": [
|
|
1209
|
+
"kind"
|
|
1210
|
+
],
|
|
1211
|
+
"additionalProperties": false
|
|
1212
|
+
}
|
|
1213
|
+
},
|
|
1214
|
+
{
|
|
1215
|
+
"type": "null"
|
|
1216
|
+
}
|
|
1217
|
+
],
|
|
1218
|
+
"description": "Test-data resources, declared the same way as `principals` above. Any entry fires `scoped-reference-resolves-forbidden` at compile time exactly as a `scopedResources` entry does: a resource the contract points the evaluator at is a scoped reference wherever it is written down (AD-16). Required on the same terms as `principals`, and the other half of the eval contract's `schemaVersion` 2 -> 3 BREAKING bump under AD-11: `null` is the empty spelling and the key is mandatory."
|
|
1151
1219
|
}
|
|
1152
1220
|
},
|
|
1153
1221
|
"required": [
|
|
1154
1222
|
"setup",
|
|
1155
|
-
"cleanup"
|
|
1223
|
+
"cleanup",
|
|
1224
|
+
"principals",
|
|
1225
|
+
"resources"
|
|
1156
1226
|
],
|
|
1157
1227
|
"additionalProperties": false
|
|
1158
1228
|
},
|
|
@@ -2130,6 +2200,34 @@
|
|
|
2130
2200
|
"matcher"
|
|
2131
2201
|
],
|
|
2132
2202
|
"additionalProperties": false
|
|
2203
|
+
},
|
|
2204
|
+
{
|
|
2205
|
+
"type": "object",
|
|
2206
|
+
"properties": {
|
|
2207
|
+
"captured": {
|
|
2208
|
+
"type": "string",
|
|
2209
|
+
"pattern": "^\\/interactions\\/[a-z0-9]+(?:-[a-z0-9]+)*\\/(?:(?:response-body|response-headers|stdout|stderr)(?:\\/(?:[^/~]|~[01])*)*|(?:response-status|exit-code)|call-inputs\\/(?:path|query|header|body)(?:\\/(?:[^/~]|~[01])*)*)$",
|
|
2210
|
+
"description": "AD-26 interaction-rooted pointer: \"/interactions/{stepId}/\" followed by one channel of the closed vocabulary. `call-inputs` takes one of the four transport channels as its next segment; `response-status` and `exit-code` take no tail. Syntax only: whether the step exists and whether the evidence is reachable are compile-time checks, not schema checks."
|
|
2211
|
+
}
|
|
2212
|
+
},
|
|
2213
|
+
"required": [
|
|
2214
|
+
"captured"
|
|
2215
|
+
],
|
|
2216
|
+
"additionalProperties": false
|
|
2217
|
+
},
|
|
2218
|
+
{
|
|
2219
|
+
"type": "object",
|
|
2220
|
+
"properties": {
|
|
2221
|
+
"principal": {
|
|
2222
|
+
"type": "string",
|
|
2223
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
2224
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
2225
|
+
}
|
|
2226
|
+
},
|
|
2227
|
+
"required": [
|
|
2228
|
+
"principal"
|
|
2229
|
+
],
|
|
2230
|
+
"additionalProperties": false
|
|
2133
2231
|
}
|
|
2134
2232
|
]
|
|
2135
2233
|
}
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"scoringVersion": {
|
|
38
38
|
"type": "string",
|
|
39
39
|
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
40
|
-
"description": "AD-11: computed by the scorer over the
|
|
40
|
+
"description": "AD-11: computed by the scorer over the six named inputs below and never caller-supplied."
|
|
41
41
|
},
|
|
42
42
|
"scoringVersionInputs": {
|
|
43
43
|
"type": "object",
|
|
@@ -66,6 +66,11 @@
|
|
|
66
66
|
"type": "string",
|
|
67
67
|
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
68
68
|
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
69
|
+
},
|
|
70
|
+
"mode": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"const": "production",
|
|
73
|
+
"description": "Owed item 4's identity clause: mode enters AD-11's scoring version, superseding AD-11's five-field sentence. Read from the sealed run record, never re-derived, so two runs scored under one mode never collide with a version computed for the other. Required, not optional, which makes this the evidence artifact's `schemaVersion` 1 -> 2 BREAKING bump under AD-11, whose rule is that \"adding an optional field is a `schemaVersion` bump recorded in the field's own description; removing or retyping is breaking\". A version-1 artifact carries five scoring-version inputs where this one carries six, so it does not parse, and no version computed before the bump compares with one computed after it."
|
|
69
74
|
}
|
|
70
75
|
},
|
|
71
76
|
"required": [
|
|
@@ -73,7 +78,8 @@
|
|
|
73
78
|
"corpusDigest",
|
|
74
79
|
"fixtureDigest",
|
|
75
80
|
"evaluatorConfigurationDigest",
|
|
76
|
-
"scoringPolicyDigest"
|
|
81
|
+
"scoringPolicyDigest",
|
|
82
|
+
"mode"
|
|
77
83
|
],
|
|
78
84
|
"additionalProperties": false
|
|
79
85
|
},
|
|
@@ -113,10 +119,11 @@
|
|
|
113
119
|
"corpusDigest",
|
|
114
120
|
"fixtureDigest",
|
|
115
121
|
"evaluatorConfigurationDigest",
|
|
116
|
-
"scoringPolicyDigest"
|
|
122
|
+
"scoringPolicyDigest",
|
|
123
|
+
"mode"
|
|
117
124
|
]
|
|
118
125
|
},
|
|
119
|
-
"description": "Which of the
|
|
126
|
+
"description": "Which of the six scoring-version inputs were caller-attested rather than computed by this package. An enum over the six key names rather than free strings, because AD-32 requires the artifact to state *which* inputs were attested and an unconstrained string cannot be checked against anything. AD-11 names three of the six as caller-attested; the enum admits any subset so a stricter or looser integration stays representable."
|
|
120
127
|
},
|
|
121
128
|
"trials": {
|
|
122
129
|
"type": "object",
|
|
@@ -610,7 +617,7 @@
|
|
|
610
617
|
"scoringVersion": {
|
|
611
618
|
"type": "string",
|
|
612
619
|
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
613
|
-
"description": "AD-11: computed by the scorer over the
|
|
620
|
+
"description": "AD-11: computed by the scorer over the six named inputs below and never caller-supplied."
|
|
614
621
|
},
|
|
615
622
|
"scoringVersionInputs": {
|
|
616
623
|
"type": "object",
|
|
@@ -639,6 +646,11 @@
|
|
|
639
646
|
"type": "string",
|
|
640
647
|
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
641
648
|
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
649
|
+
},
|
|
650
|
+
"mode": {
|
|
651
|
+
"type": "string",
|
|
652
|
+
"const": "contract-scoring",
|
|
653
|
+
"description": "Owed item 4's identity clause: mode enters AD-11's scoring version, superseding AD-11's five-field sentence. Read from the sealed run record, never re-derived, so two runs scored under one mode never collide with a version computed for the other. Required, not optional, which makes this the evidence artifact's `schemaVersion` 1 -> 2 BREAKING bump under AD-11, whose rule is that \"adding an optional field is a `schemaVersion` bump recorded in the field's own description; removing or retyping is breaking\". A version-1 artifact carries five scoring-version inputs where this one carries six, so it does not parse, and no version computed before the bump compares with one computed after it."
|
|
642
654
|
}
|
|
643
655
|
},
|
|
644
656
|
"required": [
|
|
@@ -646,7 +658,8 @@
|
|
|
646
658
|
"corpusDigest",
|
|
647
659
|
"fixtureDigest",
|
|
648
660
|
"evaluatorConfigurationDigest",
|
|
649
|
-
"scoringPolicyDigest"
|
|
661
|
+
"scoringPolicyDigest",
|
|
662
|
+
"mode"
|
|
650
663
|
],
|
|
651
664
|
"additionalProperties": false
|
|
652
665
|
},
|
|
@@ -686,10 +699,11 @@
|
|
|
686
699
|
"corpusDigest",
|
|
687
700
|
"fixtureDigest",
|
|
688
701
|
"evaluatorConfigurationDigest",
|
|
689
|
-
"scoringPolicyDigest"
|
|
702
|
+
"scoringPolicyDigest",
|
|
703
|
+
"mode"
|
|
690
704
|
]
|
|
691
705
|
},
|
|
692
|
-
"description": "Which of the
|
|
706
|
+
"description": "Which of the six scoring-version inputs were caller-attested rather than computed by this package. An enum over the six key names rather than free strings, because AD-32 requires the artifact to state *which* inputs were attested and an unconstrained string cannot be checked against anything. AD-11 names three of the six as caller-attested; the enum admits any subset so a stricter or looser integration stays representable."
|
|
693
707
|
},
|
|
694
708
|
"trials": {
|
|
695
709
|
"type": "object",
|
|
@@ -1123,6 +1137,65 @@
|
|
|
1123
1137
|
"contractVerdict": {
|
|
1124
1138
|
"$ref": "#/$defs/Verdict"
|
|
1125
1139
|
},
|
|
1140
|
+
"uncitedFindingGaps": {
|
|
1141
|
+
"type": "array",
|
|
1142
|
+
"items": {
|
|
1143
|
+
"type": "object",
|
|
1144
|
+
"properties": {
|
|
1145
|
+
"findingId": {
|
|
1146
|
+
"type": "string",
|
|
1147
|
+
"pattern": "^F-[0-9]{3,}$"
|
|
1148
|
+
},
|
|
1149
|
+
"observationIds": {
|
|
1150
|
+
"minItems": 1,
|
|
1151
|
+
"type": "array",
|
|
1152
|
+
"items": {
|
|
1153
|
+
"type": "string",
|
|
1154
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
1155
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
1156
|
+
}
|
|
1157
|
+
},
|
|
1158
|
+
"quotedEvidence": {
|
|
1159
|
+
"minItems": 1,
|
|
1160
|
+
"type": "array",
|
|
1161
|
+
"items": {
|
|
1162
|
+
"type": "object",
|
|
1163
|
+
"properties": {
|
|
1164
|
+
"quote": {
|
|
1165
|
+
"type": "string",
|
|
1166
|
+
"minLength": 1,
|
|
1167
|
+
"description": "The evaluator's verbatim quotation, per AD-23. Non-empty: an empty quotation quotes nothing, no AD-5 code names the condition, and under the admit-rule's second clause the schema is therefore the enforcement point. That this text appears in at least one of the finding's cited observations is NOT checked here; it is an AD-32 declared-versus-observed inconsistency that invalidates at ingest, and ADR-009 Decision 2 settles the precedence: \"cited identifiers govern the witness match; quotation audits it.\""
|
|
1168
|
+
},
|
|
1169
|
+
"channel": {
|
|
1170
|
+
"$ref": "#/$defs/EvidenceChannel"
|
|
1171
|
+
}
|
|
1172
|
+
},
|
|
1173
|
+
"required": [
|
|
1174
|
+
"quote",
|
|
1175
|
+
"channel"
|
|
1176
|
+
],
|
|
1177
|
+
"additionalProperties": false
|
|
1178
|
+
}
|
|
1179
|
+
},
|
|
1180
|
+
"severity": {
|
|
1181
|
+
"type": "string",
|
|
1182
|
+
"enum": [
|
|
1183
|
+
"low",
|
|
1184
|
+
"material",
|
|
1185
|
+
"critical"
|
|
1186
|
+
]
|
|
1187
|
+
}
|
|
1188
|
+
},
|
|
1189
|
+
"required": [
|
|
1190
|
+
"findingId",
|
|
1191
|
+
"observationIds",
|
|
1192
|
+
"quotedEvidence",
|
|
1193
|
+
"severity"
|
|
1194
|
+
],
|
|
1195
|
+
"additionalProperties": false
|
|
1196
|
+
},
|
|
1197
|
+
"description": "Owed item 5's rung record, contract-scoring only: one entry per uncited `defect` finding, per `core/score/outcome.ts`'s `uncitedDefectFindingGaps`. Required, not optional, which makes this the `schemaVersion` 2 -> 3 BREAKING bump under AD-11: an empty array is legal and is what a run with no uncited defect finding carries, but the key itself must be present. Never on the production branch, where the ladder signal alone is enough and this key would fail `strictObject`'s `unrecognized_keys` rule."
|
|
1198
|
+
},
|
|
1126
1199
|
"systemRecommendationRecorded": {
|
|
1127
1200
|
"description": "The evaluator's recommendation about the SYSTEM, recorded and never promoted. On a knowingly defective probe a system-directed FAIL is an input rather than a signal about the contract.",
|
|
1128
1201
|
"$ref": "#/$defs/EvaluatorRecommendation"
|
|
@@ -1158,6 +1231,7 @@
|
|
|
1158
1231
|
"remediation",
|
|
1159
1232
|
"mode",
|
|
1160
1233
|
"contractVerdict",
|
|
1234
|
+
"uncitedFindingGaps",
|
|
1161
1235
|
"systemRecommendationRecorded",
|
|
1162
1236
|
"systemRecommendationNote"
|
|
1163
1237
|
],
|
|
@@ -1165,7 +1239,7 @@
|
|
|
1165
1239
|
"description": "Contract-scoring mode: the verdict is about the contract, and the evaluator's recommendation about the system is recorded beside it rather than promoted."
|
|
1166
1240
|
}
|
|
1167
1241
|
],
|
|
1168
|
-
"description": "The scored output, owned by `emit` per AD-24, with no prior art; `score` produces the outcome and verdict values it serializes. The two modes are separate branches because AD-21 requires that the production verdict and the contract verdict never share a field.
|
|
1242
|
+
"description": "The scored output, owned by `emit` per AD-24, with no prior art; `score` produces the outcome and verdict values it serializes. The two modes are separate branches because AD-21 requires that the production verdict and the contract verdict never share a field. Mode is no longer first stated here: the Sealed Run Record now carries a required `mode`, where AD-21's \"fixed before ingest\" puts it, so this artifact restates a mode the sealed record already fixed and is never the source. Owed item 4 is closed as of this schemaVersion: `mode` is `ScoringVersionInputs`'s sixth field, `core/score/ladder.ts` carries `ProductionAssessment`/`ContractAssessment` and their own total ladders, and `core/score/mode-agreement.ts` rejects a `production` record paired with a `contract-scoring` artifact in both directions as an AD-32 cross-artifact disagreement. That check is a hand-written function at the assembly boundary rather than a schema refinement, since no single schema sees both artifacts; `emit` is its one caller, immediately before returning the artifact it just built. Owed item 5 is closed as of this schemaVersion too: the contract-scoring branch carries a required `uncitedFindingGaps`, and both ladders in `core/score/ladder.ts` gain a shared `uncited-defect-finding` CONCERNS row over `AssessmentCommon.uncitedDefectFindings`, so an ingested defect finding citing no oracle now resolves at least CONCERNS instead of routing nowhere.",
|
|
1169
1243
|
"$defs": {
|
|
1170
1244
|
"CheckResolution": {
|
|
1171
1245
|
"description": "One node of an oracle's `check` tree as it resolved. AD-4's resolution is three-valued rather than two, and the introduction vocabulary has exactly one member because AD-4 closes the introduction set at one: an empty collection. `null` where the resolution is not `insufficient-evidence`. A leaf carries an empty `children` array.",
|
|
@@ -1216,6 +1290,19 @@
|
|
|
1216
1290
|
],
|
|
1217
1291
|
"description": "AD-21's four verdicts. Uppercase is one of the two named exceptions to the lowercase kebab-case enum convention. Exit codes are AD-21's and belong to the CLI rather than to this value: PASS, WAIVED, and CONCERNS exit zero and FAIL exits two."
|
|
1218
1292
|
},
|
|
1293
|
+
"EvidenceChannel": {
|
|
1294
|
+
"type": "string",
|
|
1295
|
+
"enum": [
|
|
1296
|
+
"response-body",
|
|
1297
|
+
"response-headers",
|
|
1298
|
+
"response-status",
|
|
1299
|
+
"call-inputs",
|
|
1300
|
+
"stdout",
|
|
1301
|
+
"stderr",
|
|
1302
|
+
"exit-code"
|
|
1303
|
+
],
|
|
1304
|
+
"description": "AD-26's closed evidence channel vocabulary. The same seven the interaction-rooted pointer addresses; a channel outside this set is a syntax error rather than an unreachable-evidence finding."
|
|
1305
|
+
},
|
|
1219
1306
|
"EvaluatorRecommendation": {
|
|
1220
1307
|
"type": "string",
|
|
1221
1308
|
"enum": [
|