Mermaid guide

Mermaid Requirement Diagram: Requirements, Elements, and Traceability Links

The requirement diagram follows SysML: boxes for requirements with an ID, text, risk level and verification method, plus elements that implement them, connected by named traceability relationships. It is the Mermaid type to reach for in compliance docs, safety cases, and any spec where "which test covers this requirement" is a real question.

Requirement types are fixed keywords; relationship names are fixed too. That rigidity is the point: a reviewer can scan for every requirement without a verifies link.

  • compliance documentation
  • safety-critical specs
  • requirement traceability
  • audit artefacts

Example

Mermaid Requirement example

«refines»

«traces»

<<Requirement>>

share_diagram

ID: 1

Text: User can share a diagram via a unique URL

Risk: Low

Verification: Test

<<Functional Requirement>>

render_mermaid

ID: 2

Text: Editor renders Mermaid diagrams in real time

Risk: Medium

Verification: Demonstration

<<Performance Requirement>>

fast_render

ID: 3

Text: Diagram renders within 500ms of last keystroke

Risk: High

Verification: Test

requirementDiagram
    requirement share_diagram {
        id: 1
        text: User can share a diagram via a unique URL
        risk: low
        verifymethod: test
    }
    functionalRequirement render_mermaid {
        id: 2
        text: Editor renders Mermaid diagrams in real time
        risk: medium
        verifymethod: demonstration
    }
    performanceRequirement fast_render {
        id: 3
        text: Diagram renders within 500ms of last keystroke
        risk: high
        verifymethod: test
    }
    share_diagram - refines -> render_mermaid
    fast_render - traces -> render_mermaid

Syntax

Requirements

requirementDiagram
    requirement login {
        id: R1
        text: Users authenticate with email and password
        risk: medium
        verifymethod: test
    }
    performanceRequirement fast_login {
        id: R2
        text: Login completes under 500 ms
        risk: high
        verifymethod: analysis
    }
Requirements — Mermaid requirement

<<Requirement>>

login

ID: R1

Text: Users authenticate with email and password

Risk: Medium

Verification: Test

<<Performance Requirement>>

fast_login

ID: R2

Text: Login completes under 500 ms

Risk: High

Verification: Analysis

Types: requirement, functionalRequirement, performanceRequirement, interfaceRequirement, physicalRequirement, designConstraint. Risk: low, medium, high. Verify: analysis, inspection, test, demonstration.

Try this snippet →

Elements and relationships

requirementDiagram
    requirement login {
        id: R1
        text: Users authenticate
        risk: low
        verifymethod: test
    }
    element auth_service {
        type: service
        docref: docs/auth.md
    }
    element login_test {
        type: unit_test
    }
    auth_service - satisfies -> login
    login_test - verifies -> login
Elements and relationships — Mermaid requirement

«satisfies»

«verifies»

<<Requirement>>

login

ID: R1

Text: Users authenticate

Risk: Low

Verification: Test

<<Element>>

auth_service

Type: service

Doc Ref: docs/auth.md

<<Element>>

login_test

Type: unit_test

Relationships: contains, copies, derives, satisfies, verifies, refines, traces. Syntax is source - relation -> target.

Try this snippet →

Common mistakes

These are the parse errors that come up most, including in code written by ChatGPT and Claude. Paste any failing diagram into the editor and it marks the offending line.

  • Spaces in requirement or element names.

    Fix: Use snake_case or camelCase identifiers. The text: field is where the readable sentence goes.

  • A verification method outside the four allowed values.

    Fix: Only analysis, inspection, test, and demonstration parse. "review" or "manual" fails.

  • Relationship written like a flowchart arrow (a --> b).

    Fix: Requirement links need the relation word: a - satisfies -> b.

FAQ

Can I show which requirement a test covers?

Yes, that is the main use: declare the test as an element with type: test and connect it with - verifies ->.

Does it support hierarchy between requirements?

Use - contains -> from the parent to each child, or - derives -> when a lower-level requirement is derived from a higher one.