Skip to main content
When a workflow reaches an agent or prompt node, Fabro assembles the full prompt from multiple sources: the node’s prompt attribute, a fidelity-based preamble summarizing prior stages, a system prompt with tool guidance and environment context, project docs, and user instructions. Understanding this assembly helps you write effective prompts and control what context each node receives.

The prompt attribute

The prompt attribute on a node defines the task instructions for that stage. If no prompt is set, Fabro falls back to the node’s label.

Inline prompts

Short prompts can be written directly in the Graphviz file:
Use \ for multi-line strings:

External file references

For longer prompts, use the @ prefix to load from a Markdown file relative to the Graphviz file:
The @ prefix tells the engine to read the file contents and use them as the prompt text. This keeps Graphviz files concise and lets you version prompts as standalone Markdown. File references are resolved relative to the Graphviz file’s directory first, then fall back to ~/.fabro/. This lets you keep shared prompts in your user-level config and reference them from any project.

Variable expansion

Prompts support MiniJinja-style templates. Prompt rendering has access to the workflow goal and typed run inputs:
pipeline.fabro
Before execution, {{ goal }} becomes Add a /health endpoint to the API server. Undefined prompt variables render as empty text and produce a template_undefined_variable diagnostic. fabro validate reports that diagnostic as a warning; run-style commands promote it to an error before proceeding. Environment variables are not available in prompt templates. Prompt and goal templates can use static MiniJinja includes to share partials:
prompts/plan.md
Include names must be literal strings, resolve relative to the file being rendered, and stay under that template root. Dynamic include expressions such as {% include inputs.partial %} are rejected during manifest bundling because Fabro must know every template file before a sandbox run starts.

Fallback to label

If a node has neither a prompt attribute nor an empty one, Fabro uses the label as the prompt:
This is convenient for simple nodes but not recommended for production workflows where you want precise control over agent instructions.

Prompt assembly

The prompt the agent receives is not just the prompt attribute. Fabro prepends a preamble (unless fidelity is full) that summarizes what happened in prior stages:
The preamble is controlled by the fidelity setting. See Context: Fidelity for the full reference.
Given a plan-then-implement workflow where the plan stage completed, the implement node with fidelity="compact" would receive:
The last line is the node’s prompt attribute. Everything above it is the preamble.

System prompt

Each agent session has a system prompt that provides foundational instructions. The system prompt is built once per session and includes: The system prompt is separate from the preamble. The preamble is prepended to the user-facing prompt message, while the system prompt is set as the LLM’s system message. The system prompt varies by LLM provider. Each provider has its own identity text, tool guidance, and coding conventions tuned to the model’s strengths. The assembled prompt follows this structure:
This is the full system prompt sent to Claude as the LLM system message. The <environment> block is filled in at runtime.Tool guidance tracks the tools actually registered for the session. The web_search section shown below is present only when a Brave Search API key is configured; without one, both the tool and its guidance are omitted.
OpenAI and Gemini providers have their own system prompts with different identity text, tool guidance (e.g. apply_patch instead of edit_file for OpenAI), and coding conventions. The overall structure is the same.

Project docs

Fabro automatically discovers project instruction files by walking the directory hierarchy from the git root to the working directory. Which files are loaded depends on the provider: Files are loaded in directory order (root first, deepest last) with a total budget of 32KB. If the combined content exceeds this budget, later files are truncated.

Environment context

The system prompt includes an <environment> block with runtime details:
This block also includes git status --short and recent commits when available, giving the agent awareness of the current repository state.

Prompt nodes vs. agent nodes

Both agent nodes (shape=box) and prompt nodes (shape=tab) go through the same prompt assembly pipeline: variable expansion, preamble prepending, and system prompt construction. The difference is execution: Use prompt nodes for analysis, classification, and summarization tasks where tools are not needed.

Prompt logging

Fabro persists the assembled prompt to stages/{rank:03}-{node_id}@{visit}/prompt.md in metadata snapshots and fabro dump output for every agent and prompt stage. This includes the preamble (if any) and the expanded prompt text. Use these files for debugging when an agent behaves unexpectedly.