@openwop/spec-artifacts 2.0.0-rc.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CORPUS-STAMP.json +41 -38
  2. package/api/seams-v2.yaml +1 -1
  3. package/api/v2/asyncapi.yaml +1 -1
  4. package/api/v2/openapi.yaml +17 -19
  5. package/package.json +18 -5
  6. package/schemas/capabilities.schema.json +40 -1
  7. package/schemas/run-snapshot.schema.json +103 -33
  8. package/schemas/v2/agent-deployment-transition.schema.json +5 -6
  9. package/schemas/v2/agent-deployment.schema.json +8 -9
  10. package/schemas/v2/agent-eval-suite.schema.json +11 -12
  11. package/schemas/v2/artifact-type-pack-manifest.schema.json +22 -18
  12. package/schemas/v2/capabilities.schema.json +39 -0
  13. package/schemas/v2/certification-bundle.schema.json +1 -1
  14. package/schemas/v2/chat-card-pack-manifest.schema.json +19 -15
  15. package/schemas/v2/debug-bundle.schema.json +6 -6
  16. package/schemas/v2/effect-ledger-projection.schema.json +4 -3
  17. package/schemas/v2/effect-seam-manifest.schema.json +30 -7
  18. package/schemas/v2/error-envelope.schema.json +185 -138
  19. package/schemas/v2/eval-summary.schema.json +17 -10
  20. package/schemas/v2/goal.schema.json +5 -5
  21. package/schemas/v2/ids.schema.json +120 -22
  22. package/schemas/v2/node-pack-manifest.schema.json +27 -31
  23. package/schemas/v2/proposal.schema.json +7 -8
  24. package/schemas/v2/run-event-payloads.schema.json +258 -245
  25. package/schemas/v2/run-event.schema.json +2 -126
  26. package/schemas/v2/run-options.schema.json +1 -1
  27. package/schemas/v2/run-snapshot.schema.json +34 -13
  28. package/schemas/v2/webhook-delivery.schema.json +26 -0
  29. package/schemas/v2/workflow-chain-pack-manifest.schema.json +41 -45
  30. package/schemas/v2/workflow-definition.schema.json +31 -36
  31. package/spec/v1/core-standard-manifest.json +2 -2
  32. package/spec/v1/deprecations.json +79 -67
  33. package/spec/v1/deprecations.schema.json +23 -7
  34. package/spec/v1/extensions.json +3 -2
  35. package/spec/v2/declaration.json +63 -32
  36. package/spec/v2/errors.json +421 -360
  37. package/spec/v2/id-field-bindings.json +105 -0
  38. package/spec/v2/profiles.json +31 -7
  39. package/spec/v2/release.json +4 -4
  40. package/spec/v2/retention-floors.json +35 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/effect-seam-manifest.schema.json",
4
- "title": "Effect-seam manifest (RFC 0173 §C)",
5
- "description": "Host-declared, machine-checkable list of every outbound effect path the node runtime can reach (RFC 0173 §C.1: `{ seam, kind, guarded: true, guardedBy }`; `branchReFires` states the RFC 0140 G6 asymmetry). Served at GET /host/effect-seams (canonical, not a test seam). A seam omitted is invisible to the suite (negative-existence); the RFC 0140 R5 audit is the control.",
4
+ "title": "Effect-seam manifest (RFC 0173 \u00a7C)",
5
+ "description": "Host-declared, machine-checkable list of every outbound effect path the node runtime can reach (RFC 0173 \u00a7C.1: `{ seam, kind, guarded: true, guardedBy }`; `branchReFires` states the RFC 0140 G6 asymmetry). Served at GET /host/effect-seams (canonical, not a test seam). A seam omitted is invisible to the suite (negative-existence); the RFC 0140 R5 audit is the control.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -69,15 +69,18 @@
69
69
  "type": "string",
