rabadon

overview / rules / baseline-law-unmade

baseline-law-unmade

This takes apart the project's own copy of the law, which is the thing that would have refused the next command.

what it refuses, and what it lets through

anything that takes apart this project's own copy of the law — .rabadon/guard.json, .rabadon/promise.json, or the .rabadon directory holding them. It is judged by effect, not by verb name, because the verbs are the part that goes stale: measured against the shipped binary on 2026-08-30, rm -rf .rabadon, truncate -s 0, cp /dev/null, chmod 000, ln -sf /dev/null, install /dev/null, dd of=, and find .rabadon -delete all returned 0 while only rm <file> was refused. So the question asked is: after this command, is the law still there, still whole, still readable? Removed, emptied, overwritten, renamed away, symlinked over, appended to, or chmod'ed out of reach are one answer, and a verb this law has never heard of pointed at those paths is refused rather than waved through. This is the one place in the gate where an unknown name fails closed, because the subject is exactly three filenames. A path is reached however the shell would reach it: a glob (rm -rf .r*, rm -rf .*) and a brace (mv .rabadon{,.bak}) are expanded before they are judged — but rm -rf * passes, because bash does not expand a bare star onto a dotted name. An inline program handed to an interpreter (python3 -c, perl -e, node -e, ruby -e, and awk's first operand) is opaque text, so a body that spells one of the three names is refused; a program handed over as a file is not guessed at. Reading passes, and that is held by test from the other side: cat, grep (including grep -c rm .rabadon/guard.json, which spells a verb but writes nothing), head, tail, wc, ls, stat, diff, git diff, git log, sed -n, an interpreter reading it with no in-place flag and no inline body, cd into the directory, and cp .rabadon/guard.json ./backup.json — copying it out — all pass. So does creating it and backing it up: mkdir -p .rabadon is the first step of installing the law by hand and tar -cf backup.tar .rabadon is the promise above being kept, and both were REFUSED until 2026-08-30 — see the correction below. So does ordinary destructive work anywhere else in the tree, and so does deleting a whole project of yours that happens to contain a .rabadon: the subject is the law, not the tree around it. Change the law with an edit the guard can see, or silence baseline-law-unmade by id if a shell rewrite is really what you meant.

From the floor table in docs/guard.md. The 21 shapes it allows although they destroy the law are measured, by class.

Correction, 2026-08-30 — what the sentence above did NOT do until today

The row says "this project's own copy of the law", and until 2026-08-30 the compiled rule did not do that: it fired on every path on the disk whose last component was .rabadon, and it read five ordinary shapes as attacks. Measured with an empty bash[] fixture in a project sandbox under $HOME — deliberately not under a machine temp root, whose carve-out inflates the reading — one line per shape, REFUSE when the gate exits 2:

bash reports/kosu/kanit/f3h/probe.sh <<'EOF' mkdir -p .rabadon mkdir -p /elsewhere/unrelated/.rabadon mkdir -p "$VAR/.rabadon" tar -cf backup.tar .rabadon find . -not -path '*/.rabadon/*' -delete EOF REFUSE mkdir -p .rabadon <- installing the law by hand REFUSE mkdir -p /elsewhere/unrelated/.rabadon <- an absolute path in no project of ours REFUSE mkdir -p "$VAR/.rabadon" REFUSE tar -cf backup.tar .rabadon <- BACKING THE LAW UP REFUSE find . -not -path '*/.rabadon/*' -delete <- the walk that EXCLUDES the law

All five now pass, and each is an assertion in native/law_family_test.sh alongside the shape it must not have opened (mkdir -m 000 .rabadon, tar -xf a.tar -C .rabadon, find . -path '*/.rabadon/*' -delete, this project's own copy spelled absolute). The rule was not weakened; its subject was narrowed to what this row always said it was. Another tree's .rabadon is baseline-rm-rf-outside's business, under that rule's own id.

the refusal, as the agent reads it

rabadon BLOCKED this action. Rule: baseline-law-unmade — this takes apart the project's own copy of the law, which is the thing that would have refused the next command <verb> '<operand>' resolves onto .rabadon/guard.json, .rabadon/promise.json or the directory holding them. Removing, emptying, overwriting, renaming or chmod-ing that file disarms this project's guard for every session after it, and nothing left behind says it happened. Read it with `cat`, change it with an edit the guard can see, or silence baseline-law-unmade by id if this is really what you meant. Adjust the approach instead of retrying the same action. (only the user can override this: they may add "baseline-law-unmade" to disabled[] in .rabadon/guard.json or run `rabadon off`. If this rule looks wrong for the task, stop and ask the user; do not switch supervision off yourself.)

Rendered from the strings in native/baseline.h and the envelope in native/gate_pre.h (Judge::refuse). 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: baseline-law-unmade — this takes apart the project's own copy of the law, which is the thing that would have refused the next command <verb> '<operand>' resolves onto .rabadon/guard.json, .rabadon/promise.json or the directory holding them. Removing, emptying, overwriting, renaming or chmod-ing that file disarms this project's guard for every session after it, and nothing left behind says it happened. Read it with `cat`, change it with an edit the guard can see, or silence baseline-law-unmade by id if this is really what you meant. Nothing was stopped. `rabadon on` makes this a real refusal.

switching it off

Only the user can switch it off, by id, in the project's guard:

{ "disabled": ["baseline-law-unmade"] }

or by pausing supervision with rabadon off, which records the change. Every other rule keeps running.

in the field

No record in the published field dataset (field.jsonl, 778 records, 2026-07-27 to 2026-08-26) carries this id.

The dataset is on the field page.

rules

baseline-rm-rf-outside

blind spots

a walk that never spells the law's name · the tree deleted from outside, law and all · the tree moved away, law and all · the project root deleted by its own name

measurements

the refusals that cannot be undone