1## ADDED Requirements23### Requirement: Packs MAY declare a validated custom-property glossary45The loader SHALL validate and preserve an optional `properties` glossary.6A pack MAY declare it as a map from uppercase custom property tokens to7`{ accent, describe }`, and the loader SHALL accept only the documented accent8tokens and descriptions of 80 characters or fewer, reject unsupported fields9and malformed values atomically, and preserve valid glossary data through10normalization, catalog views, CommonJS export, and data-only sharing.1112#### Scenario: A valid glossary survives loading and sharing1314- **WHEN** a pack declares `TICK` with accent `tick` and a 55-character15 description16- **THEN** loading succeeds and the same normalized glossary is present in the17 catalog view, exported CommonJS data, and decoded shared payload1819#### Scenario: A malformed glossary leaves the catalog unchanged2021- **WHEN** a pack declares an unsupported accent, an empty description, an22 overlong description, or an unknown glossary field23- **THEN** loading or installation fails with a field-specific error and no24 pack or active-level catalog state is mutated2526### Requirement: A level's implemented custom properties SHALL be data-driven2728The host SHALL derive the current level's implemented custom-property set from29its normalized automaton property declarations. Glossary metadata SHALL affect30presentation only; it SHALL not create parser predicates or engine behavior.3132#### Scenario: A non-TICK automaton property is implemented locally3334- **WHEN** a level declares an automaton with property `WIND` and contains the35 word `WIND`36- **THEN** `WIND` is exposed to presentation as a custom property for that37 level, while a glossary entry for an unrelated word does not change rules3839#### Scenario: A legacy pack has no glossary4041- **WHEN** a valid pack omits `properties`42- **THEN** loading succeeds with an empty glossary and existing core and43 automata behavior remains unchanged4445### Requirement: Declared custom properties SHALL render consistently4647The board and rule ledger SHALL classify every current-level implemented custom48property as a property tile, using its glossary accent when present and the49documented TICK-lime fallback when absent. The same property classification and50accent SHALL be used by accessible rule details.5152#### Scenario: A custom property is visible as a property tile5354- **WHEN** the board contains `MOUSE IS WIND` and the level implements `WIND`55 with glossary accent `push`56- **THEN** the `WIND` word and its ledger predicate use the chamfered property57 tile treatment and push accent, rather than noun styling5859#### Scenario: D21 beat presentation remains independent6061- **WHEN** an active TICK automaton advances a beat62- **THEN** its accepted current/next beat strip and cue behavior remain63 unchanged while the shared property metadata supplies only word styling and64 details6566### Requirement: The first custom-property encounter SHALL teach the word6768The stage SHALL request an acknowledgement card before accepting proof input69when a player enters a proof containing a glossary-described custom property.70The card SHALL contain the pack ID, property word, tile accent, description, an71example sentence using a visible level noun, and an accessible equivalent.72Encounter state SHALL persist by pack ID and property word.7374#### Scenario: The first encounter shows a teach card7576- **WHEN** the player enters the first proof in pack `clockwork` containing77 described property `TICK`78- **THEN** the card appears before play with the TICK tile, its description,79 and an example such as `MOUSE IS TICK`, and ENTER acknowledges it8081#### Scenario: Acknowledgement suppresses repeats within a pack8283- **WHEN** the player acknowledges TICK and enters another Clockwork proof84 containing TICK85- **THEN** the card does not appear again for Clockwork while the description86 remains available through details8788#### Scenario: The same word in another pack is independent8990- **WHEN** another pack introduces its own described TICK property91- **THEN** that pack may show its own first-encounter card independently9293### Requirement: Inspect and ledger details SHALL expose custom descriptions9495Inspect mode and the ledger's hover or keyboard-focus details affordance SHALL96expose the property word and glossary description after or without the teach97card, without changing simulation state or progress.9899#### Scenario: Details remain available after acknowledgement100101- **WHEN** the player acknowledges the TICK card and opens details for TICK102- **THEN** accessible text includes `TICK` and its glossary description, and the103 engine snapshot and move count are unchanged104105### Requirement: W12 SHALL defer pair mechanics106107This change SHALL not implement or infer `level.pairs`, OPEN/SHUT contact108effects, entry overrides, or pair-specific animation. Those behaviors SHALL109remain subject to the separate W13 contract.110111#### Scenario: Pair data is not silently executed by W12112113- **WHEN** a pack contains draft OPEN/SHUT pair data114- **THEN** W12 does not execute a pair effect or alter contact resolution, and115 the pack is handled according to the separately versioned W13 capability