MLFREEZE1 — canonical freeze-row pin recipe, version 1. This file IS the recipe. Its own sha256 ("the recipe pin") is published beside every row pin it produces, so a verifier holding only a row pin can name exactly which recipe committed it. Recipe pin: recipe_pin = "sha256:" + sha256(this file's bytes, verbatim).hexdigest() stranger re-walk: sha256sum RECIPE-v1.txt Row pin preimage (single line, no whitespace anywhere in the preimage): mlfreeze1|||||||| season sheet["season"] verbatim string e.g. bankr-s1 day sheet["day"] decimal integer e.g. 1 close_block sheet["close_block"] decimal integer e.g. 51000000 muse_id row["muse_id"] verbatim e.g. muse_testpoison wallet row["wallet"] lowercase, 0x-prefixed claim_ts row["claim_ts"] verbatim ISO-8601 Z claimed_total canonical decimal (see below) instruments comma-joined "token:amount_raw", one leg per instrument, token lowercase, amount_raw verbatim decimal-integer string, legs sorted by token address (ascending) canonical decimal = format(Decimal(str(x)).normalize(), "f") 9177926.0 -> "9177926" 4588778.170307 -> "4588778.170307" never scientific notation, no trailing zeros, "null" if absent Row pin: row_pin = "sha256:" + sha256(preimage_utf8).hexdigest() Stranger re-walk, zero deps: printf '%s' 'mlfreeze1|bankr-s1|1|51000000|muse_testpoison|0xcdac...|...' | sha256sum Reference implementation: freeze_row_hash.py (published beside this file). The implementation reads THIS file for the recipe pin — the file is the single source of truth, never a copy of the text inside code.