@openwop/spec-artifacts 2.35.1 → 2.36.1

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 (101) hide show
  1. package/CORPUS-STAMP.json +103 -89
  2. package/api/openapi.yaml +325 -4
  3. package/api/seams-v2.yaml +342 -1
  4. package/api/v2/asyncapi.yaml +1 -1
  5. package/api/v2/openapi.yaml +564 -8
  6. package/package.json +1 -1
  7. package/schemas/a2a-task-state.schema.json +3 -3
  8. package/schemas/artifact-type-pack-manifest.schema.json +3 -3
  9. package/schemas/capabilities.schema.json +34 -1
  10. package/schemas/connection-pack-manifest.schema.json +14 -0
  11. package/schemas/debug-bundle.schema.json +20 -0
  12. package/schemas/dispatch-config.schema.json +1 -1
  13. package/schemas/localized-content-language-settings.schema.json +3 -3
  14. package/schemas/localized-content-page.schema.json +2 -2
  15. package/schemas/localized-content-section.schema.json +3 -3
  16. package/schemas/run-event-payloads.schema.json +4 -2
  17. package/schemas/suspend-request.schema.json +61 -4
  18. package/schemas/v2/a2a-task-state.schema.json +10 -9
  19. package/schemas/v2/agent-deployment-transition.schema.json +4 -4
  20. package/schemas/v2/agent-deployment.schema.json +7 -7
  21. package/schemas/v2/agent-eval-suite.schema.json +10 -10
  22. package/schemas/v2/agent-inventory-response.schema.json +8 -2
  23. package/schemas/v2/artifact-type-pack-manifest.schema.json +3 -3
  24. package/schemas/v2/artifact.schema.json +84 -0
  25. package/schemas/v2/capabilities.schema.json +82 -8
  26. package/schemas/v2/certification-bundle.schema.json +1 -1
  27. package/schemas/v2/channel-presence-payload.schema.json +3 -3
  28. package/schemas/v2/connection-pack-manifest.schema.json +14 -0
  29. package/schemas/v2/conversation-event.schema.json +9 -2
  30. package/schemas/v2/conversation-turn.schema.json +19 -12
  31. package/schemas/v2/dispatch-config.schema.json +1 -1
  32. package/schemas/v2/envelopes/ui.a2ui-surface.schema.json +920 -22
  33. package/schemas/v2/error-envelope.schema.json +11 -1
  34. package/schemas/v2/eval-summary.schema.json +1 -2
  35. package/schemas/v2/goal.schema.json +4 -4
  36. package/schemas/v2/localized-content-language-settings.schema.json +3 -3
  37. package/schemas/v2/localized-content-page.schema.json +2 -2
  38. package/schemas/v2/localized-content-section.schema.json +3 -3
  39. package/schemas/v2/node-pack-manifest.schema.json +105 -0
  40. package/schemas/v2/part.schema.json +81 -0
  41. package/schemas/v2/proposal.schema.json +6 -6
  42. package/schemas/v2/run-event-payloads.schema.json +5 -3
  43. package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +2 -2
  44. package/schemas/v2/self-hosted-runner-result-frame.schema.json +1 -1
  45. package/schemas/v2/suspend-request.schema.json +251 -6
  46. package/schemas/v2/tool-descriptor.schema.json +246 -2
  47. package/schemas/v2/trigger-event.schema.json +1 -2
  48. package/schemas/v2/trigger-subscription.schema.json +1 -2
  49. package/schemas/v2/webhook-verification.schema.json +22 -0
  50. package/schemas/v2/workflow-definition.schema.json +25 -25
  51. package/spec/v1/alias-detectors.json +13 -1
  52. package/spec/v1/core-standard-manifest.json +2 -2
  53. package/spec/v1/deprecations.json +45 -1
  54. package/spec/v1/deprecations.schema.json +119 -4
  55. package/spec/v1/gaps.json +1925 -4
  56. package/spec/v2/README.md +5 -2
  57. package/spec/v2/core/capabilities.md +13 -26
  58. package/spec/v2/core/conformance.md +5 -8
  59. package/spec/v2/core/connection-packs.md +1 -1
  60. package/spec/v2/core/conversation.md +1 -1
  61. package/spec/v2/core/errors.md +8 -3
  62. package/spec/v2/core/events.md +8 -20
  63. package/spec/v2/core/form-content-packs.md +2 -2
  64. package/spec/v2/core/headers.md +5 -4
  65. package/spec/v2/core/host-services.md +6 -2
  66. package/spec/v2/core/idempotency.md +1 -1
  67. package/spec/v2/core/identity.md +23 -12
  68. package/spec/v2/core/interop.md +34 -4
  69. package/spec/v2/core/interrupt.md +6 -3
  70. package/spec/v2/core/node-pack-runtimes.md +20 -0
  71. package/spec/v2/core/oauth.md +32 -0
  72. package/spec/v2/core/overview.md +19 -6
  73. package/spec/v2/core/packs.md +4 -6
  74. package/spec/v2/core/persistence.md +20 -55
  75. package/spec/v2/core/replay.md +5 -11
  76. package/spec/v2/core/runs.md +9 -8
  77. package/spec/v2/core/security-defaults.md +18 -20
  78. package/spec/v2/core/tool-catalog.md +22 -0
  79. package/spec/v2/core/versioning.md +10 -28
  80. package/spec/v2/core/webhooks.md +16 -4
  81. package/spec/v2/core/workflow-chain-packs.md +1 -1
  82. package/spec/v2/corrections.json +32 -0
  83. package/spec/v2/corrections.schema.json +49 -0
  84. package/spec/v2/declaration.json +18 -13
  85. package/spec/v2/declaration.schema.json +3 -1
  86. package/spec/v2/errors.json +46 -1
  87. package/spec/v2/ext/a2uiSurface/README.md +131 -17
  88. package/spec/v2/ext/dataIntegration/README.md +5 -0
  89. package/spec/v2/facets/a2a.schema.json +4 -0
  90. package/spec/v2/facets/auth.schema.json +24 -0
  91. package/spec/v2/facets/mcp.schema.json +4 -0
  92. package/spec/v2/facets/oauth.schema.json +70 -0
  93. package/spec/v2/facets/webhooks.schema.json +23 -2
  94. package/spec/v2/id-field-bindings.json +2 -0
  95. package/spec/v2/interop-map.json +639 -0
  96. package/spec/v2/interop-map.schema.json +458 -0
  97. package/spec/v2/migrations.json +7 -0
  98. package/spec/v2/migrations.schema.json +58 -0
  99. package/spec/v2/path-manifest.json +6 -1
  100. package/spec/v2/release.json +3 -3
  101. package/spec/v2/surface-baseline.json +7981 -0
