@openwop/spec-artifacts 2.0.0-rc.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 +234 -0
- package/LICENSE +201 -0
- package/README.md +7 -0
- package/api/.redocly.lint-ignore.yaml +22 -0
- package/api/asyncapi.yaml +834 -0
- package/api/grpc/openwop.proto +251 -0
- package/api/openapi.yaml +2693 -0
- package/api/redocly.yaml +23 -0
- package/api/seams-v2.yaml +680 -0
- package/api/v2/asyncapi.yaml +528 -0
- package/api/v2/openapi.yaml +3139 -0
- package/api/v2/redocly.yaml +16 -0
- package/package.json +10 -0
- package/schemas/README.md +144 -0
- package/schemas/a2a-task-state.schema.json +78 -0
- package/schemas/a2ui-surface-delta-frame.schema.json +48 -0
- package/schemas/agent-deployment-transition.schema.json +49 -0
- package/schemas/agent-deployment.schema.json +54 -0
- package/schemas/agent-eval-suite.schema.json +140 -0
- package/schemas/agent-inventory-response.schema.json +115 -0
- package/schemas/agent-manifest.schema.json +156 -0
- package/schemas/agent-org-chart.schema.json +82 -0
- package/schemas/agent-ref.schema.json +63 -0
- package/schemas/agent-roster-entry.schema.json +81 -0
- package/schemas/agent-roster-response.schema.json +21 -0
- package/schemas/ai-envelope.schema.json +134 -0
- package/schemas/annotation-create.schema.json +37 -0
- package/schemas/annotation.schema.json +56 -0
- package/schemas/artifact-type-pack-manifest.schema.json +244 -0
- package/schemas/audit-verify-result.schema.json +90 -0
- package/schemas/budget-policy.schema.json +18 -0
- package/schemas/capabilities.schema.json +4160 -0
- package/schemas/certification-bundle-v2.schema.json +118 -0
- package/schemas/channel-presence-payload.schema.json +41 -0
- package/schemas/channel-written-payload.schema.json +55 -0
- package/schemas/chat-card-pack-manifest.schema.json +253 -0
- package/schemas/compact-tool-descriptor.schema.json +51 -0
- package/schemas/compensation-policy.schema.json +64 -0
- package/schemas/conformance-certification-bundle.schema.json +86 -0
- package/schemas/connection-pack-manifest.schema.json +353 -0
- package/schemas/conversation-event.schema.json +168 -0
- package/schemas/conversation-turn.schema.json +117 -0
- package/schemas/core-conformance-mock-agent-config.schema.json +152 -0
- package/schemas/credential-provenance.schema.json +18 -0
- package/schemas/credential-reference.schema.json +21 -0
- package/schemas/debug-bundle.schema.json +196 -0
- package/schemas/dispatch-config.schema.json +112 -0
- package/schemas/envelopes/clarification.request.schema.json +52 -0
- package/schemas/envelopes/error.schema.json +30 -0
- package/schemas/envelopes/media.audio.schema.json +38 -0
- package/schemas/envelopes/media.file.schema.json +37 -0
- package/schemas/envelopes/media.image.schema.json +33 -0
- package/schemas/envelopes/schema.request.schema.json +26 -0
- package/schemas/envelopes/schema.response.schema.json +22 -0
- package/schemas/envelopes/ui.a2ui-surface.schema.json +154 -0
- package/schemas/error-envelope.schema.json +25 -0
- package/schemas/eval-summary.schema.json +92 -0
- package/schemas/export-bundle.schema.json +66 -0
- package/schemas/form-content-pack-manifest.schema.json +243 -0
- package/schemas/frontend-plugin-manifest.schema.json +109 -0
- package/schemas/goal.schema.json +104 -0
- package/schemas/heartbeat-evaluated.schema.json +14 -0
- package/schemas/heartbeat-state-changed.schema.json +14 -0
- package/schemas/localized-content-language-settings.schema.json +26 -0
- package/schemas/localized-content-page-response.schema.json +60 -0
- package/schemas/localized-content-page.schema.json +62 -0
- package/schemas/localized-content-section.schema.json +51 -0
- package/schemas/memory-entry.schema.json +36 -0
- package/schemas/memory-list-options.schema.json +37 -0
- package/schemas/node-pack-manifest.schema.json +654 -0
- package/schemas/orchestrator-decision.schema.json +90 -0
- package/schemas/org-chart-responsibility-view.schema.json +26 -0
- package/schemas/pack-lockfile.schema.json +108 -0
- package/schemas/prompt-kind.schema.json +8 -0
- package/schemas/prompt-pack-manifest.schema.json +117 -0
- package/schemas/prompt-ref.schema.json +40 -0
- package/schemas/prompt-template.schema.json +149 -0
- package/schemas/proposal.schema.json +84 -0
- package/schemas/registry-version-manifest.schema.json +208 -0
- package/schemas/residency.schema.json +16 -0
- package/schemas/run-ancestry-response.schema.json +54 -0
- package/schemas/run-diff-response.schema.json +64 -0
- package/schemas/run-event-payloads.schema.json +4452 -0
- package/schemas/run-event.schema.json +211 -0
- package/schemas/run-options.schema.json +80 -0
- package/schemas/run-orchestrator-decided-event.schema.json +20 -0
- package/schemas/run-snapshot.schema.json +148 -0
- package/schemas/security-advisory.schema.json +109 -0
- package/schemas/self-hosted-runner-dispatch-frame.schema.json +79 -0
- package/schemas/self-hosted-runner-registration.schema.json +53 -0
- package/schemas/self-hosted-runner-result-frame.schema.json +38 -0
- package/schemas/subject.schema.json +56 -0
- package/schemas/suspend-request.schema.json +207 -0
- package/schemas/tool-descriptor.schema.json +63 -0
- package/schemas/trigger-event.schema.json +222 -0
- package/schemas/trigger-subscription-registration.schema.json +67 -0
- package/schemas/trigger-subscription.schema.json +26 -0
- package/schemas/ui-plugin-message.schema.json +90 -0
- package/schemas/v2/a2a-task-state.schema.json +102 -0
- package/schemas/v2/a2ui-surface-delta-frame.schema.json +62 -0
- package/schemas/v2/agent-deployment-transition.schema.json +67 -0
- package/schemas/v2/agent-deployment.schema.json +68 -0
- package/schemas/v2/agent-eval-suite.schema.json +214 -0
- package/schemas/v2/agent-inventory-response.schema.json +172 -0
- package/schemas/v2/agent-manifest.schema.json +218 -0
- package/schemas/v2/agent-org-chart.schema.json +149 -0
- package/schemas/v2/agent-ref.schema.json +67 -0
- package/schemas/v2/agent-roster-entry.schema.json +104 -0
- package/schemas/v2/agent-roster-response.schema.json +27 -0
- package/schemas/v2/ai-envelope.schema.json +167 -0
- package/schemas/v2/annotation-create.schema.json +109 -0
- package/schemas/v2/annotation.schema.json +142 -0
- package/schemas/v2/artifact-type-pack-manifest.schema.json +245 -0
- package/schemas/v2/audit-verify-result.schema.json +110 -0
- package/schemas/v2/budget-policy.schema.json +61 -0
- package/schemas/v2/capabilities.schema.json +7644 -0
- package/schemas/v2/certification-bundle.schema.json +401 -0
- package/schemas/v2/channel-presence-payload.schema.json +60 -0
- package/schemas/v2/channel-written-payload.schema.json +64 -0
- package/schemas/v2/chat-card-pack-manifest.schema.json +254 -0
- package/schemas/v2/compact-tool-descriptor.schema.json +108 -0
- package/schemas/v2/compensation-policy.schema.json +91 -0
- package/schemas/v2/compensation-projection.schema.json +95 -0
- package/schemas/v2/configurable.schema.json +110 -0
- package/schemas/v2/connection-pack-manifest.schema.json +354 -0
- package/schemas/v2/conversation-event.schema.json +281 -0
- package/schemas/v2/conversation-turn.schema.json +165 -0
- package/schemas/v2/credential-provenance.schema.json +62 -0
- package/schemas/v2/credential-reference.schema.json +28 -0
- package/schemas/v2/debug-bundle.schema.json +312 -0
- package/schemas/v2/dispatch-config.schema.json +147 -0
- package/schemas/v2/effect-ledger-projection.schema.json +71 -0
- package/schemas/v2/effect-seam-manifest.schema.json +98 -0
- package/schemas/v2/envelopes/clarification.request.schema.json +59 -0
- package/schemas/v2/envelopes/error.schema.json +35 -0
- package/schemas/v2/envelopes/media.audio.schema.json +41 -0
- package/schemas/v2/envelopes/media.file.schema.json +40 -0
- package/schemas/v2/envelopes/media.image.schema.json +36 -0
- package/schemas/v2/envelopes/schema.request.schema.json +29 -0
- package/schemas/v2/envelopes/schema.response.schema.json +26 -0
- package/schemas/v2/envelopes/ui.a2ui-surface.schema.json +292 -0
- package/schemas/v2/error-envelope.schema.json +229 -0
- package/schemas/v2/eval-summary.schema.json +166 -0
- package/schemas/v2/export-bundle.schema.json +94 -0
- package/schemas/v2/form-content-pack-manifest.schema.json +241 -0
- package/schemas/v2/frontend-plugin-manifest.schema.json +152 -0
- package/schemas/v2/goal.schema.json +188 -0
- package/schemas/v2/heartbeat-evaluated.schema.json +34 -0
- package/schemas/v2/heartbeat-state-changed.schema.json +31 -0
- package/schemas/v2/ids.schema.json +31 -0
- package/schemas/v2/localized-content-language-settings.schema.json +34 -0
- package/schemas/v2/localized-content-page-response.schema.json +94 -0
- package/schemas/v2/localized-content-page.schema.json +87 -0
- package/schemas/v2/localized-content-section.schema.json +63 -0
- package/schemas/v2/memory-entry.schema.json +45 -0
- package/schemas/v2/memory-list-options.schema.json +41 -0
- package/schemas/v2/node-pack-manifest.schema.json +657 -0
- package/schemas/v2/orchestrator-decision.schema.json +120 -0
- package/schemas/v2/org-chart-responsibility-view.schema.json +36 -0
- package/schemas/v2/pack-lockfile.schema.json +139 -0
- package/schemas/v2/prompt-kind.schema.json +14 -0
- package/schemas/v2/prompt-pack-manifest.schema.json +118 -0
- package/schemas/v2/prompt-ref.schema.json +42 -0
- package/schemas/v2/prompt-template.schema.json +209 -0
- package/schemas/v2/proposal.schema.json +145 -0
- package/schemas/v2/registry-version-manifest.schema.json +292 -0
- package/schemas/v2/residency.schema.json +19 -0
- package/schemas/v2/run-ancestry-response.schema.json +68 -0
- package/schemas/v2/run-diff-response.schema.json +80 -0
- package/schemas/v2/run-event-payloads.schema.json +4588 -0
- package/schemas/v2/run-event.schema.json +324 -0
- package/schemas/v2/run-options.schema.json +90 -0
- package/schemas/v2/run-orchestrator-decided-event.schema.json +22 -0
- package/schemas/v2/run-snapshot.schema.json +207 -0
- package/schemas/v2/security-advisory.schema.json +138 -0
- package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +119 -0
- package/schemas/v2/self-hosted-runner-registration.schema.json +74 -0
- package/schemas/v2/self-hosted-runner-result-frame.schema.json +47 -0
- package/schemas/v2/subject-link.schema.json +69 -0
- package/schemas/v2/subject.schema.json +597 -0
- package/schemas/v2/suspend-request.schema.json +370 -0
- package/schemas/v2/tool-descriptor.schema.json +150 -0
- package/schemas/v2/trigger-event.schema.json +508 -0
- package/schemas/v2/trigger-subscription-registration.schema.json +99 -0
- package/schemas/v2/trigger-subscription.schema.json +79 -0
- package/schemas/v2/ui-plugin-message.schema.json +149 -0
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +610 -0
- package/schemas/v2/workflow-definition.schema.json +864 -0
- package/schemas/v2/workload-identity.schema.json +115 -0
- package/schemas/v2/workspace-file-create.schema.json +23 -0
- package/schemas/v2/workspace-file.schema.json +45 -0
- package/schemas/workflow-chain-pack-manifest.schema.json +615 -0
- package/schemas/workflow-definition.schema.json +850 -0
- package/schemas/workload-identity.schema.json +79 -0
- package/schemas/workspace-file-create.schema.json +20 -0
- package/schemas/workspace-file.schema.json +39 -0
- package/spec/v1/alias-detectors.json +283 -0
- package/spec/v1/capability-declaration-classes.json +176 -0
- package/spec/v1/core-standard-manifest.json +423 -0
- package/spec/v1/deprecations.json +854 -0
- package/spec/v1/deprecations.schema.json +187 -0
- package/spec/v1/event-codemap.json +1089 -0
- package/spec/v1/event-codemap.schema.json +41 -0
- package/spec/v1/extensions.json +1273 -0
- package/spec/v1/gaps.json +14581 -0
- package/spec/v1/gaps.schema.json +55 -0
- package/spec/v1/migrations.json +1822 -0
- package/spec/v1/migrations.schema.json +44 -0
- package/spec/v1/operation-path-manifest.json +462 -0
- package/spec/v1/spec-gaps.json +4823 -0
- package/spec/v2/declaration.json +1862 -0
- package/spec/v2/declaration.schema.json +305 -0
- package/spec/v2/errors.json +837 -0
- package/spec/v2/event-codemap.json +1099 -0
- package/spec/v2/event-codemap.schema.json +114 -0
- package/spec/v2/ext/provider-idempotency/registry.json +6 -0
- package/spec/v2/facets/a2a.schema.json +51 -0
- package/spec/v2/facets/aiProviders.schema.json +56 -0
- package/spec/v2/facets/auth.schema.json +91 -0
- package/spec/v2/facets/heartbeat.schema.json +20 -0
- package/spec/v2/facets/interrupt.schema.json +29 -0
- package/spec/v2/facets/mcp.schema.json +81 -0
- package/spec/v2/facets/replay.schema.json +34 -0
- package/spec/v2/facets/sandbox.schema.json +31 -0
- package/spec/v2/facets/webhooks.schema.json +18 -0
- package/spec/v2/path-manifest.json +279 -0
- package/spec/v2/peer-dependency-aliases.json +165 -0
- package/spec/v2/profiles.json +45 -0
- package/spec/v2/release.json +6 -0
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v1/workflow-chain-pack-manifest.schema.json",
|
|
4
|
+
"title": "WorkflowChainPackManifest",
|
|
5
|
+
"description": "Manifest for a published OpenWOP workflow-chain pack — `pack.json` at the pack root with `kind: \"workflow-chain\"`. Distinct from node-pack-manifest.schema.json. See workflow-chain-packs.md for the canonical contract and RFC 0013 for the rationale. Chain packs are workflow-edit-time abstractions: a host editor expands each declared chain inline into the parent workflow at author time, so the dispatching runtime sees only concrete `core.*` (or published-vendor) typeIds.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"name",
|
|
9
|
+
"version",
|
|
10
|
+
"kind",
|
|
11
|
+
"engines",
|
|
12
|
+
"chains"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"name": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Reverse-DNS pack name per node-packs.md §Naming. Reserved scopes are identical (`core.*` / `vendor.<org>.*` / `community.<author>.*` / `private.<host>.*` / `local.*`).",
|
|
18
|
+
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
19
|
+
"minLength": 1,
|
|
20
|
+
"maxLength": 256
|
|
21
|
+
},
|
|
22
|
+
"version": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "Pack-level version per Semantic Versioning 2.0.0.",
|
|
25
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
|
|
26
|
+
},
|
|
27
|
+
"kind": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"const": "workflow-chain",
|
|
30
|
+
"description": "Pack kind discriminator. MUST be the literal string `\"workflow-chain\"` for this schema. Manifests carrying `kind: \"node\"` (or omitting `kind`) validate against `node-pack-manifest.schema.json` instead."
|
|
31
|
+
},
|
|
32
|
+
"description": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"maxLength": 1024
|
|
35
|
+
},
|
|
36
|
+
"author": {
|
|
37
|
+
"type": "string"
|
|
38
|
+
},
|
|
39
|
+
"license": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "SPDX license identifier (e.g., `Apache-2.0`)."
|
|
42
|
+
},
|
|
43
|
+
"homepage": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"format": "uri"
|
|
46
|
+
},
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"format": "uri"
|
|
50
|
+
},
|
|
51
|
+
"keywords": {
|
|
52
|
+
"type": "array",
|
|
53
|
+
"items": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"maxLength": 64
|
|
56
|
+
},
|
|
57
|
+
"maxItems": 50
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"required": [
|
|
62
|
+
"openwop"
|
|
63
|
+
],
|
|
64
|
+
"properties": {
|
|
65
|
+
"openwop": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"description": "Semver range — which openwop protocol versions this pack works against."
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"additionalProperties": true,
|
|
71
|
+
"$comment": "Open by design — packs MAY advertise extra engine constraints (`node`, `python`, etc.) that consumer hosts ignore but operator tooling consumes. Mirrors the shape used in node-pack-manifest.schema.json."
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"additionalProperties": {
|
|
76
|
+
"type": "string"
|
|
77
|
+
},
|
|
78
|
+
"description": "Other node packs whose typeIds this pack's chains reference. Map of pack name → semver range. The host editor uses this map at expansion time to verify referenced typeIds resolve."
|
|
79
|
+
},
|
|
80
|
+
"chains": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"minItems": 1,
|
|
83
|
+
"items": {
|
|
84
|
+
"$ref": "#/$defs/WorkflowChain"
|
|
85
|
+
},
|
|
86
|
+
"description": "Chains the pack contributes. Each MUST have a unique `chainId` within the pack."
|
|
87
|
+
},
|
|
88
|
+
"signing": {
|
|
89
|
+
"$ref": "#/$defs/Signing"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"additionalProperties": false,
|
|
93
|
+
"$defs": {
|
|
94
|
+
"WorkflowChain": {
|
|
95
|
+
"type": "object",
|
|
96
|
+
"required": [
|
|
97
|
+
"chainId",
|
|
98
|
+
"version",
|
|
99
|
+
"label",
|
|
100
|
+
"description",
|
|
101
|
+
"parameters",
|
|
102
|
+
"dag"
|
|
103
|
+
],
|
|
104
|
+
"description": "A single workflow-chain entry — a pre-configured DAG fragment + parameter schema that the host editor expands inline at author time. See workflow-chain-packs.md §Chain entry shape.",
|
|
105
|
+
"properties": {
|
|
106
|
+
"chainId": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"description": "Canonical chain id — namespaced like a node typeId (reverse-DNS pattern). The pack's `name` prefix is recommended (e.g., pack `vendor.acme.editor-presets` exposing `vendor.acme.generatePRD`).",
|
|
109
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
110
|
+
"minLength": 1,
|
|
111
|
+
"maxLength": 256
|
|
112
|
+
},
|
|
113
|
+
"version": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"description": "Per-chain semver. MAY differ from the pack's overall version so a single pack can ship multiple chains that evolve independently.",
|
|
116
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
|
|
117
|
+
},
|
|
118
|
+
"label": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"minLength": 1,
|
|
121
|
+
"description": "Human-readable display label for the host editor's drag-tile catalog."
|
|
122
|
+
},
|
|
123
|
+
"description": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "One-paragraph description of what the chain produces. Surfaced in host editor tile hover-text."
|
|
126
|
+
},
|
|
127
|
+
"internal": {
|
|
128
|
+
"type": "boolean",
|
|
129
|
+
"description": "RFC 0135 — when true, this chain is a composition-only fragment (typically an RFC 0133 sub-chain child): hosts MUST omit it from default template-gallery/picker listings while keeping it loadable, resolvable by id, composable, and expandable exactly like any other chain. Presentational/discovery semantics only — NOT an authorization boundary (a host MUST NOT treat it as access control). Absent ⇒ false (listed). See workflow-chain-packs.md §\"Chain visibility (RFC 0135)\"."
|
|
130
|
+
},
|
|
131
|
+
"parameters": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"description": "JSON Schema 2020-12 fragment describing the parameter values the host editor MUST collect from the author at drop time. Authors-supplied values are validated against this schema before expansion proceeds; invalid input MUST be rejected with `chain_parameter_invalid`. RECOGNIZED EXTENSION KEY (RFC 0124 / WCP4): a property MAY carry `x-openwop-sensitive: true` to declare the parameter secret-class. A host that recognizes it MUST NOT expansion-time-freeze that parameter (plaintext secret-at-rest leak, SR-1) and MUST NOT materialize it as a plaintext `source:\"variable\"` binding (the value would land in the run-scoped bag / `RunSnapshot.variables` — the same SR-1 leak one layer down). Instead, per the 2026-07-04 §Security amendment: it is deferrable ONLY in a prompt-body position, where it MUST be materialized as a `source:\"secret\"` `PromptVariable` (BYOK-resolved via `capabilities.secrets`, redacted to `[REDACTED:<secretId>]` in `prompt.composed`, never bagged); in ANY other position (whole-value `node.inputs`, embedded non-prompt `config`, or a host lacking deferred / `secrets` support) it MUST fail closed with `sensitive_param_not_deferrable` (422). Per-run supply is a `credentialRef` secret reference, never plaintext. See `workflow-chain-packs.md` §\"Deferred-parameter expansion\" / RFC 0124 §Security.",
|
|
134
|
+
"additionalProperties": true,
|
|
135
|
+
"$comment": "Open by design — this field IS a JSON Schema document, so it must accept any of the 30+ JSON Schema 2020-12 keywords (`type`, `properties`, `required`, `oneOf`, `allOf`, etc.). Strict closure would require importing the JSON Schema meta-schema."
|
|
136
|
+
},
|
|
137
|
+
"dag": {
|
|
138
|
+
"$ref": "#/$defs/WorkflowDefinitionFragment"
|
|
139
|
+
},
|
|
140
|
+
"outputs": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"additionalProperties": {
|
|
143
|
+
"$ref": "#/$defs/ChainOutput"
|
|
144
|
+
},
|
|
145
|
+
"description": "Declared outputs the chain surfaces to the parent workflow. Keys are output names; values declare type + description."
|
|
146
|
+
},
|
|
147
|
+
"capabilities": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"items": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"enum": [
|
|
152
|
+
"streamable",
|
|
153
|
+
"cacheable",
|
|
154
|
+
"side-effectful",
|
|
155
|
+
"mcp-exportable"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
"uniqueItems": true,
|
|
159
|
+
"description": "Capability traits to propagate to every expanded node. Hosts MUST copy this array into each expanded `WorkflowNode.capabilities` so existing capability gates apply uniformly."
|
|
160
|
+
},
|
|
161
|
+
"subChains": {
|
|
162
|
+
"type": "array",
|
|
163
|
+
"items": {
|
|
164
|
+
"$ref": "#/$defs/SubChainRef"
|
|
165
|
+
},
|
|
166
|
+
"description": "RFC 0133 §1.1. OPTIONAL. Child chains this chain composes at RUN TIME. Each entry names a chain (a sibling `chainId` in this pack, or an externally published chain) that a node references via `config.subChainRef`. Unlike RFC 0013's author-time inline splice, a referenced sub-chain is co-instantiated as its own registered workflow and dispatched by the parent as a child run (both parent and child stay owned + builder-editable). A host without runtime child dispatch MUST refuse instantiation with `sub_chain_unsupported` (422) rather than flatten. Requires `capabilities.workflowChainPacks.subChains.supported: true`. See `workflow-chain-packs.md` §\"Sub-chain composition (RFC 0133)\"."
|
|
167
|
+
},
|
|
168
|
+
"producedVariables": {
|
|
169
|
+
"type": "array",
|
|
170
|
+
"items": {
|
|
171
|
+
"$ref": "#/$defs/ProducedVariable"
|
|
172
|
+
},
|
|
173
|
+
"description": "RFC 0133 §2.2. OPTIONAL. Run-scoped values a node writes to the executor's variable bag during the run and downstream nodes read by name via a `{ type:\"variable\", variableName }` input binding — where the value is NOT an author-time `parameter` and rides no typed output port. Prefer edges (a typed `sourceOutput`→`targetInput` hand-off) wherever a node exposes a value on a port; `producedVariables` is only for values written to the run bag with no typed port. On expansion the host emits these into `WorkflowDefinition.variables[]` as run-scoped entries (name + type, no value). Any `{ type:\"variable\" }` read of an UNDECLARED name (not here and not a materialized parameter) is a `variable_undeclared` manifest error. See `workflow-chain-packs.md` §\"Produced (run-scoped) variables (RFC 0133)\"."
|
|
174
|
+
},
|
|
175
|
+
"compensation": {
|
|
176
|
+
"type": "object",
|
|
177
|
+
"description": "RFC 0157 (RFC 0013 revision × RFC 0151 §B) — the chain-level compensation POLICY, MIRROR of `compensation-policy.schema.json` (copied inline; a conformance leg asserts equality apart from this description). On expansion it becomes the registered definition's `settings.compensation`: if the parent has none, the host MUST copy it; if the parent already carries one that is not deep-equal, expansion MUST fail `chain_compensation_policy_conflict` — a merged policy nobody wrote is exactly the guess-at-a-contract failure the policy exists to prevent. Absent ⇒ the chain expresses no policy and inherits the parent's (or none).",
|
|
178
|
+
"additionalProperties": false,
|
|
179
|
+
"required": [
|
|
180
|
+
"triggers"
|
|
181
|
+
],
|
|
182
|
+
"properties": {
|
|
183
|
+
"profileVersion": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"pattern": "^[1-9][0-9]*$",
|
|
186
|
+
"description": "The RFC 0151 profile version this policy was authored against. OPTIONAL; when present it MUST equal the host's advertised `capabilities.compensation.profileVersion` or registration fails, because `profileVersion` is part of the inverse-action identity (§C) and a workflow authored under one ordering rule MUST NOT mint identities under another."
|
|
187
|
+
},
|
|
188
|
+
"orderingModel": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"enum": [
|
|
191
|
+
"reverse-completion",
|
|
192
|
+
"dependency-graph"
|
|
193
|
+
],
|
|
194
|
+
"default": "reverse-completion",
|
|
195
|
+
"description": "RFC 0151 §A/§C. `reverse-completion` (default) orders inverse actions by descending durable forward-completion sequence; `dependency-graph` MUST be a DAG and preserve reverse dependency order. The value MUST be one of the host's advertised `capabilities.compensation.orderingModels[]`; a host MUST refuse the workflow at registration otherwise, so an unwind never discovers at failure time that its ordering rule is unimplemented."
|
|
196
|
+
},
|
|
197
|
+
"triggers": {
|
|
198
|
+
"type": "array",
|
|
199
|
+
"minItems": 1,
|
|
200
|
+
"uniqueItems": true,
|
|
201
|
+
"items": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"enum": [
|
|
204
|
+
"node-failure",
|
|
205
|
+
"run-cancel",
|
|
206
|
+
"cap-breach",
|
|
207
|
+
"operator-request"
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
|
+
"description": "Which events start an unwind. REQUIRED and closed — a policy that names no trigger is not a policy, and an open string here would let a host and an author disagree about a word. `node-failure`: a node reaches terminal failure after its own RFC 0009 retry policy and the run cannot continue. `run-cancel`: an RFC 0094 cancel is accepted while committed effects exist. `cap-breach`: an RFC 0058 / RFC 0084 `cap.breached` hard stop. `operator-request`: an authorized operator explicitly requests an unwind (§E) — MUST be authorized per RFC 0049, binding tenant, principal, action, and plan version. A trigger not listed here does NOT start an unwind; the run ends with its committed effects in place and `compensationStatus: none`, which is the honest shape — no generic rollback is inferred from an undeclared trigger (RFC 0151 §Compatibility)."
|
|
211
|
+
},
|
|
212
|
+
"retry": {
|
|
213
|
+
"type": "object",
|
|
214
|
+
"additionalProperties": false,
|
|
215
|
+
"description": "Defaults for inverse actions whose node-level `compensation.retry` is absent. A node's own bounds always win. Retries reuse the inverse action's stable identity (§C) — never a fresh one, or a transient refund failure mints a second refund.",
|
|
216
|
+
"properties": {
|
|
217
|
+
"maxAttempts": {
|
|
218
|
+
"type": "integer",
|
|
219
|
+
"minimum": 1
|
|
220
|
+
},
|
|
221
|
+
"backoffMs": {
|
|
222
|
+
"type": "integer",
|
|
223
|
+
"minimum": 0
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"timeoutMs": {
|
|
228
|
+
"type": "integer",
|
|
229
|
+
"minimum": 1,
|
|
230
|
+
"description": "Wall-clock ceiling per inverse-action attempt, in milliseconds. A timed-out attempt counts against `retry.maxAttempts`; it is not a distinct outcome."
|
|
231
|
+
},
|
|
232
|
+
"exhaustedDisposition": {
|
|
233
|
+
"type": "string",
|
|
234
|
+
"enum": [
|
|
235
|
+
"record-outcome",
|
|
236
|
+
"manual-intervention"
|
|
237
|
+
],
|
|
238
|
+
"default": "record-outcome",
|
|
239
|
+
"description": "RFC 0151 §E — what the host does when an inverse action exhausts its retries. Either way the run MUST route to RFC 0053 dead-letter handling and the run's `compensationStatus` follows the §D fold (`partial` or `failed`). `record-outcome` (default): record the failure and continue unwinding the remaining actions. `manual-intervention`: additionally emit `compensation.manual_intervention_required` and stop issuing further inverse actions until an authorized operator retries, skips with recorded justification, substitutes a registered action, or terminates as uncompensated — the rollup reads `manual` while that is unresolved. Requires `capabilities.compensation.manualIntervention: true`; a host that does not advertise it MUST refuse a policy that selects it."
|
|
240
|
+
},
|
|
241
|
+
"approvalScope": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"enum": [
|
|
244
|
+
"declared",
|
|
245
|
+
"all"
|
|
246
|
+
],
|
|
247
|
+
"default": "declared",
|
|
248
|
+
"description": "RFC 0151 §E. `declared` (default): only inverse actions whose node sets `compensation.requiresApproval: true` create an RFC 0051 approval interrupt. `all`: every inverse action does, regardless of the node's declaration. This value can only ESCALATE — there is no `none`, because a policy MUST NOT strip an approval a node declared for itself (RFC 0147 R9: an inverse action can itself be harmful)."
|
|
249
|
+
},
|
|
250
|
+
"onParentCancel": {
|
|
251
|
+
"type": "string",
|
|
252
|
+
"enum": [
|
|
253
|
+
"continue",
|
|
254
|
+
"pause",
|
|
255
|
+
"manual"
|
|
256
|
+
],
|
|
257
|
+
"default": "continue",
|
|
258
|
+
"description": "RFC 0151 §C — cancellation of the parent run MUST NOT silently abandon an active compensation. `continue`: the unwind runs to its terminal rollup. `pause`: emit `compensation.paused` and hold for authorized intervention (the run's own `status` carries the wait). `manual`: emit `compensation.manual_intervention_required` and stop; rollup reads `manual`. `pause`/`manual` require `capabilities.compensation.manualIntervention: true`."
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
"additionalProperties": false,
|
|
264
|
+
"patternProperties": {
|
|
265
|
+
"^(x-|vendor\\.)": {
|
|
266
|
+
"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."
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"SubChainRef": {
|
|
271
|
+
"type": "object",
|
|
272
|
+
"required": [
|
|
273
|
+
"ref"
|
|
274
|
+
],
|
|
275
|
+
"description": "RFC 0133 §1.1. A reference to a child chain the parent composes. `ref` is EITHER a string naming a SIBLING `chainId` in this pack's `chains[]`, OR an object naming an externally published chain (resolved + signature-verified like any pack dependency). A sibling `ref` that matches no `chainId`, or an external `ref` that fails resolution/verification, is `sub_chain_unresolved`. A chain that transitively composes itself is `sub_chain_cycle`.",
|
|
276
|
+
"properties": {
|
|
277
|
+
"ref": {
|
|
278
|
+
"oneOf": [
|
|
279
|
+
{
|
|
280
|
+
"type": "string",
|
|
281
|
+
"description": "A sibling `chainId` in the same pack's `chains[]`.",
|
|
282
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
283
|
+
"minLength": 1,
|
|
284
|
+
"maxLength": 256
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"type": "object",
|
|
288
|
+
"required": [
|
|
289
|
+
"packName",
|
|
290
|
+
"chainId",
|
|
291
|
+
"version"
|
|
292
|
+
],
|
|
293
|
+
"description": "An externally published chain, resolved + signature-verified like any pack dependency.",
|
|
294
|
+
"properties": {
|
|
295
|
+
"packName": {
|
|
296
|
+
"type": "string",
|
|
297
|
+
"minLength": 1,
|
|
298
|
+
"maxLength": 256
|
|
299
|
+
},
|
|
300
|
+
"chainId": {
|
|
301
|
+
"type": "string",
|
|
302
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
303
|
+
"minLength": 1,
|
|
304
|
+
"maxLength": 256
|
|
305
|
+
},
|
|
306
|
+
"version": {
|
|
307
|
+
"type": "string",
|
|
308
|
+
"description": "Semver range for the external chain. Co-registration SHOULD pin the resolved version into the parent's ownership record for reproducibility (RFC 0133 §Unresolved #1, resolved: pin)."
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
"additionalProperties": false
|
|
312
|
+
}
|
|
313
|
+
]
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
"additionalProperties": false
|
|
317
|
+
},
|
|
318
|
+
"ProducedVariable": {
|
|
319
|
+
"type": "object",
|
|
320
|
+
"required": [
|
|
321
|
+
"name",
|
|
322
|
+
"producedBy",
|
|
323
|
+
"type"
|
|
324
|
+
],
|
|
325
|
+
"description": "RFC 0133 §2.2. A run-scoped variable a chain declares: written by one node and read by others via a `{ type:\"variable\", variableName }` input binding. Run-scoped — carries NO author-time value (that is what `parameters` are for); the manifest distinguishes the two.",
|
|
326
|
+
"properties": {
|
|
327
|
+
"name": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"minLength": 1,
|
|
330
|
+
"description": "The variable-bag key downstream nodes read via `{ type:\"variable\", variableName:\"<name>\" }`."
|
|
331
|
+
},
|
|
332
|
+
"producedBy": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"minLength": 1,
|
|
335
|
+
"description": "The `nodes[].id` (within this same fragment) that writes the value."
|
|
336
|
+
},
|
|
337
|
+
"type": {
|
|
338
|
+
"type": "string",
|
|
339
|
+
"enum": [
|
|
340
|
+
"string",
|
|
341
|
+
"number",
|
|
342
|
+
"boolean",
|
|
343
|
+
"object",
|
|
344
|
+
"array"
|
|
345
|
+
],
|
|
346
|
+
"description": "JSON-Schema type token for validation/inspection."
|
|
347
|
+
},
|
|
348
|
+
"description": {
|
|
349
|
+
"type": "string",
|
|
350
|
+
"description": "One-line description of the produced value's meaning."
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
"additionalProperties": false
|
|
354
|
+
},
|
|
355
|
+
"ChainOutput": {
|
|
356
|
+
"type": "object",
|
|
357
|
+
"required": [
|
|
358
|
+
"type",
|
|
359
|
+
"description"
|
|
360
|
+
],
|
|
361
|
+
"properties": {
|
|
362
|
+
"type": {
|
|
363
|
+
"type": "string",
|
|
364
|
+
"description": "JSON Schema type token (`string` / `number` / `boolean` / `object` / `array`)."
|
|
365
|
+
},
|
|
366
|
+
"description": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"description": "One-line description of the output's meaning."
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
"additionalProperties": false
|
|
372
|
+
},
|
|
373
|
+
"WorkflowDefinitionFragment": {
|
|
374
|
+
"type": "object",
|
|
375
|
+
"required": [
|
|
376
|
+
"nodes"
|
|
377
|
+
],
|
|
378
|
+
"description": "Subset of workflow-definition.schema.json. `id`/`name`/`version`/`triggers`/`settings`/`metadata` MUST be omitted (host generates per-expansion); `variables` is replaced by the chain's top-level `parameters`. See workflow-chain-packs.md §WorkflowDefinitionFragment.",
|
|
379
|
+
"properties": {
|
|
380
|
+
"nodes": {
|
|
381
|
+
"type": "array",
|
|
382
|
+
"minItems": 1,
|
|
383
|
+
"items": {
|
|
384
|
+
"$ref": "#/$defs/FragmentNode"
|
|
385
|
+
},
|
|
386
|
+
"description": "Nodes in the fragment. Every node's `typeId` MUST reference a published node-pack typeId or a reserved `core.*` typeId."
|
|
387
|
+
},
|
|
388
|
+
"edges": {
|
|
389
|
+
"type": "array",
|
|
390
|
+
"items": {
|
|
391
|
+
"$ref": "#/$defs/FragmentEdge"
|
|
392
|
+
},
|
|
393
|
+
"description": "Edges between fragment nodes. Required when `nodes.length > 1`."
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
"additionalProperties": false
|
|
397
|
+
},
|
|
398
|
+
"FragmentNode": {
|
|
399
|
+
"type": "object",
|
|
400
|
+
"description": "Mirror of `workflow-definition.schema.json#/$defs/WorkflowNode` with relaxed `required[]` (chain authors MAY omit `name`/`position`/`config`/`inputs` for trivial pass-through nodes). Maintenance note: when fields are added to `WorkflowNode` in `workflow-definition.schema.json`, mirror the addition here so chain packs can express the same shapes. Drift here means chain-pack authors can't use new node features.",
|
|
401
|
+
"required": [
|
|
402
|
+
"id",
|
|
403
|
+
"typeId"
|
|
404
|
+
],
|
|
405
|
+
"properties": {
|
|
406
|
+
"id": {
|
|
407
|
+
"type": "string",
|
|
408
|
+
"minLength": 1,
|
|
409
|
+
"description": "Node id, unique within the fragment. Hosts MUST rewrite these to globally-unique ids at expansion time."
|
|
410
|
+
},
|
|
411
|
+
"typeId": {
|
|
412
|
+
"type": "string",
|
|
413
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
414
|
+
"minLength": 1,
|
|
415
|
+
"maxLength": 256
|
|
416
|
+
},
|
|
417
|
+
"name": {
|
|
418
|
+
"type": "string"
|
|
419
|
+
},
|
|
420
|
+
"position": {
|
|
421
|
+
"type": "object",
|
|
422
|
+
"properties": {
|
|
423
|
+
"x": {
|
|
424
|
+
"type": "number"
|
|
425
|
+
},
|
|
426
|
+
"y": {
|
|
427
|
+
"type": "number"
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
"additionalProperties": false
|
|
431
|
+
},
|
|
432
|
+
"config": {
|
|
433
|
+
"type": "object",
|
|
434
|
+
"description": "Node config — host-validated against the referenced typeId's config schema. String fields MAY contain `{{params.<name>}}` placeholders that the host MUST substitute at expansion time. RFC 0133: a `core.subWorkflow` / `core.dispatch` (child-run) node MAY carry `subChainRef: string` — a declared `subChains[].ref` (sibling `chainId` or external ref) the host rewrites to the minted child `workflowId` at co-expansion time (§1.3 step 3). A concrete `config.workflowId` inside a fragment remains INVALID — a chain MUST NOT pin a host-specific workflow id (the `not` guard below enforces it).",
|
|
435
|
+
"additionalProperties": true,
|
|
436
|
+
"not": {
|
|
437
|
+
"required": [
|
|
438
|
+
"workflowId"
|
|
439
|
+
]
|
|
440
|
+
},
|
|
441
|
+
"properties": {
|
|
442
|
+
"subChainRef": {
|
|
443
|
+
"type": "string",
|
|
444
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
445
|
+
"description": "RFC 0133 §1.2. A declared `subChains[].ref` this node dispatches as a child run. The host rewrites it to the minted child `config.workflowId` at co-expansion time. MUST match a `subChains[].ref` (sibling `chainId` or external ref's `chainId`), else `sub_chain_unresolved`."
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
"$comment": "Open by design — node config shapes are per-typeId and only known to the host at expansion time when the referenced typeId's config schema is resolved. Cross-typeId enforcement happens at the expansion step, not at manifest-validation time. The `not: { required: ['workflowId'] }` guard is the ONE closed constraint: RFC 0133 forbids pinning a concrete host-specific workflow id inside a portable chain fragment (use `subChainRef` instead)."
|
|
449
|
+
},
|
|
450
|
+
"inputs": {
|
|
451
|
+
"type": "object",
|
|
452
|
+
"description": "Per-port input wiring. String values MAY contain `{{params.<name>}}` placeholders.",
|
|
453
|
+
"additionalProperties": true,
|
|
454
|
+
"$comment": "Open by design — port shapes are per-typeId, same reasoning as `config` above."
|
|
455
|
+
},
|
|
456
|
+
"compensation": {
|
|
457
|
+
"type": "object",
|
|
458
|
+
"description": "RFC 0157 (RFC 0013 revision × RFC 0151 §B) — MIRROR of `workflow-definition.schema.json#/$defs/WorkflowNode/properties/compensation`, copied inline so this manifest stays self-contained (no cross-file `$ref`); a conformance leg asserts the two stay byte-equal apart from this description. The inverse action for this fragment node. `nodeTypeId` MUST resolve at expansion (step 3) exactly as `typeId` does — `chain_unresolvable_typeid`; `inputMapping` strings MAY carry `{{params.<name>}}` and MUST be substituted at expansion (step 5); node-id references inside `inputMapping` MUST be rewritten with the expansion prefix (step 6). Survives expansion verbatim into the registered `WorkflowNode.compensation`.",
|
|
459
|
+
"additionalProperties": false,
|
|
460
|
+
"required": [
|
|
461
|
+
"nodeTypeId"
|
|
462
|
+
],
|
|
463
|
+
"properties": {
|
|
464
|
+
"nodeTypeId": {
|
|
465
|
+
"type": "string",
|
|
466
|
+
"minLength": 1,
|
|
467
|
+
"description": "Node type implementing the inverse action. MUST resolve at registration time."
|
|
468
|
+
},
|
|
469
|
+
"inputMapping": {
|
|
470
|
+
"type": "object",
|
|
471
|
+
"description": "Derived from recorded facts only — node outputs and run inputs already in the event log.",
|
|
472
|
+
"additionalProperties": true
|
|
473
|
+
},
|
|
474
|
+
"retry": {
|
|
475
|
+
"type": "object",
|
|
476
|
+
"additionalProperties": false,
|
|
477
|
+
"properties": {
|
|
478
|
+
"maxAttempts": {
|
|
479
|
+
"type": "integer",
|
|
480
|
+
"minimum": 1
|
|
481
|
+
},
|
|
482
|
+
"backoffMs": {
|
|
483
|
+
"type": "integer",
|
|
484
|
+
"minimum": 0
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
"requiresApproval": {
|
|
489
|
+
"type": "boolean",
|
|
490
|
+
"description": "RFC 0151 §C — an inverse action can itself be harmful (RFC 0147 R9), so it may be gated behind the same approval surface as a forward effect."
|
|
491
|
+
},
|
|
492
|
+
"waiveRequiresApproval": {
|
|
493
|
+
"type": "boolean",
|
|
494
|
+
"description": "RFC 0151 §B/§E (S36, 2026-08-17) — OPTIONAL. When true, ABANDONING this inverse action (§E `skip with justification` or `terminate as uncompensated`) requires an RFC 0051 approval to have resolved `approved` first — if a human must authorize RUNNING an inverse, a human must authorize deciding it will NEVER run. DEFAULT = the obligation's EFFECTIVE `requiresApproval` (after the policy's `approvalScope` escalation, §B) — NOT false — so the field is purely additive: no existing document changes meaning. Stamped onto the obligation at MINT time like `requiresApproval` (a mid-flight redefinition cannot change who had to authorize). Does NOT apply to `substitute` (still an attempt to undo; a substitution is a new planVersion whose own `requiresApproval` governs it). No policy-level counterpart: because the default inherits the effective value, an `approvalScope` escalation escalates waives with it."
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
},
|
|
498
|
+
"irreversibleEffect": {
|
|
499
|
+
"type": "boolean",
|
|
500
|
+
"description": "RFC 0151 §B UQ4 (resolved 2026-08-16), mirrored into chain fragments per RFC 0157 — the fragment author states that this node's committed effect HAS NO INVERSE. Mutually exclusive with `compensation` (host MUST reject both at pack install / chain expansion); expansion copies it onto the expanded `WorkflowNode` unchanged. See `workflow-definition.schema.json` `WorkflowNode.irreversibleEffect`."
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
"additionalProperties": false,
|
|
504
|
+
"if": {
|
|
505
|
+
"properties": {
|
|
506
|
+
"irreversibleEffect": {
|
|
507
|
+
"const": true
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"required": [
|
|
511
|
+
"irreversibleEffect"
|
|
512
|
+
]
|
|
513
|
+
},
|
|
514
|
+
"then": {
|
|
515
|
+
"not": {
|
|
516
|
+
"required": [
|
|
517
|
+
"compensation"
|
|
518
|
+
]
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
"FragmentEdge": {
|
|
523
|
+
"type": "object",
|
|
524
|
+
"required": [
|
|
525
|
+
"from",
|
|
526
|
+
"to"
|
|
527
|
+
],
|
|
528
|
+
"properties": {
|
|
529
|
+
"from": {
|
|
530
|
+
"type": "string",
|
|
531
|
+
"description": "Source node id (must reference a node in `nodes[]`). MAY use `nodeId.outputPort` syntax to bind a specific output port."
|
|
532
|
+
},
|
|
533
|
+
"to": {
|
|
534
|
+
"type": "string",
|
|
535
|
+
"description": "Target node id (must reference a node in `nodes[]`). MAY use `nodeId.inputPort` syntax."
|
|
536
|
+
},
|
|
537
|
+
"condition": {
|
|
538
|
+
"$ref": "#/$defs/EdgeCondition",
|
|
539
|
+
"description": "Optional edge condition — the SAME shape as a top-level workflow edge's condition (workflow-definition.schema.json §EdgeCondition). When present, the edge contributes to the target only if the condition holds against the source node's output, letting a chain express content routing (router/switch/conditional branches). Safety-fix (RFC 0013 amendment 2026-07-03): the field was previously typed `string`, contradicting this description; no chain used the string form (hosts dropped the field at expansion), so correcting it to the object shape breaks no conformant behavior."
|
|
540
|
+
},
|
|
541
|
+
"triggerRule": {
|
|
542
|
+
"type": "string",
|
|
543
|
+
"enum": [
|
|
544
|
+
"all_success",
|
|
545
|
+
"any_success",
|
|
546
|
+
"all_complete",
|
|
547
|
+
"none_failed",
|
|
548
|
+
"any_failed"
|
|
549
|
+
],
|
|
550
|
+
"default": "all_success",
|
|
551
|
+
"description": "Optional fan-in / error-routing rule — the SAME shape and enum as a top-level workflow edge's `triggerRule` (workflow-definition.schema.json §WorkflowEdge). Governs how the target node fires given its incoming edges: `all_success` (default — every incoming edge's source succeeded), `any_success`, `all_complete` (fire when all sources have finished regardless of success — best-effort completion), `none_failed`, `any_failed`. Additive (RFC 0125): omitting it is identical to `all_success`, the implicit prior behavior. Mirrors the RFC 0013 2026-07-03 `condition` amendment's WorkflowEdge→FragmentEdge move. Expansion MUST carry this value onto the resulting `WorkflowEdge` so the scheduler honors it (see `workflow-chain-packs.md` §\"Expansion semantics\")."
|
|
552
|
+
}
|
|
553
|
+
},
|
|
554
|
+
"additionalProperties": false
|
|
555
|
+
},
|
|
556
|
+
"EdgeCondition": {
|
|
557
|
+
"type": "object",
|
|
558
|
+
"description": "Edge condition — identical to workflow-definition.schema.json §EdgeCondition (RFC 0013 §edges: 'same shape as a top-level workflow definition'). Inlined here so the manifest schema is self-contained for pack-loader validators. RFC 0134 added `truthy`/`falsy` (kept in sync with the top-level def).",
|
|
559
|
+
"properties": {
|
|
560
|
+
"type": {
|
|
561
|
+
"type": "string",
|
|
562
|
+
"enum": [
|
|
563
|
+
"expression",
|
|
564
|
+
"equals",
|
|
565
|
+
"notEquals",
|
|
566
|
+
"contains",
|
|
567
|
+
"regex",
|
|
568
|
+
"truthy",
|
|
569
|
+
"falsy"
|
|
570
|
+
],
|
|
571
|
+
"description": "RFC 0134: `truthy`/`falsy` test the resolved value at `left` for truthiness and take NO `right` operand; `left` is required for all operators except `expression`."
|
|
572
|
+
},
|
|
573
|
+
"left": {
|
|
574
|
+
"type": "string",
|
|
575
|
+
"description": "Left operand path (e.g., 'status', 'output.approved'). Required for every operator except `expression`."
|
|
576
|
+
},
|
|
577
|
+
"right": {
|
|
578
|
+
"description": "Right operand value (any JSON value). Meaningless for `truthy`/`falsy` (RFC 0134)."
|
|
579
|
+
},
|
|
580
|
+
"expression": {
|
|
581
|
+
"type": "string",
|
|
582
|
+
"description": "Used when type='expression'."
|
|
583
|
+
}
|
|
584
|
+
},
|
|
585
|
+
"additionalProperties": false
|
|
586
|
+
},
|
|
587
|
+
"Signing": {
|
|
588
|
+
"type": "object",
|
|
589
|
+
"description": "Optional signing metadata. Reuses node-packs.md §signing unchanged.",
|
|
590
|
+
"properties": {
|
|
591
|
+
"publicKeyRef": {
|
|
592
|
+
"type": "string",
|
|
593
|
+
"description": "Path inside the tarball to the Ed25519 public key (PEM-encoded)."
|
|
594
|
+
},
|
|
595
|
+
"signatureRef": {
|
|
596
|
+
"type": "string",
|
|
597
|
+
"description": "Path to the detached signature over `pack.json`."
|
|
598
|
+
},
|
|
599
|
+
"method": {
|
|
600
|
+
"type": "string",
|
|
601
|
+
"enum": [
|
|
602
|
+
"manual",
|
|
603
|
+
"sigstore"
|
|
604
|
+
]
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
"additionalProperties": false
|
|
608
|
+
}
|
|
609
|
+
},
|
|
610
|
+
"patternProperties": {
|
|
611
|
+
"^(x-|vendor\\.)": {
|
|
612
|
+
"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."
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|