Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

UWS

UWS logo

UWS is the Udon Workflow Specification Go package. It defines the UWS 1.x document model, JSON Schema, validation helpers, and JSON/YAML/HCL conversion helpers.

UWS is a workflow overlay over source documents — OpenAPI, AsyncAPI, GraphQL, OpenRPC, Protocol Buffers, OData, and the like. The source document owns the operations: methods, paths, channels, messages, schemas, servers, and security are all defined server-side and authoritative. UWS adds only what the source cannot express: operation binding, workflow structure, request values, outputs, triggers, and control flow.

This is what distinguishes UWS from full client-side workflow tools such as Arazzo and IaC engines such as OpenTofu and Terraform. Arazzo describes full client-side action sequences and treats each step as a bespoke client action. OpenTofu and Terraform act as full client-side workflow engines for infrastructure: each resource and provider call is described in the client configuration and resolved against a provider plugin at apply time. Neither approach assumes that the underlying operations are already defined by a server contract. UWS takes the opposite position: server actions are pre-defined by the source document, and UWS workflows reference those operations by ID rather than re-describing them. The result is a much smaller overlay: UWS does not duplicate request/response shapes, does not redeclare endpoints, and does not encode anything the source document already specifies.

UWS 1.9.1 is the latest release. It keeps OpenAPI compatibility, supports nine source description types, and adds reviewable content-provenance declarations plus deterministic advisory analysis. The ansible-module source type added in 1.6 was removed in 1.7, and UWS 1.9 defines no replacement Ansible operation profile. Missing sourceDescription.type still defaults to openapi; legacy openapiOperationId and openapiOperationRef remain valid for OpenAPI sources.

Version highlights

