title field; option labels still use title. Match a poll with
content.pollMessageGuid. Match a selected option with
content.option.optionIdentifier, not its label — different options can have
identical labels.
Poll creation and option additions
Poll creation and option additions arrive ascontent.type === "poll", with
content.change set to "created" or "optionAdded". Both contain the full
current option set. An option addition does not represent a vote.
Votes
Votes and removed votes arrive ascontent.type === "poll_option", with
selected set to true or false. The nested content.poll retains the poll
GUID and option identifiers.
Compatibility
These identity fields are optional on shared Spectrum content because other providers can still supply polls without native identifiers. Thepoll(title, ...)
builder still requires a nonempty title for outbound polls. Native snapshots
with a poll GUID require distinct option identifiers, even when their labels are
equal.
The native app.webhook() handler preserves the same poll content types and
identifiers. Hosted delivery also requires the corresponding webhook-worker
update and SDK rollout; updating only the receiving application is not enough.
Previously skipped events are not automatically replayed.