# Public vocabulary contract: labparcels.iface

> Filled example. This record covers the shared vocabulary of the fictional
> parcel fixtures. The engine never reads this file: it records the
> stability promises the team makes to consumers, not a package format.

- Package: labparcels.iface
- Version this contract describes: 0.1.0
- Owner: Lab team (fictional)
- Status: active
- Last reviewed: 2026-10-03

## 1. Promise

Within the version named above, consumers may rely on:

- the names and shapes listed in section 3 (no silent renames, no silent
  widening or narrowing of a field);
- the identity rules in section 4 (a name keeps meaning what it meant);
- the label standing in section 5 (each public name says which words are
  official and which are translations).

Anything not listed here is internal and may change without notice.

## 2. Versioning

- Versions are selected explicitly by each consumer; nothing upgrades a
  consumer automatically.
- Additive releases (new names only) keep every promise above.
- Any other change ships as a new contract version with a vocabulary
  decision record explaining what moved and why.
- The deprecated standing means: no new consumers, existing consumers get
  two releases to move.

## 3. Declared words

Entities (things with identity):

| Name | Meaning in one sentence | Standing |
|---|---|---|
| Parcel | a registered land unit | stable |
| Owner | a person or body holding a parcel | stable |

Relations (how things connect; mark the key fields consumers join on):

| Name | Arguments | Key | Meaning in one sentence |
|---|---|---|---|
| owns | owner, parcel | parcel | the owner holds the parcel |

Enums and constants (closed choices and fixed values):

| Name | Members or value | Meaning in one sentence |
|---|---|---|
| ParcelKind | residential, commercial, garden | use class of a parcel |

## 4. Identity rules

- Each declared name keeps one stable identity across releases; spelling
  variants of one member (dotted, bare, qualified) are the same member.
- A rename keeps the old name as a documented alias for two releases,
  or ships with a recorded decision and a major version step.
- Subtypes never silently change parents; key fields never silently change.

## 5. Labels

- Every public name carries labels saying the language and the standing
  of the wording (official, unofficial, or translation).
- Templates that turn a relation into a sentence name every argument, so
  generated answers read correctly in each supported language.
- Missing wording degrades to plain text; the engine never invents wording.

## 6. What consumers must do

- Import the words; never redeclare them locally under the same meaning.
- Treat the key as a functional dependency: the key fields determine
  the row, so a join outside them is underdetermined. Join on stable
  typed IDs; never on label text or declaration order.
- Record the exact vocabulary version in the consumer lockfile.

## 7. Verification on record

```text
law test labparcels.iface: world labparcels.iface
  ok   [labparcels.iface#authored] tests/01-owns-ok.lawtest / urn:lab:parcels:iface:owns-ok
  ok   [labparcels.iface#authored] tests/02-owns-unknown.lawtest / urn:lab:parcels:iface:owns-unknown
total: 2 checked, 2 passed, 0 failed, 0 not run; code 0
```

```text
1. producer: "urn:law:lab:parcels:registry#RegistrationComplete" | strength: "strict" | polarity: "positive" | anchors: [{"act":"urn:law:lab:parcels:registry#PARCEL_REGISTRY_RULES","anchor":"urn:law:lab:parcels:registry#PARCEL_RULE_1","locator":"article/1","path":"labparcels.registry.lawir.json"}]
   nodes: urn:law:lab:parcels:registry#PARCEL_REGISTRY_RULES, urn:law:lab:parcels:registry#PARCEL_RULE_1, urn:law:lab:parcels:registry#RegistrationComplete, urn:law:lab:parcels:registry#kind_of, urn:law:lab:parcels:registry#registered
   label: Parcel Registry Rules (fictional training text)
   file: labparcels.registry.lawir.json
   file: labparcels.registry.lawir.json
   source: article/1 — labparcels.registry.lawir.json
   label: recorded kind of the parcel
   file: labparcels.registry.lawir.json
   label: parcel is registered
   file: labparcels.registry.lawir.json
Rows: 1; packages in snapshot: 1.
```

```text
1. reader: "urn:law:lab:parcels:registry#RegistrationComplete" | context: "body.items[1].formula" | polarity: "positive" | package: "urn:law:lab:parcels:registry"
   nodes: urn:law:lab:parcels:iface#owns, urn:law:lab:parcels:registry#RegistrationComplete
   label: owner holds the parcel
   file: deps/labparcels.iface.lawir.json
   source: article/1 — deps/labparcels.registry.lawir.json
2. reader: "urn:law:lab:parcels:registry#TransferGranted" | context: "body.items[2].formula" | polarity: "positive" | package: "urn:law:lab:parcels:registry"
   nodes: urn:law:lab:parcels:iface#owns, urn:law:lab:parcels:registry#TransferGranted
   label: owner holds the parcel
   file: deps/labparcels.iface.lawir.json
   source: article/2 — deps/labparcels.registry.lawir.json
Rows: 2; packages in snapshot: 5.
```

## 8. Decision log

| Date | Change | Record |
|---|---|---|
| 2026-10-03 | adopted ParcelKind as a closed three-member enum | filled vocabulary-decision-record |
