Skip to content

Autonomous Hands

Hands are autonomous workflows that the agent executes on a schedule, with their own budget, tools, and approval gates. Think of them as background jobs that the agent runs independently — checking in with you only when approval is needed.

A Hand is a named, scheduled task with:

  • A prompt — what the agent should accomplish
  • A schedule — cron expression for when it runs
  • Tools — which MCP tools it can use (scoped, not all tools)
  • A budget cap — maximum spend per run
  • An approval gate — whether to pause for human approval before acting
hands:
- name: "linkedin-prospector"
schedule: "0 9 * * 1-5" # Weekdays at 9am
prompt: "Find LinkedIn prospects matching Cronoss ICP and add to CRM"
tools: ["browser_navigate", "browser_extract", "clickup"]
budget_cap_usd: 0.50
output_channel: "default"
approval_required: true
approval_target: "Esteban"

Each Hand run follows a state machine:

pending → planning → awaiting_approval → executing → completed
→ failed
→ rejected
  1. Pending — the cron fires, the Hand is queued
  2. Planning — the agent creates a numbered plan with steps
  3. Awaiting Approval — if approval_required: true, the plan is sent to the approval target for review
  4. Executing — approved plan steps execute sequentially
  5. Completed/Failed — final state, results sent to output_channel

Before executing, a Hand creates a plan — a numbered list of steps the agent intends to take. Plans provide transparency and control.

Plan: linkedin-prospector (Run #42)
1. Search LinkedIn for CTOs at EdTech companies (50-200 employees)
2. Extract top 10 profiles with contact info
3. Cross-reference with existing CRM contacts
4. Add 5 new prospects to ClickUp "Leads" list
5. Draft personalized outreach messages
Budget estimate: $0.35 / $0.50 cap
Approve? [yes/no]

Plans support comments — you can add notes before approving, and the agent adjusts its execution accordingly.

Plans can be shared with team members for collaborative review:

  • Share via link (token-based access)
  • Recipients can comment but only authorized roles can approve
  • Audit trail tracks who approved what

Each Hand has an independent budget cap. The agent tracks spend per run and stops if the cap is reached:

hands:
- name: "weekly-report"
budget_cap_usd: 0.20
# ...

Budget enforcement happens at the tool execution layer. If a tool call would exceed the remaining budget, it’s skipped and the Hand reports what it couldn’t complete.

Add entries to the hands array in config.yaml:

hands:
- name: "daily-standup"
schedule: "0 9 * * 1-5"
prompt: "Summarize yesterday's git commits and today's ClickUp tasks"
tools: ["github", "clickup"]
budget_cap_usd: 0.10
output_channel: "default"
approval_required: false

Tell the agent to create a Hand:

> Create a Hand called "weekly-report" that runs every Friday at 5pm,
summarizes the week's PRs and tasks, and sends it to WhatsApp.
Budget: $0.30. No approval needed.

The agent updates config.yaml and registers the new Hand automatically.

The web portal provides a CRUD interface for Hands with fields for name, schedule, prompt, tools, budget, and approval settings.

Pre-built Hand definitions that can be installed with one command:

> Install the "weekly-report" template

Templates provide tested prompts, tool configurations, and sensible defaults for common workflows. They’re stored in internal/tool/templates/ and installable via the built-in template_install tool.

Hand runs are logged in a SQLite table (hand_runs) with:

  • Run ID, Hand name, start/end timestamps
  • Status (completed, failed, rejected)
  • Token usage and cost
  • Plan steps and their outcomes
  • Approval history

View run history via the web portal or by asking the agent: “Show me the last 5 runs of the linkedin-prospector Hand.”