fabro/docs/public/human-tools/steering.mdx
Bryan Helmkamp 283eab181f
refactor(docs): split docs/ into public/ and internal/
Invert the docs convention so the Mintlify-published site lives under
docs/public/ and internal artifacts (strategy docs, brainstorms, plans,
etc.) sit at docs/ root or docs/internal/. Tools that default to writing
into docs/ now land in the catch-all instead of leaking into the
published tree.

- Move Mintlify content (administration/, agents/, api-reference/,
  changelog/, core-concepts/, examples/, execution/, getting-started/,
  human-tools/, integrations/, languages/, reference/, tutorials/,
  workflows/, images/, logo/, docs.json, favicon.svg, dot-highlight.js)
  into docs/public/.
- Collapse docs-internal/ into docs/internal/.
- Update Rust path references (fabro-api/build.rs, fabro-server,
  fabro-dev), TypeScript generator arg, CI path filters, clippy.toml
  reasons, AGENTS.md/CLAUDE.md, and README.md image refs.

Mintlify dashboard project root must be updated to docs/public/ in a
follow-up. .mintignore move/trim and .claude/skills/ updates land in a
separate commit.
2026-04-27 07:21:13 -07:00

47 lines
2.6 KiB
Text

---
title: "Steering"
description: "Guide running agents with real-time course corrections"
---
Steering lets you send guidance to an agent while it's working — without waiting for a human gate or stopping the run. If you see the agent heading down the wrong path, you can nudge it back on track mid-stage.
## How steering works
A steering message is injected into the agent's conversation as a user-role message. The agent sees it on its next LLM turn — after the current tool call finishes — and can adjust its approach immediately.
The delivery flow:
1. You send a steering request with your guidance text
2. The message is queued on the agent session's steering queue
3. Before the next LLM call, Fabro drains the queue and injects each message as a `Steering` turn in the conversation history
4. The LLM sees the guidance alongside its existing context and adjusts accordingly
Steering is **asynchronous** — the agent picks up the message at its next natural pause point (between tool calls), not mid-execution.
## When steering is delivered
Steering messages are drained from the queue at two points during the agent loop:
1. **Before the first LLM call** — any messages queued before the agent starts its first turn
2. **After each tool execution round** — between tool results being collected and the next LLM call
This means there is a natural latency between sending a steering message and the agent seeing it. If the agent is in the middle of a long-running shell command, the message waits until that command finishes and the next LLM turn begins.
Multiple steering messages sent in quick succession are all delivered together at the next drain point.
## Steering vs. human gates
Steering and [human gates](/workflows/human-in-the-loop) serve different purposes:
| | Steering | Human gates |
|---|---|---|
| **When** | Any time during an agent stage | At a defined point in the workflow graph |
| **Blocks execution** | No — agent continues working | Yes — workflow pauses until a choice is made |
| **Defined in the graph** | No — sent ad hoc via the API | Yes — `hexagon` nodes with edge options |
| **Use case** | Course corrections, hints, focus changes | Approval decisions, strategy selection, go/no-go |
Use human gates for structured decisions that are part of the workflow design. Use steering for reactive guidance when you're watching a run and want to intervene.
<Frame caption="The Files Changed tab shows a side-by-side diff of all changes made during the run.">
<img src="/images/web/run-files-changed.png" alt="Fabro web UI Files Changed tab showing a side-by-side diff" />
</Frame>