The sender already carries moved_to_agent reasons, but the public PSA template discarded them and described every resolved occurrence as recovered. Preserve each member's reason and successor, explain mixed and unknown outcomes, and exercise copied templates through the real sender plus the shipped Markdown renderer.
Contract-Neutral: Existing webhook help and copied-template regression coverage only; no runtime, endpoint, schema or delivery policy change.
Change-source: pulse-maintainer
The first exact-parent recipe correctly exposed unsafe copied alert strings but also failed a Unicode fixture because the real sender rounds numeric values to one decimal. Retain that failure, expect the existing rounded values explicitly and leave production behaviour and the verified documentation unchanged.
Contract-Neutral: Test expectation repair for existing sender rounding; no runtime, template or delivery contract delta.
Change-source: pulse-maintainer
The first custom-template example contradicted its own jsonString guidance. Quotes, backslashes, line breaks or JSON member syntax in real alert text could reject the request or alter its payload although a simple test message worked. Escape both string fields, preserve the numeric value and direct structured group consumers to the existing PSA example. Exercise the actual copied template through signed firing and recovery deliveries and the shipped document renderer.
Contract-Neutral: Documentation and tests describe the existing JSON template helper and sender behaviour; no notification runtime or delivery contract changes.
Change-source: pulse-maintainer
The legacy correlation header omits occurrence start, severity and group members. Show receivers the existing full-precision member data, preserve later incidents and severity updates, and test the copyable templates through the actual signed sender. Keep the freshness verifier and runtime wire format unchanged.
Contract-Neutral: Help, executable examples, tests and sender comments only; notification behaviour, schemas and webhook headers are unchanged.
Change-source: pulse-maintainer