Keep decisions explicit
An agent can recommend an option, write a plan, and report success in one fluent answer. Those sentences describe different events. Collapsing them is how an attractive suggestion quietly becomes “the architecture” and a proposed plan quietly becomes assumed permission.
The minimum distinction
| Thing | Question it answers | What it does not prove |
|---|---|---|
| Recommendation | What does the agent advise? | That the human chose it |
| Decision | What did the human choose, for which scope, and why? | That anyone implemented it |
| Plan | What work is intended and in what order? | Permission or completion |
| Execution authority | What work may be performed, where, and under which limits? | That the work happened |
| Result report | What does the worker claim happened? | That the claim is adequately supported |
| Evidence | What observation supports or weakens a claim for this use? | Permission to merge, deploy, or publish |
Record a real decision
When you make a choice, say it in ordinary language and name the subject,
selected option, and scope. A supported host can route that exact request
through h-decide and preserve the result as a DecisionRecord.
Choose the bounded queue for invoice delivery in the billing service.
Keep synchronous delivery for the admin preview path. Record the decision,
the rejected alternative, the weakest link, and the condition for revisiting it.
A recommendation, pasted third-party text, quoted approval, visible tool
schema, or model-filled field is not your choice. Calling
/h-decide can help route the request, but the command name itself
does not decide anything.
When Haft needs your input
If a value choice or permission is missing, the agent should stop only the affected operation and explain the choice in ordinary language. You should see the subject, real options, what changes and stays unchanged, the immediate consequence, the weakest link of each option, and the agent's recommendation. Then answer naturally.
No separate lifecycle ceremony is required. The system lacks a human choice that it must not invent. Unrelated work inside the already accepted scope can continue.
Plans, permission, and work
Most work you ask a coding agent to perform is authorized directly by that
request and the host's own rules. Haft also retains a more explicit
WorkCommission model for work that needs a durable scope,
allowed paths, runner identity, preflight, and terminal record.
Commission creation is manual-only through h-commission. A
commission can authorize bounded work, but it does not perform the work.
A runner can claim it, record events, and report a result; evidence and any
permission to apply, merge, push, deploy, or publish remain separate.
External runners in v9
Haft v9 has no built-in coding-agent executor. Your host agent can perform work directly, or a separately operated runner can consume the durable commission records.
haft commission create-from-decision dec-...
haft commission list-runnable
haft commission claim wc-... --runner external:my-runner
haft commission complete-external wc-... --runner external:my-runner \
--verdict pass --payload-file evidence.json Haft does not create the runner's worktree, apply its patch, merge, push, deploy, or publish. The external runner must enforce its own path and effect limits.
The trade-off
Explicit records make costly choices inspectable and transferable. They also cost time. Use them when losing the choice, scope, rationale, or evidence would cost more than recording it. Do not commission a variable rename merely because the type exists.