feature/auth/middleware
claude · opus 4.7
- pkka73 scaffold session middleware
- hxe72g verify access-token grants
- 5xtkhq rate-limit per session
- 2qpsr7 extract token store
Agents
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
task/biscuit-authz writing tests for scope denialchore/structured-logging refactoring log handlerfix/migration-0042 awaiting signaturedocs/agents-api-reference waiting for review feedbackEach 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
feature/auth/tests
gpt · 5.4
feature/auth/docs
grok · 4.20
Isolated worktrees
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
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.
Attribution
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/biscuit-authzhd-d01a8b4eed25519:a8f3c1d7 ✓Context annotations
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 moduleEvery 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.
crates/objects/src/object/action_struct.rs struct Action moduleThe action DAG is append-only. An action's id (a BLAKE3 content hash over its parents, tree, and metadata) is immutable once written.
Rebase, collapse, and merge produce new actions. The pre-operation tip stays reachable from whatever ref originally held it — no force-push semantics, no rewriting in place. git push --force has no analog here.
Practical consequence: any hd-… state-id you've ever recorded in a comment, ticket, audit log, or another annotation will resolve forever. The audit trail isn't best-effort.
crates/repo/src/commit_graph.rs fn lca moduleThread resolution walks the DAG upward to the most recent common ancestor (the LCA) rather than dereferencing the named head directly.
An agent that forked at state hd-c4f3a201 expects to see that state. If the parent thread rebased after the fork, the named head moved on disk but the agent's view didn't. Walking to the LCA preserves the agent's structural view across long-running sessions — even when a teammate has been rebasing on top of them.
The trade: thread resolution is O(depth-to-LCA) instead of O(1). Measured at 0.4ms p99 across the workspace's internal repos; acceptable.
A codebase that remembers
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.