@@ -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). 101 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). 106 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": [
@@ -33,6 +33,7 @@
33
33
  "pack_peer_dependency_undefined",
34
34
  "pack_signature_invalid",
35
35
  "pack_validation_failed",
36
+ "unsupported_runtime",
36
37
  "protocol_version_mismatch",
37
38
  "schedule_horizon_exceeded",
38
39
  "sub_chain_cycle",
@@ -41,9 +42,13 @@
41
42
  "until_in_past",
42
43
  "validation_error",
43
44
  "webhook_url_rejected",
45
+ "webhook_endpoint_unverified",
46
+ "connector_auth_declined",
47
+ "connection_auth_metadata_mismatch",
44
48
  "audience_mismatch",
45
49
  "connector_auth_expired",
46
50
  "credential_revoked",
51
+ "credential_lifetime_exceeded",
47
52
  "delegation_expired",
48
53
  "identity_unresolvable",
49
54
  "identity_unverified",
@@ -224,6 +229,7 @@
224
229
  "pack_peer_dependency_undefined": 400,
225
230
  "pack_signature_invalid": 400,
226
231
  "pack_validation_failed": 400,
232
+ "unsupported_runtime": 400,
227
233
  "protocol_version_mismatch": 400,
228
234
  "schedule_horizon_exceeded": 400,
229
235
  "sub_chain_cycle": 400,
@@ -232,9 +238,13 @@
232
238
  "until_in_past": 400,
233
239
  "validation_error": 400,
234
240
  "webhook_url_rejected": 400,
