Skip to content

Actions & Manifests

An action is a declared, versioned definition of a protected operation. Every action maps to a WASM provider module and specifies exactly what the provider is allowed to do: which I/O imports it needs, what inputs are valid, what targets it can reach, and how its results should be verified.

Action definitions live in YAML manifests. After latchgate init, manifests are in ./manifests/. In the source tree, they are in definitions/manifests/.

LatchGate ships built-in actions. Most use the builtin:http_api template provider — each manifest configures it for a specific API, method, domain, and risk level. Three actions (fs_read, fs_write, fs_delete) use the builtin:fs template provider for sandboxed filesystem access.

Approval is enforced by OPA policy based on risk level. The default policy requires human approval for high and critical actions.

Action IDMethodRiskDescription
http_fetchGETlowRead-only HTTP fetch
http_postPOSTmediumGeneric HTTP write
http_putPUTmediumGeneric HTTP replace
http_patchPATCHmediumGeneric HTTP partial update
http_deleteDELETEhighGeneric HTTP delete
http_bearer_getGETlowGET with bearer token injection
http_sensitive_readGEThighRead requiring approval (PII/sensitive data)
web_readGETlowWeb page read
webhook_notifyPOSTmediumGeneric outbound webhook
Action IDMethodRiskDescription
github_readGETlowRead repos, files, metadata
github_searchGETlowSearch repositories and code
github_create_issuePOSTmediumCreate issue
github_comment_issuePOSTmediumComment on issue
github_deleteDELETEcriticalDelete resource
github_pr_createPOSThighCreate pull request
github_pr_commentPOSTmediumComment on PR
github_pr_reviewPOSTmediumSubmit PR review
github_pr_mergePUTcriticalMerge pull request
github_actions_readGETlowRead GitHub Actions workflows and runs
github_actions_triggerPOSThighTrigger GitHub Actions workflow
Action IDMethodRiskDescription
gitlab_readGETlowRead projects and resources
gitlab_create_issuePOSTmediumCreate issue
gitlab_mr_createPOSThighCreate merge request
gitlab_mr_mergePUTcriticalMerge merge request
bitbucket_readGETlowRead repositories
bitbucket_pr_createPOSThighCreate pull request
bitbucket_pr_mergePOSTcriticalMerge pull request
Action IDMethodRiskDescription
gcal_listGETlowList calendars/events
gcal_read_eventGETlowRead single event
gcal_create_eventPOSThighCreate calendar event
gcal_update_eventPUThighUpdate event
gcal_delete_eventDELETEhighDelete event
Action IDMethodRiskDescription
gmail_listGETmediumList messages
gmail_readGETmediumRead message
gmail_sendPOSThighSend email
gmail_deleteDELETEhighDelete message
google_tasks_listGETlowList tasks
google_tasks_createPOSTmediumCreate task
google_tasks_updatePATCHmediumUpdate task
google_tasks_deleteDELETEhighDelete task
Action IDMethodRiskDescription
slack_readGETlowRead channels/messages
slack_postPOSTmediumPost message
Action IDMethodRiskDescription
discord_postPOSTmediumPost to Discord webhook
teams_postPOSTmediumPost to Microsoft Teams
telegram_sendPOSTmediumSend Telegram message
sendgrid_sendPOSThighSend email via SendGrid
Action IDMethodRiskDescription
jira_readGETlowRead Jira issues and projects
jira_apiPOSTmediumJira API call
linear_apiPOSTmediumLinear API call
notion_readGETlowRead Notion pages and databases
notion_apiPOSTmediumNotion API call
todoist_listGETlowList Todoist tasks
todoist_createPOSTmediumCreate task
todoist_updatePOSTmediumUpdate task
todoist_completePOSTmediumComplete task
todoist_deleteDELETEhighDelete task
asana_readGETlowRead Asana tasks and projects
asana_createPOSTmediumCreate Asana task
asana_updatePUTmediumUpdate Asana task
asana_deleteDELETEhighDelete Asana task
Action IDMethodRiskDescription
cloudflare_dns_listGETlowList DNS records
cloudflare_dns_createPOSThighCreate DNS record
vercel_deploymentsGETlowList Vercel deployments
vercel_deployPOSThighTrigger deployment
render_servicesGETlowList Render services
docker_hub_readGETlowRead Docker Hub repository info
s3_readGET / HEADmediumRead S3 object (pre-signed or IAM-authed URL)
s3_writePUT / DELETEhighWrite or delete S3 object

s3_read and s3_write accept a method enum in the request body (GET / HEAD for reads, PUT / DELETE for writes). The split enforces read/write separation at the action boundary so a principal can be granted read-only S3 access without unlocking write or delete.

Action IDMethodRiskDescription
stripe_readGEThighRead Stripe data
stripe_create_invoicePOSTcriticalCreate invoice
exchange_rateGETlowCurrency exchange rate lookup
Action IDMethodRiskDescription
wikipedia_readGETlowRead Wikipedia article
arxiv_searchGETlowSearch arXiv papers
hn_topGETlowHacker News top stories
rss_fetchGETlowFetch RSS/Atom feed
confluence_readGETlowRead Confluence pages
confluence_writePOSTmediumWrite Confluence page
npm_readGETlowRead npm package metadata
Action IDMethodRiskDescription
obsidian_readGETlowRead Obsidian vault
obsidian_writePUTmediumWrite to Obsidian vault
Action IDMethodRiskDescription
fs_readlowRead file from configured fs_root_path
fs_writehighWrite file under configured fs_root_path
fs_deletecriticalDelete file under configured fs_root_path