70
70
  "enum": [
71
71
  "http",
72
+ "smtp",
72
73
  "queue",
73
74
  "storage",
74
75
  "provider-sdk",
75
- "webhook-fanout"
76
- ]
76
+ "webhook-fanout",
77
+ "other"
78
+ ],
79
+ "description": "The outbound WIRE MECHANISM this seam leaves the host by \u2014 not the suite's driving mechanism, and not the business purpose. `other` is the escape for a mechanism this list does not name (raw TCP, gRPC, a filesystem write, a device SDK); a row using it MUST carry `note` saying which, so an unnameable mechanism is still auditable and no seam can hide behind a vague label. Completeness outranks driveability: a path the suite cannot drive (SMTP, for one) is still MUST-list \u2014 the scenario records it `inapplicable` with that reason, and an omitted row is invisible to the suite entirely (replay.md)."
77
80
  },
78
81
  "guarded": {
79
82
  "const": true,
80
- "description": "RFC 0173 §C.1 every row MUST be guarded; the scenario asserts it and drives one seam of each kind through the suite's receiver."
83
+ "description": "RFC 0173 \u00a7C.1 \u2014 every row MUST be guarded; the scenario asserts it and drives one seam of each kind through the suite's receiver."
81
84
  },
82
85
  "guardedBy": {
83
86
  "type": "string",
@@ -86,11 +89,31 @@
86
89
  },
87
90
  "branchReFires": {
88
91
  "type": "boolean",
89
- "description": "RFC 0140 G6 a `branch` fork re-fires this seam by design; stated here and witnessed as a permission."
92
+ "description": "RFC 0140 G6 \u2014 a `branch` fork re-fires this seam by design; stated here and witnessed as a permission."
90
93
  },
91
94
  "note": {
92
- "type": "string"
95
+ "type": "string",
96
+ "description": "Free text. REQUIRED when `kind` is `other`, where it MUST name the mechanism."
93
97
  }
98
+ },
99
+ "if": {
100
+ "properties": {
101
+ "kind": {
102
+ "const": "other"
103
+ }
104
+ },
105
+ "required": [
106
+ "kind"
107
+ ]
108
+ },
109
+ "then": {
110
+ "required": [
111
+ "seam",
112
+ "kind",
113
+ "guarded",
114
+ "guardedBy",
115
+ "note"
116
+ ]
94
117
  }
95
118
  }
96
119
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/error-envelope.schema.json",
4
4
  "title": "ErrorEnvelope (v2)",
