# Choose a sanction amount ## Intention I want to bind the sanction amount to explicitly given mitigating circumstances. Unknown mitigation does not pick a number. ## Incorrect form and why it stays silent ```text title="Incorrect form" // Смягчающее обстоятельство неизвестно: автоматически назначают 100. ``` Absence of information about mitigation is not a negative fact. The numbers 100 and 40 are a synthetic unit scale chosen by the author of two rules, not a built-in tariff. ## Correct form ```law language "law.core" version "0.2"; package recipes.zh.r04 version "0.1.0"; namespace "urn:recipe:zh-violation:04"; entity Person; relation enrolled(p: Person); relation done(p: Person); relation mitigated(p: Person); relation amount(p: Person, units: Integer); relation paid(p: Person, units: Integer); rule Ordinary strict { for p: Person; when enrolled(p) and not mitigated(p); then amount(p, 100); } rule Reduced strict { for p: Person; when enrolled(p) and mitigated(p); then amount(p, 40); } rule Impose strict { for p: Person; for units: Integer; when amount(p, units); then duty Fine { bearer p; achieve paid(p, units) during [@2026-09-01, @2026-09-10]; }; } ``` ## Frozen execution scene | Facts and snapshot | Question | Answer | |---|---|---| | mitigation established; 2026-09-13 | `truth(amount(entity_ref("urn:recipe:zh-violation:04:p"), 40))` | `truth_status == TRUE_ONLY;` | | mitigation refuted; 2026-09-13 | `truth(amount(entity_ref("urn:recipe:zh-violation:04:p"), 100))` | `truth_status == TRUE_ONLY;` | | no information; 2026-09-13 | `positions()` | `not positions_present();` | | paid on the reduced scale; 2026-09-13 | `positions()` | `position(Fine, SATISFIED);` | ```law test "established mitigation selects lower tariff" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:04:p")); assert mitigated(entity_ref("urn:recipe:zh-violation:04:p")); } evaluate truth(amount(entity_ref("urn:recipe:zh-violation:04:p"), 40)); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED; } ``` ```law test "refuted mitigation keeps base tariff" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:04:p")); assert not mitigated(entity_ref("urn:recipe:zh-violation:04:p")); } evaluate truth(amount(entity_ref("urn:recipe:zh-violation:04:p"), 100)); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED; } ``` ```law test "no data creates no position" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:04:p")); } evaluate positions(); expect not positions_present(); expect evaluation_status == COMPUTED; } ``` ```law test "payment on reduced scale satisfies" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:04:p")); assert mitigated(entity_ref("urn:recipe:zh-violation:04:p")); assert paid(entity_ref("urn:recipe:zh-violation:04:p"), 40); } evaluate positions(); expect position(Fine, SATISFIED); expect evaluation_status == COMPUTED; } ``` ## Counterfactual Diagnostic mutation `then amount(p, 40);` → `then amount(p, "forty");`: LDC-E2104. Semantic differences are pinned as separate scenes. ## Boundary enrolled here means an established ground for imposing a sanction; the elements and causal link are given by the previous layer. Money units, rounding and upper bounds are covered by the calculation recipes. Two opposite facts about mitigation need a separate resolution.