# 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.