splitty

RedJay

orchestrationClaude Codeby JoshuaRamirez

Summary

Pipes-and-filters orchestration for chunk-level analysis with Claude Code sub-agents. Splits a corpus into chunks, runs a deterministic DAG of map / reduce / gate / terminal filters in parallel, and unions the results. The orchestration loop runs in the main Claude conversation — no daemon, no MCP server — driven by an on-disk state machine that makes runs resumable and lost-message tolerant. Ships three example pipelines (map-reduce, classify-and-extract, fan-out/fan-in) and a /splitty-design skill that authors a pipeline YAML from a natural-language request.

Install to Claude Code

/plugin install splitty@RedJay

Run in Claude Code. Add the marketplace first with /plugin marketplace add JoshuaRamirez/claude-code-plugins if you haven't already.

README.md

splitty

Pipes-and-filters orchestration for chunk-level analysis with sub-agents.

What it does

You hand splitty a corpus and a goal. Splitty designs a pipeline (a YAML DAG of filters), splits the corpus into chunks, and walks the DAG one stage at a time. Each stage runs a sub-agent over its assigned chunks, writes outputs to disk, and the next stage consumes those outputs. Every branch of the DAG ends in a terminal filter that unions the branch's outputs into a final result.

Design at a glance

corpus.txt
   │
   ▼
[chunker]──► chunks/0001.txt … chunks/N.txt
   │
   ▼
┌──────────────────────────────────┐
│  pipeline.yaml (DAG of stages)   │
│                                  │
│   stage A (map, per-chunk)       │
│        │                         │
│        ▼                         │
│   stage B (map, per-chunk)       │
│        │                         │
│        ├──► stage C (reduce)     │
│        └──► stage D (reduce)     │
│              │      │            │
│              ▼      ▼            │
│         stage E (terminal)       │
└──────────────────────────────────┘
              │
              ▼
         result.md

The orchestrator is Claude itself, driven by the /splitty-run skill: read state, ask Python for the next batch of pending steps, dispatch parallel Task() calls (one sub-agent per pending step), mark them done, repeat until all branches close.

Stage types

| Type | Cardinality | Closes a branch? | |------------|----------------------------|------------------| | map | one sub-agent per chunk | no | | reduce | one sub-agent over inputs | no | | gate | filter chunks by condition | no (no agent) | | loop | repeat a stage to fixed point | no | | terminal | one sub-agent unioning a branch | yes |

A pipeline is valid only if every leaf in the DAG is a terminal stage.

Layout

splitty/
├── .claude-plugin/plugin.json
├── skills/
│   ├── splitty/SKILL.md             # /splitty — full lifecycle (design → run)
│   ├── splitty-design/SKILL.md      # design pipeline.yaml from a request
│   └── splitty-run/SKILL.md         # execute an existing pipeline.yaml
├── agents/
│   └── splitty-filter.md            # substrate sub-agent (general-purpose)
├── commands/
│   ├── splitty.md
│   ├── splitty-design.md
│   └── splitty-run.md
├── scripts/
│   ├── splitty.py                   # single-entry CLI: init, next, mark, union, etc.
│   └── lib/                         # chunker, validator, state machine
├── pipelines/examples/
│   ├── map-reduce-summary.yaml
│   ├── classify-and-extract.yaml
│   └── fan-out-fan-in.yaml
└── docs/pipeline-schema.md

Install

Splitty is distributed through the public RedJay marketplace. Inside Claude Code:

/plugin marketplace add JoshuaRamirez/claude-code-plugins
/plugin install splitty@RedJay

Or from the CLI:

claude plugin marketplace add JoshuaRamirez/claude-code-plugins
claude plugin install splitty@RedJay

The plugin registers one sub-agent (splitty-filter), three skills (splitty, splitty-design, splitty-run), and three slash commands (/splitty, /splitty-design, /splitty-run).

Quickstart

/splitty extract every named entity from notes/*.md and produce a deduplicated catalog

Splitty designs a pipeline, writes it to .splitty/runs/<run-id>/pipeline.yaml, then drives the run. You can also hand it an existing pipeline:

/splitty-run path/to/my-pipeline.yaml --input corpus.txt

Run state

Each run is fully on disk under .splitty/runs/<run-id>/:

.splitty/runs/<run-id>/
├── pipeline.yaml          # frozen copy of the pipeline used
├── input/                 # original input(s)
├── chunks/                # chunked input
├── state.json             # execution state (pending / running / done per step)
├── outputs/<stage-id>/    # per-step outputs
└── result.md              # final unioned output

Runs are resumable: kill the conversation, pick up later by pointing /splitty-run at the same run-id.

Related plugins

Browse all →