AF Assistant Factory
Assistant Factory · Vol. 01 · Hugo

Most agents are a prompt
and a while loop.

That's why they can't hold a conversation, can't ask a good question, and fall apart the moment you're the slightest bit unclear about what you want.

What this is

Assistant Factory is a framework for building domain-specific agents that treat ambiguity as a first-class signal — not an exception. Hugo is the first assistant off the line: a blog-writing collaborator with 48 flows, a real dialogue stack, and the nerve to ask you what you meant.

§ 01

The ambiguity tax

Real users don't speak in well-formed JSON. They say "rework the aviation post", and they mean one of six things. A tool-calling agent guesses. A ReAct loop picks a plausible tool, produces confident output, and moves on — whether or not it understood you. The cost of being wrong is hidden inside the response.

That's the ambiguity tax. You pay it every turn, in the quiet gap between what you said and what the agent decided you meant.

Typical agent harness
ReAct · tool loop
user › rework the aviation post
// agent picks a tool, guesses, commits
agent › tool_call: edit_post(id="the-discovery-of-flight", mode="polish")
agent › Here is a polished version…
Wrong post. Wrong kind of rework. No way to notice.
Hugo
NLU → PEX → RES
user › rework the aviation post
// NLU: intent=Revise, flow=rework, slot source=?
hugo › Two aviation posts match — The Discovery of Flight or Insights Around Attention Mechanism? And rework how: re-outline, re-voice, or polish?
Ambiguity detected. Flow pauses. State is preserved. One question, two slots.
§ 02

Three things a while loop can't do

01

Treat ambiguity like a sensor reading.

Hugo's dialogue layer declares ambiguity at two levels — specific (missing slot) and confirmation (high-stakes action). The flow pauses. The policy decides whether to ask, confirm, or proceed. Asking one good question is a feature, not a failure.

02

Multi-turn state lives in structure, not transcripts.

A flow stack, typed slots, and a scratchpad survive the turn. When the user clarifies five turns later, the agent doesn't re-read the conversation — it resumes. Long sessions don't drift, don't hallucinate state, and don't re-ask what you already said.

03

Sub-agents compose. Tools don't.

A flow is a sub-agent — multiple prompts, real decision power, its own slot schema. A tool is a deterministic function. Hugo's Plan intent orchestrates Research → Draft → Revise → Publish as a queue of sub-agents, not a brittle chain of tool calls.

§ 03

Hugo, in action

A single conversation. Four turns. Watch the stack grow, the slots fill, and the ambiguity get answered — on purpose.

Transcript
Turn 1
user › I want to write about multi-modal agents.
hugo Great — outline first, then draft? I can run the full lifecycle (outline → compose → audit → polish → release) if you want.
Turn 2
user › yes do the whole thing
hugo Queued. Starting with outline. Want a technical angle, a product angle, or a research-survey angle? — specific-ambiguity on slot tone
Turn 3
user › research survey, skeptical tone
hugo Outline drafted. Moving to compose— flow resumes from the stack, no re-prompting
Turn 7 · post-audit
hugo Audit flagged 2 high-severity issues. Top notes: fragment stacking in § recent-innovations; 14 em-dashes post-wide. Polish anyway, or address first? — confirmation-ambiguity, flow held until you decide
Under the hood
Flow stack
[ outline · compose · audit · polish · release ]
↑ parent: blueprint
Slots filled
topic  = "multi-modal agents"
tone   = "research survey, skeptical"
source = post abcd1234
Ambiguity ledger
T2 · specific · missing: tone ✓ resolved
T7 · confirmation · audit findings ← open
DisplayFrame (last turn)
origin: "audit"
blocks: [ card{findings, summary} ]
metadata: { severity_high: 2 }

A ReAct agent would dump all of this into a growing prompt and hope the next call picks up the thread. Hugo keeps it in structure.

§ 04

The three-stage pipeline

NLU
01
Understand.

Classifies intent, selects a flow, extracts slots. When something's missing or uncertain, it marks it rather than guessing.

PEX
02
Decide and act.

Runs the policy for the active flow: calls tools, invokes skills, handles ambiguity, writes to the scratchpad, and emits a DisplayFrame.

RES
03
Respond.

Composes the spoken reply from the frame's blocks and templates. Pops completed flows. Leaves state ready for the next turn.

Slot system · 12 + 4

Twelve universal slot types — Category, Exact, FreeText, Source, Level, and more — plus four domain-specific ones per assistant. Hugo adds Channel and Image. Slots know their own priority, their own validators, and when they're satisfied.

Ambiguity vocabulary
specific

A slot is missing or unclear. Ask one targeted question.

confirmation

Action is consequential. Surface the stakes, wait for a yes.

Put together, these give the agent something a while-loop never gets: a stable place to stand between turns.

§ 05

Hugo is the first. Not the last.

Assistant 01

Hugo

Blog-writing. 48 flows across Research, Draft, Revise, Publish, Converse, Plan, Internal.

shipped
Assistant 02

Dana

Data analysis. Clean, Transform, Analyze, Report. Same scaffolding; different slots, different flows.

in progress
Assistant 03

Kalli

Onboarding. Entity-heavy, form-like, but powered by the same three-stage pipeline.

design phase

The thesis isn't another harness. It's that personal assistants — grounded in a domain, patient with ambiguity, transparent about state — are a different species of agent, and they need a factory that treats them that way.