241
+ "webhook_endpoint_unverified": 400,
242
+ "connector_auth_declined": 401,
243
+ "connection_auth_metadata_mismatch": 422,
235
244
  "audience_mismatch": 401,
236
245
  "connector_auth_expired": 401,
237
246
  "credential_revoked": 401,
247
+ "credential_lifetime_exceeded": 401,
238
248
  "delegation_expired": 401,
239
249
  "identity_unresolvable": 401,
240
250
  "identity_unverified": 401,
@@ -168,6 +168,5 @@
168
168
  }
169
169
  }
170
170
  }
171
- },
172
- "x-openwop-seeded-from": "v1"
171
+ }
173
172
  }
@@ -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 \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.",
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 \u2014 no secrets/PII."
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 \u2014 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 — 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"
@@ -159,7 +159,7 @@
159
159
  "required": [
160
160
  "tenant"
161
161
  ],
162
- "description": "RFC 0048 identity triple. Redaction-safe \u2014 `principal` is an opaque id, never PII or credential material.",
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",
@@ -13,15 +13,15 @@
13
13
  "properties": {
14
14
  "baseLocale": {
15
15
  "type": "string",
16
- "pattern": "^[a-z]{2}(-[A-Z]{2})?$",
16
+ "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$",
17
17
  "description": "The locale section `data` is authored in. MUST equal `capabilities.i18n.defaultLocale`."
18
18
  },
19
19
  "supportedLocales": {
20
20
  "type": "array",
21
- "description": "BCP-47 tags the tenant authors content translations for. MUST NOT contain `baseLocale`.",
21
+ "description": "Case-canonical BCP 47 tags (RFC 0206 §A) the tenant authors content translations for. MUST NOT contain `baseLocale`.",
22
22
  "items": {
23
23
  "type": "string",
24
- "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
24
+ "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
25
25
  },
26
26
  "uniqueItems": true
27
27
  },
@@ -62,7 +62,7 @@
62
62
  "properties": {
63
63
  "locale": {
64
64
  "type": "string",
65
- "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
65
+ "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
66
66
  },
67
67
  "href": {
68
68
  "type": "string",
@@ -76,7 +76,7 @@
76
76
  "description": "og:locale:alternate values.",
77
77
  "items": {
78
78
  "type": "string",
79
- "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
79
+ "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
80
80
  },
81
81
  "uniqueItems": true
82
82
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/localized-content-section.schema.json",
4
4
  "title": "LocalizedContentSection",
5
- "description": "RFC 0103 (spec/v1/localized-content.md §B). One section record of an authored content page. A section is ONE record carrying a base `data` payload (authored in the host's `content.baseLocale`) plus a sparse `localizations` map of partial per-locale field overrides — never one record per locale. The negotiated locale's resolved body is computed by the normative per-section field merge (exact-locale → language-family → base `data`, shallow overlay; §C). Body field shapes inside `data`/`localizations` are open and host/section-type-defined; this schema closes the envelope, not the body.",
5
+ "description": "RFC 0103 (spec/v1/localized-content.md §B). One section record of an authored content page. A section is ONE record carrying a base `data` payload (authored in the host's `content.baseLocale`) plus a sparse `localizations` map of partial per-locale field overrides — never one record per locale. The negotiated locale's resolved body is computed by the normative per-section field merge (exact-locale → script-family (RFC 0206) → language-family → base `data`, shallow overlay; §C). Body field shapes inside `data`/`localizations` are open and host/section-type-defined; this schema closes the envelope, not the body.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -32,9 +32,9 @@
32
32
  },
33
33
  "localizations": {
34
34
  "type": "object",
35
- "description": "Sparse map of per-locale partial field overrides. MAY be empty (`{}`). Each key is a BCP-47 tag matching `^[a-z]{2}(-[A-Z]{2})?$` and MUST NOT equal `content.baseLocale` (the base locale is carried by `data`). Each value is a partial overlay of `data` fields; missing fields fall through to `data` (per-section merge §C).",
35
+ "description": "Sparse map of per-locale partial field overrides. MAY be empty (`{}`). Each key is a case-canonical BCP 47 tag (language, optional script, optional region; RFC 0206 §A) matching `^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$` and MUST NOT equal `content.baseLocale` (the base locale is carried by `data`). Each value is a partial overlay of `data` fields; missing fields fall through to `data` (per-section merge §C).",
36
36
  "propertyNames": {
37
- "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
37
+ "pattern": "^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
38
38
  },
39
39
  "additionalProperties": {
40
40
  "type": "object",
@@ -626,10 +626,115 @@
626
626
  }
627
627
  ]
628
628
  }
629
+ },
630
+ "mcpServer": {
631
+ "$ref": "#/$defs/McpServerRecord",
632
+ "description": "RFC 0203. Inline subset of the MCP Registry server.json (2025-12-11) naming the MCP server a `remote` pack runs on. By value: the host resolves nothing from a registry. `entry` MUST equal `remotes[0].url` (node-pack-runtimes.md)."
633
+ }
634
+ },
635
+ "if": {
636
+ "properties": {
637
+ "language": {
638
+ "const": "remote"
639
+ }
640
+ }
641
+ },
642
+ "else": {
643
+ "not": {
644
+ "required": [
645
+ "mcpServer"
646
+ ]
629
647
  }
630
648
  },
