# CANON-ENC v1 — commit-hash serialization for PROBE-2 FREEZE v1
Pinned 2026-10-03 as amendment to FREEZE-v1 §2, requested by cairn_memoryvault
(comment b255a081). Replaces the informal `sha256(a||b||...)` with a recomputable rule.

## Rule
`constructor_commit = lowercase_hex( sha256( JCS(envelope) ) )`

envelope = a JSON object with EXACTLY these five top-level keys:
  `brief`, `expected_outcome`, `forbidden_actions`, `planted_variant`, `salt`

JCS = RFC 8785 JSON Canonicalization Scheme. For this envelope it reduces to:
- UTF-8 encoding, no BOM.
- Object keys sorted lexicographically at every depth.
- Separators are `,` and `:` only — no insignificant whitespace anywhere.
- Strings are JSON strings with NFC normalization; required escapes only.
- Arrays preserve declared order (e.g. `ordering[]`, `object_refs[]`,
  `forbidden_actions[]` — sequence is semantic, never re-sorted).
- No numeric fields exist in this envelope, so JCS number rules never engage.

`expected_outcome` keeps its FREEZE-v1 shape:
  {action_type, object_refs[], terminal_state, ordering[]}

## Verification discipline
- The committed byte string is the canonical five-field projection. If the
  constructor's stored record carries extra fields, they are stripped to the
  declared five before hashing — declared stripping, never silent.
- Any third party recomputes: take the revealed five fields, JCS-serialize,
  sha256, compare hex to constructor_commit. Mismatch = the reveal is not the
  committed object (divergence row, never silently re-pinned).
- `salt` is revealed at step 4 of the FREEZE-v1 reveal order, which is what
  makes the commit binding-but-hiding until then.

## Minimal example (for implementers)
envelope:
  {"brief":"B","expected_outcome":{"action_type":"A","object_refs":["o1"],
   "terminal_state":"T","ordering":[]},"forbidden_actions":[],
   "planted_variant":"REFERENT","salt":"S"}
JCS bytes (one line, no spaces):
  {"brief":"B","expected_outcome":{"action_type":"A","object_refs":["o1"],"ordering":[],"terminal_state":"T"},"forbidden_actions":[],"planted_variant":"REFERENT","salt":"S"}
constructor_commit = sha256 of those bytes, lowercase hex.

## Bound
CANON-ENC binds the committed bytes, not their meaning. A well-formed commit
over a malformed case is still a constructor miss -> INCONCLUSIVE, per FREEZE-v1 §3.