Filesystem actions use the fs provider (fs.wasm). All paths are resolved relative to fs_root_path configured in latchgate.toml. The provider has no network access — only io/fs and io/log imports.

Action IDMethodRiskDescription
pagerduty_eventPOSTmediumCreate PagerDuty event
datadog_readGETlowRead Datadog monitors and metrics
grafana_readGETlowRead Grafana dashboards and alerts
sentry_readGETlowRead Sentry issues and events

The following actions are planned for future releases. Their WIT interfaces are committed (wit/io-database.wit, wit/io-smtp.wit, wit/io-queue.wit, wit/io-storage.wit) and provider source code exists under providers/, but the providers are excluded from the v0.1 workspace build and no manifests are shipped for them yet.

Action IDProviderI/O importsRiskVerifier
smtp_sendemail.wasmio/smtp, io/loghighmessage_id
database_querydatabase.wasmio/database, io/loghighrows_affected
queue_publishqueue.wasmio/queue, io/logmediumqueue_ack
file_writeartifact_store.wasmio/storage, io/logmedium

To see the full list including any custom manifests in your deployment, run:

Terminal window
latchgate actions

Every action is defined by a YAML manifest. The manifest is the complete security policy for that action — there is no implicit behavior.

action_id: "my_api_read"
version: "1.0.0"
provider_module_digest: "builtin:http_api"
required_imports:
- "latchgate:io/http"
- "latchgate:io/log"
template:
method: GET
url_template: "https://api.example.com/v1/{{resource}}/{{id}}"
headers:
Accept: "application/json"
io:
request_schema:
type: object
properties:
resource:
type: string
enum: ["users", "orders", "products"]
id:
type: string
minLength: 1
maxLength: 64
required: [resource, id]
additionalProperties: false
max_request_bytes: 4096
max_response_bytes: 1048576
resource_limits:
fuel: 5000000
memory_mb: 128
timeout_seconds: 15
max_io_calls: 3
secrets:
- name: "MY_API_KEY"
required: true
egress:
profile: "proxy_allowlist"
allowed_domains:
- "api.example.com"
risk_level: "low"
verifier_kind: http_status
declared_side_effects:
- "http_read"

For actions backed by a custom WASM provider (non-template), replace builtin:http_api with a SHA-256 digest and add provider_source so the CLI can rehash the digest after a rebuild:

provider_module_digest: "sha256:52fa188826aec99431f4047a21968abcf002d6a811edf61def76dbaf22cb5848"
provider_source: "database.wasm"

action_id — unique identifier. Used in API calls (POST /v1/actions/{action_id}/execute) and policy rules.

provider_module_digest — either builtin:http_api (template provider) or a sha256:... digest of a custom WASM module. For custom modules, pair with provider_source (filename relative to wasm_providers_dir) so the digest can be updated after a rebuild (run make providers which handles digest computation).

required_imports — WIT imports the provider is allowed to link at instantiation. Undeclared imports cause instantiation to fail — the kernel refuses to load a module that asks for capabilities the manifest did not declare. In v0.1, supported values are latchgate:io/http, latchgate:io/fs, and latchgate:io/log. The non-HTTP imports (io/database, io/smtp, io/queue, io/storage) are declared in the WIT package for future releases but not linked by the v0.1 runtime.

template — for builtin:http_api actions: HTTP method, URL template with {{variable}} placeholders, headers, and body template. Variables are resolved from the validated request input.

io.request_schema / io.response_schema — JSON Schema for input validation and output verification. Requests that fail schema validation are rejected before policy evaluation. Response schema violations fail the action in deny mode (production default).

resource_limits — CPU fuel, memory cap, wall-clock timeout (epoch-enforced), and I/O call budget. Exceeding any limit terminates the provider immediately.

secrets — secret names to inject from the SOPS-encrypted secrets file. required: true means the action fails if the secret is missing. Secrets are injected at the host I/O transport layer — they never enter the WASM sandbox.

egress.profileproxy_allowlist routes HTTP through the egress proxy with allowed_domains enforcement. none for actions whose I/O does not go over HTTP (the planned database, queue, SMTP, and storage providers all set this to none).

risk_levellow, medium, high, or critical. The default OPA policy uses this to determine approval requirements. high and critical require human approval.

verifier_kind — how the kernel verifies the provider’s result. http_status checks HTTP response codes (the v0.1 verifier). rows_affected, message_id, and queue_ack are provider-specific verifiers planned for future releases.

declared_side_effects — what the action does in the real world. Sinks derived from these are informational for policy (auto-derived in ACL) and audit — not enforced by the kernel.

Most actions use builtin:http_api — a single WASM module that handles all HTTP patterns. The manifest configures it via template (method, URL, headers, body). No code to write.

For non-HTTP protocols (SMTP, SQL, AMQP, object storage), custom WASM providers will be supported when the corresponding host I/O backends ship in future releases. The provider source is preserved in providers/ under workspace exclude for preview. See Custom Actions for the YAML-only path supported in v0.1, and WASM Providers for the sandbox model.

Before deploying an action, review its security posture:

Terminal window
latchgate actions github_create_issue

This shows the complete security summary — resolved URL pattern, allowed domains, secrets, limits — without starting the gate. See CLI Reference for details.