PRICE-02: pin the modes-off identity with a digest that hides only the changed words
checks / unit (pull_request) Successful in 48m44s
infra-pin / fresh (pull_request) Successful in 2s

test_price_run_fixes.py part 5 and test_modes_p3.py part 1 compare the modes-off
replay with digests printed on older trees. The trade sentence now says
"price period", and a sale quotes another "above the cheapest" figure once the
first cheap period is over. ident.trade_digest() hides exactly those two
things; re-measured on e3e4ba6, 7a00f12, 90bc901 and this tree, the digests
are the same, so every command is unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
glenn schrooyen
2026-10-22 08:20:50 +02:00
co-authored by Claude
parent 4297f7f3f1
commit ecd9822861
3 changed files with 49 additions and 29 deletions
@@ -17,6 +17,7 @@ test_modes_p3.py part 1 holds this tree to the digests printed on 7a00f12.
import functools
import hashlib
import os
import re
import sys
import tempfile
import time
@@ -117,6 +118,28 @@ def digest(rows) -> str:
return hashlib.sha256(repr(rows).encode()).hexdigest()
def _trade_words(text):
"""PRICE-02: the trade sentence as release/1.0 before it printed it. The
plan now drops price periods that have ended, so a sale's "above the
cheapest" figure is a different number once the first cheap period is
over, and the sentences say "price period" where they said "hour". Both
maps are applied to both sides, so only those two things are hidden."""
text = text.replace("this hour is neither the buy hour nor the sell hour",
"now is not the cheapest or the dearest price period")
text = re.sub(r"[0-9]+\.[0-9]+ above the cheapest",
"N above the cheapest", text)
return text.replace("firm hour at", "firm price period at")
def trade_digest(rows) -> str:
"""`digest()` with the trade sentence passed through `_trade_words()`:
every command, integrator and allocation, and the action, watts and the
rest of the sentence, byte for byte."""
return digest([r[:-1] + (None if r[-1] is None else
(r[-1][0], r[-1][1], _trade_words(r[-1][2])),)
for r in rows])
def digests() -> dict:
return {k: digest(run(**v)[0]) for k, v in SCENARIOS.items()}