Units are declared in TOML files (.taba.toml). The schema uses
progressive disclosure : simple cases are 3 lines, complexity is
available but never mandatory. One file = one unit.
[unit]
name = "hello-web"
image = "nginx:alpine"
Everything defaults:
type = "workload" (inferred from image)
kind = "service" (default)
Trust domain: current (from taba init)
Author: current (from keypair)
Capabilities: none needed, none provided
Health: OS-level process monitoring (INV-O3)
Placement on failure: from environment (INV-N5: dev=leave-dead, prod=auto-replace)
Scaling: min=1, max=1
[unit]
name = "api-server"
image = "api:v2.1.0"
digest = "sha256:abc123..."
[needs]
postgres = { type = "storage", purpose = "primary" }
redis = { type = "storage", purpose = "cache" }
[provides]
http-api = { type = "network", purpose = "serving" }
[scaling]
min = 2
max = 10
[[scaling.triggers]]
metric = "cpu_ppm"
threshold = 700_000 # 70%
direction = "up"
# Full form:
postgres = { type = "storage", purpose = "primary" }
# Minimal form (type only):
postgres = { type = "storage" }
[unit]
name = "payment-processor"
image = "payments:v3.0.0"
kind = "service"
[tolerates]
max_latency = "50ms"
consistency = "strong"
[failure]
on_oom = "backoff-inputs"
on_crash = { restart_with_backoff = 3 }
on_shutdown = { drain = "30s" }
[recovery]
strategy = "replay-from-offset"
stream = "payments-events"
[health]
type = "http"
path = "/healthz"
port = 8080
interval = "10s"
timeout = "2s"
Field Values Default
on_oom"backoff-inputs", "restart", "fail-permanent""restart"
on_crash{ restart_with_backoff = N }, "unexpected"{ restart_with_backoff = 3 }
on_shutdown{ drain = "duration" }, "immediate"{ drain = "30s" }
Type Fields Default
"http"path, port, interval, timeout—
"tcp"port, interval, timeout—
"command"command, interval, timeout—
(omitted) — OS-level process monitoring
Strategy Fields Default
"stateless"— (default)
"replay-from-offset"stream, offset (optional)—
"require-quorum"min_peers—
[unit]
name = "customer-profiles"
type = "data"
[schema]
format = "json-schema"
definition = "schemas/customer.json"
[classification]
level = "pii"
[retention]
mode = "persistent"
duration = "7y"
legal_basis = "GDPR Art. 6(1)(b)"
mandatory = true
[storage]
encrypted_at_rest = true
jurisdictions = ["EU", "CH"]
[provides]
customer-data = { type = "dataset", purpose = "analytics" }
Lattice: "public" < "internal" < "confidential" < "pii"
Mode Behavior Default
"persistent"Governed by duration + legal_basis. Tombstoned on expiry. (default)
"ephemeral"Auto-removed when producing bounded task terminates. —
"local-only"Never enters graph. Requires policy for classification > public. —
[unit]
name = "eu-customers"
type = "data"
parent = "customer-profiles"
[classification]
level = "pii"
[storage]
jurisdictions = ["EU"]
# Inherits encrypted_at_rest from parent
# Narrows jurisdiction (always allowed per INV-S7)
[unit]
name = "allow-analytics-access"
type = "policy"
[conflict]
units = ["customer-profiles", "analytics-pipeline"]
capability = "customer-data"
[resolution]
action = "allow"
rationale = "Analytics pipeline has DPA and processes within EU jurisdiction"
Action Behavior
"allow"Allow the composition unconditionally
"deny"Deny the composition
"conditional"Allow under conditions: conditions = ["condition1", "condition2"]
[unit]
name = "updated-analytics-policy"
type = "policy"
supersedes = "allow-analytics-access"
[conflict]
units = ["customer-profiles", "analytics-pipeline"]
capability = "customer-data"
[resolution]
action = "conditional"
conditions = ["processing within EU only", "audit trail enabled"]
rationale = "Updated per legal review 2026-03"
[unit]
name = "nightly-etl"
kind = "bounded-task"
image = "etl:v1.2.0"
[deadline]
wall_time = "2h"
[spawn]
max_depth = 2
max_count = 10
Field Type Default
kind"bounded-task""service"
deadline.wall_timeduration string (required for bounded-task)
deadline.lc_rangeinteger (logical clock delta) (optional)
spawn.max_depthinteger (1-4) governed by INV-W3 default (4)
spawn.max_countinteger (required if spawning)
[unit]
name = "production-domain"
type = "governance"
governance_type = "trust-domain"
[trust_domain]
description = "Production workloads for ACME Corp"
[unit]
name = "prod-gate"
type = "governance"
governance_type = "promotion-gate"
[[transitions]]
from = "dev"
to = "test"
mode = "auto"
[[transitions]]
from = "test"
to = "prod"
mode = "human-approval"
[unit]
name = "shared-data-api"
type = "governance"
governance_type = "cross-domain-capability"
[cross_domain]
provides = { type = "dataset", name = "shared-metrics", purpose = "monitoring" }
conditions = "Bilateral policy required. Read-only access."
Key Artifact type Example
imageOCI container image = "myapp:v1.0"
binaryNative binary binary = "bin/myapp"
wasmWebAssembly module wasm = "module.wasm"
k8sKubernetes manifest k8s = "pod-spec.yaml"
microvmMicroVM kernel microvm = "vmlinux-5.10"
MicroVM workloads also require kernel and rootfs paths (INV-N6).
See Runtime Matching for details.
Only one artifact key per unit. digest (SHA256) is always recommended
and required for production environments (INV-A1).
Field Default Source
type"workload"inferred from artifact key
kind"service"—
trust_domaincurrent from taba init
authorcurrent from keypair
scaling.min1 —
scaling.max1 —
healthOS-level process monitoring INV-O3
placement_on_failureenv-derived (dev=leave-dead, else=auto-replace) INV-N5
failure.on_oom"restart"—
failure.on_crash{ restart_with_backoff = 3 }—
failure.on_shutdown{ drain = "30s" }—
recovery.strategy"stateless"—
retention.mode"persistent"—
classification.level"internal"—
Extension: .taba.toml (e.g., api-server.taba.toml)
One file per unit
Multi-unit deployments: directory of .taba.toml files
Policy files can reference units by name (scoped to trust domain)
Names must match [a-z0-9][a-z0-9-]* (lowercase, hyphens, no dots)