Orkestia
Blog
Guides

Security & Compliance

How Orkestia keeps customer code and data out of its custody, isolates every tenant by construction, and gives evaluators an audit trail they can hand to a reviewer

This guide is written for the person who has to sign off before Orkestia touches a production cloud account: the platform engineer, the security reviewer, the technical lead doing an evaluation. It explains the actual mechanisms behind Orkestia's security posture and what is available today versus on the roadmap.

The short version: Orkestia is built so that the secure path is the only path. Customer cloud code and data stay in your accounts. Execution of cloud workflows happens there. App Data is the explicit exception: rows of apps that opted into the platform data plane live on Orkestia-managed Postgres, isolated by identity and ownership — not a copy of your cloud warehouse. App Host is the explicit exception for hosting: a claimed site runs on a shared pool you do not kubeconfig. Every tenant is isolated by construction, and everything the platform did for your organization is recoverable as an org-scoped audit trail.

No code/data custody (cloud)

Cloud workflows execute in the customer's own accounts. Orkestia stores workflow state and observability. App Data stores only the app rows you declared. App Host stores site metadata, not your git.

No static keys

Cross-account access uses STS-assumed roles scoped by an external ID. No long-lived access keys are stored.

Isolated by construction

Tenant scope is bound from the verified identity server-side. A caller cannot widen scope to read another org's rows.

Provable

An org-scoped, read-only audit log over the engine's transition log, plus exportable evidence packs.

The trust boundary: Zero Code Custody

The single most important architectural fact for an evaluator is where execution happens. Orkestia is an orchestrator and an observability plane. Cloud jobs and provider resources stay in your accounts. If you opt in to App Data or App Host, those apps' rows, the claimed site, and (when Buzz is on) site MinIO including Files run on Orkestia-managed infrastructure with the same identity isolation — still not your git, still not a dump of your cloud data plane.

Lives in OrkestiaLives in your cloud
Workflow definitions & compositionsYour application code
Workflow state + the transition logYour data stores, secrets, runtimes
Observability data (Lumen)The actual execution of work
Identity, org structure, governance (Staff)Customer-owned KBs / S3 / compute
This boundary is why the hybrid execution model matters for security, not just performance: AI designs the workflow, but the compiled deterministic virtual workflow is what actually runs — and it runs against your resources, under your roles, with the engine only recording what happened.

Cross-account access without static keys

Orkestia reaches into a customer cloud account through a role it assumes, not a key it stores. You create a role in your own account that trusts Orkestia's platform principal, gated by an external ID that the platform supplies. This is the standard AWS confused-deputy mitigation.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "AWS": "<orkestia-platform-principal>" },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": { "sts:ExternalId": "<your-unique-external-id>" }
    }
  }]
}

What this buys an evaluator:

  • No long-lived secrets in Orkestia's store. Access is a short-lived STS session, scoped by the role's own permission policy — which you author and can tighten or revoke at any time.
  • Revocation is one-sided and instant. Delete the trust relationship in your account and Orkestia can no longer assume the role. There is no credential to rotate or leak.
  • Least privilege is yours to set. The blast radius of any Orkestia workflow is the union of the role policies you granted — nothing more.
When you set up a connection, the workflow engine tells you exactly which principal to trust and which external ID to bind. The MCP get_workflow_prerequisites flow returns this setup guide with the platform identity already filled in. See AWS connections and Cloud connections for the connection setup, and the per-connection prerequisites in the reference catalog.

For DNS-driven flows (custom domains, app enablement) the same delegated-credential principle applies via provider connections — see DNS providers.

Identity & authentication

Orkestia has two distinct identity models, and it's worth keeping them separate when reasoning about security.

ModelWho it authenticatesMechanism
Member identityYour team operating the platformAWS Cognito — PKCE, RS256 JWTs, MFA support, social sign-in, managed sessions
End-user identityThe users of apps you build"Sign in with Orkestia" — hosted PKCE / RS256 / MFA, immutable server-side principal injection

