Workflow harness for coding agents. .fabro files are Graphviz digraphs whose node shapes pick handlers; a CSS-like stylesheet routes each step to a model. Single Rust binary.
Camp: Orchestration
Author: Bryan Helmkamp (Qlty Software)
Implementation language: Rust
Compilation target: Native binary (Rust workspace, embedded React SPA)
Licence: MIT
First seen: March 2026
Maturity: working compiler
Agent tooling:
- AGENTS.md (CLAUDE.md as symlink)
- Agent Skills format (~/.fabro/skills/, project skills/)
- MCP server with 7 fabro_run_* tools
- install.md (agent-targeted installer prompt)
- fabro graph (renders DOT workflows to SVG)
Fabro frames the coding-agent harness as a graph-execution problem. A workflow is a .fabro file containing a Graphviz digraph; Graphviz shapes map directly to handler types (Mdiamond start, Msquare exit, box agent step, parallelogram shell command, diamond conditional, hexagon human gate, component parallel fan-out). Edge labels carry a condition grammar (=, !=, >, <, contains, matches, &&, ||, !). A second authored notation -- a CSS-like model_stylesheet -- assigns model, provider, and reasoning_effort per node by selector (* < shape < .class < #id). The runtime ships as a single Rust binary that checkpoints to git between stages and runs agent steps in local, Docker, SSH, or Daytona sandboxes.
Fabro starts from the observation that agent coding harnesses spend most of their time in two failure modes: either a human babysits each step in a REPL, or the agent returns a 50-file diff and the human has to reconstruct what happened. Fabro's diagnosis is that this is what you get when the harness has no authored artefact to point at. The fix is to make the process itself a source file. A .fabro workflow is a Graphviz digraph; the agent runs through it node by node; the file is diffable, reviewable, and version-controlled like any other code. Fabro lifts the term "dark software factory" from Dan Shapiro's January 2026 five-levels framework and commits to it as the project's framing: humans supervise specs, guardrails, and outcomes; the factory handles the steps in between.
Define the process as a graph, let agents execute it, and intervene only where it matters.
The distinctive move sits at the file level: every .fabro workflow is a Graphviz DOT digraph, and the Graphviz shape is the handler type. Mdiamond is the start node, Msquare is the exit, box is an agent step that runs a multi-turn LLM session with tool access, parallelogram is a shell command, hexagon is a human gate that pauses for approval, diamond is a conditional, and component is a parallel fan-out. Edges carry labels and a condition grammar (=, !=, >, <, contains, matches, &&, ||, !) that reads against an Outcome and the run's shared context. A second authored notation, the model_stylesheet, is a CSS-like file that assigns model, provider, and reasoning_effort to nodes by selector with documented specificity (* zero, shape one, .class two, #id three). Where Boruna gates declared effects at the bytecode VM and chains them into evidence bundles, Fabro gates execution at the graph edge and commits the git checkpoint only after a stage succeeds.
digraph PlanImplement { graph [ goal="Plan, approve, implement" model_stylesheet=" * { model: claude-haiku-4-5; } .coding { model: claude-sonnet-4-5; reasoning_effort: high; } #review { model: gpt-5.2; } " ] // nodes: the shape attribute selects the handler start [shape=Mdiamond, label="Start"] exit [shape=Msquare, label="Exit"] plan [label="Plan", prompt="Write a plan."] approve [shape=hexagon, label="Approve Plan"] implement [label="Implement", class="coding"] review [label="Review", class="coding"] // edges: labels are options at gates; conditions gate flow start -> plan -> approve approve -> implement [label="[A] Approve", condition="outcome=succeeded"] approve -> plan [label="[R] Revise"] implement -> review -> exit }
A four-stage workflow with a human gate. hexagon nodes pause for input; outgoing-edge labels become the selectable options ([A] and [R] are accelerator keys). The stylesheet routes the cheap default model to most nodes and reserves Sonnet for the coding stages.
box is an agent; parallelogram runs a script; hexagon is a human gate; component fans out. The DOT file is not a transport; it is the source language.* (universal) yields to shape, which yields to .class, which yields to #id. Explicit per-node attributes win over any rule.fabro/meta/*). Resume, revert, and fork from any point use git as the durable store.goal_gate=true attributes, and wait_all / first_success parallel-join policies turn LLM-as-judge and lint-driven fix loops into a few extra nodes rather than harness plumbing.fabro_run_* tools (create, search, get, interact, gather, pair, events) so coding agents can drive runs from inside another harness.The workspace is 47 Rust crates and roughly 392k lines of code, with 96 release tags (most nightlies) and a daily changelog that runs from late February through mid-June 2026 at the time of cataloguing. The repository reports 1,221 stars and 133 forks; the GitHub contributors list shows sixteen names, of which Bryan Helmkamp authored 3,624 of 3,840 commits and three release bot accounts contributed roughly 5 percent of the remaining traffic. The LICENSE is MIT and the copyright is held by Qlty Software Inc., Helmkamp's company; the project is hosted under its own fabro-sh GitHub organisation rather than qltysh. Three observations the editorial frame should surface honestly. First, documentation polish runs ahead of demonstrable adoption: the marketing site, full OpenAPI spec, embedded web UI, and feature breadth are unusual for a project four months from first public push. Second, an evals/swe-bench directory in the repo ships a self-published SWE-Bench-Lite scoreboard (GPT-5.4 at 65.7% resolve rate over 300 instances; Sonnet 4.6 at 57.7%; Haiku 4.5 baseline at 54.0%); no third-party reproduction has yet been published. Third, the graph-based-process pattern itself is not novel — LangGraph and other harnesses have been there. Fabro's specific bet is on .fabro-as-DOT-file plus CSS-stylesheet model routing plus single-Rust-binary delivery as a combination, rather than on the graph idea in isolation.
The bet is that "expert engineers running small teams" -- explicitly the target in the docs and tagline -- will accept a structured workflow file as the price of disengagement time, and that the dark-factory framing will pull verification and human-in-the-loop into the same surface that defines the agent steps.
The agent-facing surface is unusually broad. AGENTS.md (with CLAUDE.md symlinked to it) is 17 KB and orients agents working in the repository. Fabro implements the open Agent Skills format, discovering SKILL.md files from ~/.fabro/skills/, {git_root}/.fabro/skills/, and {git_root}/skills/; skills are exposed both as a /skill-name slash syntax and a use_skill tool added to every agent step. An earlier fabro skill install command bundled a fabro-create-workflow skill for Claude Code and Codex; that command was removed in April 2026 when skills moved to user-supplied directories. The CLI's fabro mcp init configures Claude Code, Cursor, or Windsurf to launch Fabro as an MCP server exposing seven run-management tools (fabro_run_create, _search, _get, _interact, _gather, _pair, _events); a workflow can also opt agent steps into the same tool catalogue with [run.agent] fabro_tools = true to spawn structured child runs. fabro graph renders any workflow to SVG. The installer itself is agent-targeted: piping https://fabro.sh/install.md into Claude Code or Codex runs an objective-and-steps prompt that drives the install, the wizard, and the server restart end-to-end.
.ax source in a custom syntax run by a bytecode VM with hash-chained evidence bundles; Fabro's unit is .fabro files in a Graphviz DOT dialect run by a Rust orchestrator with git-commit checkpoints. Same camp, different substrates..lm.md with algebraic effects, grants, and a compile-time @deterministic annotation; Fabro ships .fabro as a Graphviz DOT subset with a CSS-like stylesheet routing nodes to models. Different surface format, same diagnosis..mrsh file; Fabro (2026) puts the LLM at individual graph nodes constrained by surrounding verification stages and human gates. Marsha is alpha and dormant; Fabro is actively developed under a company copyright.fabro-sh/fabro) on 13 March 2026. Daily changelog begins on the docs site.fabro skill install ships the bundled fabro-create-workflow SKILL.md for Claude Code and Codex. The command is removed in April when skills move to user-supplied directories..fabro file extension finalised. Auto-merge, three new lifecycle hooks, and styled workflow graphs land in successive releases.Last modified 21 June 2026