Skip to content

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/.

flowverse v0.1.1

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' …
release
v0.1.1 · commit 3c4c415
earlier
v0.1.0
licence
Apache-2.0

Read from humanfia/flowverse when this site was built.

text
❯ $aot two agents take turns until a reviewer says it is done
sh
hmz 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"
aotsimulated

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
  1. writer — draws up a spec; a session opened for this turn
  2. writer — writes the flow; another turn of the session it already had; hands the gates in the tree: the draft
  3. the gates — loads it, runs it on fakes; no turn of a model; hands critic as words: it ends in every world
  4. critic — reads it fresh; a session opened for this turn; hands writer as words: refused, word for word
  5. writer — repairs it; another turn of the session it already had; hands the gates in the tree: the draft
  6. the gates — loads it, runs it on fakes; no turn of a model; hands critic as words: it ends in every world
  7. 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:

text
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 ​

  1. 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.
  2. It loads. humanize loads the draft and reads back what it declares.
  3. 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.
  4. 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 ​

RoleWhat it isHow it is filled
writeragent, required-a writer=…Draws the spec, then drafts and repairs the flow, in one session.
criticagent, required-a critic=…Reads each draft that passed the gates, in a fresh session. It may only read.
humanyoufilled by humanize; no -aAsked about names, capabilities, and a draft whose repairs ran out.
workspaceenvironment, localthe directory you start in; no -eThis 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.

ParamDefault
nameblankWhat to call the new flow. Blank takes the name the spec gives it.
intolocallocal lands it in this project's .hmz/flows/; user in ~/.hmz/flows/.
repairs3Rounds of repair after the first draft, 0 to 6.
strictfalseSend a draft back for every warning, not only for what blocks it.
seconds60How 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 exec nobody 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 ​