Member-account controls (authentication provider, password management, active sessions, account deletion) live under Settings → Security. Authentication is handled by AWS Cognito, so password storage, strength rules, recovery, and MFA are never implemented in application code.

For the apps you expose to end-users via App Enablement, the security guarantees are enforced end to end:

GuaranteeHow it's enforced
Secure-by-default loginHosted "Sign in with Orkestia" — PKCE, RS256-signed JWTs, MFA, email verification, none of it in your code
No credentials in your appYour frontend never holds a DB or API secret; Orkestia runs the workflow server-side
Immutable identityThe end-user principal is injected server-side from the verified token — a caller cannot set or override who they are
Forced tenant isolationScoped data steps bind the tenant filter from the caller's identity; a user can never widen scope to read another's rows
App Data isolationCatalog keyed by (org, identity app). Owner / app / workspace modes. PostgREST 401/403 fail closed. Operator SQL is admitted SELECT only.
Least-exposure invocationEnd-user tokens can start only the virtual workflows you explicitly expose — never raw platform workflows

See Identity & multi-tenancy for the full model.

"Sign in with Orkestia" (end-user identity) is in active beta. Treat exact token lifetimes, MFA enrolment flows, and rate-limit defaults as subject to change, and confirm current values in Settings and the reference catalog rather than hard-coding them.

Tenant isolation by construction

Multi-tenant breaches almost always come from a missing filter, not a wrong one. Orkestia's design removes the opportunity to forget.

  • Org scope is resolved server-side from the token. When you call the workflow MCP, your organization_uuid is resolved from your authenticated identity — you do not pass it, and you cannot override it. Runs are scoped to your org automatically.
  • Scoped data steps bind the tenant filter from identity. A query workflow cannot express "read another org's rows"; the filter is derived, not supplied.
  • The audit surface is org-scoped by construction. Cross-org reads are not expressible in the audit query API — a query can only ever return your organization's runs.

Agent Exchange: two orgs, one ledger

Agent Exchange is the sanctioned cross-org channel for hiring Staff actors. It does not punch a hole in tenant isolation.

  • Mutations take the party from claims. buyer_organization_uuid / seller_organization_uuid on hire or publish are ignored. You cannot hire "as" another org by stuffing a UUID.
  • Dispatch is a grant, not a shared token. An active lease is proven, then the seller-side run is pinned to the seller org under a named system principal.
  • Orkestia never holds the funds. Settlement rides the seller's Stripe / AbacatePay / Mercado Pago account. The platform stores contract evidence.
  • Seller invoke output is untrusted data. Do not treat it as instructions or render it as a prompt. Payloads stay under the listing DPA.

Operator path: Settlement & trust.

// Conceptual: the caller never supplies the tenant filter.
// It is bound from the verified principal, server-side.
const run = await start_workflow("audit.workflow-run.query", {
  workflow_type_prefixes: ["kubernetes.", "deploy.k8s."],
  state: "terminal",
  // organization_uuid is injected from the token — not a parameter you set
});

The audit log & evidence packs

Every action on Orkestia is a workflow, and every workflow records every state transition. The audit log (the audit.* workflow library) is the typed, read-only query surface over that transition log — so you can answer "what ran for my organization, and what happened?" without writing raw SQL or risking a mutation.

CapabilityWorkflowWhat it answers
Run queryaudit.workflow-run.queryPaginated list of runs — filter by type prefix, state, terminal status, actor, time range
Run historyaudit.workflow-run.get-historyFull transition log for one run (after verifying it belongs to your org)
Run aggregateaudit.workflow-run.aggregatePer-type counts and last-started-at over a time range
Health scanaudit.workflow-health.scanSurfaces stuck / unhealthy runs
Evidence packcomposed from the queries aboveBundle query + history + aggregate over a scoped window into a portable evidence artifact

