docs← Back to article

Markdown for LLMs

Lifecycle boundaries

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

Download this articlePlain text ↗
# Lifecycle boundaries

What the construct does NOT do in 0.2: scope,
reserved values, neighbouring constructs, and the selection rule.

## Does not

- **Not produce `expired` on a duty.** The API value exists; the ladder
  never gives it: the post-window answer is the lifecycle outcomes.
- **Not produce `available`/`exercised`/`validly_exercised` on a power.**
  Exercise validity is an event property, not a position status:
  an invalid attempt gives the `invalidly_exercised(position)`
  literal and issue `POWER_INVALID_EXERCISE`; a valid one silently materializes the effect.
  The listed values are reserved by syntax, but no
  implementation produces them (a test passes vacuously).
- **Not thaw frozen transformations.** A refused power and an
  immunity-blocked effect create nothing; the power itself
  stays `ACTIVE` (the locks are on the effect).
- **Not mix days.** With a date-moment, a status changing inside the day
  (activation, window expiry, lifting) gives refusal `AMBIGUOUS_AS_OF`, not
  an "end of day" answer: the case must name a moment.
- **Not read `legal_time` for statuses.** The law axis selects editions;
  the decision axis is `decision_time`. Coinciding dates are a special case,
  not the rule.
- **Not derive completeness from silence.** Neither a closed window nor an absent
  counterexample proves anything by itself: support,
  a certificate, closure, or a decision is needed.

## Reserved and closed

- `NormativeStatus`: `UNDETERMINED`, `CONFLICTED`, `DEFEATED` — API values over
  status kinds; `CONFLICTED` requires `normative_status_supports`.
- `DEFEATED` is not a lifecycle kind: it is absent from `statusHistory`, there is no
  transition into it — a position is created that way.
- Suspension shifts the window end by the total length of the suspensions covering the window;
  `waived`/`terminated` outrank
  `satisfied`/`violated`/`expired`; `terminated` never becomes
  `expired`; a partial waiver (`violation`) excludes only the breach.

## Neighbours and the selection rule

- The status ladder vs the std waiver/suspension/termination acts: the first is what became of the position;
  the second is what did it (who, when, in what scope). A status without an act is
  the engine's conclusion; an act without a status is silence until the ladder is recomputed.
- `violated(P)` vs a subject-matter predicate (`*_violated(...)`):
  the first is the engine's fact about a position, the second is the author's fact about the world. Breach
  chains build from the first.
- `DEFEATED` vs `CONFLICTED`: defeated ground
  (the position is gone) vs incompatible supports (the position stands, the law argues).
- Condition activation vs event activation: "true now" vs
  "exactly when"; an event gives the addressee, a window from `e.time.start`, and
  an instance per addressee — before the first addressee there is no instance at all.
- `positions()` vs `truth()` vs `why_not`: the norm's fate vs the world's fact vs
  the explanation of absence.