Skip to content
Event storming templates

Event Storm — Content Publishing with Model Moderation

Newsroom draft through classifier-based moderation to distribution, where the human moderator is declared but sits on no command — the review loop nobody modelled.

Template previewEvent storming
Content publishing — draft to distributionBounded contexts3Domain events7Event coverage85.7%Hotspots3Model smells1Domain eventCommandActorAggregatePolicyRead modelExternal systemHotspotEditorial2 events · 2 commands · 1 policy · 1 hotspotArticleModeration2 events · 1 command · 1 policy · 1 hotspotModeration caseDistribution3 events · 2 commands · 0 policies · 1 hotspotPublicationJournalistSubmit draftDraft submittedNewsroom queueEditorRequest legal reviewLegal reviewrequestedEmbargoed pieces sitin the same queue asbreaking newsWhen draft submitted,screen contentClassifier serviceScreen contentContent scoredContent escalatedToxicity modelendpointModel confidencebelow 0.6 — whodecides?When content scored,publish articleHuman moderatorPublishing servicePublish articleArticle publishedSummarisation serviceGenerate summarySummary generatedEngagement dashboardArticle syndicatedPush notificationserviceA retracted articlestays in therecommender indexWorkshop checksEvents with no producing command1Article syndicatedCommands with no resulting event0noneCommands with no aggregate0noneAggregates with no events0nonePolicies with a missing trigger event0nonePolicies with a missing command0noneHotspots per context3Editorial 1 · Moderation 1 · Distribution 1Cross-context flows2Editorial → Moderation · Moderation → Distribution

Make it your own.

title "Content publishing — draft to distribution"

context "Editorial"
  actor Journalist
  aggregate Article
  command "Submit draft" by Journalist on Article
  event "Draft submitted" from "Submit draft"
  readmodel "Newsroom queue"
  command "Request legal review" by Editor on Article
  event "Legal review requested" from "Request legal review"
  hotspot "Embargoed pieces sit in the same queue as breaking news"
  policy "When draft submitted, screen content" then "Screen content"

context "Moderation"
  aggregate "Moderation case"
  # Declared, and then never put on a command: the human-in-the-loop gap.
  actor "Human moderator"
  command "Screen content" by "Classifier service" on "Moderation case"
  event "Content scored" from "Screen content"
  event "Content escalated" from "Screen content"
  external "Toxicity model endpoint"
  hotspot "Model confidence below 0.6 — who decides?"
  policy "When content scored, publish article" then "Publish article"

context "Distribution"
  aggregate Publication
  command "Publish article" by "Publishing service" on Publication
  event "Article published" from "Publish article"
  command "Generate summary" by "Summarisation service" on Publication
  event "Summary generated" from "Generate summary"
  readmodel "Engagement dashboard"
  event "Article syndicated"
  external "Push notification service"
  hotspot "A retracted article stays in the recommender index"