Try first. Adopt deliberately. Keep evidence.
Spindle replaces “install this skill and hope” with a reversible chain from intent to exact runtime behavior. Temporary use is easy; durable custody has to be earned.
A skill is more than its SKILL.md. Its effect
depends on exact package bytes, the other skills a harness can see, the model
actually served, available tools, policy, and whether the instructions still
improve the current generation of model. Spindle keeps those facts distinct and
joins them with content-addressed receipts.
The harness is the front door
spindle harness setup --harness codex --here or its
claude counterpart projects a minimal, versioned operator into the
harness's native project-skill directory. Invoke it as $spindle in
Codex or /spindle in Claude Code. The operator calls
spindle harness context --here --json for the live surface lock,
effective inventory, custody, blockers, hook heartbeat, authorization rule,
and exact dry-run/apply commands. It does not carry a stale second copy of the
lifecycle in model context.
When one harness launches another, inherited environment markers can name
both. Spindle uses the nearest named harness process as stronger runtime
evidence and otherwise fails closed for an explicit --harness.
Installing the operator proves neither that a hook ran nor that another skill
was activated, useful, or adopted.
Intent before authority
spindle inspect builds an intent card without importing or
executing candidate code. It separates package facts from contextual fit,
reports provenance, contents, authority requirements, context cost, and known
evidence, and leaves the package inactive.
$ spindle inspect ./candidate/review \
--for "review this migration" --harness codex --here --json
$ spindle inspect \
'github:owner/repository@0123456789abcdef0123456789abcdef01234567#review' \
--harness claude --here --json
Temporary before durable
One disposable session
- Exact content-addressed snapshot.
- Read-only harness posture by default.
- Startup, activation, run, and cleanup receipts.
- No durable adoption.
One expiring lease
- Overlays the actual incumbent blend.
- Names permitted surface, harness, agents, and authority.
- Rechecked on launch, resume, and compaction.
- Released or expired without rewriting history.
Desired state beats ambient state
A surface lock names exact adopted and leased inputs. At startup, Spindle inventories repository, ancestor, user, administrator, plugin, and known system scopes; compares desired with observed state; and classifies every entry. It may repair or remove only a projection whose current path and target still match an immutable ownership receipt.
restart-required instead of pretending the session is clean.
$ spindle inventory --effective --harness codex --here
$ spindle bootstrap --harness codex --here --check
$ spindle hooks install --harness codex --scope repo --here --dry-run
$ spindle launch codex --here --
One package, agent-local realizations
Parent and child agents independently resolve from the model actually served, effort, role, harness build, effective tools, policy, and active blend. The package stays immutable: Spindle combines its invariant core with at most one evaluated overlay and writes a realization receipt. The adapter separately records whether that exact agent loaded it.
Harness mechanics belong in deterministic adapters,
not in portable skill prose.Version checks, routing, permissions, startup,
and receipt writing stay outside SKILL.md.
Evidence before promotion
Evaluation reports availability, activation, routing, authorization, behavior, and adapter conformance as separate gates. Named arms include no-skill, invariant core, candidate overlay, incumbent, and ablations. A smaller or empty overlay qualifies only when repeated held-out results clear a predeclared non-inferiority margin, hard floor, and efficiency threshold for the exact runtime coordinate.
Adoption is maintenance custody
spindle adopt promotes the exact bytes from a successful trial.
Updates are new candidates tested beside the incumbent; they do not inherit old
evaluation claims. Health reports source, package, cache, inventory, model,
harness, toolset, and policy drift independently. Rollback creates a new exact
decision without rewriting prior records.
$ spindle adopt sha256:<lease-id> --here --dry-run --json
$ spindle update try review --harness codex --task-file task.md --here
$ spindle health --harness codex --here
$ spindle rollback review --harness codex --reason regression --here
$ spindle retire review --harness codex --reason obsolete --here --dry-run
Custody survives failure
Immutable records can rebuild mutable indexes after a crash. Deterministic state bundles import only absent or byte-identical files. Cache garbage collection uses an exact plan and protects all current locks, leases, and adoption history. Legacy migration audits preserve ambient state and never turn an old install into an adoption by inference.
Adapters are certified per build
Spindle's reference matrices fail closed on unobserved runtime facts. The checked evidence certifies Claude Code 2.1.220 and Codex CLI 0.146.0 with independently activated mixed-model parent and child agents. A new harness build, model, tool composition, policy, package digest, or active blend is a new coordinate—not permission to reuse an old claim.