@openwop/spec-artifacts 2.0.0-rc.38 → 2.0.0-rc.6
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/CORPUS-STAMP.json +32 -34
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +10 -9
- package/package.json +5 -18
- package/schemas/capabilities.schema.json +1 -40
- package/schemas/certification-bundle-v2.schema.json +27 -119
- package/schemas/run-snapshot.schema.json +33 -103
- package/schemas/v2/agent-deployment-transition.schema.json +6 -5
- package/schemas/v2/agent-deployment.schema.json +9 -8
- package/schemas/v2/agent-eval-suite.schema.json +12 -11
- package/schemas/v2/artifact-type-pack-manifest.schema.json +18 -22
- package/schemas/v2/capabilities.schema.json +0 -39
- package/schemas/v2/certification-bundle.schema.json +1 -1
- package/schemas/v2/chat-card-pack-manifest.schema.json +15 -19
- package/schemas/v2/debug-bundle.schema.json +6 -6
- package/schemas/v2/eval-summary.schema.json +10 -17
- package/schemas/v2/goal.schema.json +5 -5
- package/schemas/v2/ids.schema.json +22 -120
- package/schemas/v2/node-pack-manifest.schema.json +31 -27
- package/schemas/v2/proposal.schema.json +8 -7
- package/schemas/v2/run-event-payloads.schema.json +242 -246
- package/schemas/v2/run-event.schema.json +126 -2
- package/schemas/v2/run-snapshot.schema.json +13 -34
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +45 -41
- package/schemas/v2/workflow-definition.schema.json +36 -31
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +67 -79
- package/spec/v1/deprecations.schema.json +7 -23
- package/spec/v1/extensions.json +2 -3
- package/spec/v2/declaration.json +0 -7
- package/spec/v2/release.json +2 -2
- package/schemas/v2/webhook-delivery.schema.json +0 -26
- package/spec/v2/id-field-bindings.json +0 -104
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
"properties": {
|
|
255
255
|
"id": {
|
|
256
256
|
"type": "string",
|
|
257
|
-
"pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-corpus-tag-pinned|v2-declaration-parity|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-
|
|
257
|
+
"pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-corpus-tag-pinned|v2-declaration-parity|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
|
|
258
258
|
"description": "RFC 0168 §A.1 — `openwop.<area>.<slug>`. The suite mints six areas: `requirement` (an explicit `req()` id), `it` (a per-test id from the scenario file and title), `scenario` and `floor` (per-file rows), `profile` (a claimed-profile row) and `family` (a capability gate). The lookahead refuses every id minted from a corpus-coherence file: those run in the spec repo’s CI and MUST NOT appear in a host bundle (conformance.md §\"Two products, two ledgers\"; RFC 0168 §D.1). `scripts/check-req-only.mjs` fails when the list drifts from `conformance/src/coherence/`."
|
|
259
259
|
},
|
|
260
260
|
"scenario": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/chat-card-pack-manifest.schema.json",
|
|
4
4
|
"title": "ChatCardPackManifest",
|
|
5
|
-
"description": "Manifest for a published OpenWOP AI chat card pack
|
|
5
|
+
"description": "Manifest for a published OpenWOP AI chat card pack — `pack.json` at the pack root with `kind: \"card\"`. Peer to the node / workflow-chain / prompt / artifact-type pack manifests; disjoint via the `kind` discriminator. See `spec/v1/chat-card-packs.md` for the canonical contract and RFC 0071 Phase 2 for the rationale.\n\nA chat card pack distributes AI step cards: each card binds a prompt template (with typed input slots) to a typed output artifact. When a host advertises `host.chat.cardPacks: supported` and a registered card is invoked, the host substitutes inputs into the prompt, routes the call through `ctx.aiEnvelope.generate`, and (when `outputArtifactType` is set) validates the result against the referenced artifact-type pack's schema before emitting `artifact.created`.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"name",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"name": {
|
|
22
22
|
"type": "string",
|
|
23
|
-
"description": "Reverse-DNS pack name per `node-packs.md`
|
|
23
|
+
"description": "Reverse-DNS pack name per `node-packs.md` §Naming. Reserved scopes are identical (`core.*` / `vendor.<org>.*` / `community.<author>.*` / `private.<host>.*`).",
|
|
24
24
|
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
25
25
|
"minLength": 1,
|
|
26
26
|
"maxLength": 256
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"properties": {
|
|
66
66
|
"openwop": {
|
|
67
67
|
"type": "string",
|
|
68
|
-
"description": "Semver range
|
|
68
|
+
"description": "Semver range — which openwop protocol versions this pack works against."
|
|
69
69
|
}
|
|
70
70
|
},
|
|
71
71
|
"additionalProperties": false
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"additionalProperties": {
|
|
76
76
|
"type": "string"
|
|
77
77
|
},
|
|
78
|
-
"description": "Other packs this pack depends on (e.g., the artifact-type pack declaring this card's `outputArtifactType`). Map of pack name
|
|
78
|
+
"description": "Other packs this pack depends on (e.g., the artifact-type pack declaring this card's `outputArtifactType`). Map of pack name → semver range."
|
|
79
79
|
},
|
|
80
80
|
"peerDependencies": {
|
|
81
81
|
"type": "object",
|
|
@@ -106,20 +106,16 @@
|
|
|
106
106
|
"additionalProperties": false,
|
|
107
107
|
"properties": {
|
|
108
108
|
"cardTypeId": {
|
|
109
|
-
"
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$"
|
|
115
|
-
}
|
|
116
|
-
],
|
|
117
|
-
"description": "Reverse-DNS card identifier. Same pattern and reserved scopes as a pack `name`. The value `WorkflowNode.cardType` / `ctx.chat.emitCard` MAY reference. Third parties MUST NOT publish under `core.*`."
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "Reverse-DNS card identifier. Same pattern and reserved scopes as a pack `name`. The value `WorkflowNode.cardType` / `ctx.chat.emitCard` MAY reference. Third parties MUST NOT publish under `core.*`.",
|
|
111
|
+
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
112
|
+
"minLength": 1,
|
|
113
|
+
"maxLength": 256
|
|
118
114
|
},
|
|
119
115
|
"schemaVersion": {
|
|
120
116
|
"type": "integer",
|
|
121
117
|
"minimum": 0,
|
|
122
|
-
"description": "Non-negative integer card-schema version (the envelope/artifact integer-version axis). Absent
|
|
118
|
+
"description": "Non-negative integer card-schema version (the envelope/artifact integer-version axis). Absent ⇒ treated as 0."
|
|
123
119
|
},
|
|
124
120
|
"prompt": {
|
|
125
121
|
"$ref": "#/$defs/PromptSpec"
|
|
@@ -154,7 +150,7 @@
|
|
|
154
150
|
},
|
|
155
151
|
"patternProperties": {
|
|
156
152
|
"^(openwop-|x-|vendor\\.)": {
|
|
157
|
-
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md`
|
|
153
|
+
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
|
|
158
154
|
}
|
|
159
155
|
}
|
|
160
156
|
},
|
|
@@ -181,7 +177,7 @@
|
|
|
181
177
|
"additionalProperties": {
|
|
182
178
|
"type": "string"
|
|
183
179
|
},
|
|
184
|
-
"description": "Map of `{{placeholder}}` name
|
|
180
|
+
"description": "Map of `{{placeholder}}` name → input path (e.g. `\"spec\": \"inputs.spec\"`)."
|
|
185
181
|
},
|
|
186
182
|
"temperature": {
|
|
187
183
|
"type": "number",
|
|
@@ -209,7 +205,7 @@
|
|
|
209
205
|
},
|
|
210
206
|
"type": {
|
|
211
207
|
"type": "string",
|
|
212
|
-
"description": "Closed portable subset OR a `vendor.<org>.<kind>` / `x-<kind>` host extension other hosts ignore. The portable subset (G9, resolved 2026-05-27 against MyndHyve's `CardFieldType`): `text`, `longtext`, `number`, `boolean`, `select`, `multiselect`, `file`, `artifact-ref`. MyndHyve maps `textarea
|
|
208
|
+
"description": "Closed portable subset OR a `vendor.<org>.<kind>` / `x-<kind>` host extension other hosts ignore. The portable subset (G9, resolved 2026-05-27 against MyndHyve's `CardFieldType`): `text`, `longtext`, `number`, `boolean`, `select`, `multiselect`, `file`, `artifact-ref`. MyndHyve maps `textarea`→`longtext` and `toggle`→`boolean`; its product-specific kinds (`canvas-reference`, `collection-reference`, `color`) are host extensions (`vendor.myndhyve.*`), not portable.",
|
|
213
209
|
"pattern": "^(text|longtext|number|boolean|select|multiselect|file|artifact-ref|vendor\\.[a-z][a-z0-9-]*\\.[a-z][a-z0-9-]*|x-[a-z][a-z0-9-]*)$"
|
|
214
210
|
},
|
|
215
211
|
"label": {
|
|
@@ -230,7 +226,7 @@
|
|
|
230
226
|
},
|
|
231
227
|
"Signing": {
|
|
232
228
|
"type": "object",
|
|
233
|
-
"description": "Optional signing metadata. See node-packs.md
|
|
229
|
+
"description": "Optional signing metadata. See node-packs.md §signing.",
|
|
234
230
|
"additionalProperties": false,
|
|
235
231
|
"properties": {
|
|
236
232
|
"publicKeyRef": {
|
|
@@ -251,7 +247,7 @@
|
|
|
251
247
|
},
|
|
252
248
|
"patternProperties": {
|
|
253
249
|
"^(openwop-|x-|vendor\\.)": {
|
|
254
|
-
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md`
|
|
250
|
+
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
|
|
255
251
|
}
|
|
256
252
|
},
|
|
257
253
|
"x-openwop-seeded-from": "v1"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/debug-bundle.schema.json",
|
|
4
4
|
"title": "RunDebugBundle",
|
|
5
|
-
"description": "Portable JSON export of a single run's diagnostic state. See spec/v1/debug-bundle.md. Additive over v1 per COMPATIBILITY.md
|
|
5
|
+
"description": "Portable JSON export of a single run's diagnostic state. See spec/v1/debug-bundle.md. Additive over v1 per COMPATIBILITY.md §2.1: optional endpoint; hosts MAY omit.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"bundleVersion",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"properties": {
|
|
17
17
|
"bundleVersion": {
|
|
18
18
|
"const": "2",
|
|
19
|
-
"description": "RFC 0172
|
|
19
|
+
"description": "RFC 0172 §B axis 10 — one const family; this bundle is \"2\" in v2."
|
|
20
20
|
},
|
|
21
21
|
"generatedAt": {
|
|
22
22
|
"type": "string",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
},
|
|
48
48
|
"run": {
|
|
49
49
|
"type": "object",
|
|
50
|
-
"description": "Run snapshot
|
|
50
|
+
"description": "Run snapshot — same shape as GET /v1/runs/{runId}. See run-snapshot.schema.json.",
|
|
51
51
|
"required": [
|
|
52
52
|
"runId",
|
|
53
53
|
"workflowId",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"currentNodeId": {
|
|
122
122
|
"oneOf": [
|
|
123
123
|
{
|
|
124
|
-
"
|
|
124
|
+
"type": "string"
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
127
|
"type": "null"
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"nodeId": {
|
|
168
168
|
"oneOf": [
|
|
169
169
|
{
|
|
170
|
-
"
|
|
170
|
+
"type": "string"
|
|
171
171
|
},
|
|
172
172
|
{
|
|
173
173
|
"type": "null"
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
"parentSpanId": {
|
|
199
199
|
"oneOf": [
|
|
200
200
|
{
|
|
201
|
-
"
|
|
201
|
+
"type": "string"
|
|
202
202
|
},
|
|
203
203
|
{
|
|
204
204
|
"type": "null"
|
|
@@ -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
|
|
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.",
|
|
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
|
|
44
|
+
"description": "The suite-level score (0.0–1.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
|
|
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`)."
|
|
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
|
|
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`)."
|
|
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
|
|
86
|
+
"description": "Task score (0.0–1.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
|
|
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`).",
|
|
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`)
|
|
120
|
+
"description": "Finding category (e.g. `jailbreak`, `pii-leak`, `unsafe-tool-call`) — a category label, not excerpted content."
|
|
121
121
|
},
|
|
122
122
|
"severity": {
|
|
123
123
|
"type": "string",
|
|
@@ -135,14 +135,6 @@
|
|
|
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
|
-
},
|
|
146
138
|
"regression": {
|
|
147
139
|
"type": "object",
|
|
148
140
|
"additionalProperties": false,
|
|
@@ -153,14 +145,15 @@
|
|
|
153
145
|
],
|
|
154
146
|
"properties": {
|
|
155
147
|
"baselineRunId": {
|
|
156
|
-
"
|
|
148
|
+
"type": "string",
|
|
149
|
+
"minLength": 1,
|
|
157
150
|
"description": "The prior eval run this run is compared against."
|
|
158
151
|
},
|
|
159
152
|
"scoreDelta": {
|
|
160
153
|
"type": "number",
|
|
161
154
|
"minimum": -1,
|
|
162
155
|
"maximum": 1,
|
|
163
|
-
"description": "`aggregateScore` minus the baseline's (negative
|
|
156
|
+
"description": "`aggregateScore` minus the baseline's (negative ⇒ regression)."
|
|
164
157
|
},
|
|
165
158
|
"diffRef": {
|
|
166
159
|
"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
|
|
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.",
|
|
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
|
|
26
|
+
"description": "The standing objective. SR-1 redaction-safe — 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
|
|
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.",
|
|
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
|
-
"
|
|
150
|
+
"type": "string"
|
|
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
|
|
162
|
+
"description": "RFC 0048 identity triple. Redaction-safe — `principal` is an opaque id, never PII or credential material.",
|
|
163
163
|
"properties": {
|
|
164
164
|
"tenant": {
|
|
165
165
|
"type": "string",
|
|
@@ -1,129 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/ids.schema.json",
|
|
4
|
-
"title": "OpenWOP v2 identifier grammars (RFC 0170
|
|
4
|
+
"title": "OpenWOP v2 identifier grammars (RFC 0170 §D.1)",
|
|
5
5
|
"description": "One $defs entry per id kind. Every id field in every v2 schema, OpenAPI parameter and response body $refs its kind. `minted` records who mints the id: host (opaque, checkable: `^[A-Za-z0-9._~-]{16,128}$` after any tenant segment), author (a workflow/pack author chooses it; the v1 grammar stands), registry (the pack registry mints it). Tenant-bound kinds (runId, interruptId, subscriptionId, deliveryId, effectId) carry the tenant segment: a host MUST reject an id whose tenant segment is not the caller's.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"$defs": {
|
|
9
|
-
"opaque": {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
},
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
},
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
},
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
},
|
|
31
|
-
"runId": {
|
|
32
|
-
"type": "string",
|
|
33
|
-
"pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$",
|
|
34
|
-
"description": "Tenant-bound: `<tenantId>/<opaque>`.",
|
|
35
|
-
"x-openwop-minted": "host",
|
|
36
|
-
"x-openwop-tenant-bound": true
|
|
37
|
-
},
|
|
38
|
-
"interruptId": {
|
|
39
|
-
"type": "string",
|
|
40
|
-
"pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$",
|
|
41
|
-
"x-openwop-minted": "host",
|
|
42
|
-
"x-openwop-tenant-bound": true
|
|
43
|
-
},
|
|
44
|
-
"subscriptionId": {
|
|
45
|
-
"type": "string",
|
|
46
|
-
"pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$",
|
|
47
|
-
"x-openwop-minted": "host",
|
|
48
|
-
"x-openwop-tenant-bound": true
|
|
49
|
-
},
|
|
50
|
-
"deliveryId": {
|
|
51
|
-
"type": "string",
|
|
52
|
-
"pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$",
|
|
53
|
-
"x-openwop-minted": "host",
|
|
54
|
-
"x-openwop-tenant-bound": true
|
|
55
|
-
},
|
|
56
|
-
"effectId": {
|
|
57
|
-
"type": "string",
|
|
58
|
-
"pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$",
|
|
59
|
-
"x-openwop-minted": "host",
|
|
60
|
-
"x-openwop-tenant-bound": true
|
|
61
|
-
},
|
|
62
|
-
"eventId": {
|
|
63
|
-
"type": "string",
|
|
64
|
-
"pattern": "^[A-Za-z0-9._~-]{16,128}$",
|
|
65
|
-
"x-openwop-minted": "host"
|
|
66
|
-
},
|
|
67
|
-
"traceId": {
|
|
68
|
-
"type": "string",
|
|
69
|
-
"pattern": "^[0-9a-f]{32}$",
|
|
70
|
-
"description": "W3C trace-context trace-id.",
|
|
71
|
-
"x-openwop-minted": "host"
|
|
72
|
-
},
|
|
73
|
-
"spanId": {
|
|
74
|
-
"type": "string",
|
|
75
|
-
"pattern": "^[0-9a-f]{16}$",
|
|
76
|
-
"description": "W3C trace-context parent-id.",
|
|
77
|
-
"x-openwop-minted": "host"
|
|
78
|
-
},
|
|
79
|
-
"keyId": {
|
|
80
|
-
"type": "string",
|
|
81
|
-
"pattern": "^[A-Za-z0-9._~-]{1,128}$",
|
|
82
|
-
"description": "A signing-key identifier (registry `signingKeys[].keyId`, resume-token `kid`, bundle signature `keyId`).",
|
|
83
|
-
"x-openwop-minted": "registry"
|
|
84
|
-
},
|
|
85
|
-
"nodeId": {
|
|
86
|
-
"type": "string",
|
|
87
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
88
|
-
"description": "Author-chosen within a workflow definition.",
|
|
89
|
-
"x-openwop-minted": "author"
|
|
90
|
-
},
|
|
91
|
-
"workflowId": {
|
|
92
|
-
"type": "string",
|
|
93
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
94
|
-
"x-openwop-minted": "author"
|
|
95
|
-
},
|
|
96
|
-
"agentId": {
|
|
97
|
-
"type": "string",
|
|
98
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
99
|
-
"x-openwop-minted": "author"
|
|
100
|
-
},
|
|
101
|
-
"chainId": {
|
|
102
|
-
"type": "string",
|
|
103
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
104
|
-
"x-openwop-minted": "author"
|
|
105
|
-
},
|
|
106
|
-
"pluginId": {
|
|
107
|
-
"type": "string",
|
|
108
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
109
|
-
"x-openwop-minted": "author"
|
|
110
|
-
},
|
|
111
|
-
"templateId": {
|
|
112
|
-
"type": "string",
|
|
113
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
114
|
-
"x-openwop-minted": "author"
|
|
115
|
-
},
|
|
116
|
-
"libraryId": {
|
|
117
|
-
"type": "string",
|
|
118
|
-
"pattern": "^[A-Za-z0-9._~:-]{1,128}$",
|
|
119
|
-
"x-openwop-minted": "author"
|
|
120
|
-
},
|
|
121
|
-
"typeId": {
|
|
122
|
-
"type": "string",
|
|
123
|
-
"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
124
|
-
"description": "A node type id (`core.ai.callPrompt`); the RFC 0107 grammar. Underscore is admitted because node-pack-manifest.schema.json's `name` pattern admits it and a pack's node type ids are DERIVED from its name \u2014 a pack legally named `vendor.acme.my_tools` must be able to declare `vendor.acme.my_tools.echo`. Without the underscore this kind rejected type ids that a legal pack name generates, which is a constraint that cannot express a legitimate value. maxLength is present because this was the ONLY kind whose pattern left length unbounded \u2014 every other $def bounds it inside the pattern ({1,128}, {16,128}). 256 is taken from the bound node-pack-manifest already carried locally, so this relocates it rather than inventing one, and binding those properties to this kind no longer drops it.",
|
|
125
|
-
"x-openwop-minted": "author",
|
|
126
|
-
"maxLength": 256
|
|
127
|
-
}
|
|
9
|
+
"opaque": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{16,128}$", "description": "Host-minted opaque token: no `@`, no whitespace, no `/`; 16–128 characters." },
|
|
10
|
+
"tenantId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}$", "x-openwop-minted": "host" },
|
|
11
|
+
"workspaceId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}$", "x-openwop-minted": "host" },
|
|
12
|
+
"subjectId": { "type": "string", "pattern": "^[^\\s/]{1,256}$", "description": "Issuer-scoped, stable, opaque (RFC 0170 §A); the issuer's grammar, never PII.", "x-openwop-minted": "host" },
|
|
13
|
+
"runId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "description": "Tenant-bound: `<tenantId>/<opaque>`.", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
|
|
14
|
+
"interruptId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
|
|
15
|
+
"subscriptionId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
|
|
16
|
+
"deliveryId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
|
|
17
|
+
"effectId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
|
|
18
|
+
"eventId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host" },
|
|
19
|
+
"traceId": { "type": "string", "pattern": "^[0-9a-f]{32}$", "description": "W3C trace-context trace-id.", "x-openwop-minted": "host" },
|
|
20
|
+
"spanId": { "type": "string", "pattern": "^[0-9a-f]{16}$", "description": "W3C trace-context parent-id.", "x-openwop-minted": "host" },
|
|
21
|
+
"keyId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}$", "description": "A signing-key identifier (registry `signingKeys[].keyId`, resume-token `kid`, bundle signature `keyId`).", "x-openwop-minted": "registry" },
|
|
22
|
+
"nodeId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "description": "Author-chosen within a workflow definition.", "x-openwop-minted": "author" },
|
|
23
|
+
"workflowId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
|
|
24
|
+
"agentId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
|
|
25
|
+
"chainId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
|
|
26
|
+
"pluginId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
|
|
27
|
+
"templateId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
|
|
28
|
+
"libraryId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
|
|
29
|
+
"typeId": { "type": "string", "pattern": "^[a-z][a-z0-9-]*(\\.[a-z][a-zA-Z0-9-]*)+$", "description": "A node type id (`core.ai.callPrompt`); the RFC 0107 grammar.", "x-openwop-minted": "author" }
|
|
128
30
|
}
|
|
129
31
|
}
|