631
649
  "additionalProperties": false
632
650
  },
651
+ "McpServerRecord": {
652
+ "type": "object",
653
+ "additionalProperties": false,
654
+ "required": [
655
+ "name",
656
+ "description",
657
+ "version",
658
+ "remotes"
659
+ ],
660
+ "description": "RFC 0203. Every valid instance validates against https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json. Excludes packages[] (install instructions), icons, _meta, and every header or variable slot, so a signed manifest carries no install surface and no credential.",
661
+ "properties": {
662
+ "$schema": {
663
+ "const": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"
664
+ },
665
+ "name": {
666
+ "type": "string",
667
+ "minLength": 3,
668
+ "maxLength": 200,
669
+ "pattern": "^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$"
670
+ },
671
+ "description": {
672
+ "type": "string",
673
+ "minLength": 1,
674
+ "maxLength": 100
675
+ },
676
+ "version": {
677
+ "type": "string",
678
+ "maxLength": 255,
679
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-[0-9A-Za-z.-]+)?(\\+[0-9A-Za-z.-]+)?$"
680
+ },
681
+ "title": {
682
+ "type": "string",
683
+ "minLength": 1,
684
+ "maxLength": 100
685
+ },
686
+ "websiteUrl": {
687
+ "type": "string",
688
+ "format": "uri",
689
+ "pattern": "^https://"
690
+ },
691
+ "repository": {
692
+ "type": "object",
693
+ "additionalProperties": false,
694
+ "required": [
695
+ "url",
696
+ "source"
697
+ ],
698
+ "properties": {
699
+ "url": {
700
+ "type": "string",
701
+ "format": "uri"
702
+ },
703
+ "source": {
704
+ "type": "string"
705
+ },
706
+ "id": {
707
+ "type": "string"
708
+ },
709
+ "subfolder": {
710
+ "type": "string"
711
+ }
712
+ }
713
+ },
714
+ "remotes": {
715
+ "type": "array",
716
+ "minItems": 1,
717
+ "maxItems": 1,
718
+ "items": {
719
+ "type": "object",
720
+ "additionalProperties": false,
721
+ "required": [
722
+ "type",
723
+ "url"
724
+ ],
725
+ "properties": {
726
+ "type": {
727
+ "const": "streamable-http"
728
+ },
729
+ "url": {
730
+ "type": "string",
731
+ "pattern": "^https://[^\\s{}]+$"
732
+ }
733
+ }
734
+ }
735
+ }
736
+ }
737
+ },
633
738
  "Signing": {
634
739
  "type": "object",
635
740
  "additionalProperties": false,
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/part.schema.json",
4
+ "title": "Part",
5
+ "description": "RFC 0205 §D. An A2A v1.0.1 `Part`, transcribed from `specification/a2a.proto` `message Part` at tag v1.0.1 with the JSON member names A2A spec §5.5 requires (camelCase). Exactly one of `text`, `raw`, `url`, `data` is present: member presence is the discriminator (A2A spec §14 \"Current Pattern (v1.0)\"), and the v0.3 `kind` member is not part of the shape. A2A commits no JSON Schema of its own (`specification/json/README.md`: `a2a.json` is a non-normative build artifact), so this file is the corpus's transcription. `oneOf` is deliberate: this schema describes a host-emitted wire object, not an LLM-emitted envelope payload (ai-envelope.md §\"Schema discipline\" scopes its `oneOf` ban to the latter).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "text": {
10
+ "type": "string",
11
+ "description": "a2a.proto: \"The string content of the `text` part.\""
12
+ },
13
+ "raw": {
14
+ "type": "string",
15
+ "contentEncoding": "base64",
16
+ "description": "a2a.proto: \"The `raw` byte content of a file. In JSON serialization, this is encoded as a base64 string.\" Bounded by host policy (a2a-integration.md D.3)."
17
+ },
18
+ "url": {
19
+ "type": "string",
20
+ "format": "uri",
21
+ "description": "a2a.proto: \"A `url` pointing to the file's content.\" On an OpenWOP read it MUST NOT resolve beyond the caller's authorization (RFC 0205 §A.3; a2a-integration.md D.3); a consumer MUST NOT auto-fetch it without an egress decision (a2a-integration.md D.3 inbound)."
22
+ },
23
+ "data": {
24
+ "description": "a2a.proto: \"Arbitrary structured `data` as a JSON value (object, array, string, number, boolean, or null).\""
25
+ },
26
+ "metadata": {
27
+ "type": "object",
28
+ "description": "a2a.proto: \"Optional. metadata associated with this part.\" OpenWOP fields live under `metadata.openwop.*` (a2a-integration.md).",
29
+ "additionalProperties": {}
30
+ },
31
+ "filename": {
32
+ "type": "string",
33
+ "maxLength": 1024,
34
+ "description": "a2a.proto: \"An optional `filename` for the file (e.g., \\\"document.pdf\\\").\""
35
+ },
36
+ "mediaType": {
37
+ "type": "string",
38
+ "minLength": 3,
39
+ "maxLength": 255,
40
+ "description": "a2a.proto: \"The `media_type` (MIME type) of the part content … available for all part types.\" Any RFC 6838 spelling is accepted on input; a host SHOULD emit lowercase."
41
+ }
42
+ },
43
+ "oneOf": [
44
+ {
45
+ "required": [
46
+ "text"
47
+ ]
48
+ },
49
+ {
50
+ "required": [
51
+ "raw"
52
+ ]
53
+ },
54
+ {
55
+ "required": [
56
+ "url"
57
+ ]
58
+ },
59
+ {
60
+ "required": [
61
+ "data"
62
+ ]
63
+ }
64
+ ],
65
+ "examples": [
66
+ {
67
+ "text": "Hello, world!"
68
+ },
69
+ {
70
+ "raw": "iVBORw0KGgo=",
71
+ "filename": "diagram.png",
72
+ "mediaType": "image/png"
73
+ },
74
+ {
75
+ "data": {
76
+ "approve": true
77
+ },
78
+ "mediaType": "application/json"
79
+ }
80
+ ]
81
+ }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/proposal.schema.json",
4
4
  "title": "Proposal",
