Appearance
A warning that validates
An executor publishes exactly one kind of message on a skill's behalf: skill.warning.raised. Build it from the SOM 1.0 schema, not from the sample warnings in the skill files.
The skill library's samples don't validate
The 0.2.2 samples use a wrn-… warning_id (the schema wants a UUID), a null skill_warning_ref (it wants a string) and, in one skill, a system_type outside SOM's list. SOM 1.0 refuses all three, and so does the bus. Load Skill warning copied from the skill library sample in the Playground to see the verdict. RND's position: P-01.
The envelope
| Field | Value | Source |
|---|---|---|
som_version | "1.0.0" | SOM |
message_id | A UUID (UUIDv7 recommended), new per warning, and the same on a retry of that warning | SOM, P-10 |
correlation_id | The trigger's correlation_id: the story's | SOM |
causation_id | The trigger's message_id. Always set it, although SOM makes it optional | Skill library |
message_type | "skill.warning.raised" | SOM |
timestamp | When the evaluation produced the warning, RFC 3339 | SOM |
originating_system | A system_id your connection may stamp; a system_type from SOM's list | SOM, the bus, P-02 |
topic | "som.skill.warning.raised" | SOM (must start som.) |
system_type must be one of SOM 1.0's values. The library's own tool types (rundown, mam, playout, cms…) aren't, apart from graphics and archive, and are refused with envelope.enum. Which value to use is P-02.
The payload
All twelve required fields, and nothing the schema doesn't define.
| Field | Rule | Common mistake |
|---|---|---|
warning_id | A UUID (UUIDv7), new for each warning | "wrn-7f2c9a41", copied from the samples |
skill_id | The upstream id, smart-stories/<name>, never renamed | – |
skill_version | The version of the skill file you implement: "0.2.2" in this suite | "v2" |
story_id | The snapshot's story_id | – |
scope | story:<story_id>, asset:<asset_id> or link:<link_id> | An instance reference. SOM says never, although the schema only checks that it's a string |
severity | hold, flag or inform, lower case, within the skill's range | "FLAG", "warning" |
rule_id | The configured instance's label | – |
non_overridable | true for hold, otherwise false | Left out |
affected_fields | Field paths in the story, such as ["lifecycle.phase"] | – |
detail | Plain words: what was read, what it was compared with, and what clears it | – |
blocks | [] unless severity is hold; then what is withheld | Left out when empty |
skill_warning_ref | A string naming the declaration | null, copied from the samples. See P-09 |
message_type | Optional. If present, "skill.warning.raised" | A different value: refused with payload.message_type_mismatch |
A complete warning
raise-flag-on-match, configured instance house-breaking-indicative-category, triggered by snapshot 6 of the hurricane run:
json
{
"som_version": "1.0.0",
"message_id": "0199a1c4-7b90-7d12-9c3e-5a1f0b2c3d41",
"correlation_id": "0199a1c4-5b10-7c3a-9e4f-2a6b8c0d1e22",
"causation_id": "0199a1c4-7a2e-7b31-8c55-4d2f9e6a1b07",
"message_type": "skill.warning.raised",
"timestamp": "2026-09-11T16:41:00.412000Z",
"originating_system": { "system_id": "planning-01", "system_type": "ncs" },
"topic": "som.skill.warning.raised",
"payload": {
"warning_id": "0199a1c4-7b90-7d12-9c3e-5a1f0b2c3d42",
"skill_id": "smart-stories/raise-flag-on-match",
"skill_version": "0.2.2",
"story_id": "hurricane-2026-0911",
"scope": "story:hurricane-2026-0911",
"severity": "flag",
"rule_id": "house-breaking-indicative-category",
"non_overridable": false,
"affected_fields": ["lifecycle.phase"],
"detail": "indicative-category declared: lifecycle.phase reads BREAKING, which matches BREAKING. Cleared by an assertion at or above duty-editor on this story.",
"blocks": [],
"skill_warning_ref": "house-breaking-indicative-category/story:hurricane-2026-0911/1",
"message_type": "skill.warning.raised"
}
}Checkpoint
- [ ] My warnings pass the Playground:
warning_ida UUID,skill_warning_refa string,system_typefrom SOM's list. - [ ] Every warning carries the trigger's
correlation_id, and itsmessage_idascausation_id.
Next: How an executor behaves.