Why this matters for compliance:

  • One source of truth. The data already lives in the engine — the audit log exposes it safely instead of copying it into a parallel store that can drift.
  • Read-only and side-effect-free. Every audit workflow is a DataWorkflow or read-only Workflow; auditing cannot mutate state.
  • Evidence packs. Compose the queries above over a time range or workflow group into a portable artifact you can hand directly to an auditor — answering "prove what the platform did for us" without a screen-scrape.
  • Prefix-composed grouping. Ask for "all kubernetes workflows" or "all billing workflows" by passing the prefixes you care about, with no hard-coded filters.
The audit log is the historical record; Lumen is the live runtime view (logs, traces, metrics). Pair them: the audit trail tells you what ran, Lumen tells you how it behaved. See Observability with Lumen.

FailGuard — reliability guardrails

FailGuard is the automated error-fix guardrail for production. Connect a GitHub repository and a Sentry project; when production throws an error, FailGuard deduplicates it by fingerprint, indexes the relevant code, and runs the failguard.error-fix workflow that explores, designs, generates, reviews, evaluates — and, within the controls you set, opens a pull request.

AspectBehavior
TriggerA Sentry webhook; events are matched to a project, deduplicated by fingerprint, and screened against your rules
Repairfailguard.error-fix transitions through explore → design → generate → review → evaluate → create-PR / reject
ControlsAuto-fix toggle, mandatory-review requirement, confidence threshold, daily / hourly attempt limits, excluded paths and error types
Indexing ownershipour_side uses platform-managed Bedrock resources; their_side keeps the KB/S3 in your AWS account via a connection
AuditabilityEvery attempt stores its full workflow history, agent outputs, file-change proposals, confidence metrics, and PR URL

Two security-relevant properties: a generated fix is a proposal, not a merge — it lands as a reviewed PR, and the review requirement / confidence threshold are guardrails you control; and because every repair attempt is a workflow run, it is visible to the audit log above. Repair history is workflow-run history.

With their_side indexing, FailGuard's code index and storage live in your own AWS account under a connection you grant — consistent with the no-custody boundary. our_side uses platform-managed Bedrock resources; choose per your data-residency requirements.

Mapping to common compliance concerns

The table below maps typical reviewer questions to the mechanism that answers them. It is a map of capabilities, not a certification claim.

Reviewer concernOrkestia mechanism
"Where does our code/data live?"In your cloud accounts. Orkestia holds workflow state + observability data only
"How do you access our account?"STS-assumed role gated by external ID; no stored static keys; revocable one-sided
"How is access scoped?"Role permission policies you author; least privilege is yours to set
"Can one tenant see another's data?"No — org scope is bound from the verified token server-side and is not overridable
"How do you authenticate users?"AWS Cognito (members); hosted PKCE/RS256/MFA "Sign in with Orkestia" (end-users)
"Can you prove what happened?"Org-scoped, read-only audit log + exportable evidence packs
"What about secrets in our app?"None — the frontend holds no DB/API secret; execution is server-side
"How do you handle prod failures?"FailGuard: deduplicated, indexed, reviewed PR proposals — every attempt auditable
The guarantees above — no-custody execution, assume-role access, tenant isolation, the audit log, and FailGuard — are live today. The security.* library today carries org-level workflow policy controls (security.org-workflow-policy.*). A couple of related capabilities are on the roadmap: engine-native security-assessment workflows (authorized posture collection, safe checks, findings triage), and formal compliance attestations (e.g. SOC 2 / ISO). Orkestia provides the evidence-generation primitives today; confirm current status with the team.

Where to go next

Identity & multi-tenancy

The two identity models and how tenant scope is bound from the token.

Observability with Lumen

The live runtime view that pairs with the audit trail.

Deployment models

Where the control plane and runners sit, and what crosses the boundary.

Hybrid execution model

Why AI-designed, deterministic-compiled workflows keep the trust boundary clean.

AWS connections

Set up the assume-role + external-ID trust into your account.

Reference catalog

Audit, evidence-pack, and FailGuard APIs in full detail.