5
- "description": "GENERATED from spec/v2/errors.json by scripts/generate-error-envelope.mjs (RFC 0171 §B.1). 94 registered codes; vendor codes match ^(?!openwop\\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9_]*$. Consumers MUST accept an unknown registered member and MUST NOT act on it (RFC 0171 §A.5).",
5
+ "description": "GENERATED from spec/v2/errors.json by scripts/generate-error-envelope.mjs (RFC 0171 §B.1). 97 registered codes; vendor codes match ^(?!openwop\\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9_]*$. Consumers MUST accept an unknown registered member and MUST NOT act on it (RFC 0171 §A.5).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -15,100 +15,103 @@
15
15
  {
16
16
  "type": "string",
17
17
  "enum": [
18
- "audience_mismatch",
19
- "capability_not_provided",
20
- "capability_required",
21
- "client_version_unsupported",
22
- "connection_provider_conflict",
23
18
  "connection_provider_unresolved",
24
19
  "connector_action_unresolved",
25
- "connector_auth_expired",
26
- "credential_forbidden",
27
- "credential_not_found",
28
- "credential_required",
29
- "credential_revoked",
30
20
  "credential_scope_unsupported",
31
- "credential_unavailable",
32
21
  "delegation_chain_cyclic",
33
22
  "delegation_chain_too_long",
34
- "delegation_expired",
35
- "delegation_scope_amplified",
36
- "envelope_correlation_conflict",
37
- "envelope_invalid",
38
- "envelope_refusal",
39
- "envelope_truncation_unrecoverable",
40
- "event_type_unmapped",
41
- "forbidden",
42
- "force_engine_version_forbidden",
43
- "fork_point_invalid",
44
- "id_tenant_mismatch",
45
- "idempotency_in_flight",
46
23
  "idempotency_key_invalid",
47
- "idempotency_key_mismatch",
48
- "identity_unresolvable",
49
- "identity_unverified",
50
- "internal_error",
51
24
  "interop_version_unsupported",
52
- "interrupt_already_resolved",
53
- "interrupt_cancelled",
54
- "interrupt_expired",
55
- "interrupt_not_found",
56
- "interrupt_token_invalid",
57
- "key_revoked",
58
- "loop_limit_exceeded",
59
- "mcp_mrtr_rounds_exceeded",
60
- "mock_provider_forbidden",
61
- "not_found",
62
25
  "oauth_provider_unsupported",
63
26
  "oauth_scope_unsupported",
64
- "pack_dependency_conflict",
65
27
  "pack_dependency_cycle",
66
28
  "pack_engine_unsupported",
67
29
  "pack_integrity_failure",
68
- "pack_integrity_mismatch",
69
30
  "pack_kind_invalid",
70
- "pack_load_failure",
71
31
  "pack_lockfile_incomplete",
72
- "pack_namespace_unauthorized",
73
32
  "pack_peer_dependency_missing",
74
33
  "pack_peer_dependency_undefined",
75
- "pack_registry_unreachable",
76
- "pack_runtime_requirement_unmet",
77
34
  "pack_signature_invalid",
78
35
  "pack_validation_failed",
79
- "pack_version_not_found",
80
36
  "protocol_version_mismatch",
37
+ "schedule_horizon_exceeded",
38
+ "sub_chain_cycle",
39
+ "sub_chain_depth_exceeded",
40
+ "unsupported_stream_mode",
41
+ "until_in_past",
42
+ "validation_error",
43
+ "webhook_url_rejected",
44
+ "audience_mismatch",
45
+ "connector_auth_expired",
46
+ "credential_revoked",
47
+ "delegation_expired",
48
+ "identity_unresolvable",
49
+ "identity_unverified",
50
+ "interrupt_token_invalid",
51
+ "key_revoked",
52
+ "sender_constraint_missing",
53
+ "unauthenticated",
54
+ "credential_forbidden",
55
+ "delegation_scope_amplified",
56
+ "forbidden",
57
+ "force_engine_version_forbidden",
58
+ "id_tenant_mismatch",
59
+ "mock_provider_forbidden",
60
+ "pack_namespace_unauthorized",
61
+ "run_forbidden",
62
+ "sandbox_capability_denied",
63
+ "sandbox_escape_attempt",
64
+ "workspace_membership_required",
65
+ "credential_not_found",
66
+ "interrupt_not_found",
67
+ "not_found",
68
+ "pack_version_not_found",
69
+ "replay_source_missing",
70
+ "signature_not_available",
81
71
  "protocol_version_unsupported",
82
- "rate_limited",
83
- "recursion_limit_exceeded",
72
+ "connection_provider_conflict",
73
+ "envelope_correlation_conflict",
74
+ "idempotency_in_flight",
75
+ "idempotency_key_mismatch",
76
+ "interrupt_already_resolved",
77
+ "pack_dependency_conflict",
78
+ "pack_integrity_mismatch",
84
79
  "replay_diverged_at_refusal",
85
80
  "replay_memory_snapshot_unavailable",
86
- "replay_source_missing",
87
- "residency_unavailable",
88
81
  "run_already_active",
89
- "run_forbidden",
90
82
  "run_terminal",
83
+ "run_state_conflict",
84
+ "version_conflict",
85
+ "workspace_conflict",
86
+ "interrupt_cancelled",
87
+ "interrupt_expired",
88
+ "payload_too_large",
89
+ "workspace_too_large",
90
+ "unsupported_media_type",
91
+ "capability_not_provided",
92
+ "capability_required",
93
+ "credential_required",
94
+ "envelope_invalid",
95
+ "envelope_refusal",
96
+ "envelope_truncation_unrecoverable",
97
+ "fork_point_invalid",
98
+ "loop_limit_exceeded",
99
+ "mcp_mrtr_rounds_exceeded",
100
+ "pack_runtime_requirement_unmet",
101
+ "recursion_limit_exceeded",
102
+ "residency_unavailable",
91
103
  "run_timeout",
92
- "runner_unavailable",
93
- "sandbox_capability_denied",
94
- "sandbox_escape_attempt",
95
104
  "sandbox_memory_exceeded",
96
105
  "sandbox_timeout",
97
- "schedule_horizon_exceeded",
98
- "sender_constraint_missing",
99
- "signature_not_available",
100
- "sub_chain_cycle",
101
- "sub_chain_depth_exceeded",
102
106
  "token_budget_exceeded",
103
- "unauthenticated",
104
- "unsupported_stream_mode",
105
- "until_in_past",
106
- "validation_error",
107
- "version_conflict",
108
- "webhook_url_rejected",
109
- "workspace_conflict",
110
- "workspace_membership_required",
111
- "workspace_too_large"
107
+ "client_version_unsupported",
108
+ "rate_limited",
109
+ "event_type_unmapped",
110
+ "internal_error",
111
+ "pack_load_failure",
112
+ "credential_unavailable",
113
+ "pack_registry_unreachable",
114
+ "runner_unavailable"
112
115
  ]
113
116
  },
