@openwop/spec-artifacts 2.0.0-rc.9 → 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.
- package/CORPUS-STAMP.json +40 -37
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +17 -19
- package/package.json +1 -1
- package/schemas/capabilities.schema.json +40 -1
- package/schemas/run-snapshot.schema.json +103 -33
- package/schemas/v2/agent-deployment-transition.schema.json +5 -6
- package/schemas/v2/agent-deployment.schema.json +8 -9
- package/schemas/v2/agent-eval-suite.schema.json +11 -12
- package/schemas/v2/artifact-type-pack-manifest.schema.json +22 -18
- package/schemas/v2/certification-bundle.schema.json +1 -1
- package/schemas/v2/chat-card-pack-manifest.schema.json +19 -15
- package/schemas/v2/debug-bundle.schema.json +6 -6
- package/schemas/v2/effect-ledger-projection.schema.json +4 -3
- package/schemas/v2/effect-seam-manifest.schema.json +30 -7
- package/schemas/v2/error-envelope.schema.json +185 -138
- package/schemas/v2/eval-summary.schema.json +17 -10
- package/schemas/v2/goal.schema.json +5 -5
- package/schemas/v2/ids.schema.json +120 -22
- package/schemas/v2/node-pack-manifest.schema.json +27 -31
- package/schemas/v2/proposal.schema.json +7 -8
- package/schemas/v2/run-event-payloads.schema.json +258 -245
- package/schemas/v2/run-event.schema.json +2 -126
- package/schemas/v2/run-options.schema.json +1 -1
- package/schemas/v2/run-snapshot.schema.json +34 -13
- package/schemas/v2/webhook-delivery.schema.json +26 -0
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +41 -45
- package/schemas/v2/workflow-definition.schema.json +31 -36
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +79 -67
- package/spec/v1/deprecations.schema.json +23 -7
- package/spec/v1/extensions.json +3 -2
- package/spec/v2/declaration.json +57 -33
- package/spec/v2/errors.json +421 -360
- package/spec/v2/id-field-bindings.json +105 -0
- package/spec/v2/profiles.json +31 -7
- package/spec/v2/release.json +3 -3
- package/spec/v2/retention-floors.json +35 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"//": "The explicit coverage map for spec/v2/core/identity.md §5 ('every id field in every v2 schema and every api/v2/openapi.yaml parameter and response body MUST $ref its kind'). It exists because the obvious check — fire when a property NAME equals a $def name — enforces §5 only where naming happens to align. 88 *Id properties live in schemas/v2/; only 20 share a name with a kind. childRunId sat as {type:string,minLength:1} in the same file where parentRunId was correctly $ref'd, so a child run's identifier carried no tenant segment for the mandatory 403 id_tenant_mismatch refusal to read. A name-matching check would have reported green over it. Every *Id property MUST appear here exactly once: under `bindings` (it IS that kind and MUST $ref it) or under `notAKind` (nothing in ids.schema.json governs it, with the reason). A property in neither fails the check, so a new id field cannot be added without someone deciding which it is. PLURAL ARRAYS: a `*Ids` property is covered through its `items` schema, which MUST $ref the kind. The first version of this map saw only `/Id$/`, and a tier-1 host found `POST /runs:bulk-cancel` taking runIds[] from the body untyped — every tenant-bound id a v2 client owned answered not_found, silently.",
|
|
4
|
+
"bindings": {
|
|
5
|
+
"agentId": "agentId",
|
|
6
|
+
"artifactTypeId": "typeId",
|
|
7
|
+
"baselineRunId": "runId",
|
|
8
|
+
"cardTypeId": "typeId",
|
|
9
|
+
"causationId": "eventId",
|
|
10
|
+
"chainId": "chainId",
|
|
11
|
+
"childRunId": "runId",
|
|
12
|
+
"childWorkflowId": "workflowId",
|
|
13
|
+
"contributingRunIds": "runId",
|
|
14
|
+
"currentNodeId": "nodeId",
|
|
15
|
+
"deliveryId": "deliveryId",
|
|
16
|
+
"effectId": "effectId",
|
|
17
|
+
"enqueuedRunId": "runId",
|
|
18
|
+
"evalRunId": "runId",
|
|
19
|
+
"eventId": "eventId",
|
|
20
|
+
"failedNodeId": "nodeId",
|
|
21
|
+
"fromAgentId": "agentId",
|
|
22
|
+
"interruptId": "interruptId",
|
|
23
|
+
"keyId": "keyId",
|
|
24
|
+
"lastNodeId": "nodeId",
|
|
25
|
+
"libraryId": "libraryId",
|
|
26
|
+
"nodeId": "nodeId",
|
|
27
|
+
"nodeIds": "nodeId",
|
|
28
|
+
"nodeTypeId": "typeId",
|
|
29
|
+
"originalEventId": "eventId",
|
|
30
|
+
"parentRunId": "runId",
|
|
31
|
+
"parentSpanId": "spanId",
|
|
32
|
+
"pinnedNodeIds": "nodeId",
|
|
33
|
+
"pluginId": "pluginId",
|
|
34
|
+
"runId": "runId",
|
|
35
|
+
"signingKeyId": "keyId",
|
|
36
|
+
"sourceNodeId": "nodeId",
|
|
37
|
+
"sourceRunId": "runId",
|
|
38
|
+
"sourceRunIds": "runId",
|
|
39
|
+
"spanId": "spanId",
|
|
40
|
+
"subjectId": "subjectId",
|
|
41
|
+
"subscriptionId": "subscriptionId",
|
|
42
|
+
"targetAgentId": "agentId",
|
|
43
|
+
"targetNodeId": "nodeId",
|
|
44
|
+
"templateId": "templateId",
|
|
45
|
+
"tenantId": "tenantId",
|
|
46
|
+
"toAgentId": "agentId",
|
|
47
|
+
"traceId": "traceId",
|
|
48
|
+
"triggerSubscriptionId": "subscriptionId",
|
|
49
|
+
"typeId": "typeId",
|
|
50
|
+
"workflowId": "workflowId",
|
|
51
|
+
"workspaceId": "workspaceId",
|
|
52
|
+
"interruptedNodeId": "nodeId"
|
|
53
|
+
},
|
|
54
|
+
"notAKind": {
|
|
55
|
+
"annotationId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
56
|
+
"approvalGateId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
57
|
+
"approvalId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
58
|
+
"artifactId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
59
|
+
"auditCorrelationId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
60
|
+
"callId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
61
|
+
"causationHostId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
62
|
+
"changeId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
63
|
+
"changelogId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
64
|
+
"commitmentId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
65
|
+
"compensationId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
66
|
+
"contextId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
67
|
+
"conversationId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
68
|
+
"correlationId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
69
|
+
"credentialId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
70
|
+
"cveIds": "CVE identifiers; the owning schema carries the ^CVE-[0-9]{4}-[0-9]+$ grammar",
|
|
71
|
+
"departmentId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
72
|
+
"envelopeId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
73
|
+
"goalId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
74
|
+
"groupId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
75
|
+
"heartbeatId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
76
|
+
"hostId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
77
|
+
"instanceId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
78
|
+
"invocationId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
79
|
+
"leaseId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
80
|
+
"memoryId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
81
|
+
"mergedIds": "memory-entry ids (agentMemoryConsolidated); no openwop id kind governs memory entries",
|
|
82
|
+
"messageId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
83
|
+
"nextWorkerIds": "a UNION — \"worker node-ids OR agent-ids\", so no single kind can bind it; binding to either would reject the other legitimate form",
|
|
84
|
+
"outputId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
85
|
+
"pageId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
86
|
+
"parentDepartmentId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
87
|
+
"proposalId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
88
|
+
"roleId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
89
|
+
"rosterId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
90
|
+
"runnerId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
91
|
+
"scopeId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
92
|
+
"sectionId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
93
|
+
"sessionId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
94
|
+
"sourceEngineId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
95
|
+
"sourceIds": "memory-entry ids (memoryCompacted); no openwop id kind governs memory entries",
|
|
96
|
+
"sourceManifestId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
97
|
+
"speakerId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
98
|
+
"stepId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
99
|
+
"suiteId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
100
|
+
"taskId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
101
|
+
"toolId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
102
|
+
"webhookId": "no openwop id kind governs this surface; the grammar is the owning schema's own",
|
|
103
|
+
"workerId": "no openwop id kind governs this surface; the grammar is the owning schema's own"
|
|
104
|
+
}
|
|
105
|
+
}
|
package/spec/v2/profiles.json
CHANGED
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
]
|
|
13
13
|
},
|
|
14
14
|
"floorScenarios": [
|
|
15
|
-
"
|
|
15
|
+
"v2-capabilities-root-closed",
|
|
16
|
+
"v2-preferred-version-default",
|
|
17
|
+
"v2-version-header-honored"
|
|
16
18
|
],
|
|
17
19
|
"requirementIds": [],
|
|
18
|
-
"note": "discovery only; the alias openwop-core is deleted (row C2.3)"
|
|
20
|
+
"note": "discovery only; the alias openwop-core is deleted (row C2.3). Floor minted rc.45: the closed root, the preferredVersion default, and the header honoured-or-refused — each unaided. v2-well-known-one-resource is deliberately absent: it is inapplicable by design for a host advertising one major, which every host becomes at v1 end-of-support, and a floor that expires is not a floor."
|
|
19
21
|
},
|
|
20
22
|
{
|
|
21
23
|
"id": "openwop-core-standard",
|
|
@@ -28,18 +30,40 @@
|
|
|
28
30
|
"eventLog"
|
|
29
31
|
]
|
|
30
32
|
},
|
|
31
|
-
"floorScenarios": [
|
|
33
|
+
"floorScenarios": [
|
|
34
|
+
"v2-interrupt-token-scheme",
|
|
35
|
+
"v2-effect-seam-manifest",
|
|
36
|
+
"v2-webhook-durable-delivery",
|
|
37
|
+
"v2-idempotency-key-grammar",
|
|
38
|
+
"v2-era-key",
|
|
39
|
+
"v2-era-stamp-universal",
|
|
40
|
+
"v2-event-type-closed",
|
|
41
|
+
"v2-poll-cursor-v2",
|
|
42
|
+
"v2-run-cancel",
|
|
43
|
+
"v2-run-bulk-cancel",
|
|
44
|
+
"v2-run-pause-resume",
|
|
45
|
+
"v2-run-options-limits",
|
|
46
|
+
"v2-sse-last-event-id"
|
|
47
|
+
],
|
|
32
48
|
"requirementIds": [],
|
|
33
|
-
"note": "seeded from spec/v1/core-standard-manifest.json at P3-B; the
|
|
49
|
+
"note": "rc.59: five unaided run-surface witnesses joined the floor — v2-run-cancel (runs.md §Cancel: 409 run_terminal on a terminal run), v2-run-bulk-cancel (§Cancel: per-entry envelopes, id_tenant_mismatch / not_found, details.maxRunIds), v2-run-pause-resume (§Pause and resume: 409 run_terminal / run_state_conflict, the literal drainPolicy echo, the immediate cut), v2-run-options-limits (capabilities.md limits metadata honoured on create), v2-sse-last-event-id (events.md §SSE frames: Last-Event-ID resumes at the next sequence, never re-emits the resumption point). cancelRun, bulkCancelRuns and pauseRun are core operations by the runs.md surface table (only ancestry, annotations and eval-summary are 404-when-unadvertised), so a host that omits one is blocked, not inapplicable, and the floor refuses it — the prose's outcome. Their optional legs (values mode, the conformance-delay / conformance-cancellable fixtures) record inapplicable with the reason and the file row stays a witnessed pass. Measured before the change: the reference host passes all five (rc.58, 179 / 0 / 0 / 42); neither production host satisfies this predicate, so no existing claim moves. seeded from spec/v1/core-standard-manifest.json at P3-B; floor minted rc.45, one or more unaided witnesses per predicate family: interrupt (token scheme), replay (the effect-seam manifest — its seam-driven no-re-fire leg lives in v2-effect-seam-no-refire on the seams floor), webhooks (durable delivery), idempotency (Layer-1 key grammar), eventLog (era key, era stamp, closed event type, poll cursor). Deliberately absent: v2-pinned-run-disposition (seam-gated and opt-in), v2-v1-signed-webhook-accepted (a coexistence scenario, driven through the seam; the cut gate is its home), v2-effect-identity-business-key (retry leg seam-driven), v2-approver-enforced (conditional on the refKinds facet)."
|
|
34
50
|
},
|
|
35
51
|
{
|
|
36
52
|
"id": "openwop-conformance-seams-v2",
|
|
37
53
|
"predicate": {
|
|
38
|
-
"families": []
|
|
54
|
+
"families": [],
|
|
55
|
+
"metadata": [
|
|
56
|
+
"conformance"
|
|
57
|
+
]
|
|
39
58
|
},
|
|
40
|
-
"floorScenarios": [
|
|
59
|
+
"floorScenarios": [
|
|
60
|
+
"v2-fork-a-v1-run",
|
|
61
|
+
"v2-effect-identity-business-key",
|
|
62
|
+
"v2-v1-signed-webhook-accepted",
|
|
63
|
+
"v2-effect-seam-no-refire"
|
|
64
|
+
],
|
|
41
65
|
"requirementIds": [],
|
|
42
|
-
"note": "RFC 0168 §C.1 — the seams profile; its own api/seams-v2.yaml; forbidden from the capability namespace"
|
|
66
|
+
"note": "RFC 0168 §C.1 — the seams profile; its own api/seams-v2.yaml; forbidden from the capability namespace. Floor minted rc.45: the four scenarios driven through a seam. rc.62 CLAIM FIX: the predicate now requires `conformance` at the discovery root. Until rc.62 the predicate was EMPTY, and `claimedProfilesForV2` treats an empty predicate as vacuously satisfied, so this profile was CLAIMED BY EVERY v2 HOST — including two production hosts that never advertised it and carried it at `certified: false`. A profile claimed by a host that never advertised it is a claim the host did not make. The predicate is deliberately NECESSARY, not sufficient: it tests that a `conformance` block exists, while the exact advert (`conformance.seamsProfile === openwop-conformance-seams-v2`) is tested per scenario by `seamsProfileAdvertised`. The two compose honestly — no conformance block means NOT CLAIMED; a block naming some other profile means claimed, every floor row `inapplicable`, witnessCount 0, and therefore not certified and not blocked. This profile is the instrument, not a capability predicate: each floor file is ALSO gated on the family it witnesses (fork-a-v1-run and effect-seam-no-refire on replay, effect-identity-business-key on idempotency, v1-signed-webhook-accepted on webhooks), records `inapplicable` when that family is absent, and the profile certifies only on a witnessed pass — a seams host advertising none of those families witnesses nothing through the seam and certifies nothing."
|
|
43
67
|
}
|
|
44
68
|
]
|
|
45
69
|
}
|
package/spec/v2/release.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "RFC 0172 \u00a7D.1 \u2014 the one release identity the v2 artifacts derive from. `version` is the next corpus tag `v<version>` (the publish workflow's coordinated-release tag pattern `v*`; RFC 0172's `openwop/v2.<minor>.<patch>` spelling is amended to this at its flip). api/v2/*.yaml info.version, the suite's 2.x version and @openwop/spec-artifacts read it. Bumped by the release PR that cuts the tag, never by hand elsewhere.",
|
|
3
|
-
"version": "2.0.0
|
|
4
|
-
"corpusTag":
|
|
5
|
-
"updated": "2026-09-
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"corpusTag": "v2.0.0",
|
|
5
|
+
"updated": "2026-09-05"
|
|
6
6
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "spec/v2/core/overview.md §v1 end-of-support, Old-major retention floors (charter Phase 5). Each row is a published old-major artifact and the last 1.x version a consumer may be pinned to; every row MUST stay installable for `windowMonths` from the 2.0.0 publish (the v2.0.0 tag's commit date — read from git by check-retention-floors.mjs, never written here). Hand-kept: a new 1.x release of an old-major line bumps `lastOldMajor`; nothing else changes. `probe` is the registry document the check reads with --network and the JSON path it expects the version at.",
|
|
3
|
+
"windowMonths": 12,
|
|
4
|
+
"releaseTag": "v2.0.0",
|
|
5
|
+
"artifacts": [
|
|
6
|
+
{
|
|
7
|
+
"ecosystem": "npm",
|
|
8
|
+
"name": "@openwop/openwop",
|
|
9
|
+
"oldMajor": 1,
|
|
10
|
+
"lastOldMajor": "1.9.0",
|
|
11
|
+
"probe": { "url": "https://registry.npmjs.org/@openwop%2Fopenwop", "versionsAt": "versions" }
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"ecosystem": "npm",
|
|
15
|
+
"name": "@openwop/openwop-conformance",
|
|
16
|
+
"oldMajor": 1,
|
|
17
|
+
"lastOldMajor": "1.163.0",
|
|
18
|
+
"probe": { "url": "https://registry.npmjs.org/@openwop%2Fopenwop-conformance", "versionsAt": "versions" }
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"ecosystem": "pypi",
|
|
22
|
+
"name": "openwop-client",
|
|
23
|
+
"oldMajor": 1,
|
|
24
|
+
"lastOldMajor": "1.7.0",
|
|
25
|
+
"probe": { "url": "https://pypi.org/pypi/openwop-client/json", "versionsAt": "releases" }
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"ecosystem": "go",
|
|
29
|
+
"name": "github.com/openwop/openwop-sdks/go",
|
|
30
|
+
"oldMajor": 1,
|
|
31
|
+
"lastOldMajor": "v1.6.0",
|
|
32
|
+
"probe": { "url": "https://proxy.golang.org/github.com/openwop/openwop-sdks/go/@v/list", "versionsAt": "lines" }
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|