5
- "description": "RFC 0096 \u00a7B. A reviewable-learning proposal \u2014 an INERT, draft-state reusable artifact (skill/pack/template/automation) the host synthesized from run/tool traces, that MUST NOT influence the resolution, planning, or execution of any run while in any state other than `applied`. Activation is delegated to RFC 0051 approval-gate or RFC 0049 RBAC (no new authorization path). On `apply` the installed artifact MUST byte-match the last-persisted `artifact` (no silent re-synthesis). `rationale` and `provenance.sourceRunIds` are SR-1 redaction-safe (no secrets/PII). Gated on the `agents.proposals` capability.",
5
+ "description": "RFC 0096 §B. A reviewable-learning proposal — an INERT, draft-state reusable artifact (skill/pack/template/automation) the host synthesized from run/tool traces, that MUST NOT influence the resolution, planning, or execution of any run while in any state other than `applied`. Activation is delegated to RFC 0051 approval-gate or RFC 0049 RBAC (no new authorization path). On `apply` the installed artifact MUST byte-match the last-persisted `artifact` (no silent re-synthesis). `rationale` and `provenance.sourceRunIds` are SR-1 redaction-safe (no secrets/PII). Gated on the `agents.proposals` capability.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -47,12 +47,12 @@
47
47
  },
