Help us improve
Share bugs, ideas, or general feedback.
From mermaid-event-model
Validates Event Model DSL files (Mermaid eventModel diagrams in Markdown) for information completeness, tracing UI and read model fields back to events and commands with no gaps.
npx claudepluginhub howarddierking/mermaid-event-modelHow this skill is triggered — by the user, by Claude, or both
Slash command
/mermaid-event-model:validate-completenessThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are analyzing an Event Model DSL file to verify it satisfies the **information completeness principle**: every field in every view must be traceable to an event, and every event must be reachable through a command. The blueprint must account for all information — no implicit data, no hidden side effects, no assumed fields.
Applies C++ Core Guidelines to write, review, or refactor C++ code. Enforces modern, safe, and idiomatic practices for C++17/20/23.
Share bugs, ideas, or general feedback.
You are analyzing an Event Model DSL file to verify it satisfies the information completeness principle: every field in every view must be traceable to an event, and every event must be reachable through a command. The blueprint must account for all information — no implicit data, no hidden side effects, no assumed fields.
Reference: https://www.pradhan.is/blogs/event-modelling-best-practices
Read the DSL file at: $ARGUMENTS
If no argument is provided, default to blueprint_dsl.md in the project root.
DSL files are markdown. Each one is a .md file whose DSL lives inside a fenced ```mermaid block whose first content line is eventModel. When analyzing for completeness, focus on the lines INSIDE that fence — they hold the element declarations, data sections, and edges. The markdown structure outside the fence is descriptive prose and doesn't affect traceability.
Three rules must hold:
Field traceability — Every field displayed in a UI or present in a read model must originate from a domain event earlier in the flow. If a UI shows a field that no upstream event carries, the model is incomplete.
Command-to-event connection — Every command must produce at least one domain event. Every domain event must be reachable from a command (or from an external system event). No hidden side effects.
No assumed information — Data dependencies cannot be implicit. If a read model needs a field, an event must supply it. If a UI displays a field, a read model or event must carry it. Implementation cannot be left to "figure it out."
Work backward through the data flow — start from what the user sees (UIs) and trace each field back to its source.
Extract all elements with their types, fields, and edges. Build a dependency graph.
For every field in a UI element:
For every field in a read model:
For every field in a domain event:
UUID identifiers, timestamp fields like registeredAt, bookedAt). System-generated fields are fields that the system produces at event-creation time rather than receiving from user input.For every field in a command:
string can carry a UUID value).guestId: UUID in an event can originate from a command that also has guestId: UUID, even if the UI that triggered the command doesn't have it — as long as SOME upstream element in the chain provides it.*Id: UUID, *At: timestamp, *edAt: timestamp) are allowed to appear in events without a command source. Flag them as "system-generated" rather than "missing."Present the results as a structured report:
State whether the model is complete or has gaps, with a count of issues found.
For each UI, list every field and its trace path:
UI: "Booking Screen" (booking_ui)
roomId: UUID
<- readModel "Room Availability" (avail) [roomId: UUID] OK
<- domainEvent "Room Added" (ra) [roomId: UUID] OK
roomType: string
<- readModel "Room Availability" (avail) [roomType: string] OK
<- domainEvent "Room Added" (ra) [roomType: string] OK
checkIn: date
<- (no upstream read model carries this field) GAP
Collect all gaps into a single list with:
checkIn: date to the Room Availability read model" or "add a new event that carries this field")List any elements with no incoming or outgoing connections where expected.