Agents

Run agents the way you'd run your best engineers.

Two agents on the same repo collide. Retries duplicate work. Handoffs lose context. The shared record is whatever survives in chat. Heddle gives each agent its own task-thread, and the team one operating record across them. Cursor, Claude Code, Codex converge on one Heddle repo.

heddle agent ls — heddle/core-services

4 active · 1 ready
Agent Thread Status States Elapsed
  • mochi claude-opus-4.7
    task/biscuit-authz writing tests for scope denial
    running
    7
    11m 04s
  • nori claude-sonnet-4.6
    chore/structured-logging refactoring log handler
    running
    4
    08m 22s
  • ume claude-opus-4.7
    fix/migration-0042 awaiting signature
    ready
    12
    24m 58s
  • haku claude-haiku-4.5
    docs/agents-api-reference waiting for review feedback
    idle
    2
    02m 17s
Illustrative snapshot — live telemetry with the hosted preview.
02 Task threads

Run many task-threads.
One repository.

Each task is its own named thread — isolated by default, addressable, recoverable. Merge creates a new state. The whole record holds: every capture, every retry, every fork.

feature/auth/middleware

claude · opus 4.7

  1. pkka73 scaffold session middleware
  2. hxe72g verify access-token grants
  3. 5xtkhq rate-limit per session
  4. 2qpsr7 extract token store

4 states

feature/auth/tests

gpt · 5.4

  1. zepss6 cover login happy path
  2. 3jmtnk test expired tokens
  3. 9fbcqm fuzz the rate limiter

3 states

feature/auth/docs

grok · 4.20

  1. x9r2qm draft auth API reference
  2. vknq84 add migration notes

2 states

MERGE feature/auth 9 commits · 3 agents · one resolved state
claudefeature/auth/middleware · 4gptfeature/auth/tests · 3grokfeature/auth/docs · 2mainhd-pkka73p5zbe3b · claudepkka73hd-hxe72g89a4mq2 · claudehxe72ghd-zepss63kb2s5n · gptzepss6hd-x9r2qmf3a8wp · grokx9r2qmhd-vknq84llr2cm · grokvknq84hd-5xtkhq8wp3nv · claude5xtkhqhd-3jmtnkkkr9t8 · gpt3jmtnkhd-9fbcqmt2pxh4 · gpt9fbcqmhd-2qpsr7vn5cks · claude2qpsr7hd-d01a8b4e

Isolated worktrees

One repo. Many agents. No lock contention.

Each worktree is a lightweight pointer into the shared object store. Any agent gets an independent working directory backed by the full history. Isolation is structural — not coordinated, not negotiated.

heddle start task/biscuit-authz --agent-provider anthropic --agent-model claude-opus-4.7

Multi-agent coordination

Parallel threads. Merged with attribution intact.

Each agent works on its own worktree with independent state. Snapshot isolation is structural — the worktree holds its own view, the shared object store keeps the record consistent.

Merge when the work is ready. Attribution from every agent is preserved through the merge. You always know who contributed which state.

Walk back from the merge tip and every commit still has its name.

Attribution

Every action carries its author.

The agent registry records ID, provider, model, and status at spawn time. That metadata is structural — threaded into the object model from the first write. When work is merged, attribution from every agent is preserved.

You always know what each agent did, under which model, with what authorization. The record survives the merge.

task task/biscuit-authz
state hd-d01a8b4e
actor claude-opus-4.7
provider anthropic
delegated by anan@heddle.sh
confidence 0.94
signature ed25519:a8f3c1d7
captured 2026-04-22 · 11:47

Context annotations

The reasoning outlasts the work.

Constraints, invariants, and design rationale attach directly to the code they govern — scoped to a file, a symbol, or a line range. When the next agent opens the same function, the annotation is already there.

crates/server/src/biscuit/facts.rs fn build_authorizer module

Every authorizer must derive its facts from the Biscuit token, not from out-of-band ambient state. The Datalog program in rules.biscuit is the single source of truth for what a scope grants.

If a verifier loads a public key from PUBLIC_KEYS_ENV but no minting keypair, it must reject signing requests outright. configured_minting_keypair returns None in that posture so the caller can distinguish 'not configured' from 'configured but malformed'.

Any new auth surface should mirror this contract: keys.rs:require_minting_keypair on minting startup, facts.rs:build_authorizer on every verify.

hd-d01a8b4e enforces rules.biscuit

A codebase that remembers

Every decision recorded. Always at the right scope.

Constraints and rationale attach to the code they govern — not to a wiki that falls behind, not to a channel that scrolls away. Scoped to the file, the symbol, or the line. Re-anchored on every capture. When the next agent opens the file, the context is already there.