48
48
  "rationale": {
49
49
  "type": "string",
50
- "description": "Plain-language justification. SR-1 redaction-safe \u2014 no secrets/PII."
50
+ "description": "Plain-language justification. SR-1 redaction-safe — no secrets/PII."
51
51
  },
52
52
  "artifact": {
53
53
  "type": "object",
54
- "description": "The proposed artifact, shaped by `kind` (an RFC 0003 pack manifest, an RFC 0013 chain pack, an RFC 0027 template, an RFC 0052 job spec). Inert until applied. Deliberately open (`additionalProperties` not constrained here) because the payload conforms to the kind's own existing schema, validated by the host at `apply` (malformed-for-kind \u21d2 422).",
55
- "$comment": "Intentionally open object \u2014 the artifact body is validated against the kind's own schema, not this envelope.",
54
+ "description": "The proposed artifact, shaped by `kind` (an RFC 0003 pack manifest, an RFC 0013 chain pack, an RFC 0027 template, an RFC 0052 job spec). Inert until applied. Deliberately open (`additionalProperties` not constrained here) because the payload conforms to the kind's own existing schema, validated by the host at `apply` (malformed-for-kind ⇒ 422).",
55
+ "$comment": "Intentionally open object — the artifact body is validated against the kind's own schema, not this envelope.",
56
56
  "additionalProperties": true
57
57
  },
58
58
  "provenance": {
@@ -90,7 +90,7 @@
90
90
  "required": [
91
91
  "tenant"
92
92
  ],
93
- "description": "RFC 0048 identity triple that owns this proposal. Redaction-safe \u2014 `principal` is an opaque id, never PII or credential material. Single-tenant hosts populate at least `tenant`.",
93
+ "description": "RFC 0048 identity triple that owns this proposal. Redaction-safe — `principal` is an opaque id, never PII or credential material. Single-tenant hosts populate at least `tenant`.",
94
94
  "properties": {
95
95
  "tenant": {
96
96
  "type": "string",
@@ -105,7 +105,7 @@
105
105
  "principal": {
106
106
  "type": "string",
107
107
  "minLength": 1,
108
- "description": "Acting identity (user or agent) \u2014 opaque id, never PII."
108
+ "description": "Acting identity (user or agent) — opaque id, never PII."
109
109
  }
110
110
  }
111
111
  },
@@ -1081,7 +1081,7 @@
1081
1081
  "properties": {
1082
1082
  "reason": {
1083
1083
  "type": "string",
1084
- "description": "`v1_pin_unsupported` (RFC 0176 \u00a7B.1) is a registered reason."
1084
+ "description": "Registered reasons: `v1_pin_unsupported` (RFC 0176 \u00a7B.1); `mcp-request-cancelled` (RFC 0198 \u2014 the MCP request that owned the run was cancelled or disconnected before the host answered it)."
1085
1085
  },
1086
1086
  "cancelledBy": {
1087
1087
  "type": "string",
@@ -1279,7 +1279,8 @@
1279
1279
  "conversation.start",
1280
1280
  "conversation.exchange",
1281
1281
  "conversation.close",
1282
- "low-confidence"
1282
+ "low-confidence",
1283
+ "credential"
1283
1284
  ],
1284
1285
  "description": "RFC 0094 \u00a7E \u2014 the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
1285
1286
  },
@@ -1421,7 +1422,8 @@
1421
1422
  "conversation.start",
1422
1423
  "conversation.exchange",
1423
1424
  "conversation.close",
1424
- "low-confidence"
1425
+ "low-confidence",
1426
+ "credential"
1425
1427
  ],
1426
1428
  "description": "RFC 0094 \u00a7E \u2014 the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
1427
1429
  },
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/self-hosted-runner-dispatch-frame.schema.json",
4
4
  "title": "SelfHostedRunnerDispatchFrame",
