2026-10-11 16:37 UTC

Plasma AI claims its released Fractal runtime lets coding agents recursively spawn bounded child loops in Git worktrees with shared execution records, reducing manual task decomposition and coordination without providing filesystem or network isolation.

state: seedheat: mediumuncertainty: mediumknownscott: lowagent-orchestration agent-harnesses hierarchical-agentsPlasma AI

What is this?

Fractal is an open-source runtime from Plasma AI (Nicholas Diao, Andrew Turner, Colton Berry), released July 21, 2026, that organizes coding agents into a recursive tree: each node is a persistent agent loop working in its own git worktree, spawning child nodes for separable subtasks, with per-node/per-iteration/per-step budget caps and all run state (iterations, costs, signals) in a local SQLite database surfaced via a terminal UI. Its thesis is that subagent fan-out is now standard in leading harnesses but long-running recursive loops are not yet first-class. Notably, the GitHub README is explicit that nodes run agents with approval gates disabled by default and that worktrees isolate only the git branch โ€” not the filesystem or network โ€” so the hypothesis's 'no filesystem or network isolation' caveat checks out against the source. Plasma AI also ships related agent-infrastructure tools (Radio for shared inter-agent channels, Wiki for deterministic CLI-indexed Markdown knowledge bases), suggesting a broader multi-agent coordination stack.

Why it matters to Scott

