docs← Back to article

Markdown for LLMs

nb-21 solutions — Positions live, files move, readings decide

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

Download this articlePlain text ↗
# nb-21 solutions — Positions live, files move, readings decide

*Checkable against `law test packs/examples/language-demo/lifecycle`
(25 checked, 25 passed) and
`law test packs/examples/language-demo/lifecycle_stages`
(5 checked, 5 passed). Identifiers and code as written.*

## 1. Which single fact turns revocation to NEITHER

**Answer: the sublet fact (`sublet-ann`); the `power without grounds
does not operate` test already proves the outcome.**

`StallRevocation` needs two things at once: the exercise event
(`revocation_notice`) and the gate (`valid_when (stall_sublets(a))`).
The notice alone only records an attempt. Remove `stall_sublets(ann)`
and the gate fails, no constitutive step runs, and
`stall_revoked(ann)` is NEITHER. The without-grounds test is exactly
that configuration (open permit, office, notice, no sublet →
NEITHER).

## 2. Why the gated sealing changes nothing

**Answer: the token `terminate` in `effect terminate(...)`; the run
records `NON_EXECUTABLE_RULE`; a second sealing order changes
nothing observable.**

`SealStall` passes its gate (`stall_sublets(a)` holds), so this is not
an invalid exercise — it is a valid attempt with a non-executable
effect form. The 0.1 subset executes only `create`: the engine warns
`NON_EXECUTABLE_RULE` once per position–event pair, keeps the event,
produces no `invalidly_exercised`, and leaves `stall_permit_open(ann)`
TRUE_ONLY. A second `sealing_order` is the same pair again — the
warning is not multiplied and still no effect is created, so both
expects (`truth_status == TRUE_ONLY`, `issue(NON_EXECUTABLE_RULE)`)
hold unchanged.

## 3. Why the open question is an issue, not NEITHER

**Answer: the group selects `exactly_one`, so an unselected choice is
a missing decision the engine must name — `INTERPRETATION_REQUIRED`;
the main route is unaffected, proved by `main route needs no
reading`.**

NEITHER would mean "the rules ran and concluded nothing". Here the
rules cannot run at all: neither `NarrowReading` nor `BroadReading`
may fire without selection, and guessing one would invent law. So the
engine reports the cause as an issue on the storage query. That the
missing choice pollutes nothing is proved separately: `main route
needs no reading` selects no interpretation and still derives
`DecideStall` ACTIVE (with `NoSublet` ACTIVE beside it) — the duties
never read `storage_covered`.

## 4. Who decides Bob's overnight right

**Answer: the `SubletsLoseOvernight` rule decides — `overnight_right(bob)`
is FALSE_ONLY — and `PNight` does not cover him because his defendant
fact takes him out of the precedent's fact pattern.**

Bob keeps his pitch (plaintiff fact, matching `PNight`) but also
sublets it (defendant fact `sublets_pitch`). The precedent's outcome
follows only where its plaintiff pattern holds alone — Ann's case
(`precedent followed`, TRUE_ONLY). For Bob the distinguishing rule
fires on the defendant fact and concludes `not overnight_right(bob)`,
hence FALSE_ONLY. Following is for the same-sided case;
distinguishing is for the case with the extra losing fact.

## 5. Adding a procedure to the stages package

**Answer: it fails at the static check, `law engine check`, with
`LDC-E4126` (`STAGE_PROCEDURE_UNSUPPORTED`).**

A stage and a procedure in one program are refused before any test
runs: the tour fold the stage needs is undefined alongside a
procedure automaton. The committed probe
`packs/examples/language-demo/lifecycle/evidence/snippets/stage-procedure.law.txt`
(a stage plus a minimal two-state procedure) is refused with
`error LDC-E4126`, exit 1. No `law test` line is reached — the
program does not compile, so there is nothing to execute. This is an
implementation-support fact about the verified profile
(`law 0.1.0`, `law.core/0.2`), not a language-wide claim.