aot
Describe a flow, and get one you can run. A writer drafts it; humanize loads the draft and runs it on fake agents; a critic reads it fresh. Only a draft that passes all three lands in this project's .hmz/flows/.
In hmz, open /flow → Flowverses → official and install aot. Or run the release without installing anything:
hmz exec -f 'git+https://github.com/humanfia/aot-flow@v0.1.1#aot' …- repository
- humanfia/aot-flow
- release
- v0.1.1 · commit
3c4c415 - earlier
- v0.1.0
- licence
- Apache-2.0
Read from humanfia/flowverse when this site was built.
❯ $aot two agents take turns until a reviewer says it is donehmz exec -f aot -a writer=claude/claude-opus-5:high -a critic=codex/gpt-5.6-sol:high \
-p budget.cost=10 "two agents take turns until a reviewer says it is done"The whole run, at rest. Step through it with the buttons, or drag the bar.
A draft lands only once humanize has loaded it, it has ended on its own in three fake worlds, and a critic that never saw it written approves it.
The run, turn by turn
- writer — draws up a spec; a session opened for this turn
- writer — writes the flow; another turn of the session it already had; hands the gates in the tree: the draft
- the gates — loads it, runs it on fakes; no turn of a model; hands critic as words: it ends in every world
- critic — reads it fresh; a session opened for this turn; hands writer as words: refused, word for word
- writer — repairs it; another turn of the session it already had; hands the gates in the tree: the draft
- the gates — loads it, runs it on fakes; no turn of a model; hands critic as words: it ends in every world
- critic — reads it fresh; a session opened for this turn; hands the finish as words: approved: it lands
Then round again: a refusal goes back word for word, up to repairs times.
It ends when approved: the flow lands, repairs run out, and you say no, or the budget runs out.
When it lands, it prints what the new flow drives, takes and ends on, and the line that runs it:
compiled: turn_taking_review -- two agents take turns until a reviewer approves
landed: .hmz/flows/turn_taking_review
drives: worker -- an agent
drives: reviewer -- an agent
ends: by verdict -- reviewer says done, within 6 rounds
hmz exec -f @local/turn_taking_review -a worker=CLI/MODEL:EFFORT -a reviewer=CLI/MODEL:EFFORT -p budget.cost=USD "the task"At the prompt, the new flow is $@local/turn_taking_review.
How a draft is checked
- A spec first. The writer draws up the roles the flow drives, what each must be able to do, its params and what ends it. A capability no backend serves is sent back to be restated, then put to you. A name that is already taken is put to you too.
- It loads. humanize loads the draft and reads back what it declares.
- It ends on its own. The draft runs on fake agents in three worlds: an agent that never says it is done, one that says so at once, and one that answers nothing. It must end in every one within
seconds. - A critic approves it. A fresh session that may only read, and never saw it written.
A refusal at any step goes back to the writer word for word, for up to repairs rounds.
Roles and params
| Role | What it is | How it is filled | |
|---|---|---|---|
writer | agent, required | -a writer=… | Draws the spec, then drafts and repairs the flow, in one session. |
critic | agent, required | -a critic=… | Reads each draft that passed the gates, in a fresh session. It may only read. |
human | you | filled by humanize; no -a | Asked about names, capabilities, and a draft whose repairs ran out. |
workspace | environment, local | the directory you start in; no -e | This project: the draft is written in a scratch directory beside it, and lands in its .hmz/flows/. |
Each agent role takes one -a role=CLI[@PROVIDER]/MODEL[:EFFORT]; several roles may share one -a, comma-separated. There is no -e to give: workspace is a local environment, the directory you start the run in, and an -e naming it is refused. See Command-line specs.
Both agents carry the flow's own skill, writing-flows: how a flow is written against humanize. Any backend can fill either role.
| Param | Default | |
|---|---|---|
name | blank | What to call the new flow. Blank takes the name the spec gives it. |
into | local | local lands it in this project's .hmz/flows/; user in ~/.hmz/flows/. |
repairs | 3 | Rounds of repair after the first draft, 0 to 6. |
strict | false | Send a draft back for every warning, not only for what blocks it. |
seconds | 60 | How long each run on fakes may take. |
What ends it
- The flow lands. It is moved into place whole, and never over a flow that is already there.
- Nothing lands. No spec could be drawn, you declined a name or a capability, or the repairs ran out and you did not take the draft as it stands. Under
hmz execnobody is there to say yes, so every such question is a no. - The budget.
Picking it up
aot keeps nothing for --resume: each run is one description, and running it again writes another flow.
See also
- Writing a flow: the same thing, by hand
- Testing a flow: the fake agents the draft is run on