VersionAdds
1.0Initial spec: OpenAPI-bound operations, workflow structure, request binding, structural control flow (sequence/parallel/switch/loop/merge/await), triggers, results, success criteria, success/failure actions, runtime expressions, and the x-uws- extension prefix with x-uws-operation-profile.
1.1Portable timeout on operations/workflows/steps; workflow-level idempotency metadata for run de-duplication.
1.2First-class sourceDescription.type for openapi, google-discovery, aws-smithy; canonical sourceOperationId / sourceOperationRef selectors. Legacy openapiOperationId / openapiOperationRef kept for OpenAPI sources.
1.3First-class asyncapi source type; AsyncAPI operation selector rules including #/operations/..., #/channels/..., and #/channels/.../messages/... ref forms.
1.4First-class graphql, openrpc, grpc-protobuf, and odata source types; generic selectors required for those families.
1.5First-class browser-profile source type; capability profile sub-spec published separately as versions/browser.1.5.{json,md}.
1.6First-class ansible-module source type (FQCN as sourceOperationId, #/modules/<fqcn> refs); argspec sub-spec published separately as versions/ansible.1.0.{json,md}.
1.7Removed ansible-module: the managed host does not expose the collection module as a pre-existing operation, and UWS 1.7 does not standardize Ansible module calls.
1.8Kept UWS core stable; added browser 1.6 and browser-authentication/call 1.1 profiles for bounded popup/frame contexts while retaining all older schemas.
1.9.0Kept UWS core stable; added browser 1.7 locale-free scalar conversion for accessibility-text outputs while retaining browser authentication 1.1 and all older schemas.
1.9.1Added optional contentTrust declarations and deterministic advisory provenance/capability analysis without changing existing output shapes or execution behavior.

See versions/CHANGELOG.md for the full changelog.

Non-source runtimes such as command execution, function calls, file I/O, SSH, SQL, browser automation, or LLM calls are extension-profile concerns represented with x-* fields, not UWS core service types. Operations without a source binding are extension-owned and require x-uws-operation-profile to name the implementation profile that can execute them. The optional uws.runtime.1.0 supplement standardizes a small x-uws-runtime selector payload for those extension-owned operations.

GoDoc

Documentation

Packages

  • uws1 contains the UWS 1.x Go model, structural vocabulary, and structural validation.
  • convert converts UWS documents between JSON, YAML, and the HCL authoring form.
  • schemas locates version documents and validates the separately versioned browser profiles. Go schema APIs formerly under versions moved here so versions/ contains documents only.
  • validation loads JSON, YAML, or HCL artifacts and applies versioned JSON Schema plus semantic validation.
  • contenttrust performs explicit, deterministic advisory analysis using source- and extension-profile resolvers.
  • runtimes contains the public uws.runtime.1.0 supplement constants, wire structs, and extension helpers.
  • browserauthentication contains the additive secret-free sign-in profile and named-session operation extension types.
  • browserregistration contains the separate additive secret-free account-registration profile and explicitly approved mutation extension types.
  • versions/1.9.1.md is the latest human-readable UWS 1.9 specification.
  • versions/1.9.1.json is the latest JSON Schema for UWS 1.9 documents; 1.9.0 remains immutable and accepted.
  • versions/browser.1.7.* publishes portable scalar accessibility-text conversion on top of browser 1.6 contexts; immutable browser 1.5/1.6 documents remain accepted.
  • versions/browser-authentication.1.1.* and versions/browser-authentication-call.1.1.* publish context-capable sign-in recipes and explicit named-session establishment; immutable 1.0 documents remain accepted.
  • versions/browser-registration.1.0.* and versions/browser-registration-call.1.0.* publish account-creation recipes with symbolic credentials, an explicit submit approval, fail-on-duplicate behavior, no ambiguous retry, and a preselected cleanup disposition.
  • versions/ansible.1.0.md / versions/ansible.1.0.json are retained only with the historical UWS 1.6 contract.

The UWS-owned Ansible module-call supplement, its ansiblemodulecall Go package, and its schema accessors were removed when 1.7 support was retired. UWS 1.6 documents still validate. Consumers of those historical UWS-named Go contracts must pin an older revision; the last published pre-removal tree is commit a68a209. The Ramen repository instead keeps its static conversion-only implementation in its own internal/ansibleconvert package with Ramen-owned identifiers. It is not a compatibility copy and does not accept the retired UWS Ansible identifiers. This recovers the historical files into the current directory:

git archive a68a209 ansiblemodulecall versions/ansible.1.0.json versions/ansible.1.0.md versions/ansible-module-call.1.0.json versions/ansible-module-call.1.0.md | tar -x

The browser-authentication documents are separate profiles rather than part of the UWS 1.8+ core schema. browser-authentication.1.1 describes a reviewed, secret-free sign-in recipe, while browser-authentication-call.1.1 validates the operation-level x-uws-browser-authentication envelope. A UWS 1.8+ document selects that envelope through x-uws-operation-profile; tooling that implements the profile then validates it with schemas. This separation lets the browser profile evolve independently and keeps authentication semantics out of core UWS parsing.

The browser-registration documents are likewise separate from both UWS core and browser authentication. They describe an explicitly approved account- creation mutation and its fixed duplicate, ambiguity, and cleanup controls. They do not establish a session, carry credential values, automate human verification, retry an ambiguous outcome, or perform cleanup.

Validation

Use (*uws1.Document).Validate() when an error is enough, or ValidateResult() when callers need all path-tagged validation errors.

result:=doc.ValidateResult()
if!result.Valid() {
returnresult
}

Validation checks required root fields, source operation bindings, extension-owned operation profiles, duplicate identifiers, standard request-binding keys, known structural types, selected reference integrity, action/criterion rules, and trigger routes.

versions/1.9.1.json provides structural JSON Schema validation. Use the Go validator for semantic checks such as duplicate identifiers, reference integrity, and malformed contentTrust declarations. Go callers resolve it with schemas.PathForVersion.

The separate versions/runtime.1.0.json schema validates the public runtime supplement payload. It requires x-uws-runtime.type, accepts only the non-HTTP runtime identifiers defined by the supplement, and rejects HTTP/API/event source metadata because HTTP and event calls are represented by core source operation binding fields.

Content-trust analysis is explicit and advisory:

report, err:=contenttrust.Analyze(ctx, doc, resolvers...)

The report contains stable edges and findings without runtime values or content excerpts. Findings do not enter ValidationResult, prevent execution, or alter executor results. Provenance (trusted, untrusted, unknown) remains separate from capability (free_text, constrained_scalar, composite, unknown).

Execution

UWS 1.x defines a bound-runtime execution model. UWS core owns orchestration and structural execution semantics; the bound runtime owns leaf execution plus the evaluation services needed for expressions and iterative constructs.

At a high level:

  • Document.Execute(ctx) executes the document through the orchestrator
  • Document.DispatchTrigger(ctx, triggerID, output, payload) dispatches a trigger event into the same execution model
  • Document.ExecutionRecords() exposes the accumulated execution snapshot
  • Runtime is responsible for leaf execution, expression evaluation, and item resolution

Execution requires a bound runtime and a document that passes validation for execution. Trigger dispatch resolves outputs by label or decimal index and routes only to declared workflows or top-level entry-workflow steps.

Interchange

The convert package provides JSON, YAML, and HCL helpers such as JSONToHCL, HCLToJSON, and MarshalYAML. MarshalHCL works on a deep copy and does not mutate the caller-owned document.

HCL conversion preserves dynamic map keys such as $ref through reversible key rewriting. JSON and YAML preserve x-* extensions through the JSON extension model; HCL represents object-level extensions with extensions { ... } blocks and flattens them back to x-* fields when converting to JSON or YAML.

Large round-trip fixtures under testdata/big/ exercise the HCL/JSON converter with runtime supplement metadata and multi-file source references.

Development

go test ./...
go vet ./...

License

Apache License 2.0. See LICENSE.

About

Udon Workflow Specification

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages