id property
An action id on the same plugin — this is what makes a step executable while staying pure data.
The design this came from held a closure (teardown('…', () => sh(…))),
which a serialisable contract cannot. Naming an action instead costs
nothing and buys the property every other surface already has: the
checklist runs a step by the same call fw run <plugin> <action> makes,
so a step can never do something the CLI and an agent cannot also do — and
there is no second code path to keep in step with the first.
A plugin may emit several steps naming one action, told apart by
arguments: the run plugin emits one per running app, all of them stop.
Implementation
final String id;