It refuses the call
A rule in deny returns the violation as the tool’s result instead of running it. The model reads what blocked it and
does the missing work.
const SEC_01 = Presets.requireBefore('restartService', 'queryMetrics', { id: 'SEC-01', description: 'restartService may not run before queryMetrics has returned', mode: 'deny',})const guarded = guardTools(createMonitor({ rules: [SEC_01] }), tools, { source })Hand guarded to your agent instead of the originals. That is the whole integration.
It refuses the call
A rule in deny returns the violation as the tool’s result instead of running it. The model reads what blocked it and
does the missing work.
It waits for a human
A rule in suspend pauses the workflow through the engine’s own suspension, so the pause survives a restart and the
approval can arrive minutes later.
It says why
Every verdict names the rule, the event, and the subterm that failed — the same object live, in your telemetry, and in CI.
You never have to learn the notation
Properties are named in English. The temporal logic underneath is there when you want it and out of the way when you do not.
Install is two packages, and your first rule is the four lines above with the reasoning behind each one. If you already know what you want to say, by example is the sentence you mean beside the line that writes it. The demo is the whole corpus — thirteen recorded runs across an agent and a workflow, with the source they were produced from.