114
117
  {
@@ -122,112 +125,156 @@
122
125
  "minLength": 1
123
126
  },
124
127
  "details": {
125
- "type": "object",
126
- "additionalProperties": true,
127
- "description": "Error-specific contextual data. No code has registered a details schema yet (errors.json rows carry details: null); when one does, this becomes a oneOf discriminated on error."
128
+ "oneOf": [
129
+ {
130
+ "type": "object",
131
+ "required": [
132
+ "supported"
133
+ ],
134
+ "properties": {
135
+ "supported": {
136
+ "type": "array",
137
+ "minItems": 1,
138
+ "items": {
139
+ "type": "string",
140
+ "enum": [
141
+ "values",
142
+ "updates",
143
+ "messages",
144
+ "debug"
145
+ ]
146
+ },
147
+ "description": "Each individual mode the host serves; combinations are not listed (events.md §The events channel)."
148
+ }
149
+ },
150
+ "additionalProperties": true,
151
+ "x-openwop-error": "unsupported_stream_mode"
152
+ },
153
+ {
154
+ "type": "object",
155
+ "required": [
156
+ "runStatus"
157
+ ],
158
+ "properties": {
159
+ "runStatus": {
160
+ "type": "string",
161
+ "description": "The run status that refused the transition (runs.md §Pause and resume)."
162
+ }
163
+ },
164
+ "additionalProperties": true,
165
+ "x-openwop-error": "run_state_conflict"
166
+ },
167
+ {
168
+ "type": "object",
169
+ "additionalProperties": true
170
+ }
171
+ ]
128
172
  }
129
173
  },
