Intent -> Spec
Goal becomes refs, profile, retry policy, validation, artifacts.
The harness can be Claude Code, Codex, OpenCode, or another AI coding agent. It writes a bounded job spec. Crabbox leases the worker. Airbyte moves rows. Evidence tells the agent what to do next.
Click a row. The main flow jumps to the same boundary.
Read the system as 4 contracts. Each box gets a narrow input, owns one decision, and emits a narrow output.
Goal becomes refs, profile, retry policy, validation, artifacts.
Spec becomes a sandboxed command with a durable run id.
Profile name becomes scoped variables inside the worker only.
Connector moves rows directly. The prompt never becomes the data plane.
Execution becomes logs, JUnit, metrics, counts, redacted config.
Signals become finish, retry, repair, or alert.
A useful agent output is not prose. It is a spec contract, an execution handoff, and an evidence contract.
# Goal: sync CRM accounts into the warehouse safely.
crabbox pool ensure example-org/data-movement/main/provider/linux/etl \
--min-ready 3 \
--create -- \
--cache-volume airbyte-etl
mkdir -p .crabbox/generated
cat > .crabbox/generated/accounts-sync.json <<'JSON'
{
"movement": "source_to_target",
"source_ref": "source.crm.accounts",
"target_ref": "warehouse.analytics.accounts",
"airbyte_connection": "accounts_sync",
"credential_profile": "etl-warehouse",
"allow_env": ["AIRBYTE_*", "SOURCE_*", "TARGET_*"],
"idempotency_key": "accounts_sync:daily",
"retry": {
"max_attempts": 2,
"when": ["rate_limit", "transient_network"]
},
"validation": ["row_count", "schema_drift", "freshness"],
"artifacts": ["reports/**", "metrics.json", "redacted-config.json"],
"redact": ["password", "token", "secret"]
}
JSON
crabbox run --pool example-org/data-movement/main/provider/linux/etl \
--shell 'python -m workers.airbyte_sync --config .crabbox/generated/accounts-sync.json' \
--allow-env 'AIRBYTE_*,SOURCE_*,TARGET_*' \
--env-from-profile etl-warehouse \
--artifact-glob 'reports/**,metrics.json,redacted-config.json' \
--junit reports/
crabbox results <run-id> --json
crabbox artifacts download <run-id> --out evidence/<run-id>
Failures are not mysteries. They are boundary breaks. Each class tells you where to look first and what you are allowed to change.
Agent plans. Crabbox runs. Airbyte moves. Evidence returns. Repeat only when the evidence says what changed.