Every quote, policy check, approval and order appends a plain-language entry. Chain: hash = SHA-256(prevHash + RFC8785(entry)).
8/8Verify again. The edited entry's recomputed hash (f6c4f2f5) no longer matches, so the chain breaks there and everything after it is suspect: chain.valid: false.
Kitchen reads its own entries via slip; Valio operator sees the full chain in demo mode
Confirmations carry auditEntryId; carts share traceId with OpenTelemetry
Oversized cancel text → invalid_reason (no log stuffing)