docs← Back to article

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.

Download this articlePlain text ↗
# 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.