130
174
  "x-openwop-http-status": {
131
- "audience_mismatch": 401,
132
- "capability_not_provided": 422,
133
- "capability_required": 422,
134
- "client_version_unsupported": 426,
135
- "connection_provider_conflict": 409,
136
175
  "connection_provider_unresolved": 400,
137
176
  "connector_action_unresolved": 400,
138
- "connector_auth_expired": 401,
139
- "credential_forbidden": 403,
140
- "credential_not_found": 404,
141
- "credential_required": 422,
142
- "credential_revoked": 401,
143
177
  "credential_scope_unsupported": 400,
144
- "credential_unavailable": 501,
145
178
  "delegation_chain_cyclic": 400,
146
179
  "delegation_chain_too_long": 400,
147
- "delegation_expired": 401,
148
- "delegation_scope_amplified": 403,
149
- "envelope_correlation_conflict": 409,
150
- "envelope_invalid": 422,
151
- "envelope_refusal": 422,
152
- "envelope_truncation_unrecoverable": 422,
153
- "event_type_unmapped": 500,
154
- "forbidden": 403,
155
- "force_engine_version_forbidden": 403,
156
- "fork_point_invalid": 422,
157
- "id_tenant_mismatch": 403,
158
- "idempotency_in_flight": 409,
159
180
  "idempotency_key_invalid": 400,
160
- "idempotency_key_mismatch": 409,
161
- "identity_unresolvable": 401,
162
- "identity_unverified": 401,
163
- "internal_error": 500,
164
181
  "interop_version_unsupported": 400,
165
- "interrupt_already_resolved": 409,
166
- "interrupt_cancelled": 410,
167
- "interrupt_expired": 410,
168
- "interrupt_not_found": 404,
169
- "interrupt_token_invalid": 401,
170
- "key_revoked": 401,
171
- "loop_limit_exceeded": 422,
172
- "mcp_mrtr_rounds_exceeded": 422,
173
- "mock_provider_forbidden": 403,
174
- "not_found": 404,
175
182
  "oauth_provider_unsupported": 400,
176
183
  "oauth_scope_unsupported": 400,
177
- "pack_dependency_conflict": 409,
178
184
  "pack_dependency_cycle": 400,
179
185
  "pack_engine_unsupported": 400,
180
186
  "pack_integrity_failure": 400,
181
- "pack_integrity_mismatch": 409,
182
187
  "pack_kind_invalid": 400,
183
- "pack_load_failure": 500,
184
188
  "pack_lockfile_incomplete": 400,
185
- "pack_namespace_unauthorized": 403,
186
189
  "pack_peer_dependency_missing": 400,
187
190
  "pack_peer_dependency_undefined": 400,
188
- "pack_registry_unreachable": 503,
189
- "pack_runtime_requirement_unmet": 422,
190
191
  "pack_signature_invalid": 400,
191
192
  "pack_validation_failed": 400,
192
- "pack_version_not_found": 404,
193
193
  "protocol_version_mismatch": 400,
194
+ "schedule_horizon_exceeded": 400,
195
+ "sub_chain_cycle": 400,
196
+ "sub_chain_depth_exceeded": 400,
197
+ "unsupported_stream_mode": 400,
198
+ "until_in_past": 400,
199
+ "validation_error": 400,
200
+ "webhook_url_rejected": 400,
201
+ "audience_mismatch": 401,
202
+ "connector_auth_expired": 401,
203
+ "credential_revoked": 401,
204
+ "delegation_expired": 401,
205
+ "identity_unresolvable": 401,
206
+ "identity_unverified": 401,
207
+ "interrupt_token_invalid": 401,
208
+ "key_revoked": 401,
209
+ "sender_constraint_missing": 401,
210
+ "unauthenticated": 401,
211
+ "credential_forbidden": 403,
212
+ "delegation_scope_amplified": 403,
213
+ "forbidden": 403,
214
+ "force_engine_version_forbidden": 403,
215
+ "id_tenant_mismatch": 403,
216
+ "mock_provider_forbidden": 403,
217
+ "pack_namespace_unauthorized": 403,
218
+ "run_forbidden": 403,
219
+ "sandbox_capability_denied": 403,
220
+ "sandbox_escape_attempt": 403,
221
+ "workspace_membership_required": 403,
222
+ "credential_not_found": 404,
223
+ "interrupt_not_found": 404,
224
+ "not_found": 404,
225
+ "pack_version_not_found": 404,
226
+ "replay_source_missing": 404,
227
+ "signature_not_available": 404,
194
228
  "protocol_version_unsupported": 406,
195
- "rate_limited": 429,
196
- "recursion_limit_exceeded": 422,
229
+ "connection_provider_conflict": 409,
230
+ "envelope_correlation_conflict": 409,
231
+ "idempotency_in_flight": 409,
232
+ "idempotency_key_mismatch": 409,
233
+ "interrupt_already_resolved": 409,
234
+ "pack_dependency_conflict": 409,
235
+ "pack_integrity_mismatch": 409,
197
236
  "replay_diverged_at_refusal": 409,
198
237
  "replay_memory_snapshot_unavailable": 409,
199
- "replay_source_missing": 404,
200
- "residency_unavailable": 422,
201
238
  "run_already_active": 409,
202
- "run_forbidden": 403,
203
239
  "run_terminal": 409,
240
+ "run_state_conflict": 409,
241
+ "version_conflict": 409,
242
+ "workspace_conflict": 409,
243
+ "interrupt_cancelled": 410,
244
+ "interrupt_expired": 410,
245
+ "payload_too_large": 413,
246
+ "workspace_too_large": 413,
247
+ "unsupported_media_type": 415,
248
+ "capability_not_provided": 422,
249
+ "capability_required": 422,
250
+ "credential_required": 422,
251
+ "envelope_invalid": 422,
252
+ "envelope_refusal": 422,
253
+ "envelope_truncation_unrecoverable": 422,
254
+ "fork_point_invalid": 422,
255
+ "loop_limit_exceeded": 422,
256
+ "mcp_mrtr_rounds_exceeded": 422,
257
+ "pack_runtime_requirement_unmet": 422,
258
+ "recursion_limit_exceeded": 422,
259
+ "residency_unavailable": 422,
204
260
  "run_timeout": 422,
205
- "runner_unavailable": 503,
206
- "sandbox_capability_denied": 403,
207
- "sandbox_escape_attempt": 403,
208
261
  "sandbox_memory_exceeded": 422,
209
262
  "sandbox_timeout": 422,
210
- "schedule_horizon_exceeded": 400,
211
- "sender_constraint_missing": 401,
212
- "signature_not_available": 404,
213
- "sub_chain_cycle": 400,
214
- "sub_chain_depth_exceeded": 400,
215
263
  "token_budget_exceeded": 422,
216
- "unauthenticated": 401,
217
- "unsupported_stream_mode": 400,
218
- "until_in_past": 400,
219
- "validation_error": 400,
220
- "version_conflict": 409,
221
- "webhook_url_rejected": 400,
222
- "workspace_conflict": 409,
223
- "workspace_membership_required": 403,
224
- "workspace_too_large": 413
264
+ "client_version_unsupported": 426,
265
+ "rate_limited": 429,
266
+ "event_type_unmapped": 500,
267
+ "internal_error": 500,
268
+ "pack_load_failure": 500,
269
+ "credential_unavailable": 501,
270
+ "pack_registry_unreachable": 503,
271
+ "runner_unavailable": 503
225
272
  },
