# Presume until rebutted ## Intent I want to keep a presumed status until a rebuttal is presented. ## Wrong form and why it stays silent ```text title="Incorrect form" // unless convicted(p) якобы выводит not innocent(p). ``` A blocking proviso lifts the presumption but does not assert the opposite. A contrary proviso must explicitly name then not innocent(p). ## Correct form Minimal executable witness below. ```law language "law.core" version "0.2"; package recipes.d.r01 version "0.1.0"; namespace "urn:recipe:d-evidence:01"; entity Person; relation accused(p: Person); relation convicted(p: Person); relation innocent(p: Person); presumption Innocence(p: Person) { when accused(p); presume innocent(p); unless convicted(p); } ``` ## Frozen execution scene In the table P and Q are different entities of the page, C is a case; full identifiers are pinned in the scenes. | Input on 13.09.2026 (a different date is named in the scene) | Question | Answer | |---|---|---| | without rebuttal | `truth(innocent(P))` | `TRUE_ONLY` / `COMPUTED` | | proviso blocks | `truth(innocent(P))` | `NEITHER` / `COMPUTED` | | without the condition | `truth(innocent(P))` | `NEITHER` / `COMPUTED` | | without the proviso | `truth(innocent(P))` | `TRUE_ONLY` / `COMPUTED` | ```law test "presumption holds without rebuttal" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED; } ``` ```law test "blocking exception suspends presumption" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); assert convicted(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED; } ``` ```law test "missing trigger gives neither" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED; } ``` ```law test "removed exception restores presumption" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); assert convicted(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED; } ``` The counterfactual program differs only by the mutation named below; its scene: ```law test "contrary exception derives negation" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); assert convicted(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == FALSE_ONLY; expect evaluation_status == COMPUTED; } ``` ```python >>> import runpy >>> check = runpy.run_path("docs/recipes/d-evidence/resources/check.py") >>> check["check_variant"](https://github.com/arxohq/law/blob/master/docs/recipes/d-evidence/1) 'Д1: контрфактуал подтверждён; lawc = lawref' ``` ```python >>> import runpy >>> check = runpy.run_path("docs/recipes/d-evidence/resources/check.py") >>> check["check_expansion"](https://github.com/arxohq/law/blob/master/docs/recipes/d-evidence/1) 'Д1: expand показывает два правила; приоритет блокирующей оговорки отсутствует' ``` ## Counterfactual Diagnostic mutation (check) — LDC-E0201. Original fragment: ```text presume innocent(p); ``` Replacement: ```text presume innocent(p); scope accused(p); ``` The paired scenes above pin the change of outcome. ## Boundary The expansion is checked with the ordinary expand command: the rule and the defeater are visible; the absence of the prescribed priority is named below. This is not a definition of a criminal standard. Counterfactual mutation: `unless convicted(p);` → `unless convicted(p) then not innocent(p);`. For the blocking form, expansion shows the defeasible rule and the defeater, but no separate priority node; the blocking outcomes shown above are still correct. ## Pitfall Do not read a blocking proviso as asserting the opposite: it only lifts the presumption. Only a contrary proviso with an explicit `then not innocent(p)` establishes the negation.