Skip to content

Review Handoff

OpenUdon packages are reviewed through generated evidence and a machine-readable handoff manifest before openudon run can invoke a trusted executor.

For SaaS-specific review evidence, credential scope, side-effect risk, approval JSON, and dry-run guidance, see SaaS Review And Trusted Handoff.

Handoff Manifest

expected/review-handoff.json uses the stable apitools.review-handoff.v1 wire version. The manifest records package inputs, approval state, owner split, execution policy, credential binding names, and trusted-runner metadata.

The manifest is evidence for an external reviewer or orchestrator. It does not grant approval by itself. Generation normally leaves side-effectful packages in generated or review-required state.

Required Package Inputs

The package digest covers the required handoff inventory:

project.md
workflows/intent.hcl
workflows/workflow.hcl
workflows/workflow.uws.yaml
expected/plan.json
expected/quality.json
expected/refinement.json
expected/review.md
expected/review-handoff.json
expected/data.hcl when runtime inputs are declared
openapi/... regular files used by the package
google-discovery/... regular files used by the package
aws-smithy/... regular files used by the package
asyncapi/... regular files used by the package
graphql/... regular files used by the package
openrpc/... regular files used by the package
grpc-protobuf/... regular files used by the package
odata/... regular files used by the package
associated advisory security sidecars

Unsafe relative paths, symlinks, directories, special files, missing files, and unstated required inputs are rejected before execution.

expected/data.hcl may include ENVIRONMENT markers for values owned by the operator environment. Review packages should contain the marker names, not plaintext credential values.

Approval JSON

Create approval JSON only after reviewing the current package:

mkdir -p approvals
go run ./cmd/openudon approval-template \
  --example ./examples/eval/support-email \
  --state approved_for_sandbox \
  --reviewer "Reviewer Name" \
  > approvals/support-email-sandbox.json

Approval JSON uses openudon.approval.v1 and includes:

version
scope
state
reviewer
approved_at
expires_at
package_sha256
notes

The approved digest must match the package at run time. If any digest-covered file changes, generate a new approval after review.

Trusted Runner Config And Evidence

Validate the package and write a non-secret run config without invoking the executor:

go run ./cmd/openudon run \
  --example ./examples/eval/support-email \
  --tier sandbox \
  --approval approvals/support-email-sandbox.json \
  --dry-run

openudon run checks the handoff manifest, stored and current quality, approval scope, approval state, expiry, package digest, tier compatibility, credential-value policy, and direct-production policy. The resulting openudon.executor-run.v1 config includes the UWS artifact, API source files, sorted package paths, package digest, tier, workdir, and credential binding names.

Dry runs stage digest-covered files into a fresh workdir and recompute the package digest without requiring credential values or invoking the executor. Both dry runs and real handoffs write openudon.run-evidence.v1 at <workdir>/run-evidence.json with package paths, staged paths, gate outcomes, credential binding names, and a digest reference to <workdir>/async-evidence.json. The sidecar is an openudon.async-evidence-bundle.v1 wrapper over neutral Evidence async request and response records for OpenUdon package handoff audit only. When a compatible udon executor writes a udon.execution-report.v1 file, OpenUdon also forwards status and confirmation-read observations from that report. OpenUdon does not interpret Ramen convergence or store credential values or raw executor output. OPENUDON_EXECUTOR selects the final executor as an absolute binary path or docker://<image>.

The run evidence sidecar reference is workdir-relative so ignored run directories can be archived without rewriting paths:

{
  "async_evidence_files": [
    {
      "path": "async-evidence.json",
      "digest": "sha256:...",
      "records": 2,
      "purpose": "openudon_run_async_execution_forwarding"
    }
  ]
}

Dry-runs and executor invocations without a report contain one execution request and one execution response. Compatible udon executions can add one status observation and, when the report includes an output digest, one confirmation-read observation. A machine-readable schema is available at docs/schemas/openudon.async-evidence-bundle.v1.schema.json.

{
  "version": "openudon.async-evidence-bundle.v1",
  "records": [
    {
      "kind": "execution_request",
      "execution_request": {
        "version": "evidence.async.execution-request.v1",
        "attempt": {
          "evidence_id": "examples.support-email.abc123.request",
          "attempt_id": "examples.support-email.abc123",
          "source": "openudon.trustedrunner"
        },
        "operation": {
          "subject_kind": "openudon_package",
          "subject_id": "examples/support-email",
          "action": "run",
          "source_kind": "uws",
          "operation_id": "workflows/workflow.uws.yaml"
        },
        "transport": {
          "runner_mode": "dry-run",
          "stage_kind": "dry-run",
          "tier": "sandbox",
          "dry_run": "true"
        }
      }
    },
    {
      "kind": "execution_response",
      "execution_response": {
        "version": "evidence.async.execution-response.v1",
        "request_evidence_id": "examples.support-email.abc123.request",
        "outcome": "accepted"
      }
    }
  ]
}

If OPENUDON_UDON_RUNNER overrides the outer runner shim, OpenUdon evidence marks the staged path as stage_kind: preflight. That proves OpenUdon's package validation before handing the config to the external runner; the external runner still owns its final executor-visible stage and invocation.

Verify archived run evidence and sidecar integrity with:

go run ./cmd/openudon run-evidence verify \
  --file .openudon-run/support-email/run-evidence.json