Declare the whole run
Inputs, tasks, dependencies, agents, tools, policy, memory, and outputs live in strict versioned YAML.
What agentctl is
Ordinary automation is predictable but cannot reason. Agent scripts can reason but often hide control flow, retries, authority, and recovery. agentctl gives deterministic orchestration the final say while a model handles only the tasks you assign to it.
Inputs, tasks, dependencies, agents, tools, policy, memory, and outputs live in strict versioned YAML.
Models receive explicit instructions, tools, token limits, turn limits, timeouts, and provider capabilities.
SQLite records tasks, effects, approvals, checkpoints, audit events, and trace correlation before recovery is needed.
How it works
Verified workflow
This exact file is imported from examples/acceptance/mock-tool/workflow.yaml. The acceptance suite copies it to a clean directory and runs it without credentials.
apiVersion: agentctl.dev/v1
kind: Workflow
metadata:
name: acceptance-mock-tool
spec:
inputs:
reportPath: artifacts/mock-report.txt
outputs:
verdict: "${{ tasks.inspect.output.text }}"
artifact: "${{ inputs.reportPath }}"
providers:
fake:
kind: fake
policy:
workspaceRoot: .
writableRoots: [artifacts]
approval: never
tools:
read_fixture:
kind: builtin.workspace.read
description: Read a UTF-8 file inside the authorized workspace.
inputSchema:
type: object
properties:
path: { type: string }
required: [path]
additionalProperties: false
outputSchema:
type: object
properties:
path: { type: string }
content: { type: string }
bytes: { type: integer }
sha256: { type: string }
required: [path, content, bytes, sha256]
additionalProperties: false
capability: filesystem.read
risk: low
effectClass: observe
idempotency: idempotent
retrySafe: true
timeoutSeconds: 5
approval: never
agents:
inspector:
provider: fake
model: scripted
instructions: Read the fixture and report its marker.
tools: [read_fixture]
maxTurns: 2
maxToolCalls: 1
maxOutputTokens: 32
timeoutSeconds: 5
providerOptions:
toolInput: { path: fixture/service.txt }
finalText: AGENTCTL_MOCK_FIXTURE_VERIFIED
actions:
assert:
kind: builtin.assert
write:
kind: builtin.write
tasks:
- id: inspect
uses: agent:inspector
with:
prompt: Use read_fixture before answering.
- id: verify
uses: action:assert
needs: [inspect]
with:
that: "${{ tasks.inspect.output.text == 'AGENTCTL_MOCK_FIXTURE_VERIFIED' }}"
message: the mock provider did not complete its tool continuation
- id: report
uses: action:write
needs: [inspect, verify]
with:
path: "${{ inputs.reportPath }}"
content: "${{ tasks.inspect.output.text }}"
Trust and control
Filesystem, process, environment, network, provider, tool, and approval rules are runtime decisions.
Non-pure requests are recorded before dispatch with stable identity, risk, idempotency, and confirmation.
Non-interactive runs pause and exit 3. An operator resolves the exact request and resumes the same run.
OpenAI, Azure OpenAI, Anthropic, and Gemini map native APIs behind a neutral core. Capabilities still differ.
One process and SQLite keep the correctness boundary inspectable without a hosted control plane.
A crash after dispatch can leave an uncertain effect. agentctl stops instead of silently repeating it.
Use cases
One runtime, three invocation paths
Use check, plan, check mode, run, inspect, and resume from a normal terminal.
Operate locallyCron, systemd, or Kubernetes owns triggers and overlap. agentctl owns one durable bounded run.
Schedule runsMount config, workspace, state, and artifacts. Consume one versioned JSON result and exit code.
Run the containerDurable execution
agentctl records an effect request before execution. A confirmed result can be reused on resume. A started result without confirmation becomes uncertain, which stops automatic recovery until an operator reconciles the external system.
Understand resume and recorded replayChoose the right boundary
| Approach | Best at | Where agentctl differs |
|---|---|---|
| Shell script plus model API | Small direct integrations | Adds strict graph compilation, external policy, effects, approvals, and durable recovery. |
| Chat-agent framework | Interactive conversations and dynamic handoffs | Keeps reviewed workflow control flow authoritative instead of model-owned. |
| General workflow engine | Broad scheduling and distributed execution | Focuses on one local durable run with bounded model and tool semantics. |
| Ansible | Configuration management and idempotent convergence | Uses agent tasks and an effect ledger, but is not a configuration-management replacement. |
| CI/CD pipeline | Runners, triggers, secrets, and artifact retention | Runs inside CI as one step; CI still owns the surrounding job lifecycle. |
Current maturity
The workflow API is agentctl.dev/v1. Deterministic composition, durable recovery, local persistence, native Linux arm64 containers, and bounded GPT-5.6 journeys have executable evidence. The pinned 0.3 release source also passed hosted Linux x64, macOS arm64, Windows x64, container, security, package, SBOM, and release-preparation gates. Other native providers and protocols have mock coverage at documented levels.
Start with evidence
Validate the YAML, inspect the deterministic plan, execute it, then read the durable run record.