Markdown for LLMs
Close a list before a residual norm
The source Markdown for this article. Copy it into your assistant or download it as a text file.
# Close a list before a residual norm
## Intention
I want to allow actions outside an exhaustive list of prohibitions.
## Incorrect form and why it stays silent
A list of positive records alone does not promise completeness:
```law title="Incorrect form"
rule Residual strict { for a: Act; when activity(a) and not prohibited(a); then allowed(a); }
// Политики ClosedList нет.
```
## Correct form
```law
language "law.core" version "0.2";
package recipes.v.r04 version "0.1.0";
namespace "urn:recipe:v-negation:04";
entity Act;
relation activity(a: Act);
relation prohibited(a: Act);
relation allowed(a: Act);
closure ClosedList {
predicate prohibited;
domain activity;
snapshot REGISTRY_2026;
complete_as_of @2026-09-13T00:00:00+05:00;
derive_explicit_negative true;
effective [@2026-01-01, @2027-01-01);
}
rule Residual strict {
for a: Act;
when activity(a) and not prohibited(a);
then allowed(a);
}
```
## Frozen execution scene
| Facts | Question | Answer |
|---|---|---|
| activity(a), no record | allowed(a) | TRUE_ONLY |
| activity(a), prohibited(a) | allowed(a) | NEITHER |
| outside domain | allowed(a) | NEITHER |
| activity(a), without ClosedList | allowed(a) | NEITHER |
```law
test "residual rule allows remainder" {
given {
context {
legal_time @2026-09-13;
decision_time @2026-09-13T09:00:00+05:00;
knowledge_time @2026-09-13T09:00:00+05:00;
timezone "Asia/Almaty";
}
assert activity(entity_ref("urn:recipe:v-negation:04:a"));
}
evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a")));
expect truth_status == TRUE_ONLY;
}
```
```law
test "named ban blocks allowance" {
given {
context {
legal_time @2026-09-13;
decision_time @2026-09-13T09:00:00+05:00;
knowledge_time @2026-09-13T09:00:00+05:00;
timezone "Asia/Almaty";
}
assert activity(entity_ref("urn:recipe:v-negation:04:a"));
assert prohibited(entity_ref("urn:recipe:v-negation:04:a"));
}
evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a")));
expect truth_status == NEITHER;
}
```
```law
test "no activity yields neither" {
given {
context {
legal_time @2026-09-13;
decision_time @2026-09-13T09:00:00+05:00;
knowledge_time @2026-09-13T09:00:00+05:00;
timezone "Asia/Almaty";
}
}
evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a")));
expect truth_status == NEITHER;
}
```
```law
test "bare list without closure proves nothing" {
given {
context {
legal_time @2026-09-13;
decision_time @2026-09-13T09:00:00+05:00;
knowledge_time @2026-09-13T09:00:00+05:00;
timezone "Asia/Almaty";
}
assert activity(entity_ref("urn:recipe:v-negation:04:a"));
}
evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a")));
expect truth_status == NEITHER;
}
```
## Counterfactual
evaluates.without removes ClosedList; runs repeats this counterfactual with a dated case. The norm stays the same; the source of negative support disappears.
## Boundary
Here allowed is a checkable qualification of a residual norm. `allowed` here is not the `weakly_permitted` answer: that is a separate query with a chosen universe of rules, snapshot, reading, and closure policy. The strong liberty position is described separately. A complete normative list cannot be replaced by the absence of case facts.
## Pitfall
A list without closure leaves a negative premise NEITHER. The completeness holder, domain, and snapshot fix exactly that cause.