skill composition for coding agents v0.1

The right skills, composed for each surface.

A pile of skills is cheap to add and expensive to carry. Spindle composes source skills into tight, surface-specific blends — resolved for the repo, rendered for the harness and model, and materialized exactly where the agent runtime loads them.

Python toolchain MIT licensed pip-installable packages harness-native output

Agent "skills" — the reusable instruction files a coding agent loads to do a job well — multiply fast. Left unmanaged, every repository inherits the same growing pile: skills it will never use, skills that quietly contradict each other, and a context budget spent on instructions instead of work. Spindle treats a surface's skill set as something you compose and verify, not something you accumulate.

The everyday workflow is one command. spindle bind looks at a repo, figures out what kind of surface it is, resolves the exact subset of skills it should receive, checks that subset for coherence, renders each skill for the target harness and model, and writes the result into the harness's native skills directory. The agent simply finds the right skills already there.

Two minutes in

bash
# install the toolchain and a reference distribution of skills
$ uv sync --extra dev
$ spindle dist install examples/spindle-sample/distributions/spindle-sample
$ spindle dist activate spindle-sample

# see what you've got
$ spindle doctrine show
$ spindle skill list

# compose + render + materialize the right blend for a repo
$ spindle bind /path/to/repo --harness claude
resolved 4 skills · lint ok · rendered (identity) · linked → .claude/skills/

That last command is the whole idea in miniature: classify the repo, select the channels it subscribes to, resolve them into one blend, render through the harness/model profiles, lint for coherence, and materialize the selected skills where the runtime can load them — failing closed if the blend isn't coherent.

The shape of the idea

Why it exists →

The case against the skill pile: context budget, silent conflicts, one-size-fits-all phrasing, and eroded guardrails. Why the extra step pays for itself.

How it works →

The data model — package, distribution, channel, surface, profile, blend, doctrine — and the six-stage bind pipeline that turns sources into materialized skills.

Does it actually help? →

Binding proves a skill is available, not that it's better. Spindle runs paired, held-out behavioral evaluations and gates promotion on the result.

Use it →

Install a distribution, bind a repo, and build your own packages, distributions, and channels. Plug in your own task, gate, and scout sinks.

What it is, precisely

Spindle is a small, dependency-light Python toolchain for a specific loop: install skill packages, group them into distributions, resolve the right subset for a repo or agent surface, render that subset for a harness/model profile, and materialize the result where the agent runtime loads it. Packages and distributions are ordinary pip-installable projects that declare themselves with [tool.spindle.package] and [tool.spindle.distribution] metadata, so the whole ecosystem grows through packaging you already understand.

The public base ships a minimal reference distribution under examples/spindle-sample. Everything private — an organization's own packages, project registries, task sinks, marketplace providers — lives in separate adapter packages that depend on Spindle, never inside its core.

Rendering proves a skill is present. Only a held-out evaluation proves it helped.The distinction Spindle is built around.

Built for humans and agents

This site reads as prose for people and ships a machine surface for agents: an llms.txt index and a single-file bundle.md you can paste straight into an LLM's context. Point your agent at either when you want it to reason about how Spindle works.