eval-quality 0.1.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/LICENSE +190 -0
- package/README.md +355 -0
- package/corpus/dev/README.md +36 -0
- package/corpus/dev/compile-seal-example/brief.json +1 -0
- package/corpus/dev/compile-seal-example/contract.json +1 -0
- package/corpus/dev/contracts/absent-collection-locations.json +1 -0
- package/corpus/dev/contracts/absent-sibling-groups.json +1 -0
- package/corpus/dev/contracts/absent-success-indicator.json +1 -0
- package/corpus/dev/contracts/empty-channel-roles.json +1 -0
- package/corpus/dev/contracts/empty-collection-locations.json +1 -0
- package/corpus/dev/contracts/empty-request-shapes.json +1 -0
- package/corpus/dev/contracts/empty-sibling-groups.json +1 -0
- package/corpus/dev/contracts/no-collection-quantifier.json +1 -0
- package/corpus/dev/contracts/no-operation-inventory.json +1 -0
- package/corpus/dev/contracts/no-read-back-relation.json +1 -0
- package/corpus/dev/contracts/no-state-change-marker.json +1 -0
- package/corpus/dev/contracts/no-type-violating-step.json +1 -0
- package/corpus/dev/contracts/per-key-split-oracles.json +1 -0
- package/corpus/dev/contracts/satisfied-declarations.json +1 -0
- package/corpus/dev/contracts/single-required-response-key.json +1 -0
- package/corpus/dev/contracts/split-indicator-oracle.json +1 -0
- package/corpus/dev/contracts/unaddressed-parameter-sibling.json +1 -0
- package/corpus/dev/contracts/unnamed-reference-set.json +1 -0
- package/corpus/dev/contracts/wrong-cardinality-form.json +1 -0
- package/corpus/dev/index.json +1 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/local-corpus-adapter.d.ts +7 -0
- package/dist/adapters/local-corpus-adapter.js +78 -0
- package/dist/adapters/node-file-system-adapter.d.ts +7 -0
- package/dist/adapters/node-file-system-adapter.js +39 -0
- package/dist/adapters/port-boundary.d.ts +18 -0
- package/dist/adapters/port-boundary.js +83 -0
- package/dist/adapters/system-clock-adapter.d.ts +10 -0
- package/dist/adapters/system-clock-adapter.js +18 -0
- package/dist/application/compile.d.ts +4 -0
- package/dist/application/compile.js +24 -0
- package/dist/application/diagnostics.d.ts +22 -0
- package/dist/application/diagnostics.js +18 -0
- package/dist/application/index.d.ts +23 -0
- package/dist/application/index.js +17 -0
- package/dist/application/invoke-port.d.ts +2 -0
- package/dist/application/invoke-port.js +45 -0
- package/dist/application/preflight.d.ts +27 -0
- package/dist/application/preflight.js +131 -0
- package/dist/application/seal.d.ts +4 -0
- package/dist/application/seal.js +28 -0
- package/dist/application/serialize.d.ts +6 -0
- package/dist/application/serialize.js +9 -0
- package/dist/cli/arguments.d.ts +28 -0
- package/dist/cli/arguments.js +167 -0
- package/dist/cli/exit-codes.d.ts +36 -0
- package/dist/cli/exit-codes.js +39 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +143 -0
- package/dist/cli/render.d.ts +26 -0
- package/dist/cli/render.js +53 -0
- package/dist/cli/run.d.ts +41 -0
- package/dist/cli/run.js +203 -0
- package/dist/core/canonical/canonicalize.d.ts +1 -0
- package/dist/core/canonical/canonicalize.js +113 -0
- package/dist/core/canonical/digest.d.ts +7 -0
- package/dist/core/canonical/digest.js +81 -0
- package/dist/core/canonical/scan-json.d.ts +1 -0
- package/dist/core/canonical/scan-json.js +298 -0
- package/dist/core/canonical/value-domain.d.ts +4 -0
- package/dist/core/canonical/value-domain.js +113 -0
- package/dist/core/compile/compile.d.ts +24 -0
- package/dist/core/compile/compile.js +67 -0
- package/dist/core/compile/declarations.d.ts +5 -0
- package/dist/core/compile/declarations.js +22 -0
- package/dist/core/compile/expression-legality.d.ts +14 -0
- package/dist/core/compile/expression-legality.js +346 -0
- package/dist/core/compile/forbidden-inputs.d.ts +5 -0
- package/dist/core/compile/forbidden-inputs.js +19 -0
- package/dist/core/compile/interface-inventory.d.ts +10 -0
- package/dist/core/compile/interface-inventory.js +55 -0
- package/dist/core/compile/oracle-alignment.d.ts +14 -0
- package/dist/core/compile/oracle-alignment.js +93 -0
- package/dist/core/compile/reachability.d.ts +17 -0
- package/dist/core/compile/reachability.js +177 -0
- package/dist/core/compile/rubrics.d.ts +55 -0
- package/dist/core/compile/rubrics.js +198 -0
- package/dist/core/compile/scripting-bound.d.ts +5 -0
- package/dist/core/compile/scripting-bound.js +151 -0
- package/dist/core/compile/sensitivity-witness.d.ts +73 -0
- package/dist/core/compile/sensitivity-witness.js +232 -0
- package/dist/core/compile/waivers.d.ts +3 -0
- package/dist/core/compile/waivers.js +21 -0
- package/dist/core/coverage/coverage.d.ts +18 -0
- package/dist/core/coverage/coverage.js +47 -0
- package/dist/core/coverage/relevance.d.ts +75 -0
- package/dist/core/coverage/relevance.js +186 -0
- package/dist/core/coverage/rules.d.ts +7 -0
- package/dist/core/coverage/rules.js +18 -0
- package/dist/core/coverage/satisfaction.d.ts +107 -0
- package/dist/core/coverage/satisfaction.js +415 -0
- package/dist/core/coverage/table.d.ts +26 -0
- package/dist/core/coverage/table.js +222 -0
- package/dist/core/declared-inputs.d.ts +16 -0
- package/dist/core/declared-inputs.js +18 -0
- package/dist/core/evaluate/evidence-resolution.d.ts +54 -0
- package/dist/core/evaluate/evidence-resolution.js +153 -0
- package/dist/core/evaluate/operators.d.ts +87 -0
- package/dist/core/evaluate/operators.js +350 -0
- package/dist/core/evaluate/resolution.d.ts +40 -0
- package/dist/core/evaluate/resolution.js +336 -0
- package/dist/core/evaluate/resolved-value.d.ts +9 -0
- package/dist/core/evaluate/resolved-value.js +6 -0
- package/dist/core/failure-codes.d.ts +18 -0
- package/dist/core/failure-codes.js +50 -0
- package/dist/core/lineage/chain.d.ts +49 -0
- package/dist/core/lineage/chain.js +210 -0
- package/dist/core/lineage/freeze.d.ts +12 -0
- package/dist/core/lineage/freeze.js +35 -0
- package/dist/core/lineage/stage-table.d.ts +43 -0
- package/dist/core/lineage/stage-table.js +106 -0
- package/dist/core/preflight/plan.d.ts +67 -0
- package/dist/core/preflight/plan.js +313 -0
- package/dist/core/preflight/projection.d.ts +40 -0
- package/dist/core/preflight/projection.js +96 -0
- package/dist/core/preflight/reduce.d.ts +8 -0
- package/dist/core/preflight/reduce.js +180 -0
- package/dist/core/preflight/witness-evidence.d.ts +42 -0
- package/dist/core/preflight/witness-evidence.js +88 -0
- package/dist/core/probe/target-policy.d.ts +63 -0
- package/dist/core/probe/target-policy.js +328 -0
- package/dist/core/schemas/artifact-reference.d.ts +19 -0
- package/dist/core/schemas/artifact-reference.js +30 -0
- package/dist/core/schemas/artifact.d.ts +1153 -0
- package/dist/core/schemas/artifact.js +84 -0
- package/dist/core/schemas/constraint-ledger.d.ts +57 -0
- package/dist/core/schemas/constraint-ledger.js +143 -0
- package/dist/core/schemas/eval-contract.d.ts +402 -0
- package/dist/core/schemas/eval-contract.js +147 -0
- package/dist/core/schemas/evaluator-configuration.d.ts +37 -0
- package/dist/core/schemas/evaluator-configuration.js +43 -0
- package/dist/core/schemas/evidence-artifact.d.ts +471 -0
- package/dist/core/schemas/evidence-artifact.js +232 -0
- package/dist/core/schemas/expression.d.ts +197 -0
- package/dist/core/schemas/expression.js +284 -0
- package/dist/core/schemas/faults.d.ts +9 -0
- package/dist/core/schemas/faults.js +32 -0
- package/dist/core/schemas/interface.d.ts +417 -0
- package/dist/core/schemas/interface.js +115 -0
- package/dist/core/schemas/isolation-manifest.d.ts +136 -0
- package/dist/core/schemas/isolation-manifest.js +92 -0
- package/dist/core/schemas/lineage.d.ts +21 -0
- package/dist/core/schemas/lineage.js +28 -0
- package/dist/core/schemas/oracle.d.ts +72 -0
- package/dist/core/schemas/oracle.js +35 -0
- package/dist/core/schemas/plan.d.ts +115 -0
- package/dist/core/schemas/plan.js +58 -0
- package/dist/core/schemas/pointer.d.ts +63 -0
- package/dist/core/schemas/pointer.js +94 -0
- package/dist/core/schemas/port-messages.d.ts +103 -0
- package/dist/core/schemas/port-messages.js +90 -0
- package/dist/core/schemas/preflight-verdict.d.ts +60 -0
- package/dist/core/schemas/preflight-verdict.js +38 -0
- package/dist/core/schemas/primitives.d.ts +78 -0
- package/dist/core/schemas/primitives.js +121 -0
- package/dist/core/schemas/private-artifact-manifest.d.ts +56 -0
- package/dist/core/schemas/private-artifact-manifest.js +46 -0
- package/dist/core/schemas/probe-body.d.ts +25 -0
- package/dist/core/schemas/probe-body.js +23 -0
- package/dist/core/schemas/probe-policy.d.ts +76 -0
- package/dist/core/schemas/probe-policy.js +33 -0
- package/dist/core/schemas/probe.d.ts +189 -0
- package/dist/core/schemas/probe.js +82 -0
- package/dist/core/schemas/publish.d.ts +30 -0
- package/dist/core/schemas/publish.js +135 -0
- package/dist/core/schemas/reference-set.d.ts +18 -0
- package/dist/core/schemas/reference-set.js +27 -0
- package/dist/core/schemas/rubric.d.ts +62 -0
- package/dist/core/schemas/rubric.js +68 -0
- package/dist/core/schemas/scoring-policy.d.ts +28 -0
- package/dist/core/schemas/scoring-policy.js +51 -0
- package/dist/core/schemas/sealed-evaluator-brief.d.ts +80 -0
- package/dist/core/schemas/sealed-evaluator-brief.js +59 -0
- package/dist/core/schemas/sealed-run-record.d.ts +382 -0
- package/dist/core/schemas/sealed-run-record.js +215 -0
- package/dist/core/schemas/sensitivity-witness.d.ts +138 -0
- package/dist/core/schemas/sensitivity-witness.js +86 -0
- package/dist/core/schemas/verdict.d.ts +25 -0
- package/dist/core/schemas/verdict.js +20 -0
- package/dist/core/schemas/waiver.d.ts +17 -0
- package/dist/core/schemas/waiver.js +24 -0
- package/dist/core/seal/derived-reference.d.ts +36 -0
- package/dist/core/seal/derived-reference.js +383 -0
- package/dist/core/seal/direction-prose.d.ts +13 -0
- package/dist/core/seal/direction-prose.js +120 -0
- package/dist/core/seal/plan-index.d.ts +63 -0
- package/dist/core/seal/plan-index.js +155 -0
- package/dist/core/seal/scripting-audit.d.ts +15 -0
- package/dist/core/seal/scripting-audit.js +51 -0
- package/dist/core/seal/seal.d.ts +18 -0
- package/dist/core/seal/seal.js +155 -0
- package/dist/core/stage-contracts.d.ts +30 -0
- package/dist/core/stage-contracts.js +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +22 -0
- package/dist/ports/clock-port.d.ts +13 -0
- package/dist/ports/clock-port.js +7 -0
- package/dist/ports/corpus-port.d.ts +16 -0
- package/dist/ports/corpus-port.js +7 -0
- package/dist/ports/environment-probe-port.d.ts +76 -0
- package/dist/ports/environment-probe-port.js +32 -0
- package/dist/ports/file-system-port.d.ts +27 -0
- package/dist/ports/file-system-port.js +11 -0
- package/dist/ports/port.d.ts +33 -0
- package/dist/ports/port.js +14 -0
- package/dist/testing/conformance.d.ts +88 -0
- package/dist/testing/conformance.js +281 -0
- package/dist/testing/index.d.ts +26 -0
- package/dist/testing/index.js +18 -0
- package/dist/testing/probe-conformance.d.ts +45 -0
- package/dist/testing/probe-conformance.js +186 -0
- package/package.json +130 -0
- package/schemas/artifact-reference.schema.json +64 -0
- package/schemas/eval-contract.schema.json +2145 -0
- package/schemas/evaluator-configuration.schema.json +199 -0
- package/schemas/evidence-artifact.schema.json +1229 -0
- package/schemas/isolation-manifest.schema.json +394 -0
- package/schemas/preflight-verdict.schema.json +114 -0
- package/schemas/private-artifact-manifest.schema.json +103 -0
- package/schemas/probe.schema.json +1151 -0
- package/schemas/rubric.schema.json +148 -0
- package/schemas/scoring-policy.schema.json +90 -0
- package/schemas/sealed-evaluator-brief.schema.json +268 -0
- package/schemas/sealed-run-record.schema.json +875 -0
|
@@ -0,0 +1,875 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "urn:eval-quality:schema:sealed-run-record",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"schemaVersion": {
|
|
7
|
+
"type": "integer",
|
|
8
|
+
"minimum": 1,
|
|
9
|
+
"maximum": 9007199254740991,
|
|
10
|
+
"description": "AD-11 requires an integer under this exact name. Deliberately not `z.literal(1)`: the literal exports as `{\"type\":\"number\",\"const\":1}`, losing `integer` for a non-TypeScript consumer, and it would turn a version-2 artifact into an anonymous schema-parse failure instead of AD-28's dedicated `schema-version-mismatch` fault. Version equality belongs to the reader that throws that fault."
|
|
11
|
+
},
|
|
12
|
+
"parentDigest": {
|
|
13
|
+
"anyOf": [
|
|
14
|
+
{
|
|
15
|
+
"type": "string",
|
|
16
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
17
|
+
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"type": "null"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"description": "AD-29 lineage. `null` if and only if `revisionCount` is 0. That biconditional is stated here rather than refined: a refinement is silently dropped from the published schema, so a non-TypeScript consumer would never see it, and the constraint ledger records it as not expressible."
|
|
24
|
+
},
|
|
25
|
+
"revisionCount": {
|
|
26
|
+
"type": "integer",
|
|
27
|
+
"minimum": 0,
|
|
28
|
+
"maximum": 9007199254740991,
|
|
29
|
+
"description": "AD-29: one greater than the parent artifact's."
|
|
30
|
+
},
|
|
31
|
+
"runId": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"description": "An opaque caller label. Carried over from the prior art unchanged."
|
|
35
|
+
},
|
|
36
|
+
"conditionArm": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"minLength": 1,
|
|
39
|
+
"description": "An opaque caller label with no product semantics, per AD-24. The prior art's five-member enum does not survive, and its own extension history is the reason: an enum a local amendment had to widen once for `self-review` will be widened again."
|
|
40
|
+
},
|
|
41
|
+
"trialIndex": {
|
|
42
|
+
"type": "integer",
|
|
43
|
+
"minimum": 1,
|
|
44
|
+
"maximum": 9007199254740991,
|
|
45
|
+
"description": "Which trial this record is. AD-24 excludes the trial index from the Evaluator Configuration \"so trials pool into one scoring version\", which requires it somewhere else, and a Sealed Run Record is the only artifact carrying exactly one trial. One-based, matching the only instance that exists. AD-6's aggregate of trial count, invalidated attempts, and each attempt's reason is the Evidence Artifact's; asking one run to report its siblings is what no stage signature can do."
|
|
46
|
+
},
|
|
47
|
+
"contractDigest": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
50
|
+
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
51
|
+
},
|
|
52
|
+
"sealedBriefDigest": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
55
|
+
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
56
|
+
},
|
|
57
|
+
"evaluatorConfigurationDigest": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
60
|
+
"description": "A bare digest rather than an `ArtifactReference`, and required on both this record and the isolation manifest. AD-32 requires the two to *agree*, and an `ArtifactReference` on one side against a bare digest on the other makes the comparison lopsided; AD-2 already has ingest receiving the Evaluator Configuration as its own input, so nothing needs resolving through a reference. The agreement itself is a cross-artifact rule no schema can see."
|
|
61
|
+
},
|
|
62
|
+
"evaluatorRecommendation": {
|
|
63
|
+
"$ref": "#/$defs/EvaluatorRecommendation"
|
|
64
|
+
},
|
|
65
|
+
"oracleDispositions": {
|
|
66
|
+
"type": "array",
|
|
67
|
+
"items": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"properties": {
|
|
70
|
+
"oracleId": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"pattern": "^O-[0-9]{3,}$"
|
|
73
|
+
},
|
|
74
|
+
"disposition": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"enum": [
|
|
77
|
+
"held",
|
|
78
|
+
"violated",
|
|
79
|
+
"not-attempted"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"observationIds": {
|
|
83
|
+
"type": "array",
|
|
84
|
+
"items": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
87
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
88
|
+
},
|
|
89
|
+
"description": "Required and permitted to be empty. AD-33 requires \"every disposition citing supporting observations, and an unsupported disposition invalidating cross-artifact agreement rather than being believed\", so an unsupported disposition has to stay representable for the scorer to invalidate it. That one disposition exists per required oracle is likewise not refined: AD-23 makes a missing disposition an AD-21 invalidating condition, so the schema admits the shape and ingest fires the rung."
|
|
90
|
+
},
|
|
91
|
+
"note": {
|
|
92
|
+
"anyOf": [
|
|
93
|
+
{
|
|
94
|
+
"type": "string"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"type": "null"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"required": [
|
|
103
|
+
"oracleId",
|
|
104
|
+
"disposition",
|
|
105
|
+
"observationIds",
|
|
106
|
+
"note"
|
|
107
|
+
],
|
|
108
|
+
"additionalProperties": false
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"findings": {
|
|
112
|
+
"type": "array",
|
|
113
|
+
"items": {
|
|
114
|
+
"$ref": "#/$defs/Finding"
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"observations": {
|
|
118
|
+
"type": "array",
|
|
119
|
+
"items": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"properties": {
|
|
122
|
+
"observationId": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
125
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
126
|
+
},
|
|
127
|
+
"operationId": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
130
|
+
"description": "The operation this observation exercised. `Operation.operationId` is scoped to a `PermittedInterface`, so two interfaces may declare the same one; that collision is a cross-artifact rule with no AD-5 code, since `duplicate-operation-signature` covers method plus path template only, and it is left to ingest."
|
|
131
|
+
},
|
|
132
|
+
"provenance": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"enum": [
|
|
135
|
+
"baseline",
|
|
136
|
+
"evaluator-chosen"
|
|
137
|
+
],
|
|
138
|
+
"description": "AD-23: `baseline` for a pre-canned or deterministic test, `evaluator-chosen` for an action the evaluator selected. The distinction is the one the product's central finding rests on: what a sealed evaluator detects beyond the pre-canned baseline. It lives on the observation, never on the finding."
|
|
139
|
+
},
|
|
140
|
+
"callInputs": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"properties": {
|
|
143
|
+
"path": {
|
|
144
|
+
"anyOf": [
|
|
145
|
+
{
|
|
146
|
+
"type": "object",
|
|
147
|
+
"propertyNames": {
|
|
148
|
+
"type": "string"
|
|
149
|
+
},
|
|
150
|
+
"additionalProperties": {
|
|
151
|
+
"$ref": "#/$defs/JsonValue"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"type": "null"
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"query": {
|
|
160
|
+
"anyOf": [
|
|
161
|
+
{
|
|
162
|
+
"type": "object",
|
|
163
|
+
"propertyNames": {
|
|
164
|
+
"type": "string"
|
|
165
|
+
},
|
|
166
|
+
"additionalProperties": {
|
|
167
|
+
"$ref": "#/$defs/JsonValue"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"type": "null"
|
|
172
|
+
}
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
"header": {
|
|
176
|
+
"anyOf": [
|
|
177
|
+
{
|
|
178
|
+
"type": "object",
|
|
179
|
+
"propertyNames": {
|
|
180
|
+
"type": "string"
|
|
181
|
+
},
|
|
182
|
+
"additionalProperties": {
|
|
183
|
+
"$ref": "#/$defs/JsonValue"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"type": "null"
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
},
|
|
191
|
+
"body": {
|
|
192
|
+
"anyOf": [
|
|
193
|
+
{
|
|
194
|
+
"type": "object",
|
|
195
|
+
"propertyNames": {
|
|
196
|
+
"type": "string"
|
|
197
|
+
},
|
|
198
|
+
"additionalProperties": {
|
|
199
|
+
"$ref": "#/$defs/JsonValue"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"type": "null"
|
|
204
|
+
}
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"required": [
|
|
209
|
+
"path",
|
|
210
|
+
"query",
|
|
211
|
+
"header",
|
|
212
|
+
"body"
|
|
213
|
+
],
|
|
214
|
+
"additionalProperties": false
|
|
215
|
+
},
|
|
216
|
+
"responseBody": {
|
|
217
|
+
"anyOf": [
|
|
218
|
+
{
|
|
219
|
+
"$ref": "#/$defs/JsonValue"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"type": "null"
|
|
223
|
+
}
|
|
224
|
+
],
|
|
225
|
+
"description": "AD-26's `response-body` channel. The null branch is redundant against the value container, which already admits `null`; it is kept so all ten observation fields read the same way, and it means \"no body observed\" and \"a body that was JSON null\" are indistinguishable here, which is an accepted cost of one uniform spelling."
|
|
226
|
+
},
|
|
227
|
+
"responseHeaders": {
|
|
228
|
+
"anyOf": [
|
|
229
|
+
{
|
|
230
|
+
"type": "object",
|
|
231
|
+
"propertyNames": {
|
|
232
|
+
"type": "string"
|
|
233
|
+
},
|
|
234
|
+
"additionalProperties": {
|
|
235
|
+
"$ref": "#/$defs/JsonValue"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"type": "null"
|
|
240
|
+
}
|
|
241
|
+
],
|
|
242
|
+
"description": "A name-to-value map, not the open value container. AD-26 gives `response-headers` a tail, so a pointer resolves INTO this channel; a scalar here would leave `/interactions/x/response-headers/Content-Type` addressing nothing. That is the difference from `responseBody`, where a scalar or an array is a legitimate body and the open container is correct."
|
|
243
|
+
},
|
|
244
|
+
"responseStatus": {
|
|
245
|
+
"anyOf": [
|
|
246
|
+
{
|
|
247
|
+
"type": "integer",
|
|
248
|
+
"minimum": 0,
|
|
249
|
+
"maximum": 9007199254740991
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"type": "null"
|
|
253
|
+
}
|
|
254
|
+
],
|
|
255
|
+
"description": "Deliberately not bounded to a protocol range. A negative status is meaningless and excluded, but the upper end is left open: AD-19 declares four interface kinds and v0 rejects three of them at compile time under `unsupported-interface-kind`, so bounding this to HTTP would encode a protocol assumption the artifact outlives. `null` where the channel does not apply."
|
|
256
|
+
},
|
|
257
|
+
"stdout": {
|
|
258
|
+
"anyOf": [
|
|
259
|
+
{
|
|
260
|
+
"type": "string"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"type": "null"
|
|
264
|
+
}
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
"stderr": {
|
|
268
|
+
"anyOf": [
|
|
269
|
+
{
|
|
270
|
+
"type": "string"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"type": "null"
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
},
|
|
277
|
+
"exitCode": {
|
|
278
|
+
"anyOf": [
|
|
279
|
+
{
|
|
280
|
+
"type": "integer",
|
|
281
|
+
"minimum": -9007199254740991,
|
|
282
|
+
"maximum": 9007199254740991
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"type": "null"
|
|
286
|
+
}
|
|
287
|
+
],
|
|
288
|
+
"description": "Signed on purpose, unlike `responseStatus`: a process terminated by a signal is conventionally reported as a negative code, and this field records what was observed rather than what is tidy."
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
"required": [
|
|
292
|
+
"observationId",
|
|
293
|
+
"operationId",
|
|
294
|
+
"provenance",
|
|
295
|
+
"callInputs",
|
|
296
|
+
"responseBody",
|
|
297
|
+
"responseHeaders",
|
|
298
|
+
"responseStatus",
|
|
299
|
+
"stdout",
|
|
300
|
+
"stderr",
|
|
301
|
+
"exitCode"
|
|
302
|
+
],
|
|
303
|
+
"additionalProperties": false
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"judgeResults": {
|
|
307
|
+
"type": "array",
|
|
308
|
+
"items": {
|
|
309
|
+
"type": "object",
|
|
310
|
+
"properties": {
|
|
311
|
+
"rubricId": {
|
|
312
|
+
"type": "string",
|
|
313
|
+
"pattern": "^R-[0-9]{3,}$"
|
|
314
|
+
},
|
|
315
|
+
"criterionId": {
|
|
316
|
+
"type": "string",
|
|
317
|
+
"pattern": "^RC-[0-9]{3,}$"
|
|
318
|
+
},
|
|
319
|
+
"score": {
|
|
320
|
+
"anyOf": [
|
|
321
|
+
{
|
|
322
|
+
"type": "integer",
|
|
323
|
+
"minimum": -9007199254740991,
|
|
324
|
+
"maximum": 9007199254740991
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"type": "null"
|
|
328
|
+
}
|
|
329
|
+
],
|
|
330
|
+
"description": "An integer, because AD-22 puts the scale on the rubric's own anchored levels and `ScaleLevel.level` is already `z.int()`; no second scale is minted here. `null` is the shape AD-6's `judge-error` fires on, so it must parse. That the criterion is one the cited rubric declares, and that a conforming record shows one judge call scoring all named criteria, are AD-17 cross-artifact rules a schema over one artifact cannot see."
|
|
331
|
+
},
|
|
332
|
+
"note": {
|
|
333
|
+
"anyOf": [
|
|
334
|
+
{
|
|
335
|
+
"type": "string"
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
"type": "null"
|
|
339
|
+
}
|
|
340
|
+
]
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"required": [
|
|
344
|
+
"rubricId",
|
|
345
|
+
"criterionId",
|
|
346
|
+
"score",
|
|
347
|
+
"note"
|
|
348
|
+
],
|
|
349
|
+
"additionalProperties": false
|
|
350
|
+
},
|
|
351
|
+
"description": "Empty is legal: a contract with no rubric produces no judge call."
|
|
352
|
+
},
|
|
353
|
+
"actionsArtifact": {
|
|
354
|
+
"$ref": "#/$defs/ArtifactReference"
|
|
355
|
+
},
|
|
356
|
+
"isolationManifestArtifact": {
|
|
357
|
+
"$ref": "#/$defs/ArtifactReference"
|
|
358
|
+
},
|
|
359
|
+
"resourceUse": {
|
|
360
|
+
"type": "object",
|
|
361
|
+
"properties": {
|
|
362
|
+
"toolCalls": {
|
|
363
|
+
"type": "integer",
|
|
364
|
+
"minimum": 0,
|
|
365
|
+
"maximum": 9007199254740991
|
|
366
|
+
},
|
|
367
|
+
"inputTokens": {
|
|
368
|
+
"type": "integer",
|
|
369
|
+
"minimum": 0,
|
|
370
|
+
"maximum": 9007199254740991
|
|
371
|
+
},
|
|
372
|
+
"outputTokens": {
|
|
373
|
+
"type": "integer",
|
|
374
|
+
"minimum": 0,
|
|
375
|
+
"maximum": 9007199254740991
|
|
376
|
+
},
|
|
377
|
+
"wallClockSeconds": {
|
|
378
|
+
"type": "number",
|
|
379
|
+
"minimum": 0,
|
|
380
|
+
"description": "Stays a number where money becomes a string: a measured duration is not currency, and the worked example's 62.5 is an exact binary64 inside AD-36's value domain."
|
|
381
|
+
},
|
|
382
|
+
"costUsd": {
|
|
383
|
+
"type": "string",
|
|
384
|
+
"pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$",
|
|
385
|
+
"description": "Money, so AD-36 carries it as a string in a declared format. The prior art's number does not survive; an AD-24 divergence."
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
"required": [
|
|
389
|
+
"toolCalls",
|
|
390
|
+
"inputTokens",
|
|
391
|
+
"outputTokens",
|
|
392
|
+
"wallClockSeconds",
|
|
393
|
+
"costUsd"
|
|
394
|
+
],
|
|
395
|
+
"additionalProperties": false
|
|
396
|
+
},
|
|
397
|
+
"evidenceDisclosure": {
|
|
398
|
+
"type": "object",
|
|
399
|
+
"properties": {
|
|
400
|
+
"truncationBound": {
|
|
401
|
+
"anyOf": [
|
|
402
|
+
{
|
|
403
|
+
"type": "integer",
|
|
404
|
+
"minimum": 0,
|
|
405
|
+
"maximum": 9007199254740991
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"type": "null"
|
|
409
|
+
}
|
|
410
|
+
],
|
|
411
|
+
"description": "AD-17 requires truncation to be \"deterministic, disclosed with its bound\". `null` is untruncated. The unit is left to the caller and stated rather than encoded, following the `RubricBody.maxLength` precedent for AD-22's equally unitless \"bounded length\". The over-truncated condition compares this bound against the evidence carried in this same artifact, which is why the disclosure and the evidence travel together."
|
|
412
|
+
},
|
|
413
|
+
"reportedIncomplete": {
|
|
414
|
+
"type": "boolean",
|
|
415
|
+
"description": "AD-17: \"a case that cannot be bounded without discarding disconfirming material is reported incomplete\". This is the operand AD-21's incomplete condition reads. The remaining two conditions read no field here: unavailable is an `ArtifactReference` that does not resolve through the corpus port, and internally inconsistent is AD-32's cross-artifact agreement check. AD-17's \"must retain evidence contradicting the leading verdict\" is decidable by none of them and is recorded as unenforced in v0."
|
|
416
|
+
}
|
|
417
|
+
},
|
|
418
|
+
"required": [
|
|
419
|
+
"truncationBound",
|
|
420
|
+
"reportedIncomplete"
|
|
421
|
+
],
|
|
422
|
+
"additionalProperties": false
|
|
423
|
+
},
|
|
424
|
+
"invalidReason": {
|
|
425
|
+
"anyOf": [
|
|
426
|
+
{
|
|
427
|
+
"type": "string"
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"type": "null"
|
|
431
|
+
}
|
|
432
|
+
]
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
"required": [
|
|
436
|
+
"schemaVersion",
|
|
437
|
+
"parentDigest",
|
|
438
|
+
"revisionCount",
|
|
439
|
+
"runId",
|
|
440
|
+
"conditionArm",
|
|
441
|
+
"trialIndex",
|
|
442
|
+
"contractDigest",
|
|
443
|
+
"sealedBriefDigest",
|
|
444
|
+
"evaluatorConfigurationDigest",
|
|
445
|
+
"evaluatorRecommendation",
|
|
446
|
+
"oracleDispositions",
|
|
447
|
+
"findings",
|
|
448
|
+
"observations",
|
|
449
|
+
"judgeResults",
|
|
450
|
+
"actionsArtifact",
|
|
451
|
+
"isolationManifestArtifact",
|
|
452
|
+
"resourceUse",
|
|
453
|
+
"evidenceDisclosure",
|
|
454
|
+
"invalidReason"
|
|
455
|
+
],
|
|
456
|
+
"additionalProperties": false,
|
|
457
|
+
"description": "One sealed evaluator trial, as the caller presents it. Succeeds the prior-art `h0-run-result` schema per AD-24, keeping its run identifier, condition arm, findings, action-log reference, resource use, invalidation reason, evaluator recommendation as a closed enum, and per-finding confidence on a declared scale. Divergences: `condition` is demoted to the opaque `conditionArm`, `verdict` becomes `evaluatorRecommendation` without `NOT_APPLICABLE`, money is a decimal string, and `taskId`, `note`, and per-finding `actionIds` do not survive: the contract is pinned by `contractDigest`, an unstructured orchestrator annotation is the free-prose channel the Conventions close everywhere else, and two citation vocabularies on one finding is the ambiguity ADR-009 removed. Two constructions are deliberately absent and each is owed to an open item: the run MODE, which AD-21 requires to be fixed before ingest and to enter AD-11's identity inputs rather than appearing first in the evidence artifact (Owed item 4), and observation ORDERING, which ADR-006 forbids reading off array position (Owed item 2). Both arrive as additive `schemaVersion` bumps under AD-11.",
|
|
458
|
+
"$defs": {
|
|
459
|
+
"EvaluatorRecommendation": {
|
|
460
|
+
"type": "string",
|
|
461
|
+
"enum": [
|
|
462
|
+
"PASS",
|
|
463
|
+
"CONCERNS",
|
|
464
|
+
"FAIL"
|
|
465
|
+
],
|
|
466
|
+
"description": "The evaluator's own recommendation, ingested and never promoted to a verdict in contract-scoring mode. AD-24 requires a closed enum; the prior art's `NOT_APPLICABLE` is dropped with the `scripted` arm it belonged to. Consequence recorded here because it closes a rung: AD-21's Invalid condition for \"an unrecognised evaluator recommendation value\" is unreachable for a schema-valid artifact, since an unrecognised value fails to parse and becomes an AD-28 `schema-parse-failure` fault, and a fault never becomes a verdict. An ingesting reader either validates this field leniently and maps an unrecognised value to that rung, or accepts that the rung fires only as a fault."
|
|
467
|
+
},
|
|
468
|
+
"Finding": {
|
|
469
|
+
"oneOf": [
|
|
470
|
+
{
|
|
471
|
+
"type": "object",
|
|
472
|
+
"properties": {
|
|
473
|
+
"findingType": {
|
|
474
|
+
"type": "string",
|
|
475
|
+
"const": "defect"
|
|
476
|
+
},
|
|
477
|
+
"findingId": {
|
|
478
|
+
"type": "string",
|
|
479
|
+
"pattern": "^F-[0-9]{3,}$"
|
|
480
|
+
},
|
|
481
|
+
"oracleId": {
|
|
482
|
+
"anyOf": [
|
|
483
|
+
{
|
|
484
|
+
"type": "string",
|
|
485
|
+
"pattern": "^O-[0-9]{3,}$"
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
"type": "null"
|
|
489
|
+
}
|
|
490
|
+
],
|
|
491
|
+
"description": "The oracle this finding answers. Nullable because AD-23 is explicit that \"a finding citing no oracle is retained as an uncited finding rather than discarded\", and it is often the evaluator-chosen detection the AD exists to preserve. The carve-out is oracle-only and is deliberately not extended to `probeId`."
|
|
492
|
+
},
|
|
493
|
+
"probeId": {
|
|
494
|
+
"type": "string",
|
|
495
|
+
"pattern": "^P-[0-9]{3,}$",
|
|
496
|
+
"description": "Required, unlike `oracleId`. AD-23 carves out the no-oracle case and nothing else; a finding arises during some probe's run, so citing the probe is always possible, and AD-7's per-class vector cannot attribute a finding that names no probe."
|
|
497
|
+
},
|
|
498
|
+
"behaviorId": {
|
|
499
|
+
"anyOf": [
|
|
500
|
+
{
|
|
501
|
+
"type": "string",
|
|
502
|
+
"pattern": "^B-[0-9]{3,}$"
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
"type": "null"
|
|
506
|
+
}
|
|
507
|
+
],
|
|
508
|
+
"description": "The behaviour at issue, where the finding names one. `null` for a finding that answers no declared behaviour, which is the same case `oracleId: null` records."
|
|
509
|
+
},
|
|
510
|
+
"severity": {
|
|
511
|
+
"type": "string",
|
|
512
|
+
"enum": [
|
|
513
|
+
"low",
|
|
514
|
+
"material",
|
|
515
|
+
"critical"
|
|
516
|
+
]
|
|
517
|
+
},
|
|
518
|
+
"summary": {
|
|
519
|
+
"type": "string",
|
|
520
|
+
"minLength": 1
|
|
521
|
+
},
|
|
522
|
+
"confidence": {
|
|
523
|
+
"type": "number",
|
|
524
|
+
"minimum": 0,
|
|
525
|
+
"maximum": 1,
|
|
526
|
+
"description": "AD-24 requires per-finding confidence \"on a declared scale\" and declares no scale, so the closed unit interval is declared here: 0 through 1 inclusive. It exports `minimum` and `maximum` natively, and it is the same scale the scoring policy's `confidenceThreshold` uses, or AD-21's \"a finding whose confidence falls below the policy threshold\" would compare two different scales."
|
|
527
|
+
},
|
|
528
|
+
"observationIds": {
|
|
529
|
+
"minItems": 1,
|
|
530
|
+
"type": "array",
|
|
531
|
+
"items": {
|
|
532
|
+
"type": "string",
|
|
533
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
534
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
535
|
+
},
|
|
536
|
+
"description": "Tightened to at least one on this branch, which is AD-23's \"additionally\" expressed structurally: a defect claim citing no witness is what AD-40 calls an invalidating declared-versus-observed inconsistency, and the minimum is the half of that rule a schema can carry."
|
|
537
|
+
},
|
|
538
|
+
"evidenceArtifacts": {
|
|
539
|
+
"type": "array",
|
|
540
|
+
"items": {
|
|
541
|
+
"$ref": "#/$defs/ArtifactReference"
|
|
542
|
+
},
|
|
543
|
+
"description": "References to the evidence this finding rests on. Nothing to do with this package's `EvidenceArtifact`, which is the scored output `emit` owns: two unrelated things one word apart, named here so a reader does not reach for the wrong type."
|
|
544
|
+
},
|
|
545
|
+
"quotedEvidence": {
|
|
546
|
+
"minItems": 1,
|
|
547
|
+
"type": "array",
|
|
548
|
+
"items": {
|
|
549
|
+
"type": "object",
|
|
550
|
+
"properties": {
|
|
551
|
+
"quote": {
|
|
552
|
+
"type": "string",
|
|
553
|
+
"minLength": 1,
|
|
554
|
+
"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.\""
|
|
555
|
+
},
|
|
556
|
+
"channel": {
|
|
557
|
+
"$ref": "#/$defs/EvidenceChannel"
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
"required": [
|
|
561
|
+
"quote",
|
|
562
|
+
"channel"
|
|
563
|
+
],
|
|
564
|
+
"additionalProperties": false
|
|
565
|
+
},
|
|
566
|
+
"description": "Required and non-empty on this branch alone, per AD-23. Only `defect` findings enter a detection measure, and a detection claim with no quotation is the shape AD-40 records revision 4 having no way to match."
|
|
567
|
+
}
|
|
568
|
+
},
|
|
569
|
+
"required": [
|
|
570
|
+
"findingType",
|
|
571
|
+
"findingId",
|
|
572
|
+
"oracleId",
|
|
573
|
+
"probeId",
|
|
574
|
+
"behaviorId",
|
|
575
|
+
"severity",
|
|
576
|
+
"summary",
|
|
577
|
+
"confidence",
|
|
578
|
+
"observationIds",
|
|
579
|
+
"evidenceArtifacts",
|
|
580
|
+
"quotedEvidence"
|
|
581
|
+
],
|
|
582
|
+
"additionalProperties": false,
|
|
583
|
+
"description": "A claimed defect. The only finding type that enters a detection measure under AD-23, and the only one carrying required quoted evidence."
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
"type": "object",
|
|
587
|
+
"properties": {
|
|
588
|
+
"findingType": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"const": "observation"
|
|
591
|
+
},
|
|
592
|
+
"findingId": {
|
|
593
|
+
"type": "string",
|
|
594
|
+
"pattern": "^F-[0-9]{3,}$"
|
|
595
|
+
},
|
|
596
|
+
"oracleId": {
|
|
597
|
+
"anyOf": [
|
|
598
|
+
{
|
|
599
|
+
"type": "string",
|
|
600
|
+
"pattern": "^O-[0-9]{3,}$"
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
"type": "null"
|
|
604
|
+
}
|
|
605
|
+
],
|
|
606
|
+
"description": "The oracle this finding answers. Nullable because AD-23 is explicit that \"a finding citing no oracle is retained as an uncited finding rather than discarded\", and it is often the evaluator-chosen detection the AD exists to preserve. The carve-out is oracle-only and is deliberately not extended to `probeId`."
|
|
607
|
+
},
|
|
608
|
+
"probeId": {
|
|
609
|
+
"type": "string",
|
|
610
|
+
"pattern": "^P-[0-9]{3,}$",
|
|
611
|
+
"description": "Required, unlike `oracleId`. AD-23 carves out the no-oracle case and nothing else; a finding arises during some probe's run, so citing the probe is always possible, and AD-7's per-class vector cannot attribute a finding that names no probe."
|
|
612
|
+
},
|
|
613
|
+
"behaviorId": {
|
|
614
|
+
"anyOf": [
|
|
615
|
+
{
|
|
616
|
+
"type": "string",
|
|
617
|
+
"pattern": "^B-[0-9]{3,}$"
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
"type": "null"
|
|
621
|
+
}
|
|
622
|
+
],
|
|
623
|
+
"description": "The behaviour at issue, where the finding names one. `null` for a finding that answers no declared behaviour, which is the same case `oracleId: null` records."
|
|
624
|
+
},
|
|
625
|
+
"severity": {
|
|
626
|
+
"type": "string",
|
|
627
|
+
"enum": [
|
|
628
|
+
"low",
|
|
629
|
+
"material",
|
|
630
|
+
"critical"
|
|
631
|
+
]
|
|
632
|
+
},
|
|
633
|
+
"summary": {
|
|
634
|
+
"type": "string",
|
|
635
|
+
"minLength": 1
|
|
636
|
+
},
|
|
637
|
+
"confidence": {
|
|
638
|
+
"type": "number",
|
|
639
|
+
"minimum": 0,
|
|
640
|
+
"maximum": 1,
|
|
641
|
+
"description": "AD-24 requires per-finding confidence \"on a declared scale\" and declares no scale, so the closed unit interval is declared here: 0 through 1 inclusive. It exports `minimum` and `maximum` natively, and it is the same scale the scoring policy's `confidenceThreshold` uses, or AD-21's \"a finding whose confidence falls below the policy threshold\" would compare two different scales."
|
|
642
|
+
},
|
|
643
|
+
"observationIds": {
|
|
644
|
+
"type": "array",
|
|
645
|
+
"items": {
|
|
646
|
+
"type": "string",
|
|
647
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
648
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
649
|
+
},
|
|
650
|
+
"description": "The observations this finding relies on. Declared on every branch, not only on `defect`: AD-23's word is *additionally*, which is a floor on `defect` rather than a prohibition on the other two, and the architecture's own worked record carries observation identifiers on a `confirmation` and on an `observation` finding. A defect-only field would turn those into `unrecognized_keys` failures for no AD reason. That a cited identifier matches a declared observation is a cross-artifact rule with no AD-5 code and is left to ingest."
|
|
651
|
+
},
|
|
652
|
+
"evidenceArtifacts": {
|
|
653
|
+
"type": "array",
|
|
654
|
+
"items": {
|
|
655
|
+
"$ref": "#/$defs/ArtifactReference"
|
|
656
|
+
},
|
|
657
|
+
"description": "References to the evidence this finding rests on. Nothing to do with this package's `EvidenceArtifact`, which is the scored output `emit` owns: two unrelated things one word apart, named here so a reader does not reach for the wrong type."
|
|
658
|
+
}
|
|
659
|
+
},
|
|
660
|
+
"required": [
|
|
661
|
+
"findingType",
|
|
662
|
+
"findingId",
|
|
663
|
+
"oracleId",
|
|
664
|
+
"probeId",
|
|
665
|
+
"behaviorId",
|
|
666
|
+
"severity",
|
|
667
|
+
"summary",
|
|
668
|
+
"confidence",
|
|
669
|
+
"observationIds",
|
|
670
|
+
"evidenceArtifacts"
|
|
671
|
+
],
|
|
672
|
+
"additionalProperties": false,
|
|
673
|
+
"description": "A non-defect note about the interface or the evidence. Carries no quoted evidence requirement and never enters a detection measure."
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
"type": "object",
|
|
677
|
+
"properties": {
|
|
678
|
+
"findingType": {
|
|
679
|
+
"type": "string",
|
|
680
|
+
"const": "confirmation"
|
|
681
|
+
},
|
|
682
|
+
"findingId": {
|
|
683
|
+
"type": "string",
|
|
684
|
+
"pattern": "^F-[0-9]{3,}$"
|
|
685
|
+
},
|
|
686
|
+
"oracleId": {
|
|
687
|
+
"anyOf": [
|
|
688
|
+
{
|
|
689
|
+
"type": "string",
|
|
690
|
+
"pattern": "^O-[0-9]{3,}$"
|
|
691
|
+
},
|
|
692
|
+
{
|
|
693
|
+
"type": "null"
|
|
694
|
+
}
|
|
695
|
+
],
|
|
696
|
+
"description": "The oracle this finding answers. Nullable because AD-23 is explicit that \"a finding citing no oracle is retained as an uncited finding rather than discarded\", and it is often the evaluator-chosen detection the AD exists to preserve. The carve-out is oracle-only and is deliberately not extended to `probeId`."
|
|
697
|
+
},
|
|
698
|
+
"probeId": {
|
|
699
|
+
"type": "string",
|
|
700
|
+
"pattern": "^P-[0-9]{3,}$",
|
|
701
|
+
"description": "Required, unlike `oracleId`. AD-23 carves out the no-oracle case and nothing else; a finding arises during some probe's run, so citing the probe is always possible, and AD-7's per-class vector cannot attribute a finding that names no probe."
|
|
702
|
+
},
|
|
703
|
+
"behaviorId": {
|
|
704
|
+
"anyOf": [
|
|
705
|
+
{
|
|
706
|
+
"type": "string",
|
|
707
|
+
"pattern": "^B-[0-9]{3,}$"
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"type": "null"
|
|
711
|
+
}
|
|
712
|
+
],
|
|
713
|
+
"description": "The behaviour at issue, where the finding names one. `null` for a finding that answers no declared behaviour, which is the same case `oracleId: null` records."
|
|
714
|
+
},
|
|
715
|
+
"severity": {
|
|
716
|
+
"type": "string",
|
|
717
|
+
"enum": [
|
|
718
|
+
"low",
|
|
719
|
+
"material",
|
|
720
|
+
"critical"
|
|
721
|
+
]
|
|
722
|
+
},
|
|
723
|
+
"summary": {
|
|
724
|
+
"type": "string",
|
|
725
|
+
"minLength": 1
|
|
726
|
+
},
|
|
727
|
+
"confidence": {
|
|
728
|
+
"type": "number",
|
|
729
|
+
"minimum": 0,
|
|
730
|
+
"maximum": 1,
|
|
731
|
+
"description": "AD-24 requires per-finding confidence \"on a declared scale\" and declares no scale, so the closed unit interval is declared here: 0 through 1 inclusive. It exports `minimum` and `maximum` natively, and it is the same scale the scoring policy's `confidenceThreshold` uses, or AD-21's \"a finding whose confidence falls below the policy threshold\" would compare two different scales."
|
|
732
|
+
},
|
|
733
|
+
"observationIds": {
|
|
734
|
+
"type": "array",
|
|
735
|
+
"items": {
|
|
736
|
+
"type": "string",
|
|
737
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
738
|
+
"description": "A kebab-case slug. Excludes \"/\" and \"~\" so an identifier can be embedded in an interaction-rooted pointer without escaping."
|
|
739
|
+
},
|
|
740
|
+
"description": "The observations this finding relies on. Declared on every branch, not only on `defect`: AD-23's word is *additionally*, which is a floor on `defect` rather than a prohibition on the other two, and the architecture's own worked record carries observation identifiers on a `confirmation` and on an `observation` finding. A defect-only field would turn those into `unrecognized_keys` failures for no AD reason. That a cited identifier matches a declared observation is a cross-artifact rule with no AD-5 code and is left to ingest."
|
|
741
|
+
},
|
|
742
|
+
"evidenceArtifacts": {
|
|
743
|
+
"type": "array",
|
|
744
|
+
"items": {
|
|
745
|
+
"$ref": "#/$defs/ArtifactReference"
|
|
746
|
+
},
|
|
747
|
+
"description": "References to the evidence this finding rests on. Nothing to do with this package's `EvidenceArtifact`, which is the scored output `emit` owns: two unrelated things one word apart, named here so a reader does not reach for the wrong type."
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
"required": [
|
|
751
|
+
"findingType",
|
|
752
|
+
"findingId",
|
|
753
|
+
"oracleId",
|
|
754
|
+
"probeId",
|
|
755
|
+
"behaviorId",
|
|
756
|
+
"severity",
|
|
757
|
+
"summary",
|
|
758
|
+
"confidence",
|
|
759
|
+
"observationIds",
|
|
760
|
+
"evidenceArtifacts"
|
|
761
|
+
],
|
|
762
|
+
"additionalProperties": false,
|
|
763
|
+
"description": "A record that a behaviour held. AD-6 resolves it to `confirmed`, the state revision 3 added after `passed-clean-control` was being misused for it."
|
|
764
|
+
}
|
|
765
|
+
]
|
|
766
|
+
},
|
|
767
|
+
"ArtifactReference": {
|
|
768
|
+
"oneOf": [
|
|
769
|
+
{
|
|
770
|
+
"type": "object",
|
|
771
|
+
"properties": {
|
|
772
|
+
"storage": {
|
|
773
|
+
"type": "string",
|
|
774
|
+
"const": "public"
|
|
775
|
+
},
|
|
776
|
+
"path": {
|
|
777
|
+
"type": "string",
|
|
778
|
+
"minLength": 1
|
|
779
|
+
},
|
|
780
|
+
"privateRef": {
|
|
781
|
+
"type": "null"
|
|
782
|
+
},
|
|
783
|
+
"digest": {
|
|
784
|
+
"type": "string",
|
|
785
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
786
|
+
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
"required": [
|
|
790
|
+
"storage",
|
|
791
|
+
"path",
|
|
792
|
+
"privateRef",
|
|
793
|
+
"digest"
|
|
794
|
+
],
|
|
795
|
+
"additionalProperties": false
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"type": "object",
|
|
799
|
+
"properties": {
|
|
800
|
+
"storage": {
|
|
801
|
+
"type": "string",
|
|
802
|
+
"const": "private"
|
|
803
|
+
},
|
|
804
|
+
"path": {
|
|
805
|
+
"type": "null"
|
|
806
|
+
},
|
|
807
|
+
"privateRef": {
|
|
808
|
+
"type": "string",
|
|
809
|
+
"minLength": 1,
|
|
810
|
+
"description": "An opaque handle resolved through the corpus port under AD-8, never a filesystem path and never a URL. AD-18 forbids a private path from entering any artifact, and this is the field a caller would otherwise reach for."
|
|
811
|
+
},
|
|
812
|
+
"digest": {
|
|
813
|
+
"type": "string",
|
|
814
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
815
|
+
"description": "AD-27 digest: \"sha256:\" plus 64 lowercase hexadecimal characters."
|
|
816
|
+
}
|
|
817
|
+
},
|
|
818
|
+
"required": [
|
|
819
|
+
"storage",
|
|
820
|
+
"path",
|
|
821
|
+
"privateRef",
|
|
822
|
+
"digest"
|
|
823
|
+
],
|
|
824
|
+
"additionalProperties": false
|
|
825
|
+
}
|
|
826
|
+
],
|
|
827
|
+
"description": "A reference to an artifact, public by path or private by opaque handle. Succeeds the prior-art `artifact-ref` schema per AD-24, with its two `if`/`then` branches re-expressed as a discriminated union per AD-13 and its `sha256` field renamed to `digest` against the shared AD-27 primitive. Alone among the twelve interchange artifacts this one carries NO `schemaVersion` and NO AD-29 lineage: it is a reference shape embedded inside other artifacts rather than one that crosses the package boundary alone, so versioning it would add a key to every finding and every manifest entry for no reader. It is in the inventory because it is published, not because it is exchanged; the exemption is asserted by a test against the registry's `carriesLineage` flag."
|
|
828
|
+
},
|
|
829
|
+
"EvidenceChannel": {
|
|
830
|
+
"type": "string",
|
|
831
|
+
"enum": [
|
|
832
|
+
"response-body",
|
|
833
|
+
"response-headers",
|
|
834
|
+
"response-status",
|
|
835
|
+
"call-inputs",
|
|
836
|
+
"stdout",
|
|
837
|
+
"stderr",
|
|
838
|
+
"exit-code"
|
|
839
|
+
],
|
|
840
|
+
"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."
|
|
841
|
+
},
|
|
842
|
+
"JsonValue": {
|
|
843
|
+
"description": "AD-36 value domain. Every number is a finite IEEE 754 double-precision value, and every integer lies in the safe-integer range; a larger integer, and any value needing exact decimal semantics such as money, is carried as a string in its own declared format. JSON Schema cannot express finiteness, so this restriction is stated rather than encoded: producers are told the rule here instead of discovering it through a digest mismatch, and the canonical scanner rejects a violating value before any parse.",
|
|
844
|
+
"anyOf": [
|
|
845
|
+
{
|
|
846
|
+
"type": "string"
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
"type": "number"
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
"type": "boolean"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"type": "null"
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
"type": "array",
|
|
859
|
+
"items": {
|
|
860
|
+
"$ref": "#/$defs/JsonValue"
|
|
861
|
+
}
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
"type": "object",
|
|
865
|
+
"propertyNames": {
|
|
866
|
+
"type": "string"
|
|
867
|
+
},
|
|
868
|
+
"additionalProperties": {
|
|
869
|
+
"$ref": "#/$defs/JsonValue"
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
]
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|