coerce_payload was lowercasing payload.type ("PRICE" → "price") while
EventPayloadDescriptor.payload_type and ReportPayloadDescriptor.payload_type
passed the wire value through unchanged. The result was a within-event
mismatch that broke any consumer joining interval payload rows against
payload_descriptors[].payload_type by string equality (silent dict-lookup
miss). Preserve the wire case throughout so descriptor and payload sides
agree. Surfaced by the openadr3-ven-hass 0.4.0 → 0.4.1 incident.
Also: add CHANGELOG.md (Keep-a-Changelog format), document the
Trusted-Publisher release flow in CONTRIBUTING.md, link the changelog
from README, and update the payload-coercion table to reflect the new
pass-through behavior.
Fixes POA3-bp6.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>