Declare your tool's lifecycle once. Whippletree compiles it onto every harness at the best fidelity each can verify.
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.
A requirement lands where the harness can carry it. Hard requirements that fall short refuse to install rather than degrade quietly.
NativeThe harness has a real hook for it, enforced by the harness itself.
DegradedApproximated through a coarser mechanism, with the lossage stated in full.
Compiled to instructionsBest effort. The model is told to run the step and usually will, but can skip it under pressure.
ObserverReserved. Not implemented.