5
- "description": "RFC 0122 \u00a7Registration + channel. A single model/tool DISPATCH STEP the host routes to a registered runner over the runner\u2194host channel (`self-hosted-runner.md`). The host is the sole orchestration/persistence/replay authority; this frame carries ONE step's inputs, never a whole run. `inputs` is opaque model/tool input (messages, tool arguments) and MUST NOT contain runner-credential material \u2014 the runner holds its own credential locally (SECURITY invariant `runner-credential-non-transit`). `seq` is the per-runner monotonic DISPATCH cursor, a DISTINCT sequence from the run event-log `sequence` (they MUST NOT be conflated); a reconnecting runner resumes via `Last-Event-ID` at this cursor and the host drops any redelivered `{runId, stepId}` whose result is already persisted (at-most-once).",
5
+ "description": "RFC 0122 §Registration + channel. A single model/tool DISPATCH STEP the host routes to a registered runner over the runner↔host channel (`self-hosted-runner.md`). The host is the sole orchestration/persistence/replay authority; this frame carries ONE step's inputs, never a whole run. `inputs` is opaque model/tool input (messages, tool arguments) and MUST NOT contain runner-credential material — the runner holds its own credential locally (SECURITY invariant `runner-credential-non-transit`). `seq` is the per-runner monotonic DISPATCH cursor, a DISTINCT sequence from the run event-log `sequence` (they MUST NOT be conflated); a reconnecting runner resumes via `Last-Event-ID` at this cursor and the host drops any redelivered `{runId, stepId}` whose result is already persisted (at-most-once).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -25,7 +25,7 @@
25
25
  "seq": {
26
26
  "type": "integer",
27
27
  "minimum": 0,
28
- "description": "The per-runner monotonic dispatch cursor for the channel. DISTINCT from the run event-log `sequence` (MUST NOT be conflated \u2014 conflating them breaks resume dedup). A reconnecting runner resumes via the SSE `Last-Event-ID` at this cursor so a dispatch is never redelivered past it (`stream-modes.md \u00a7Resumption`)."
28
+ "description": "The per-runner monotonic dispatch cursor for the channel. DISTINCT from the run event-log `sequence` (MUST NOT be conflated — conflating them breaks resume dedup). A reconnecting runner resumes via the SSE `Last-Event-ID` at this cursor so a dispatch is never redelivered past it (`stream-modes.md §Resumption`)."
29
29
  },
30
30
  "kind": {
31
31
  "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/self-hosted-runner-result-frame.schema.json",
4
4
  "title": "SelfHostedRunnerResultFrame",
5
- "description": "RFC 0122 \u00a7Registration + channel. The runner's answer to one `SelfHostedRunnerDispatchFrame`, POSTed back to the host over ordinary HTTP. The `{runId, stepId}` pair MUST equal the dispatch it answers (the at-most-once idempotency key); `seq` echoes the dispatch cursor. `output` is the opaque model/tool output the host persists as a normal step record \u2014 replay reads from persistence and NEVER re-dispatches. `output` MUST NOT contain runner-credential material (`runner-credential-non-transit`), and the host MUST treat it as UNTRUSTED transport: content re-entering an agent loop is fenced `<UNTRUSTED>` (`runner-output-untrusted-transport`). A provider-side error is carried inside `output` (it is still a model/tool output); host-side liveness failure is signalled out-of-band as the retriable `runner_unavailable` error, NOT as a result frame.",
5
+ "description": "RFC 0122 §Registration + channel. The runner's answer to one `SelfHostedRunnerDispatchFrame`, POSTed back to the host over ordinary HTTP. The `{runId, stepId}` pair MUST equal the dispatch it answers (the at-most-once idempotency key); `seq` echoes the dispatch cursor. `output` is the opaque model/tool output the host persists as a normal step record — replay reads from persistence and NEVER re-dispatches. `output` MUST NOT contain runner-credential material (`runner-credential-non-transit`), and the host MUST treat it as UNTRUSTED transport: content re-entering an agent loop is fenced `<UNTRUSTED>` (`runner-output-untrusted-transport`). A provider-side error is carried inside `output` (it is still a model/tool output); host-side liveness failure is signalled out-of-band as the retriable `runner_unavailable` error, NOT as a result frame.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [