Whippletree

One pull,
every harness.

Declare your tool's lifecycle once. Whippletree compiles it onto every harness at the best fidelity each can verify.

$ go install whippletree.dev/cmd/whippletree@latest

Read the docs / Author a bundle

It tells you what it cannot do

Whippletree probes the installed harness and reports the tier every requirement actually reaches, before anything is written to disk.

$ whippletree preflight ./my-tool --target codex
whippletree preflight · target codex (probed 0.146.0)

  stop-gate             want ≥T1  got T1  SATISFY   native Stop + stop_hook_active
  session-start-signal  want ≥T2  got T1  SATISFY   native SessionStart
  file-read-signal      want ≥T4  got T2  SATISFY   matcher Bash|Edit|Write|apply_patch;
                                                  misses reads in pipelines and heredocs
  bin-reachable         want ≥T1  got T1  SATISFY   bundle channel

Plan: 4 satisfy, 0 degrade, 0 refuse.

Four tiers, named honestly

A requirement lands where the harness can carry it. Hard requirements that fall short refuse to install rather than degrade quietly.

T1

NativeThe harness has a real hook for it, enforced by the harness itself.

T2

DegradedApproximated through a coarser mechanism, with the lossage stated in full.

T3

Compiled to instructionsBest effort. The model is told to run the step and usually will, but can skip it under pressure.

T4

ObserverReserved. Not implemented.