The radar already tracks this exact story in an open case (radar:fractal-recursive-agent-loops โ€” 'Independent use will determine whether Fractal's recursive agent-loop architecture improves reliability on complex multi-step work'), so this signal is a duplicate rather than a development. Residual Scott-specific texture only: Fractal's recursive worktree-backed task tree mirrors his own Manager hierarchical Salesforce-reporting agent, and its approval-gates-disabled-by-default / no-filesystem-or-network-isolation posture is a live instance of his Architecture-Not-Vibes containment argument โ€” but neither adds anything the radar doesn't already hold.
dev:project.managerip:framework.architecture-not-vibesradar:fractal-recursive-agent-loopsradar:concept.recursive-agentsradar:concept.agent-orchestrationradar:concept.agent-harnesses
queries asked of Scott's wikis
  • agent harness orchestration โ€” recursive loops, subagent fan-out, tree-of-agents patterns
  • git worktrees for parallel agent coding โ€” isolation limits, branch vs filesystem
  • agent memory / shared execution records โ€” SQLite run state, agent-maintained wikis as coordination substrate
  • loop bounds and budget caps โ€” guardrails for unattended agent runs, auto-approve / bypass-permissions risk
  • multi-agent coordination โ€” inter-agent messaging, shared channels, task decomposition automation
  • local open tooling for agent runtimes โ€” self-hosted orchestration vs vendor harness features

Measured heat

now 0 pts/hpeak 0 pts/hcomments 0/hpeers p14momentum: steady2 platformsage 1965h
points/hour across evidence ยท reading as of 2026-10-12 02:59:37.977291+11:00 ยท deterministic, not a model opinion

How the heat travelled

07-21 19:22 (minted)โญ origin echo-reconstructedHierarchical agent loops recursively spawn worktree-backed children under iteration, depth, cost, and time caps; default configurations disa
Plasma AI on github (echo) ยท attributed from hn.story.49807198 ยท published time unknown
โ€”
09-22 19:55first on hacker news ยท published ยท lag ?Open source tool for building hierarchical agent loops
NatalieTrono
โ€”
09-22 19:55amplified on hacker news ๐Ÿ‘‘hn.story.49807198
NatalieTrono
peak 2 ยท 0 comments ยท 98% of case engagement
07-21 19:22our radar first saw it ยท lag ?discovery anchor: hn.story.49807198โ€”
pace: p9 vs 1032 stories at the 336h mark (now 452h old) โ€” behind addom-local-coding-harness (0.5x)

Evidence (2) โ€” โญ canonical anchor

sourceobjectauthorscorecomments
๐ŸŸง hnOpen source tool for building hierarchical agent loops
Retrieved article excerpt

Open article ยท Retrieved 2026-09-22T21:23:05.640472+00:00

# fractal

[license](https://github.com/plasma-ai/fractal/blob/main/LICENSE)
[build](https://github.com/plasma-ai/fractal/actions/workflows/build.yaml)
[docs](https://github.com/plasma-ai/fractal/actions/workflows/docs.yaml)
[lint](https://github.com/plasma-ai/fractal/actions/workflows/lint.yaml)
[tests](https://github.com/plasma-ai/fractal/actions/workflows/tests.yaml)
[codecov](https://codecov.io/gh/plasma-ai/fractal)
[pre-commit](https://github.com/pre-commit/pre-commit)

Hierarchical agent loops with recursive self-organization.

In a fractal, autonomous agent loops arrange themselves into a tree: a node
iterates toward a goal in its own `git worktree` and spawns child nodes for
separable subtasks, so the tree grows to fit the problem rather than a fixed
plan. Hard caps (iterations, depth, children, cost, time) keep each loop
bounded, and an operator can steer or stop it at any point. Run metadata
(including cost) lands in one local `SQLite` database, which can be interacted
with live in a terminal UI.

[fractal TUI dashboard](https://raw.githubusercontent.com/plasma-ai/fractal/main/docs/_static/tui.png)

Warning

**Nodes run their agent without permission prompts by default.** Unattended
loops cannot stop to ask, so every seeded agent config disables the approval
gate โ€” Claude `bypassPermissions`, Codex `danger-full-access`, Grok
`--always-approve`, opencode `--auto`, omp `--yolo`. A node can therefore run
any command its agent decides to run, with your credentials and your machine's
reach. The per-node `git worktree` isolates the *branch* it commits to, not
the filesystem, the network, or anything else outside it. Only launch nodes
whose task you would trust to run unsupervised, and prefer a sandboxed or
otherwise disposable host for anything else.

---

**Source**:
<https://github.com/plasma-ai/fractal>

**Package**:
<https://pypi.org/project/plasma-fractal/>

**Documentation**:
<https://docs.plasma.ai/fractal>

---

## Installation

Install the `fractal` package from PyPI:

```
pip install plasma-fractal
```

or

```
pip install fractal
```

Use `pipx install` or `uv tool install` to install the package in an isolated
environment. If you use one of these two methods, you must also install
`plasma-wiki` (a plain `pip` install pulls `plasma-wiki` and puts `wiki` on your
`PATH`, but this is not the case when using `pipx install` or
`uv tool install`).

`uv tool install plasma-fractal --with-executables-from plasma-wiki` does the
same in one command.

Open the dashboard from your project root with `fractal open` (requires an
initialized fractal). Pass `--light` if your terminal uses a light color scheme.

### Skill

Install the skill for your agent via the plugin marketplace (Claude Code and
Codex):

```
# Claude Code
/plugin marketplace add plasma-ai/plugins
/plugin install fractal@plasma

# Codex
codex plugin marketplace add plasma-ai/plugins
codex plugin add fractal@plasma
```

Another install route is from the CLI, which copies (or symlinks) the fractal
and wiki skills into `~/.claude/skills` and `~/.agents/skills` (add `--project`
for the current project only):

```
fractal install [--link]
```

After upgrading the package, re-run `fractal install` to refresh the copied
skills (pass `--link` for symlinked install).

## Usage

A fractal is a tree of git worktrees, each running an autonomous agent loop. The
root (user) node is your current branch itself โ€” it has no worktree or loop of
its own; top-level nodes branch from it, and child nodes branch from their
parent. Agents iterate in tmux sessions (or, with `--headless`, in detached
process groups), and all state (runs, iters, steps, costs, signals) is tracked
in a local SQLite database.

Five agent backends are supported โ€” Claude Code (`claude`), Codex (`codex`),
Grok Build (`grok`), OpenCode (`opencode`), and Oh My Pi (`omp`) โ€” selected per
node with `--agent` (children inherit it). Claude and Codex can additionally
route through OpenRouter with `--provider=openrouter`, which authenticates via
`OPENROUTER_API_KEY` from the launching shell; OpenCode and Oh My Pi reach
OpenRouter natively through their own `openrouter/<author>/<model>` model ids.

Use the `/fractal` skill to spawn and manage agent nodes. The `fractal` CLI is
also available directly โ€” run `fractal --help` and `fractal <command> --help` to
explore.

The skill is invoked as `/fractal [directive]` and takes plain-language
instructions. The agent interprets the directive and prints any suggested
`NODE.md` instructions and completion requirement it can distill from the
directive, plus a table of every parameter (empty where the directive said
nothing), then asks for anything it could not infer. From there it walks you
through refining the node's definition and, once you approve, launches the node
in a tmux session. On hosts where tmux cannot run, add `--headless`; the node's
output appends to `headless.log`, delegated child starts follow the parent's
backend, and an unflagged relaunch reuses the backend the node last launched
with.

Parameters the skill interprets from the directive:

- **`name`**: node name (required; letters, digits, and `_` only โ€” no `-`)
- **`path`**: project root, repo root or monorepo sub-project (default: `.`)
- **`title`**: human-readable display name (default: de-slugged node name)
- **`scope`**: restrict commits to subdirectories within the worktree
  (comma-separated, e.g. `parent/child,tests`)
- **`base`**: branch to start from (default: current branch)
- **`meta`**: target node branch for meta-configuration
- **`inherit`**: seed surfaces from the parent node instead of the package seed
  (comma-separated: `steps`, `scripts`, `skills`, `config`, or `all`); agent
  config always inherits. A top-level spawn's parent is the user node, which
  carries no steps, scripts, or skills โ€” the parameter is for configured nodes
  spawning children
- **`agent`**: agent command; inherits the user node's default when omitted
- **`provider`**: provider route for the agent (e.g. `openrouter`); inherits the
  user node's default when omitted
- **`model`**: model override; when omitted, the agent uses its own default
  model (Claude runs on the seed's `best` alias, or
  `anthropic/claude-sonnet-4.6` when routed through OpenRouter)
- **`effort`**: reasoning-effort override; when omitted, the Claude and Codex
  seeds' own pinned level (`high`) applies rather than the vendor default, while
  Grok, OpenCode, and Oh My Pi fall back to the vendor default
- **`max-iters`**: per-run iteration cap
- **`max-depth`**: maximum child node nesting depth
- **`max-children`**: maximum direct child nodes
- **`max-descendants`**: maximum total descendant nodes
- **`timeout`**: per-run time limit (e.g. `30m`, `1.5h`)
- **`iter-timeout`**: per-iteration time limit (e.g. `30m`, `1.5h`)
- **`step-timeout`**: per-step time limit (e.g. `30s`, `10m`); caps each step
- **`interval`**: fixed iteration schedule (e.g. `1h`)
- **`sleep`**: delay between iterations (e.g. `10s`)
- **`wait`**: sleep between approval-wait sync invocations (default: `1m`)
- **`max-cost`**: cost ceiling in USD per run โ€” runs are isolated, so each
  launch arms the cap anew; after a budget-ended run, `node start --continue`
  refuses without an explicit `--max-cost`
- **`max-iter-cost`**: per-iteration cost ceiling in USD
- **`max-step-cost`**: per-step cost ceiling in USD (warn-only when
  unenforceable)
- **`reserve-budget`**: budget reserved for cleanup; USD or N% of `max-cost`
  (default: 10%)
- **`sync`**: enable (default) or disable radio sync before each step
- **`detached`**: run each step as a separate agent session (default: one
  continuous session)
- **`local`**: skip pushing to remote after each commit

## Development

### Install

Run `install.sh` in the package root. With no environment active it creates and
uses a local `.venv`; with one active (e.g. pyenv) it installs into that
environment (editable), without recreating it:

```
./install.sh --all-extras --groups=test,lint,type
```

Run `./install.sh --help` for all options. Alternatively, run
`uv sync --all-extras --group test --group lint --group type` and
`uv run pre-commit install` to set up the environment manually.

Installing a dependency as editable (e.g. a sibling package) is left to the
caller: `uv pip install --editable <path>`.

With an editable install, `fractal install --link` symlinks the bundled skill
into the agent skill directories instead of copying it, so skill edits apply
without re-running the install.

Once installed, run tools with `uv run --no-sync <command>`, or activate the
environment first (`source .venv/bin/activate`).

### Tests

Run the test suite:

```
pytest .
```

The suite runs with `--doctest-modules` enabled, and the integration tests
create real git repositories and worktrees.

### Linting

Run linters and formatters:

```
pre-commit run --all-files
```

### Contributing

The contribution workflow, repository conventions, and release process (version
sources, tagging, CI guard) are documented in:

- Contribution workflow (organization-wide):
  [CONTRIBUTING.md](https://github.com/plasma-ai/.github/blob/main/CONTRIBUTING.md)
- Repository conventions:
  [AGENTS.md](https://github.com/plasma-ai/fractal/blob/main/AGENTS.md)
- Release process (organization-wide):
  [RELEASING.md](https://github.com/plasma-ai/.github/blob/main/RELEASING.md)

Pull requests should be branched from `dev`, not `main`, and opened against
`dev` โ€” `main` only advances at releases.

## License

Licensed under the Apache License 2.0 โ€” see
[LICENSE](https://github.com/plasma-ai/fractal/blob/main/LICENSE).

Copyright ยฉ 2026 Plasma AI
NatalieTrono20
๐ŸŸง echo.github โญHierarchical agent loops recursively spawn worktree-backed children under iteration, depth, cost, and time caps; default configurations disaPlasma AIโ€”โ€”

Interpretation history

Decision trace