docs← Back to article

Markdown for LLMs

Prohibition pitfalls

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

Download this articlePlain text ↗
# Prohibition pitfalls

Wrong forms, silent outcomes, `LDC-E` diagnostics, typical formalizer
mistakes, and how to detect them.

## 1. Duplicating a prohibition with a paired duty

An established action fact inside the window gives `VIOLATED` of
the prohibition itself — a paired duty next to it gives a second `VIOLATED` for the same breach, and
`positions` carries two breaches instead of one. New packages
do not introduce pairs.

## 2. A norm boundary in the goal window

A norm in force since March 1 is written `effective [@2026-03-01, infinity);`
on the rule; the goal window is the performance deadline. At `legal_time`
outside `effective` there is no position at all; at `legal_time` outside `window` there is one —
`PENDING` before and `UNDETERMINED`/`EXPIRED` after. Different answers: "no norm yet"
and "the deadline has not started". Putting the enactment date into `window`
gets `PENDING` where there should be no position.

## 3. A quiet window is not compliance

After the window with no monitoring certificate, no closure policy over the whole window, and no
adjudication — `UNDETERMINED`, not `SATISFIED`. Absence of
proof of performance is not compliance — mirroring the achievement rule
(absence of proof of non-performance is not a breach). A quiet error:
a test with `expect position(X, SATISFIED)` after the window fails, and the failure reads as
an engine defect.

## 4. Tautological goal

A `condition` repeating the rule premise (`condition contract_signed(s, c)`
with `when contract_signed(s, c)`) is established when the position is created —
always `SATISFIED`, the duty requires nothing. The form is not silent: `LDC-E1371`
(warning)
names the goal, the condition, and the rule. A composite condition is checked leaf by leaf;
`forbearance` is not part of the form — a prohibition's subject is an action,
not a condition.

## 5. Liberty with no priority is conflict, not victory

Forbearance and liberty over the same action for one subject with overlapping
windows and no priority give `UNRESOLVED_NORMATIVE_CONFLICT`, and both positions
stand. Expecting "permission defeats prohibition" by itself mistakes
the direction: priority wins (`DEFEATED` for the loser),
not modality. The weak-permission query and the conflict rule read the same
prohibition (see the [liberty page](/constructs/liberty-immunity/)).

## 6. A window boundary is a value, not a name

A bare name as a boundary (`window [moment, infinity)`) is rejection `LDC-E2115`;
a term-built window with no deadline policy is `MISSING_POLICY`. Boundaries are
literals, rule variables, `infinity`/`-infinity`, or terms with a policy.

## 7. Incomplete prohibition — `LDC-E1305`

A `prohibition` without an addressee, without an `action`, or without a
`window` is rejection `LDC-E1305` for each missing field.
Detection: `law engine check` lists every missing field — read the whole
list, not the first item.