226
273
  "x-openwop-retriable": [
274
+ "residency_unavailable",
275
+ "rate_limited",
227
276
  "internal_error",
228
277
  "pack_registry_unreachable",
229
- "rate_limited",
230
- "residency_unavailable",
231
278
  "runner_unavailable"
232
279
  ]
233
280
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/eval-summary.schema.json",
4
4
  "title": "EvalSummary",
5
- "description": "RFC 0081 §C. The terminal scorecard of an eval run (the `mode: \"eval\"` projection over `POST /v1/runs`, RFC 0081 §B): the aggregate + per-task scores, cost, latency, schema-validity, and safety findings, plus the suite provenance and (for `regression` mode) the score delta vs a baseline. Set as the eval run's output and served by `GET /v1/runs/{runId}/eval-summary`. SECURITY invariant `eval-summary-no-content-leak`: the summary carries scores, ids, counts, and redaction-safe safety descriptors only NEVER task output bodies, rubric prose, model completions, prompts, or credential material (SR-1). A consumer reads the run's normal projection for any body.",
5
+ "description": "RFC 0081 \u00a7C. The terminal scorecard of an eval run (the `mode: \"eval\"` projection over `POST /v1/runs`, RFC 0081 \u00a7B): the aggregate + per-task scores, cost, latency, schema-validity, and safety findings, plus the suite provenance and (for `regression` mode) the score delta vs a baseline. Set as the eval run's output and served by `GET /v1/runs/{runId}/eval-summary`. SECURITY invariant `eval-summary-no-content-leak`: the summary carries scores, ids, counts, and redaction-safe safety descriptors only \u2014 NEVER task output bodies, rubric prose, model completions, prompts, or credential material (SR-1). A consumer reads the run's normal projection for any body.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -41,11 +41,11 @@
41
41
  "type": "number",
