1## Context23The current loader validates `manifest.engine` as the data/schema version and4defaults an omitted value to `MOD_SCHEMA_VERSION`. It has no equivalent field5for behavioral semantics. W6 changes precedence, transform reading order, and6contact order while preserving the existing manifest shape, so an old pack7needs an explicit compatibility signal.89## Decisions1011### A monotonic integer revision1213The host exports one current rules revision, `CURRENT_RULES_VERSION = 2`.14Revision `2` means the post-W6 contract: PUSH precedence over STOP, defeat15before win, `X IS X` self-blocking, reading-order transform conflicts, one-link16transform chains per turn, and complete `AND` noun reading. Future semantic17changes bump the integer. This field is deliberately separate from18`manifest.engine`, which continues to describe the validated data API.1920`manifest.rules` is a positive integer no greater than the current revision.21Non-integers, zero, negative values, and other types are validation errors.22A value greater than `2` is rejected as an unsupported future rules revision;23the loader must fail before it registers any part of the pack.2425### Missing means legacy revision one2627An omitted `manifest.rules` is interpreted as revision `1`, the pre-W6 rules28contract. Normalization materializes the effective revision so local imports,29shared decoding, CommonJS export, catalog records, pack-service preview views,30and cloned or persisted views agree. Every projection boundary, including31`manifestFromView()` and `createPackView()`, must carry `rules` forward instead32of rebuilding a manifest that drops it. The engine still runs the current rules33implementation; this revision is a compatibility declaration and does not34select an alternate simulator.3536First-party packs that are authored for the current runtime declare37`rules: 2` explicitly. Imported packs without the field stay usable and receive38the legacy note below.3940### One transient pack-level warning4142For an effective revision below the host revision, diagnostics returns one43bounded warning with the pack identity and source detail. Its player message is44exactly:4546> This pack was made for older rules; some proofs may play differently.4748The warning is nonfatal and appears in both local CommonJS and data-only shared49previews. It uses the existing warning envelope, with `word: 'RULES'`,50`levelId: null`, `levelTitle: null`, and `sentence: null`; `detail` identifies51`manifest.rules`, the effective revision, and the current revision. It is52emitted once per preview, not once per proof, and does not count authored53levels as separate warnings. The warning is recomputed on preview and is never54copied into normalized authored data, catalog records, snapshots, exports, or55shared payloads.5657### Keep preview and installation atomic5859Validation happens before catalog registration. An unsupported future revision60returns the normal structured pack error and leaves the catalog unchanged. A61known older revision returns `errors: []`, installs normally when selected, and62retains the effective revision in the pack's normalized manifest.6364## Risks and mitigations6566- Existing packs omit the field. Treating absence as revision one preserves67 loading while making the semantic mismatch visible.68- A warning can be mistaken for a compatibility mode. The message and docs say69 the current rules run; no legacy simulator is introduced.70- Local and shared paths can drift. Run the same fixtures through `loadMod`,71 `decodeSharedPack`, and pack-service previews, then compare warning envelopes72 and normalized manifests.73- First-party world packs may be edited by their owners. Ask each owner to add74 `rules: 2` rather than mutating team-owned pack files in this change.7576## Non-goals7778- Reimplementing pre-W6 rules or adding a rules-version switch to the engine.79- Changing `manifest.engine`, share envelope version, feature negotiation, or80 warning thresholds for long proof titles.81- Changing puzzle content, solver search semantics, or presentation copy beyond82 the one compatibility note.