docs← Back to article

Markdown for LLMs

Separate an action from a duty

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# Separate an action from a duty

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

Declaring an action type itself prescribes nothing.

```law title="Incorrect form"
action Submit { actor: Person; }
// Этого недостаточно, чтобы возникла SubmitDuty.
```

Another incorrect form is a duty without a bearer; it is rejected with LDC-E1305 and pinned by teaches.

```text title="Incorrect form"
then duty SubmitDuty {
    goal achievement {
        condition submitted(p);
        window [@2026-01-01, @2027-01-01);
    }
};
```

## Correct form

A duty is introduced by the normative head of a separate rule.

```law
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

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

```law
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);
}
```

```law
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);
}
```

```law
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

`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

The presence of a duty also does not mean liberty. Permission, prohibition, and weak permission are separate recipes in book A.

## Pitfall

A declared action without an activated rule does not produce SubmitDuty; the scenes above pin both sides.