Harness developers
Build host adapters without inventing a second workflow.
Capabilities, fallbacks, and durable receipts make host differences inspectable while the lifecycle contract stays in one place.
Page evidence
- tmux teamparallel lanes
- host-nativenative delegation
- subagentbounded delegation
- serial classavailable, not wired
- nativefull primitive
- wrappedverified wrapper
- bridgedtranslated capability
- emulatedrecorded substitute
- degradedexplicit loss
Host, substrate, and reviewer remain separate axes. The selected lower rung becomes a receipt.
Contract crosswalk
One neutral adapter interface, with a readable boundary.
Start with the three runtime moments that every adapter must preserve. The complete crosswalk stays available when you need the implementation detail.
- 01Bootstrap
Declare host capabilities and install the host-facing command surface.
- 02Run
Resolve the available substrate, then dispatch the shared lifecycle without changing its meaning.
- 03Receipt
Collect and validate a durable handoff so the next decision can reopen the evidence.
Open the complete 11-concern adapter crosswalk
Adapter contract
HostAdapter, 10 operations + the guild-run wrapper
capabilities()- Advertise what the host can do; the router reads this, never the host name.
bootstrap()- Install the package or inject the AGENTS.md instruction tree.
preflight()- Run-start hook, or the best available fallback rung when there is no native hook.
dispatch()- Run a lane on the selected substrate.
collect()- Read back and validate the lane result.
renderCommandSurface()- Expose /guild:* or the host-equivalent action surface.
renderPackage()- Emit host-native package metadata and install files.
renderPermissionDecision()- Render deny / ask / allow to the host UI or the file bus.
resolveModelParams()- Map cheap / mid / powerful tiers to host-native model params.
memory()- Reach guild-memory and guild-telemetry over a supported transport, or filesystem fallback.
bin/guild-run- The wrapper / bin bootstrap, the 11th concern beside the 10 operations.
The 10 operations plus the guild-run wrapper are the 11-concern contract (crosswalked to the 8 ADR adapter surfaces). Unknown hosts fail closed to an unavailable or explicit degraded path, never a guessed Claude path. The dedicated serial backend exists but is not selected by production code yet.
Runtime evidence
A manifest selects capability. A file bus leaves the receipt.
The capability manifest describes the host before routing. Lanes coordinate through local files, so an operator can inspect the result without needing the source host API.
Capability manifest
.guild/hosts/<host-id>/capability.json, guild.host_capability.v1
The runtime descriptor a host writes at bootstrap. It resolves model tiers from settings and probes the host for the primitives below; the cross-host router reads it to route lanes. It describes the host, it never routes anything itself.
tool_support.subagent- Can a subagent be spawned.
tool_support.agent_team- Native agent-team support.
tool_support.independent_agents- Independent parallel agents, or serial only.
tool_support.tmux- Probed at write time for the tmux dispatch rung.
tool_support.mcp- MCP transport for memory / telemetry, or filesystem fallback.
The router reads the manifest; the manifest does not route work by itself.
Durable receipt
The lane result stays portable because the receipt is a file.
Durable handoff receipt
.guild/runs/<id>/handoffs/<specialist>-<task-id>.md, guild.handoff_receipt.v1
A completed lane writes a durable Markdown receipt. It is distinct from guild.handoff.v2, the in-flight envelope the receipt embeds.
task_id- The lane this receipt answers.
tier- The resolved cost tier the lane ran at.
status- ok / escalate / blocked.
summary- Capped result summary.
artifacts[]- Files the lane produced.
The file bus is the portable host boundary. The launcher validates a receipt after the lane returns.
- lane assignment
- review packet
- gate decision
- focused context
- bounded work
- handoff receipt
- task
- handoff
- review result
Files carry authority, evidence, and recovery state. Chat is not the durable bus.
Recorded degradation
Take the strongest available path, then write down the drop.
The selected substrate is frozen at run start. When a host lacks a stronger primitive, the lower rung and its effect are part of the durable record.
- Rung 1
tmux team
Visible panes, one per specialist plus an orchestrator pane.
- Rungs 2-3
in-process agent
Host-native Agent / subagent dispatch when tmux is absent.
- Rung 4
serial floor
Conceptual universal floor. The SerialBackend class ships, but no production caller selects it yet.
- Cross-host
remote (SSH)
Runs a lane or reviewer on another box; selected by a separate routing block.
Support posture
A support label is not the same as public evidence.
Keep presentation support and receipt-derived public state separate, especially when a route uses a weaker host primitive.
- Resolve hostcapability manifest
- Name pathsupport label
- Verify routeoperator receipt
- Publish stateevidence-backed only
Public extension points