rabadon

overview / rules / guard-weaken

guard-weaken

An edit to the guard must be provably a strengthening, and this one cannot be checked.

what it refuses, and what it lets through

Guard-weaken: strengthen your own guard, never cut it. A session may ADD to its guard (the repair loop authors incident rules into it) but may never remove a rule or add an id to disabled[], or it could switch off the promise rules one file over. Told apart by comparing ids and disabled[] before and after, not by trusting a description of the edit.

From the comment in native/gate_pre.h above the code that decides it.

the refusal, as the agent reads it

rabadon BLOCKED this action. Rule: guard-weaken — an edit to the guard must be provably a strengthening, and this one cannot be checked <tool> on <file> — rewrite the whole file with Write so before and after can be compared Adjust the approach instead of retrying the same action. (this rule is sealed: disabled[] does not switch it off. Only the operator, editing .rabadon/promise.json or .rabadon/guard.json by hand, can change what it protects.)
rabadon BLOCKED this action. Rule: guard-weaken — a guard that does not parse enforces nothing, which is the strongest weakening there is the proposed <file> is not valid JSON Adjust the approach instead of retrying the same action. (this rule is sealed: disabled[] does not switch it off. Only the operator, editing .rabadon/promise.json or .rabadon/guard.json by hand, can change what it protects.)
rabadon BLOCKED this action. Rule: guard-weaken — the session may add rules to its own guard and may not remove one rule '<rule id>' disappears from <file> Adjust the approach instead of retrying the same action. (this rule is sealed: disabled[] does not switch it off. Only the operator, editing .rabadon/promise.json or .rabadon/guard.json by hand, can change what it protects.)
rabadon BLOCKED this action. Rule: guard-weaken — the session may not switch off a rule that watches it '<rule id>' is added to disabled[] in <file> Adjust the approach instead of retrying the same action. (this rule is sealed: disabled[] does not switch it off. Only the operator, editing .rabadon/promise.json or .rabadon/guard.json by hand, can change what it protects.)

Rendered from the strings in native/gate_pre.h, the rule and the envelope (Judge::refuse) both. A word in <angle brackets> is filled in from the command at the moment it is refused.

in watch mode the same verdict is recorded, and nothing is stopped

rabadon (watch) would have blocked this. Rule: guard-weaken — an edit to the guard must be provably a strengthening, and this one cannot be checked <tool> on <file> — rewrite the whole file with Write so before and after can be compared Nothing was stopped. `rabadon on` makes this a real refusal.

switching it off

Sealed: disabled[] in .rabadon/guard.json does not switch it off, and the refusal does not offer that way out. promise-tamper, promise-anti-path and guard-weaken cannot be switched off by disabled[] (sealed_rule): otherwise a supervised session could list the rules protecting the goal contract as ones it need not obey. They answer only to the operator editing the files by hand, which does not pass through this hook. promise-off-target stays switchable: a once-per-session challenge buys no integrity by being locked, and drift stays on the ledger regardless.

in the field

2 of the 778 records in the published field dataset (field.jsonl, 2026-07-27 to 2026-08-26) carry this id. STOP is a refusal in enforce mode; WOULD_BLOCK is the same verdict recorded in watch mode, where nothing is stopped.

eventrecords
WOULD_BLOCK2

Counted from field.jsonl, the file the field page is built from.

rules

baseline-supervision-tamper · promise-off-target

incident rules

no-shell-rewrite-of-guard-or-promise

measurements

the refusals that cannot be undone

changelog

rabadon 0.2.4 (11 entries)