3 months ago
2e7eac4custom rule sentences read "flag when {x}" but the evaluator treats the
comparison as the PASS condition (passed = comparison holds), uniform with
built-ins. so "flag when account age under 10" stored under(10) and PASSED
accounts under 10 — the opposite of the author's intent. a 1263-day account
FAILED an "under 10" rule; a spam rule "over 50 forks" blocked everyone with
<=50 forks and let spammers through. correctness only held by accident when
the author happened to pick a negating verb (noneOf/not double-flips).
fix A (copy layer — keeps the evaluator's comparison=pass invariant intact):
- the builder sentence and card read "require that {x}" — the author states
what is ALLOWED, matching what runs. negating verbs read naturally because
enum signals map noneOf -> "is not" ("require that target branch is not
staging").
- drop severity from the sentence (it weighs a failure, it is not the
requirement); the card shows it as a separate colour-coded chip.
- guard test: a rule authored to pass a value passes, and fails one that does
not — this class of inversion must never be invisible again.
does NOT change the evaluator, the registry, or any rule. existing stored
rules still need their comparisons rewritten under the new semantics (handled
separately); the worker stays un-redeployed until that lands.Parent6566405