01 - Quick Start
Boot your first local Harness Engineering control plane in 5 minutes.
In this quick start, you will start the daemon, load a manifest, and let the control plane dispatch a shell-based agent through a declarative workflow.
Prerequisites
- Rust toolchain (for building from source)
- SQLite3
- Bash shell
Step 1: Build
cargo build --workspace --releaseThis produces the supported runtime binaries:
| Binary | Path | Purpose |
|---|---|---|
orchestratord | target/release/orchestratord | Daemon (gRPC server + embedded workers) |
orchestrator | target/release/orchestrator | CLI client (connects to daemon via gRPC) |
Use orchestratord + orchestrator as the only supported runtime model.
Step 2: Start the Daemon
./target/release/orchestratord --foreground --workers 2The daemon owns the SQLite database, task queue, and worker pool. Keep it running in one terminal and use the CLI client from another terminal.
Starting the daemon is what creates the SQLite schema at ~/.orchestratord/agent_orchestrator.db (override the location with ORCHESTRATORD_DATA_DIR). It runs every pending migration before it accepts a single connection, so there is nothing to initialize by hand.
Step 3: Wait Until the Daemon Can Serve
./target/release/orchestrator daemon status --wait-ready
# orchestratord is ready (migrations=ready (38/38), keyring=ready (active key primary), workers=ready (2/2 started))Optional when you are typing commands yourself — by the time you have switched terminals the daemon is ready. Worth knowing for scripts: the socket accepts connections slightly before the worker pool has registered, so a script that starts the daemon and immediately creates a task can watch nothing pick it up.
Earlier versions of this guide ran
orchestrator inithere and said it created the schema. It did not:initis an RPC to a running daemon, so it could not run before one existed, and a running daemon had already migrated. The command still exists and is harmless; it is simply not a setup step.
Step 4: Read the Manifest
The quickstart manifest ships in this repository at fixtures/manifests/bundles/quickstart.yaml. It defines a Workspace, an Agent, and a Workflow:
# fixtures/manifests/bundles/quickstart.yaml
apiVersion: orchestrator.dev/v2
kind: Workspace
metadata:
name: default
spec:
work_dir: "."
qa_targets:
- docs/qa
ticket_dir: docs/ticket
---
apiVersion: orchestrator.dev/v2
kind: Agent
metadata:
name: echo_agent
spec:
capabilities:
- qa
command: >-
echo '{"confidence":0.95,"quality_score":0.9,
"artifacts":[{"kind":"analysis","findings":[
{"title":"all-good","description":"no issues found","severity":"info"}
]}]}'
driver:
provider: shell
transport: cli
---
apiVersion: orchestrator.dev/v2
kind: Workflow
metadata:
name: simple_qa
spec:
steps:
- id: qa
type: qa
enabled: true
loop:
mode: onceEvery Agent declares a typed driver — here shell/cli, which executes spec.command as-is. Omitting spec.driver is a deprecated compatibility form that triggers a [legacy_agent_command_deprecated] warning at apply time; see Agent Driver Model.
Step 5: Apply the Manifest
./target/release/orchestrator apply -f fixtures/manifests/bundles/quickstart.yamlThis loads all resources (Workspace, Agent, Workflow) into the database. You can verify:
./target/release/orchestrator get workspaces
./target/release/orchestrator get agents
./target/release/orchestrator get workflowsStep 6: Create and Run a Task
./target/release/orchestrator task create \
--goal "My first QA run" \
--workflow simple_qaThis creates a task, binds it to the default workspace and simple_qa workflow, and starts execution immediately. Add --name "my-first-task" to pick the task name yourself.
To create without starting:
./target/release/orchestrator task create \
--goal "My first QA run" \
--workflow simple_qa \
--no-startThen start it manually:
./target/release/orchestrator task start <task_id>Step 7: Inspect Results
# List all tasks
./target/release/orchestrator task list
# Task details (table, JSON, or YAML)
./target/release/orchestrator task info <task_id>
./target/release/orchestrator task info <task_id> -o json
# View execution logs
./target/release/orchestrator task logs <task_id>What Just Happened?
orchestratordstarted the control plane, SQLite-backed runtime, and embedded workersinitcreated the SQLite schemaapplyloaded three resources into the database through the daemontask createbound a workspace + workflow, discovered QA target files as task items, and enqueued work for the daemon workers- The
echo_agentwas selected (it has theqacapability) and its command was executed for each item - Results (exit code, stdout, stderr) were captured in the database
Next Steps
- 02 - Resource Model — understand the resource kinds
- 03 - Workflow Configuration — design multi-step workflows