42
42
  "minimum": 0,
43
43
  "maximum": 1,
44
- "description": "The suite-level score (0.0–1.0): the aggregation (host-defined, typically the mean) of per-task scores."
44
+ "description": "The suite-level score (0.0\u20131.0): the aggregation (host-defined, typically the mean) of per-task scores."
45
45
  },
46
46
  "passed": {
47
47
  "type": "boolean",
48
- "description": "Whether the run cleared the suite's `thresholds` (RFC 0081 §A) `aggregateScore >= passScore` AND, when declared, `totalCostUsd <= maxCostUsd` AND the p95 latency bar. The load-bearing flag an RFC 0082 deployment gate may require (`requiredEval`)."
48
+ "description": "Whether the run cleared the suite's `thresholds` (RFC 0081 \u00a7A) \u2014 `aggregateScore >= passScore` AND, when declared, `totalCostUsd <= maxCostUsd` AND the p95 latency bar. The load-bearing flag an RFC 0082 deployment gate may require (`requiredEval`)."
49
49
  },
50
50
  "taskCount": {
51
51
  "type": "integer",
@@ -60,7 +60,7 @@
60
60
  "totalCostUsd": {
61
61
  "type": "number",
62
62
  "minimum": 0,
63
- "description": "MAY. Total cost of the run, summed from the per-task RFC 0026 `provider.usage` events (the scalar only never a pricing breakdown or rate card; `eval-summary-no-content-leak`)."
63
+ "description": "MAY. Total cost of the run, summed from the per-task RFC 0026 `provider.usage` events (the scalar only \u2014 never a pricing breakdown or rate card; `eval-summary-no-content-leak`)."
64
64
  },
65
65
  "tasks": {
66
66
  "type": "array",
@@ -83,7 +83,7 @@
83
83
  "type": "number",
84
84
  "minimum": 0,
85
85
  "maximum": 1,
86
- "description": "Task score (0.0–1.0)."
86
+ "description": "Task score (0.0\u20131.0)."
87
87
  },
88
88
  "passed": {
89
89
  "type": "boolean",
@@ -105,7 +105,7 @@
105
105
  },
106
106
  "safetyFindings": {
107
107
  "type": "array",
108
- "description": "MAY. Redaction-safe safety findings (primarily `adversarial` mode). Each is a `{kind, severity}` descriptor NO excerpted content, prompt, or completion text (`eval-summary-no-content-leak`).",
108
+ "description": "MAY. Redaction-safe safety findings (primarily `adversarial` mode). Each is a `{kind, severity}` descriptor \u2014 NO excerpted content, prompt, or completion text (`eval-summary-no-content-leak`).",
109
109
  "items": {
110
110
  "type": "object",
111
111
  "additionalProperties": false,
@@ -117,7 +117,7 @@
117
117
  "kind": {
118
118
  "type": "string",
119
119
  "minLength": 1,
120
- "description": "Finding category (e.g. `jailbreak`, `pii-leak`, `unsafe-tool-call`) a category label, not excerpted content."
120
+ "description": "Finding category (e.g. `jailbreak`, `pii-leak`, `unsafe-tool-call`) \u2014 a category label, not excerpted content."
121
121
  },
122
122
  "severity": {
123
123
  "type": "string",
@@ -135,6 +135,14 @@
135
135
  }
136
136
  }
137
137
  },
138
+ "pinnedNodeIds": {
139
+ "type": "array",
140
+ "items": {
141
+ "$ref": "ids.schema.json#/$defs/nodeId"
142
+ },
143
+ "uniqueItems": true,
144
+ "description": "MAY. The node ids whose outputs were PINNED (mocked) for this eval run rather than executed, so a reader knows the verdict's scope. Ids only, never the pinned values: this summary MUST be content-free of task output (runs.md), and a pin IS a task output. The values live on the eval run's own resume snapshot, behind the run's auth, where a reproducer with access can fetch them. Added 2026-09-04 after a tier-1 host proposed `pinned: true` on each node.completed event and asked first \u2014 replay-ness is a run property (replay.md \u00a7Determinism 5, webhooks.md \u00a7Replay), so the per-event flag was refused and the seat moved here: reproducibility of SCOPE on the wire, reproducibility of VALUES behind the boundary."
145
+ },
138
146
  "regression": {
139
147
  "type": "object",
140
148
  "additionalProperties": false,
@@ -145,15 +153,14 @@
145
153
  ],
146
154
  "properties": {
147
155
  "baselineRunId": {
148
- "type": "string",
149
- "minLength": 1,
156
+ "$ref": "ids.schema.json#/$defs/runId",
150
157
  "description": "The prior eval run this run is compared against."
151
158
  },
152
159
  "scoreDelta": {
153
160
  "type": "number",
154
161
  "minimum": -1,
155
162
  "maximum": 1,
156
- "description": "`aggregateScore` minus the baseline's (negative regression)."
163
+ "description": "`aggregateScore` minus the baseline's (negative \u21d2 regression)."
157
164
  },
158
165
  "diffRef": {
159
166
  "type": "string",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/goal.schema.json",
4
4
  "title": "Goal",
5
- "description": "RFC 0097 §B. A standing goal a durable objective with explicit completion criteria, evaluated by a host-side judge (RFC 0090 verifier verdict or an opaque host evaluator), that keeps an agent working across turns and runs until the judge is satisfied, a declared RFC 0058 bound is crossed, or the agent escalates (RFC 0044). Completion MUST be the judge's verdict a client MUST NOT set `state: satisfied` directly. Continuation MUST be bounded. `objective` and any verdict payload are SR-1 redaction-safe. Gated on the `agents.goals` capability.",
5
+ "description": "RFC 0097 \u00a7B. A standing goal \u2014 a durable objective with explicit completion criteria, evaluated by a host-side judge (RFC 0090 verifier verdict or an opaque host evaluator), that keeps an agent working across turns and runs until the judge is satisfied, a declared RFC 0058 bound is crossed, or the agent escalates (RFC 0044). Completion MUST be the judge's verdict \u2014 a client MUST NOT set `state: satisfied` directly. Continuation MUST be bounded. `objective` and any verdict payload are SR-1 redaction-safe. Gated on the `agents.goals` capability.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "objective": {
25
25
  "type": "string",
26
- "description": "The standing objective. SR-1 redaction-safe no secrets/PII."
26
+ "description": "The standing objective. SR-1 redaction-safe \u2014 no secrets/PII."
27
27
  },
28
28
  "state": {
29
29
  "type": "string",
@@ -67,7 +67,7 @@
67
67
  ],
68
68
  "default": null,
69
69
  "additionalProperties": false,
70
- "description": "Most recent judge verdict. Content-free re: objective text. Non-deterministic judge output MUST be persisted (carried in the `goal.evaluated` event / checkpoint) and never recomputed on replay/fork.",
70
+ "description": "Most recent judge verdict. Content-free re: objective text. Non-deterministic judge output \u2014 MUST be persisted (carried in the `goal.evaluated` event / checkpoint) and never recomputed on replay/fork.",
71
71
  "properties": {
72
72
  "satisfied": {
73
73
  "type": "boolean"
@@ -147,7 +147,7 @@
147
147
  "contributingRunIds": {
148
148
  "type": "array",
149
149
  "items": {
150
- "type": "string"
150
+ "$ref": "ids.schema.json#/$defs/runId"
151
151
  },
152
152
  "description": "RFC 0040 causation-compatible."
153
153
  }
@@ -159,7 +159,7 @@
159
159
  "required": [
160
160
  "tenant"
161
161
  ],
162
- "description": "RFC 0048 identity triple. Redaction-safe `principal` is an opaque id, never PII or credential material.",
162
+ "description": "RFC 0048 identity triple. Redaction-safe \u2014 `principal` is an opaque id, never PII or credential material.",
163
163
  "properties": {
164
164
  "tenant": {
165
165
  "type": "string",