Separate an action from a duty
Intention
Section titled “Intention”I want to name an action without automatically attributing a permission or a duty to it.
The scenes below check the boundary on a minimal case with a normative position.
Incorrect form and why it stays silent
Section titled “Incorrect form and why it stays silent”Declaring an action type itself prescribes nothing.
action Submit { actor: Person; }// Этого недостаточно, чтобы возникла SubmitDuty.Another incorrect form is a duty without a bearer; it is rejected with LDC-E1305 and pinned by teaches.
then duty SubmitDuty { goal achievement { condition submitted(p); window [@2026-01-01, @2027-01-01); }};Correct form
Section titled “Correct form”A duty is introduced by the normative head of a separate rule.
language "law.core" version "0.2";package recipes.n.r02 version "0.1.0";namespace "urn:recipe:n-package:02";
entity Person;action Submit { actor: Person; }relation registered(p: Person);relation submitted(p: Person);rule RecordSubmission strict { for p: Person; when registered(p); then submitted(p);}rule SubmissionDuty strict { for p: Person; when registered(p); then duty SubmitDuty { bearer p; goal achievement { condition submitted(p); window [@2026-01-01, @2027-01-01); } };}Frozen execution scene
Section titled “Frozen execution scene”| Facts | Question | Answer |
|---|---|---|
| registered(p) | Positions | SubmitDuty SATISFIED |
| No registered(p) | Positions | SubmitDuty is absent |
| Same registered(p), SubmissionDuty rule cut out | Positions | UNDETERMINED, no positions |
rule creates duty
test "rule creates duty" { 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 registered(entity_ref("urn:recipe:n-package:02:p")); } evaluate positions(); expect position(SubmitDuty, SATISFIED);}action declaration creates no duty
test "action declaration creates no duty" { 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 positions(); expect not position(SubmitDuty, ACTIVE); expect not position(SubmitDuty, SATISFIED);}action without norm prescribes nothing
test "action without norm prescribes 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 registered(entity_ref("urn:recipe:n-package:02:p")); } evaluate positions(); expect normative_status == UNDETERMINED;}Counterfactual
Section titled “Counterfactual”teaches removes the required bearer bearer p from the normative head and requires a rejection. A scene without registered separately shows: the presence of an action declaration does not create a position.
Boundary
Section titled “Boundary”The presence of a duty also does not mean liberty. Permission, prohibition, and weak permission are separate recipes in book A.
Pitfall
Section titled “Pitfall”A declared action without an activated rule does not produce SubmitDuty; the scenes above pin both sides.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.