Skip to content

Instantly share code, notes, and snippets.

@adewale
Created August 2, 2026 12:46
Show Gist options
  • Select an option

  • Save adewale/cf6ecc50d8b22db0f65becd977bdb9e4 to your computer and use it in GitHub Desktop.

Select an option

Save adewale/cf6ecc50d8b22db0f65becd977bdb9e4 to your computer and use it in GitHub Desktop.
Agentic Mermaid: Mermaid 11.16 construct-level fidelity audit for PR #192

Review

Scope and pin

Audited the checked-out pr-192 branch against local mermaid@11.16.0 and the vendored official pages for FLOWCHART, STATE, and SEQUENCE. plan.md and progress.md were requested but are absent in this checkout. The PR diff is Sankey-focused; the findings below are pre-existing family-contract gaps exposed by auditing the PR's overall claimed capability state, not regressions introduced in its changed source files.

Findings

High — SEQUENCE — official half-arrow tokens corrupt participant identity

  • Syntax:
    sequenceDiagram
      A-|/B: bottom half arrow
      A-|\B: top half arrow
    
    Loading
  • Expected Mermaid implication: The complete -|/ / -|\ token is the message arrow and the recipient remains B. Mermaid 11.16 documents the complete solid/dotted, forward/reverse half-arrow vocabulary, including -|/, -|\, -//, and their reverse forms (skills/agentic-mermaid-diagram-workflow/references/upstream/sequenceDiagram.md:439-462).
  • Actual Agentic behavior: The message regex consumes only -| and treats the final / or \ as part of the participant id. The probe produced actors A,/B for A-|/B and A,\B for A-|\B. It similarly parses A-//B as recipient /B. The regex only has one-character half-head alternatives (src/sequence/parser.ts:6), while the IR has only half-top/half-bottom and cannot retain the documented stick/non-stick distinction (src/sequence/types.ts:32-33). No diagnostic is emitted.
  • Ledger status: Unrecorded gap. The capability ledger generically maps all documented headings to source-preserved (src/syntax-capability-ledger.ts:178-188), but the renderer parser actively misparses these lines; the sequence opaque-segment divergence only concerns typed mutation (docs/project/divergences.md:20-25,44-50).
  • Smallest contract/test: Parameterize every row in the official half-arrow table. Assert from === A, to === B, exact solid/dotted and start/end orientation, stable serialize/reparse, SVG marker side/shape, and no phantom slash/backslash actor. The IR likely needs distinct normal/stick half-head variants.

High — SEQUENCE — semicolon-separated official markup renders as an empty diagram

  • Syntax: sequenceDiagram; participant A; participant B; A->>B: hi
  • Expected Mermaid implication: Semicolons may replace line breaks; the official page explicitly requires #59; when a literal semicolon is desired in message text (skills/agentic-mermaid-diagram-workflow/references/upstream/sequenceDiagram.md:930-946). Local Mermaid 11.16 mermaid.parse accepts this exact source as sequence.
  • Actual Agentic behavior: verifyMermaid returns no warnings, but SVG contains no actors and no hi message. parseSequenceDiagram initializes an empty diagram and processes only entries after the first array element (src/sequence/parser.ts:65-81; line-oriented implementation), with no sequence statement splitter comparable to Flowchart's. The audit probe rendered a 1,707-byte empty shell.
  • Ledger status: Unrecorded and silent. This is neither the documented segment-preserving limitation nor a diagnosed divergence.
  • Smallest contract/test: A conformance test comparing newline and semicolon forms for actors, messages, blocks, notes, layout semantics, and non-empty SVG. Split only grammar-level semicolons and preserve #59;/entity content.

High — STATE — legal trailing comments delete transitions from rendering

  • Syntax:
    stateDiagram-v2
      A --> B %% inline comment
      B --> C
    
    Loading
  • Expected Mermaid implication: State comments may occur at the end of a statement; everything after %% to newline is ignored (skills/agentic-mermaid-diagram-workflow/references/upstream/stateDiagram.md:440-458). Both transitions remain.
  • Actual Agentic behavior: Only the B --> C edge survives. Global preprocessing removes only lines that start with %% (src/parser.ts:35-36), then the anchored transition grammar rejects the trailing comment (src/state/parse-core.ts:109-116). The structured body preserves the source by falling opaque and emits generic state_opaque, but the render parser still drops topology.
  • Ledger status: Partially ledgered, behavior gap unrecorded. Opaque round-trip/mutation refusal follows docs/project/divergences.md:18,38-50; silently losing a legal edge during render does not.
  • Smallest contract/test: Strip quote-aware trailing %%... before both shared state parsers. Assert graph edges A→B,B→C, structured (not opaque) body, round-trip, SVG connectors, and no comment text.

High — SEQUENCE — option is prefix-misparsed as a nested opt block

  • Syntax:
    sequenceDiagram
      critical connect
        A->>B: try
      option timeout
        B-->>A: fail
      end
    
    Loading
  • Expected Mermaid implication: option partitions alternatives inside a critical region (skills/agentic-mermaid-diagram-workflow/references/upstream/sequenceDiagram.md:754-795).
  • Actual Agentic behavior: The opener regex lacks a keyword boundary and matches opt at the start of option (src/sequence/parser.ts:248-259); the divider grammar recognizes only else|and, not option (src/sequence/parser.ts:263-271). The SVG therefore contains a fabricated nested opt [ion timeout] block instead of a critical option divider. The generic sequence_opaque_segment warning only says typed read-back is incomplete, not that rendering changes semantics.
  • Ledger status: Typed critical regions being source-preserved is deliberate (docs/project/divergences.md:24-25); the renderer's prefix misparse is unrecorded.
  • Smallest contract/test: Require keyword boundaries, recognize option only in critical, and test block tree/divider positions plus SVG labels (critical [connect], timeout, no opt [ion timeout]).

Medium — SEQUENCE — rect COLOR is rendered as an unfilled labeled fragment

  • Syntax:
    sequenceDiagram
      rect rgb(255, 0, 0)
        A->>B: hi
      end
    
    Loading
  • Expected Mermaid implication: The region background is highlighted with the authored RGB/RGBA color (skills/agentic-mermaid-diagram-workflow/references/upstream/sequenceDiagram.md:846-901).
  • Actual Agentic behavior: Parser stores the color as an ordinary block label (src/sequence/parser.ts:248-258). Renderer uses theme group fill/none (src/sequence/renderer.ts:532-552) and prints rect [rgb(255, 0, 0)] as a header (src/sequence/renderer.ts:604-609). Probe confirmed the region rect had fill="none".
  • Ledger status: Source preservation for rect blocks is deliberate at the edit layer (src/agent/sequence-body.ts:44-48; docs/project/divergences.md:24-25), but the documented rendering implication is not recorded as divergent.
  • Smallest contract/test: Add an optional background paint field to rect blocks; assert exact effective fill, no synthetic header label, nested rect compositing, deterministic SVG, and contrast/security validation.

Medium — STATE — whitespace in the official multi-state class form silently disables styling

  • Syntax: class Moving, Crash movement
  • Expected Mermaid implication: Apply movement to both states; this exact spaced form appears in the official syntax and examples (skills/agentic-mermaid-diagram-workflow/references/upstream/stateDiagram.md:519-535,560,584).
  • Actual Agentic behavior: Both legacy and structured regexes disallow whitespace in the comma-separated id group (src/parser.ts:596-603, src/agent/state-body.ts:178-190). The render graph has no class assignments and no authored fill. Verification emits only generic state_opaque, so the user is told mutation is unavailable, not that rendering ignored a valid style.
  • Ledger status: Opaque preservation is deliberate; ignored authored appearance is unrecorded.
  • Smallest contract/test: Permit optional whitespace around commas, trim ids, and assert two class assignments, two styled SVG nodes, structured round-trip, and equivalence with class Moving,Crash movement.

Medium — FLOWCHART — edge-ID class assignment is accepted but has no effect

  • Syntax:
    flowchart LR
      A e1@--> B
      classDef hot stroke:#f00,stroke-width:8px
      class e1 hot
    
    Loading
  • Expected Mermaid implication: class e1 hot applies the class to edge e1; official docs use this mechanism for edge animation (skills/agentic-mermaid-diagram-workflow/references/upstream/flowchart.md:1268-1294).
  • Actual Agentic behavior: The parser records classAssignments[e1] = hot (src/parser.ts:340-347), but the assignment is consumed by node styling only; probe SVG contained neither #f00 nor the 8px edge paint, and verification returned no warnings. The targeted Flowchart warning pass covers metadata, images, interactions, markdown, and malformed statements but not ineffective edge classes (src/agent/flowchart-unsupported.ts:28-56).
  • Ledger status: Unrecorded gap. This is source-preserved and apparently structured, but not operable or diagnosed.
  • Smallest contract/test: Resolve class assignment targets against both node and edge identities. Assert static edge paint from classDef; if animation CSS is intentionally unsupported, emit a specific ineffective/unsupported diagnostic rather than claiming full class effect.

Positive coverage verified

  • FLOWCHART: Extra-dash minimum link length is modeled: probe parsed A ----> C with length: 3, matching the documented rank-length implication (skills/agentic-mermaid-diagram-workflow/references/upstream/flowchart.md:1348-1409). Edge IDs have dedicated parse/round-trip/SVG/op/verify coverage (src/__tests__/flowchart-edge-ids.test.ts:30-118); ampersand fan-out and same-line semicolon statements are covered (src/__tests__/flowchart-parser-conformance.test.ts:54-67). Documented-but-unwired config is explicitly named rather than swallowed (src/flowchart-config.ts:42-58).
  • STATE: Notes have parse/layout/SVG/agent/ops coverage (src/__tests__/state-notes.test.ts:53-153). Choice/fork/join, history diagnostics, and concurrency regions have semantic geometry tests (src/__tests__/state-pseudostates.test.ts:56-165). State config separates wired and legacy ineffective keys (src/state/config.ts:6-30,54-96).
  • SEQUENCE: Actor/message/block/note basics are exercised (src/__tests__/sequence-parser.test.ts:20-223); boxes, autonumber, and create/destroy each have parse/layout/render tests (src/__tests__/sequence-box.test.ts:44-190, src/__tests__/sequence-autonumber.test.ts:19-74, src/__tests__/sequence-create-destroy.test.ts:30-112). Actor stereotype vocabulary and safe menu fields are typed (src/sequence/types.ts:32-56). Documented-but-unwired config keys are explicitly listed for ineffective-config diagnostics (src/sequence/config.ts:45-94).
  • Preservation contract: Sequence critical/rect and State unknown forms can remain source-preserved for serialization/typed-edit refusal. That is a useful deliberate divergence, but it does not make incorrect renderer lowering acceptable (docs/project/divergences.md:38-50).

Uncertain / needs upstream-render oracle

  • Half-arrow glyph distinctions beyond endpoint corruption: Endpoint corruption is confirmed. Separately, the local IR collapses the official normal/stick and some reverse half-arrow forms into only two head kinds (src/sequence/types.ts:32-33). A browser-backed Mermaid 11.16 render oracle should pin the exact marker geometry before choosing the expanded local enum.
  • State inline-comment upstream executable probe: The official documentation is explicit, and Agentic loss is confirmed. Local mermaid.parse for State was blocked in the headless probe by the package's DOMPurify.addHook environment requirement, so a jsdom/browser oracle should be added when fixing it.

Commands and repository state

  • git diff --name-status main...HEAD, branch/log/status inspection: PR is Sankey-focused; no staged files; only pre-existing untracked .pi-subagents/ is present.
  • Custom Bun parser/verify/SVG probes reproduced all seven Agentic behaviors above. A first temporary harness invocation failed because /tmp relative imports did not resolve; the corrected absolute-import harness passed.
  • Local Mermaid 11.16 mermaid.parse accepted sequence semicolon, critical, rect, and flow edge-class probes. State probes reached a headless DOMPurify environment error, not a reported grammar rejection.
  • No full suite was run: this was a read-only syntax audit, and no project/source files or tests were changed.
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "Seven concrete findings include severity, exact official syntax, expected vs actual behavior, project file:line evidence, vendored official-doc citations, ledger classification, and smallest required contract/test."
    }
  ],
  "changedFiles": [],
  "testsAddedOrUpdated": [],
  "commandsRun": [
    {
      "command": "git status --short; git diff --name-status main...HEAD; git diff --cached --name-only",
      "result": "passed",
      "summary": "Confirmed pr-192 scope, no staged files, and only pre-existing untracked .pi-subagents/."
    },
    {
      "command": "bun /tmp/audit-probes-abs.ts (corrected absolute-import harness)",
      "result": "passed",
      "summary": "Reproduced empty semicolon sequence, half-arrow endpoint corruption, state topology/style loss, critical option misparse, rect fill loss, and ineffective flow edge class."
    },
    {
      "command": "node /tmp/mermaid-parse.mjs",
      "result": "passed",
      "summary": "Pinned Mermaid 11.16 accepted sequence semicolon/critical/rect and Flowchart edge-class syntax; State checks were limited by headless DOMPurify setup."
    },
    {
      "command": "bun /tmp/audit-probes.ts (initial relative-import harness)",
      "result": "failed",
      "summary": "Temporary audit harness could not resolve ./src from /tmp; corrected with absolute imports. This was not a product/test failure."
    }
  ],
  "validationOutput": [
    "A-|/B parsed recipient as /B; A-|\\B parsed recipient as \\B.",
    "Semicolon-only sequence verified clean but rendered no actors/messages.",
    "State inline comment left only B->C; spaced class list produced zero class assignments.",
    "Critical option rendered as opt [ion timeout]; rect rgb region rendered fill=none.",
    "Flow edge-ID class assignment was parsed but SVG contained no authored red/8px edge style."
  ],
  "residualRisks": [
    "No browser-backed Mermaid SVG oracle was available for State or exact half-arrow glyph geometry.",
    "Full repository tests were not run because the task was review-only and no code changed.",
    "plan.md and progress.md requested by the task were absent from the checkout."
  ],
  "noStagedFiles": true,
  "diffSummary": "Review-only; no repository diff created. PR #192 itself is Sankey-focused, while this report identifies pre-existing Flowchart/State/Sequence contract gaps visible in the PR's overall capability state.",
  "reviewFindings": [
    "high: src/sequence/parser.ts:6 - documented half-arrow tokens corrupt recipient ids",
    "high: src/sequence/parser.ts:65 - semicolon-separated sequence markup renders empty without warning",
    "high: src/state/parse-core.ts:109 - legal trailing comments delete transitions from rendering",
    "high: src/sequence/parser.ts:249 - critical option is prefix-misparsed as opt",
    "medium: src/sequence/renderer.ts:532 - rect COLOR is ignored as fill and displayed as a header",
    "medium: src/parser.ts:597 - spaced State class lists are ignored",
    "medium: src/parser.ts:341 - Flowchart edge class assignments are parsed but ineffective"
  ],
  "manualNotes": "Report saved to the authoritative /tmp path. No project/source edits were made."
}

Review

  • Scope: PR #192 (a3b1b3b3) is a Sankey-focused change and does not modify src/class/*, src/er/*, src/gantt/*, or their family-specific tests. It does, however, republish the citizenship/evidence surface that marks Class, ER, and Gantt Mermaid-syntax parity “satisfied.” The requested plan.md and progress.md were absent at repository root, so this audit used the pinned 11.16.0 manifest, vendored official docs, implementations, tests, and matrix directly.
  • Pin verified: package.json:209 and docs/project/upstream-mermaid-manifest.json:3-8 identify Mermaid 11.16.0 / commit f3dea58385fd5c7dd1f4e9c9c1876751ae6943cc.

Concrete gaps

High — Class inline/separate annotations are silently discarded

  • Reproduction:
    classDiagram
      class Shape <<interface>>
    
    Loading
    The separate form <<interface>> Shape fails similarly.
  • Expected: Mermaid creates Shape and displays its interface annotation. Both forms are official, alongside the nested-body form (skills/agentic-mermaid-diagram-workflow/references/upstream/classDiagram.md:734-755).
  • Actual: parseClassDiagram returns no classes and no relationships for the inline reproduction. CLASS_DECLARATION_RE permits labels/generics/body-open but no trailing annotation (src/class/parser.ts:38-48); annotation recognition exists only while already inside a class body (src/class/parser.ts:180-193). No later branch recognizes the separate form.
  • Implications: semantic identity, SVG/PNG/layout/terminal, describe, and verify see an empty diagram. Under the documented structured-or-opaque agent contract the source can remain lossless for serialization, but render semantics are still absent.
  • Missing discriminating contract: a test for each of the three official annotation spellings asserting one stable class identity, equal annotation semantics, non-empty SVG/terminal output, describe exposure, and serialize/mutate preservation. Repository search found no test containing class Shape <<interface>>.

High — Class plain dashed links are dropped with both endpoint identities

  • Reproduction:
    classDiagram
      classO .. classP : Link(Dashed)
    
    Loading
  • Expected: two classes joined by the official dashed “Link” relationship (skills/.../upstream/classDiagram.md:325-366).
  • Actual: the parser probe returned classes: [] and relationships: []. The ordinary-arrow regex omits bare .. even though it accepts <.., ..>, and ..|> (src/class/parser.ts:434-475). Because endpoints are minted only after relation recognition (src/class/parser.ts:339-346), all authored identity and geometry disappear.
  • Missing discriminating contract: parse/render/terminal/agent test asserting two endpoints, one dashed no-marker edge, source-map identity, and serialize-after-mutation. No test contains classO .. classP.

High — Backtick class identities with spaces cannot participate in relationships

  • Reproduction:
    classDiagram
      class `Animal Class!`
      class `Car Class`
      `Animal Class!` --> `Car Class`
    
    Loading
  • Expected: official escaped identifiers create two classes and one association (skills/.../upstream/classDiagram.md:151-164).
  • Actual: probe result was the two classes but zero relationships. Declarations accept a whole backtick token (src/class/parser.ts:38-48), while relationship endpoints are captured with \S+? / \S+? (src/class/parser.ts:434-475), which cannot span spaces. This is an identity grammar split inside one parser.
  • Missing discriminating contract: a relationship-vocabulary matrix using backtick ids containing spaces/punctuation, checking parse identity, labels, SVG data-* identity, terminal edge, mutation/rename safety, and round-trip.

Medium — Class link tooltips are parsed away

  • Reproduction:
    classDiagram
      class Shape
      link Shape "https://example.com" "Official tooltip"
    
    Loading
  • Expected: safe link plus hover tooltip; the official interaction contract describes tooltip as an optional authored value (skills/.../upstream/classDiagram.md:865-878).
  • Actual: parseClassInteraction returns only {id, generic, href} and has no tooltip field (src/class/parser.ts:73-78); the main parser stores only href (src/class/parser.ts:206-210). Tooltip semantics cannot reach Scene/SVG or describe. Callback execution can deliberately remain disabled for security, but loss of a safe tooltip is a separate issue.
  • Missing discriminating contract: strict/loose safe-link tests that independently assert sanitized href, tooltip presence, callback inertness, accessibility exposure, and source preservation.

High — Official ER word aliases for cardinality/identification are wholly unsupported

  • Reproduction:
    erDiagram
      CAR 1 to zero or more NAMED-DRIVER : allows
    
    Loading
  • Expected: the same relationship as CAR ||--o{ NAMED-DRIVER : allows; Mermaid officially defines cardinality phrases (1, zero or more, many(0), etc.) and to / optionally to (skills/.../upstream/entityRelationshipDiagram.md:140-208).
  • Actual: probe result was entities: [], rels: 0. ER relationship grammar accepts only punctuation cardinalities and --|.. (src/er/parser.ts:276-310); the unrecognized line also cannot become a bare entity. Thus both identity and relationship semantics vanish.
  • Missing discriminating contract: differential tests for every official left/right word alias and both identification aliases, asserting equivalence with canonical glyph syntax across parser, SVG marker primitives, terminal, describe, verify, and serialization. No test contains the official CAR 1 to zero or more example.

Medium — ER multiple-class shorthand is rejected rather than applying both classes

  • Reproduction:
    erDiagram
      PERSON:::foo,bar
      classDef foo fill:#f96
      classDef bar stroke:#00f
    
    Loading
  • Expected: stable PERSON identity with both authored classes; multiple shorthand classes are official (skills/.../upstream/entityRelationshipDiagram.md:794-797).
  • Actual: probe result was no entities. ER_ENTITY_REFERENCE_SOURCE and parseErEntityReference permit exactly one :::[\w-]+ suffix (src/er/parser.ts:14-35). The long-form assignment similarly captures only one class name (src/er/parser.ts:166-171), despite official ER allowing multiple classes on multiple nodes.
  • Missing discriminating contract: one- and multi-entity tests for :::a,b and class A,B a,b, asserting identity does not absorb style suffixes, precedence/default-class behavior, Scene paint, SVG paint, terminal style projection, and typed/source serialization. No test contains nodeId:::className1,className2.

Medium — ER’s supported subgraphs are still represented as “dropped/unsupported” by the diagnostic contract

  • Reproduction:
    erDiagram
      subgraph Domain
        CUSTOMER
      end
    
    Loading
  • Expected in pinned 11.16.0: a typed group containing CUSTOMER, without an unsupported-syntax warning; the official page defines nested groups, ids/titles, relationships to groups, and scoped direction (skills/.../upstream/entityRelationshipDiagram.md, “Subgraphs” through “Direction in subgraphs”).
  • Actual inconsistency: the current parser does build typed groups and membership (src/er/parser.ts:142-156,184-190), but erContainsSubgraphConstruct still describes grouping as “tolerated”/“dropped” and returns true for every subgraph (src/er/parser.ts:327-339). docs/design/families/er.md, “Subgraph tolerance,” likewise says grouping is ignored and verify emits UNSUPPORTED_SYNTAX. This misrepresents a now-native feature to agents/verify even when render/layout retain it.
  • Missing discriminating contract: official nested/id-title/group-edge/scoped-direction cases must assert group geometry and containment, describe/facts group identity, mutation preservation, and specifically the absence of UNSUPPORTED_SYNTAX.

Medium — Official Gantt config keys are absent from the render resolver

  • Reproduction:
    ---
    config:
      gantt:
        barGap: 9
        weekday: monday
        todayMarker: off
        barHeight: 22
    ---
    gantt
      A :a, 2025-01-01, 1d
    
    Loading
  • Expected: barGap changes row spacing, weekday aligns week ticks, and todayMarker controls the marker, alongside barHeight. These keys/behaviors are documented at skills/.../upstream/gantt.md:523-560; the official config sample also includes title/padding/font/section-style controls (:546-560).
  • Actual: direct resolver probe returned only { "barHeight": 22 }. ResolvedGanttFrontmatterConfig and resolveGanttFrontmatterConfig implement only display mode, bar height, top axis, axis format, and tick interval (src/gantt/parser.ts:258-299). The in-body weekday/todayMarker syntax works (src/gantt/parser.ts:181-199), but the official config channel has no effect. Whether generic config lint diagnoses every omitted key was not established; the rendering semantics are absent either way.
  • Missing discriminating contract: table-driven config wire-or-warn tests for every pinned ganttConfig key, with geometry/style assertions for wired keys and exact named diagnostics for deliberate no-ops. Existing Gantt/config tests contain no barGap reproduction.

Medium — Invalid Gantt durations deliberately diverge from pinned behavior

  • Reproduction:
    gantt
      Bad duration :a, 2025-01-01, 3dX
    
    Loading
  • Expected in pinned official docs: invalid duration tokens are ignored and task duration defaults to zero (skills/.../upstream/gantt.md:163).
  • Actual contract: only GANTT_DURATION_RE matches a duration; otherwise the token is classified as a date (src/gantt/parser.ts:27,62-71) and downstream scheduling rejects an invalid date. docs/design/families/gantt.md explicitly chooses invalid-duration parse errors, so this is a deliberate documented divergence, not hidden loss—but it remains incompatible with the pinned behavior.
  • Missing discriminating contract: an executable divergence fixture proving upstream zero-duration versus Agentic Mermaid’s named structured error, plus capability-ledger status diagnosed rather than parity/native. No Gantt test contains 3dX.

High — Capability/evidence manifests overstate syntax parity

  • Evidence: the citizenship matrix marks mermaidSyntaxParity “satisfied” for Class, ER, and Gantt and cites generic corpus/closing-gap evidence (docs/contributing/diagram-family-citizenship.matrix.json:1037-1043,1231-1237,2391-2397). Yet none of the concrete official reproductions above exists in tests, and direct parser/config probes demonstrate loss.
  • Expected: feature-granular states should be native, source-preserved, or diagnosed only after a discriminating contract; aggregate parity cannot be “satisfied” while official authorable clauses disappear.
  • Actual cause/risk: src/syntax-capability-ledger.ts projects broad descriptor operations and official-doc inventory states; broad parse/serialize hooks can therefore make a dimension look covered without proving each syntax clause. PR #192 refreshes/ships this matrix while changing only Sankey implementation.
  • Missing contract: each manifest feature row needs a concrete executable case or explicit divergence diagnostic; aggregate mermaidSyntaxParity must fail if any official authorable feature lacks such evidence. Generic corpus round-trip is insufficient when renderer parsers silently skip individual lines.

Opaque-but-lossless and deliberate divergences

  • Class’s whole-body opaque fallback and ER/Gantt ordered opaque segments are valuable serialization guards: the unsupported lines above need not be textually lost by parse→serialize. That does not repair renderer/layout/describe/verify loss, and capability reporting should distinguish the two.
  • Documented, reasonable divergences observed: ER defaults LR rather than upstream TB while explicit direction is honored (docs/design/families/er.md, “Direction and spacing”); class no-op config keys are intended to emit INEFFECTIVE_CONFIG; Gantt callbacks are preserved but never executed; today-marker rendering requires an explicit clock for determinism; dependency arrows are an opt-in render option rather than invented Mermaid syntax.
  • Gantt invalid-duration handling is documented but should be represented as a pinned upstream divergence, not syntax parity.

Strengths

  • Correct: Class has shared declaration/reference helpers, stable generic identity, all main UML marker directions, cardinalities, notes, namespaces (including labels/nesting/compact mode), style resolution, and explicit direction.
  • Correct: ER handles quoted/unicode aliases, optional ? types losslessly through its permissive attribute token, composite PK/FK/UK keys, comments, glyph crow’s-foot variants, identifying/non-identifying lines, direction, styles, and now typed nested subgraphs/group endpoints.
  • Correct: Gantt has a notably broad deterministic model: status tags, milestones/vertical markers, after/until, calendar excludes/includes, weekend/weekday directives, multiple duration units/decimals, bounded ticks, compact mode, supplied-clock today marker, SVG/terminal projections, and segment-preserving mutation.
  • Correct: direct invalid/duplicate Gantt constructs use named errors rather than silent fallback, except where an explicit upstream-lenient behavior is intentionally chosen.

Uncertainty / residual risk

  • Full bun run test, typecheck, browser SVG, PNG, terminal goldens, verify, and mutation suites were not run; this was a targeted syntax audit. Parser-model probes establish the semantic losses before layout/render, but exact final SVG/terminal snapshots were not generated.
  • Local npm source maps were not exhaustively decoded; upstream authority here is the vendored official 11.16.0 docs whose hashes/revision are pinned in the manifest.
  • The generic config diagnostic layer may warn for some ignored Gantt keys. That would make them diagnosed rather than silent, but does not add their official rendering behavior.
  • Working tree had a pre-existing untracked .pi-subagents/ directory. No repository files were edited and nothing was staged.
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "Nine concrete findings identify severity, reproduction, expected/actual behavior, implementation coordinates, pinned upstream citations, and missing discriminating tests/contracts."
    }
  ],
  "changedFiles": [
    "/tmp/agentic-mermaid-syntax-audit/02-class-er-gantt.md"
  ],
  "testsAddedOrUpdated": [],
  "commandsRun": [
    {
      "command": "git status --short && git branch --show-current && git log -1 --oneline && git diff --stat && git diff --cached --stat",
      "result": "passed",
      "summary": "Confirmed branch pr-192 at a3b1b3b3, only pre-existing untracked .pi-subagents/, and no staged diff."
    },
    {
      "command": "git diff --name-status main...HEAD && git log --oneline --decorate main..HEAD",
      "result": "passed",
      "summary": "Confirmed PR #192 is a single Sankey-focused commit and enumerated changed files."
    },
    {
      "command": "combined line-coordinate, parser/config probe, evidence-existence, and status script",
      "result": "failed",
      "summary": "Coordinate/config/ER/status portions ran; the embedded Class probe failed because shell command substitution consumed backticks. It was rerun successfully in a quoted heredoc."
    },
    {
      "command": "bun heredoc Class parser probes; rg exact reproductions in src/__tests__; git status/staging",
      "result": "passed",
      "summary": "Proved annotation and dashed-link inputs produce an empty Class model; backtick-space relationship produces two classes and zero edges; found no exact discriminating tests; no staged files."
    },
    {
      "command": "direct ER parser probes and resolveGanttFrontmatterConfig probe",
      "result": "passed",
      "summary": "Proved ER word alias and multi-class shorthand produce empty models; Gantt config resolved only barHeight while discarding barGap, weekday, and todayMarker."
    }
  ],
  "validationOutput": [
    "Class annotation: classes=[], relationships=[]",
    "Class dashed link: classes=[], relationships=[]",
    "Class backtick-space association: two classes, relationships=[]",
    "ER word alias: entities=[], rels=0",
    "ER multi-class shorthand: entities=[], rels=0",
    "Gantt config probe: {\"barHeight\":22}",
    "No exact reproduction strings were found in src/__tests__.",
    "git diff --cached --name-only produced no output."
  ],
  "residualRisks": [
    "Full test/typecheck/browser/PNG/terminal/verify/mutation suites were not run.",
    "Generic config diagnostics may warn for some semantically ignored Gantt keys.",
    "Vendored official docs were used as upstream authority; local Mermaid source maps were not exhaustively decoded.",
    "plan.md and progress.md requested by the task were absent."
  ],
  "noStagedFiles": true,
  "diffSummary": "Review-only audit artifact; no project/source or test files changed. PR #192 itself is Sankey-focused but republishes parity/evidence claims covering the audited families.",
  "reviewFindings": [
    "high: src/class/parser.ts:38-48,180-193 - two official class annotation forms disappear",
    "high: src/class/parser.ts:434-475 - official bare dashed links disappear with endpoints",
    "high: src/class/parser.ts:434-475 - backtick ids containing spaces cannot be relationship endpoints",
    "medium: src/class/parser.ts:73-78,206-210 - authored class link tooltip is discarded",
    "high: src/er/parser.ts:276-310 - official ER word aliases are unsupported",
    "medium: src/er/parser.ts:14-35,166-171 - ER multiple-class styling syntax is unsupported",
    "medium: src/er/parser.ts:142-156,327-339 - native subgraphs remain misdiagnosed/documented as dropped",
    "medium: src/gantt/parser.ts:258-299 - official Gantt config keys are ignored",
    "medium: src/gantt/parser.ts:27,62-71 - invalid duration behavior deliberately diverges from pinned Mermaid",
    "high: docs/contributing/diagram-family-citizenship.matrix.json:1037-1043,1231-1237,2391-2397 - parity claims are not feature-discriminating"
  ],
  "manualNotes": "No blockers prevented the audit. The most urgent correction is to stop claiming aggregate pinned syntax parity until the silent parser losses have executable feature-level evidence or explicit diagnosed divergences."
}

Review

Findings

  • High — Timeline silently turns an upstream comment into visible semantic content. Exact syntax:
    timeline
      2020 : Start
      % comment
      2021 : End
    
    Loading
    Expected: Mermaid 11.16.0 consumes % comment as a comment. The vendored source map’s timeline.jison lexer includes %(?!\{)[^\n]* as its first rule (node_modules/mermaid/dist/chunks/mermaid.core/timeline-definition-FHXFAJF6.mjs.map, embedded ../../../src/diagrams/timeline/parser/timeline.jison:651). Actual: the renderer parser skips only # lines (src/timeline/parser.ts:88-93), while the structured parser skips only %% (src/agent/timeline-body.ts:77-81) and then classifies any colon-free line as a period (src/agent/timeline-body.ts:129-135). A local end-to-end probe produced a structured % comment period, three SVG periods, and visible comment text instead of two periods. This is dangerous silent acceptance: ordering, structural counts, labels, accessibility text, layout, serialization/mutation, SVG, and likely the shared terminal parse are all affected; verify emits no unsupported-syntax warning. Contract needed: an upstream-differential test for % comment, %% comment, comments before/between/after periods, asserting identical structured semantics and no SVG/terminal/a11y node for comments.
  • High — timeline TB is silently rendered as LR while the agent surface calls the same source opaque. Official syntax allows only LR and TD (skills/agentic-mermaid-diagram-workflow/references/upstream/timeline.md, “Direction (v11.14.0+)”; the pinned lexer exposes only timeline_lr/timeline_td at embedded timeline.jison:78,651). The renderer extracts only LR/TD (src/timeline/parser.ts:54-57) but skips every later timeline... header without validating it (src/timeline/parser.ts:88-92). The behavior is knowingly codified as “accepting-and-ignoring non-upstream tokens (tb/bt/rl) as horizontal” in src/__tests__/timeline-parser.test.ts (focused test output). Local probe: parseRegisteredMermaid("timeline TB …") returned opaque, while renderMermaidSVG succeeded with one horizontally interpreted period. Expected: reject/diagnose unsupported TB consistently (or preserve it opaquely without native rendering). Actual: a close, plausible orientation token changes authored appearance silently on the render path and splits render from parse/serialize/mutate/verify behavior. Contract needed: renderer/agent/verify parity tests for TB/BT/RL and arbitrary suffixes; successful native render must never silently discard a header token.
  • Medium — Timeline structured labels preserve literal <br> markup instead of the official forced line-break semantic. The official docs explicitly say <br> forces a line break and use it in section, period, and event text (skills/agentic-mermaid-diagram-workflow/references/upstream/timeline.md:98-120,126-170). The native parser correctly calls normalizeBrTags for title, section, period, and event (src/timeline/parser.ts:75-84,94-105,121-124). The agent parser instead uses whitespace-only normalizeTimelineText and stores its results directly (src/agent/timeline-body.ts:82-123). Probe output retained label: "A<br>B" and event "...<br>Now". Canonical serialization happens to preserve authored SVG appearance by re-emitting the tag (src/agent/timeline-body.ts:163-174), so this is not source loss; it is semantic drift in typed body/layout/describe/facts/verification and label measurement. Contract needed: body and layoutMermaid tests requiring A\nB semantic labels, while serialize→render retains an official <br> line break on SVG and terminal.
  • Medium — Timeline mutation rejects event colons that both parsers accept. Exact valid examples include 2020 : Visit 10:30 and 2020 : See https://example.test. Official events are simple text (skills/agentic-mermaid-diagram-workflow/references/upstream/timeline.md:42-61); the pinned event lexer allows a colon not followed by whitespace (embedded timeline.jison:651), and the shared parser explicitly preserves clock/URL colons (src/timeline/parse-core.ts:16-19,45-50). Local parsing accepted Visit 10:30. Yet add_period.events, add_event, and set_event_text pass allowColon: false (src/agent/timeline-body.ts:314-323,351-355). This is loud, safe rejection rather than silent corruption, but it makes typed mutation less capable than accepted/official syntax. Contract needed: all three ops with clock and URL values, followed by serialize→parse semantic equality and SVG/terminal label checks; only : separators should be refused/escaped.
  • Medium — Fractional Journey scores accepted by pinned Mermaid are rejected by both native and agent paths. Exact syntax: Task: 3.5: Me. The official contract says score is “a number between 1 and 5, inclusive,” not an integer (skills/agentic-mermaid-diagram-workflow/references/upstream/userJourney.md:37-42). The pinned lexer accepts arbitrary task data (node_modules/mermaid/dist/chunks/mermaid.core/journeyDiagram-5HDEW3XC.mjs.map, embedded journey.jison:640), and journeyDb.addTask uses Number(pieces[0]) (same map, embedded journeyDb.js:61-70). A direct Mermaid 11.16.0 parse probe accepted 3.5. Agentic Mermaid’s regex accepts digits only and validation requires Number.isInteger (src/journey/parse-core.ts:21-29,60-62,164-175). The agent therefore preserves the source opaquely with a targeted invalid-score reason, but native SVG rendering throws. This is loud unsupported handling, not dangerous silent acceptance. Contract needed: pinned-oracle cases at 1, 1.5, 3.5, and 5 across parse/body/serialize/mutate/verify/layout/SVG/terminal; keep out-of-range values loud.
  • Low / documentation — The capability report overstates closure for these syntax seams. It declares Journey, GitGraph, and Timeline native in every dimension (docs/project/section-a-capability-report.md:420,425,428) and reports parse/serialize/mutation/verify/layout/SVG/terminal gates as passed (:502-511,542-551,562-565 and following rows). Those are implementation-presence gates, not demonstrated pinned-syntax parity: the cases above pass through as a phantom node, semantic markup, refused mutation, opaque/native split, or render failure. Contract needed: either add syntax-feature qualifications/known gaps to the report or make the report’s native claims depend on pinned doc/source-map differential cases.

Positives

  • GitGraph coverage is strong. The implementation models all documented orientations LR/TB/BT, checkout/switch, quoted branches, positive order, custom commit id/type/tags, merge attributes, cherry-pick parent constraints, insertion order, accessibility metadata, and all six documented config keys. Parsing is fail-closed for unknown statements/attributes (src/gitgraph/parser.ts:71-154,166-190), while serialization preserves statement kind and checkout keyword (src/gitgraph/parser.ts:219-241). The focused GitGraph doc-parity and agent-operation suites passed.
  • GitGraph merge identity is correctly separated from authored visual type (src/gitgraph/types.ts:5-25), avoiding the common error where merge ... type:REVERSE ceases to be a semantic merge. Cherry-pick ancestry and immediate-parent rules are explicitly checked (src/gitgraph/parser.ts:128-150).
  • Journey shares one walker across renderer and agent paths, normalizes <br> consistently, preserves optional/multiple actors and accessibility directives, and makes rejected lines opaque with targeted reasons rather than dropping them (src/journey/parse-core.ts:31-53,91-185; src/agent/journey-body.ts:37-96). Integer out-of-range handling is appropriately loud.
  • Timeline correctly preserves source order of sections, periods, and events, supports official continuation forms, LR/TD direction, accessibility metadata, and disableMulticolor; its native parser correctly normalizes <br> (src/timeline/parser.ts:75-157).
  • No missing family-specific click/link interaction syntax was found in the vendored official docs for these three families.

Notes / uncertainties

  • Bare GitGraph commits receive deterministic synthetic IDs (c0, c1, …) rather than Mermaid’s documented random IDs (skills/agentic-mermaid-diagram-workflow/references/upstream/gitgraph.md:87-91; src/gitgraph/parser.ts:47-55). This is an intentional-looking fit with the repository’s determinism requirement, but it is still an authored-appearance difference and should be disclosed as a deterministic compatibility choice rather than exact Mermaid visual parity.
  • The requested plan.md and progress.md were absent at the repository root, so no plan/progress assertions could be checked. This audit used vendored docs, Mermaid 11.16.0 package source maps, implementation/tests, capability reports, and executable probes instead.
  • No project/source files were edited. The only written file is this audit artifact outside the repository. .pi-subagents/ was already untracked; the staging area remained empty.
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "Five concrete severity-rated syntax/behavior findings cite exact project locations and pinned Mermaid docs/source-map lines; one capability-report qualification is also cited."
    }
  ],
  "changedFiles": [
    "/tmp/agentic-mermaid-syntax-audit/03-journey-timeline-gitgraph.md"
  ],
  "testsAddedOrUpdated": [],
  "commandsRun": [
    {
      "command": "git status --short && git diff --stat && git diff --name-only && git diff --cached --name-only",
      "result": "passed",
      "summary": "No tracked or staged project changes; only pre-existing untracked .pi-subagents/."
    },
    {
      "command": "bun -e '<Mermaid 11.16.0 syntax probes>'",
      "result": "passed",
      "summary": "Pinned Mermaid accepted Journey score 3.5 and Timeline hash/percent probes; GitGraph grammar probes were also accepted by @mermaid-js/parser."
    },
    {
      "command": "source-map extraction probes for timeline.jison and journey.jison/journeyDb.js",
      "result": "passed",
      "summary": "Confirmed Timeline percent-comment/event lexer rules and Journey Number(score) behavior from vendored 11.16.0 maps."
    },
    {
      "command": "bun test --timeout 30000 src/__tests__/journey-parse-core.test.ts src/__tests__/journey-parser.test.ts src/__tests__/agent-timeline.test.ts src/__tests__/timeline-parser.test.ts src/__tests__/timeline-direction.test.ts src/__tests__/gitgraph-agent-ops.test.ts src/__tests__/mindmap-gitgraph-doc-parity.test.ts",
      "result": "passed",
      "summary": "152 passed, 0 failed; existing tests notably codify ignored non-upstream Timeline direction tokens."
    },
    {
      "command": "local parseRegisteredMermaid/renderMermaidSVG probes for Timeline comments/directions/markup and Journey fractional score",
      "result": "passed",
      "summary": "Reproduced phantom % comment period in body/SVG, TB opaque-vs-native split, literal <br> in Timeline body, accepted clock event, and Journey 3.5 opaque/render error."
    },
    {
      "command": "git status --short; git diff --cached --name-only",
      "result": "passed",
      "summary": "Staging area empty at completion; no project files changed."
    }
  ],
  "validationOutput": [
    "Focused suite: 152 pass, 0 fail, 615 expect() calls.",
    "Timeline % comment probe: structured body had 3 periods and SVG contained comment; upstream lexer classifies it as a comment.",
    "Timeline TB probe: agent body opaque, native SVG render succeeded.",
    "Journey 3.5 probe: pinned Mermaid parse succeeded; Agentic body opaque and native render threw integer-only error."
  ],
  "residualRisks": [
    "Terminal behavior for the phantom percent-comment and literal <br> typed-layout seam was inferred from shared parsers, not separately snapshot-probed.",
    "No browser pixel comparison against Mermaid was run.",
    "plan.md and progress.md were absent."
  ],
  "noStagedFiles": true,
  "diffSummary": "Review-only audit; no repository diff. Added only the required /tmp Markdown report.",
  "reviewFindings": [
    "high: src/timeline/parser.ts:88-93 and src/agent/timeline-body.ts:77-81,129-135 - upstream % comments become visible periods",
    "high: src/timeline/parser.ts:54-57,88-92 - timeline TB is silently ignored by native rendering while agent parsing is opaque",
    "medium: src/agent/timeline-body.ts:82-123 - official <br> line breaks remain literal in typed semantics",
    "medium: src/agent/timeline-body.ts:314-323,351-355 - valid event colons are rejected by mutation",
    "medium: src/journey/parse-core.ts:21-29,60-62,164-175 - pinned fractional scores are rejected",
    "low: docs/project/section-a-capability-report.md:420,425,428 - native/pass labels do not expose these syntax gaps"
  ],
  "manualNotes": "GitGraph documented syntax/config coverage was strong; no GitGraph blocker was found."
}

Review

  • Correct: The repository pins Mermaid 11.16.0 in package.json:209 and records the same version/tag in docs/project/upstream-mermaid-manifest.json:5-7. The four vendored syntax documents are registered as official upstream artifacts (docs/project/upstream-mermaid-manifest.json:277-320,573-574,715-731).
  • Correct: PIE preserves source order, implements showData, donut/legend/highlight config, theme variables, and accessibility scanning. Zero-valued slices are a documentation/source discrepancy rather than an Agentic bug: the public doc says “greater than zero” (skills/agentic-mermaid-diagram-workflow/references/upstream/pie.md:38-43), but pinned 11.16 source explicitly accepts >= 0 and stores zero (node_modules/mermaid/dist/chunks/mermaid.core/pieDiagram-ENE6RG2P.mjs.map, embedded pieDb.ts:36-44); Agentic follows the executable source at src/pie/parser.ts:87-103.
  • Correct: QUADRANT covers the documented title, one/two-sided axes, all four quadrants, normalized [0,1] coordinates, direct/class point styles, accessibility, and configuration. The stricter duplicate-point-label rejection (src/quadrant/parser.ts:74,123-126) supports stable mutation identity; upstream duplicate behavior could not be conclusively established in the Node probe because pinned Mermaid reached a DOMPurify host error.
  • Correct: RADAR covers positional and keyed series, forward resolution of curves against the final axis list (src/radar/parser.ts:340-385), body options, graticules, scale configuration, legend, theme variables, accessibility, and coupled axis/curve mutation. The 64-tick/256-axis resource limits and exact typed curve arity are explicit Agentic safety/identity divergences, not silent behavior.
  • Correct: XYCHART covers signed decimals, categorical/numeric axes, horizontal orientation, named series/legend, per-point line labels, accessibility, and the principal axis visibility/size knobs. Existing tests cover showDataLabel (for example src/__tests__/xychart-integration.test.ts:233 and src/__tests__/xychart-parser.test.ts:111-126), but not the missing contracts below.

Findings

High — XYCHART silently discards unrecognized family statements

  • Minimal repro: xychart\n frob official-data-lost\n bar [1,2].
  • Expected: Pinned Mermaid 11.16 rejects the source with a parse error; malformed/unknown chart content must not disappear. The upstream Jison grammar has a closed statement token set (node_modules/mermaid/dist/chunks/mermaid.core/xychartDiagram-FW5EYKEG.mjs.map, embedded xychart.jison, symbols statement, title, X_AXIS, Y_AXIS, LINE, BAR), and pinned upstream throws when there is no plot (same map, embedded xychartDb.ts:201-202).
  • Actual: parseXYChart accepts the repro, silently omits frob official-data-lost, and returns the bar series. Its statement loop handles known cases with continue but has no terminal error branch (src/xychart/parser.ts:68-126). This also lets malformed recognized directives such as an unusable axis tail be consumed without an error through applyAxisDirective (src/xychart/parser.ts:211-247).
  • Output/mutation implication: Rendering can look valid while authored source was lost semantically. The structured agent parser is safer—it falls back opaque on unknown lines—but direct render/parser surfaces disagree, so mutation/read and render do not share one recognition contract.
  • Missing contract: A parser/integration differential test asserting every nonblank non-accessibility statement is either modeled or rejected, including unknown statements and malformed x/y-axis forms. Existing tests do not pin this fail-loud boundary.

High — official xyChart.showDataLabelOutsideBar is accepted but has no effect

  • Minimal repro:
    ---
    config:
      xyChart:
        showDataLabel: true
        showDataLabelOutsideBar: true
    ---
    xychart
      x-axis [A]
      bar [5]
    
    Loading
  • Expected: The value label is outside the bar. This is explicitly documented (skills/agentic-mermaid-diagram-workflow/references/upstream/xyChart.md:275-296) and harvested into the pinned manifest (docs/project/upstream-mermaid-manifest.json:30533-30540).
  • Actual: A differential probe produced byte-identical SVG with the field absent versus true; the label remained at the default placement. The typed config exposes only showDataLabel (src/xychart/types.ts:60-90), the resolver reads only that field (src/xychart/parser.ts:328-349), and rendering always calls the same label placement path (src/xychart/renderer.ts:269-289). There is no ineffective-config warning evidenced for the harvested key, so this is silent.
  • Output/mutation implication: SVG/PNG and derived terminal behavior cannot honor an official layout directive; frontmatter can survive source mutation while remaining renderingly false.
  • Missing contract: Config-schema parity test, true/false geometry test, and wire-or-warn manifest test for xyChart.showDataLabelOutsideBar. Existing showDataLabel tests do not discriminate outside placement.

Medium — official x-axis labelRotation is silently ignored

  • Minimal repro: config.xyChart.xAxis.labelRotation: 45 with xychart\n x-axis [LongLabel]\n bar [5].
  • Expected: Bottom x-axis labels rotate 45 degrees. The option and applicability are documented at skills/agentic-mermaid-diagram-workflow/references/upstream/xyChart.md:154-168 and harvested at docs/project/upstream-mermaid-manifest.json:30563-30585.
  • Actual: SVG for labelRotation: 0 and 45 was byte-identical. XYAxisRenderConfig has no rotation field (src/xychart/types.ts:93-105), and resolveAxisConfig reads visibility, sizing, ticks, and line width but not rotation (src/xychart/parser.ts:375-430). Axis label rendering consequently receives no rotation.
  • Output/mutation implication: Dense categorical axes can overlap or communicate a false configured layout; all raster/SVG outputs inherit it.
  • Missing contract: Harvested-config coverage should require every manifest axis key to be wired or explicitly warned; add a render assertion for a label transform at nonzero rotation.

Medium — official XYCHART dataLabelColor theme variable is silently ignored

  • Minimal repro: Set config.themeVariables.xyChart.dataLabelColor: '#ff0000', render a bar with showDataLabel: true, then change only the color to '#00ff00'.
  • Expected: Bar value-label paint changes. The official theme table specifies dataLabelColor (skills/agentic-mermaid-diagram-workflow/references/upstream/xyChart.md:177-198).
  • Actual: The two SVGs were byte-identical. resolveXYChartTheme reads title/axis/legend/palette colors but omits dataLabelColor (src/xychart/parser.ts:353-372); the renderer paints labels with a generic resolved labelColor (src/xychart/renderer.ts:275-288).
  • Output/mutation implication: Authored theme identity is preserved textually but not visually in SVG/PNG; verification cannot accurately claim that this official theme field took effect.
  • Missing contract: Theme-variable differential test and wire-or-warn inventory entry for dataLabelColor.

Medium — duplicate PIE labels have different series/identity semantics from pinned Mermaid

  • Minimal repro: pie\n "Same" : 1\n "Same" : 9.
  • Expected: Pinned Mermaid stores sections in a Map and only inserts when the label is not already present, so the first Same slice wins (node_modules/mermaid/dist/chunks/mermaid.core/pieDiagram-ENE6RG2P.mjs.map, embedded pieDb.ts:18-24,36-44).
  • Actual: Agentic parses two slices, [1,9], because it unconditionally appends entries (src/pie/parser.ts:83-104), changing total, angles, legend rows, output identity, and ordering semantics.
  • Mutation implication: The typed body gives both occurrences synthetic IDs, but all public pie mutation lookup is label-based and selects the first occurrence (src/agent/pie-body.ts:133-135,167-195), making the second duplicate impossible to target consistently. Conversely, add_slice rejects creating duplicates (src/agent/pie-body.ts:156-165), so parse and creation/mutation invariants disagree.
  • Missing contract: Pinned differential test for duplicate labels across parser, SVG/ASCII, asPie, and mutation; contract must deliberately choose upstream first-wins or reject duplicates fail-loudly before rendering.

Deliberate divergences and uncertainty

  • PIE’s local <1% policy keeps wedges but may suppress their percentage text (src/pie/layout.ts:376-425), whereas its comment records upstream’s small-slice removal. This is an explicit data-preservation divergence, not silent loss.
  • QUADRANT centers labels and warns for documented-but-unwired positional config; RADAR adds optional tickLabels and hard resource bounds. These are documented in src/quadrant/config.ts:1-28 and src/radar/config.ts:1-30.
  • Official PIE prose says “up to two decimal places,” but both local grammar (src/pie/parser.ts:25) and executable upstream behavior are more permissive. Treat the pinned executable parser as authoritative unless product policy explicitly chooses the prose restriction.
  • The upstream QUADRANT duplicate-label probe was inconclusive because Mermaid’s Node execution hit DOMPurify.addHook after grammar entry. No duplicate-label defect is claimed without a clean upstream result.
  • No concrete RADAR rendering/parser incompatibility was verified from the inspected official syntax. Its executable source-map extraction was less complete than PIE/XYCHART, so unusual lexer edges (especially duplicate IDs and exotic whitespace/escaping) remain residual differential-test risk.

Commands and repository state

  • plan.md and progress.md were requested but absent (ENOENT); the audit proceeded from repository source, vendored docs, pinned package/maps, tests, and manifest.
  • git merge-base origin/main HEAD, git diff --stat origin/main...HEAD, and history inspection showed the checked-out PR branch at a3b1b3b3; the tip commit is Sankey-focused, so the chart findings are current-tree contract findings rather than chart-file edits in that tip commit.
  • The custom Bun differential probe verified: upstream rejects an unknown XY statement; local accepts/drops it; local PIE retains both duplicate labels; showDataLabelOutsideBar, x-axis labelRotation, and dataLabelColor each produce byte-identical SVG across value changes.
  • No project/source files were edited. No tests were added. No staged files exist. The pre-existing untracked .pi-subagents/ remains untouched.
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "Five concrete findings include severity, minimal repro, expected/actual behavior, local file:line citations, pinned upstream doc/source-map citations, and missing contracts."
    }
  ],
  "changedFiles": [
    "/tmp/agentic-mermaid-syntax-audit/04-charts.md"
  ],
  "testsAddedOrUpdated": [],
  "commandsRun": [
    {
      "command": "git status --short; git diff --stat; git diff --name-only; git history/merge-base inspection",
      "result": "passed",
      "summary": "Confirmed branch state, no staged files, and only pre-existing untracked .pi-subagents/."
    },
    {
      "command": "Bun custom Mermaid 11.16/local differential probe",
      "result": "passed",
      "summary": "Reproduced silent XY statement loss, duplicate PIE parsing, and byte-identical SVG for three ignored XY config/theme fields."
    },
    {
      "command": "Targeted source-map extraction and manifest/doc/source inspection",
      "result": "passed",
      "summary": "Confirmed pinned upstream PIE Map semantics, XY grammar/config inventory, and official documentation contracts."
    },
    {
      "command": "bun run test / bun run typecheck",
      "result": "not-run",
      "summary": "Review-only audit made no source changes; focused executable probes were used instead of the full suite."
    }
  ],
  "validationOutput": [
    "Upstream xyUnknown: REJECT parse error; local xyUnknown: ACCEPT with only bar series.",
    "Local duplicate PIE entries: [{label:Same,value:1},{label:Same,value:9}].",
    "showDataLabelOutsideBar SVG identical: true.",
    "labelRotation 0 vs 45 SVG identical: true.",
    "dataLabelColor red vs green SVG identical: true."
  ],
  "residualRisks": [
    "Upstream QUADRANT duplicate identity behavior was inconclusive due to DOMPurify host failure.",
    "RADAR exotic lexer/duplicate-ID cases need a clean executable upstream differential lane.",
    "Full repository tests and typecheck were not run because this was a no-edit focused audit."
  ],
  "noStagedFiles": true,
  "diffSummary": "Review artifact only; no project/source or test changes.",
  "reviewFindings": [
    "high: src/xychart/parser.ts:68-126 - unknown/malformed statements are silently discarded",
    "high: src/xychart/parser.ts:328-349 - showDataLabelOutsideBar is harvested but unwired",
    "medium: src/xychart/parser.ts:375-430 - x-axis labelRotation is harvested but unwired",
    "medium: src/xychart/parser.ts:353-372 - dataLabelColor is documented but ignored",
    "medium: src/pie/parser.ts:83-104 - duplicate label semantics diverge from pinned Mermaid and break mutation targeting"
  ],
  "manualNotes": "plan.md and progress.md were absent. The checked-out tip commit is Sankey-focused, so these are current-tree fidelity findings rather than direct chart-file changes in the tip commit."
}

Review

Blocker

  • High — Sankey linkColor: gradient is not a gradient. Repro:
    ---
    config:
      sankey:
        linkColor: gradient
        nodeColors:
          A: "#ff0000"
          B: "#0000ff"
    ---
    sankey
    A,B,1
    
    Loading
    Expected (Mermaid 11.16.0): a per-link, user-space <linearGradient> with a source-color stop at 0%, target-color stop at 100%, and the link stroke referencing that gradient. This is explicit in the vendored syntax contract (skills/agentic-mermaid-diagram-workflow/references/upstream/sankey.md, “Links Coloring”) and pinned implementation (node_modules/mermaid/dist/chunks/mermaid.core/sankeyDiagram-HTMAVEWB.mjs:725-735). Actual: one flat midpoint color; the probe returned gradient:false, urlGradient:false, stroke:"#246fce". src/sankey/config.ts:9-12 and src/sankey/renderer.ts:233-258 intentionally substitute a 50/50 blend because the current Scene paint contract forbids URL paints. Deliberate divergence: yes, explicitly documented in code and locked in by src/__tests__/sankey-renderer.test.ts (“gradient mode never emits URL-referencing paints”). That test proves the divergence rather than Mermaid fidelity. Missing contract: a safe, non-fetching local SVG resource-reference representation (typed gradient definition plus local url(#id) paint), a source→target stop test, and an SVG visual/DOM comparison against 11.16.0. This affects the default linkColor, so it is not an edge case.

Notes / concrete gaps

  • Medium — Sankey omits upstream overlap blending independently of the gradient issue. Repro:
    sankey
    A,C,10
    B,D,10
    A,D,5
    B,C,5
    
    Loading
    Expected: Mermaid puts each link wrapper in mix-blend-mode: multiply while retaining stroke-opacity: 0.5 (node_modules/mermaid/dist/chunks/mermaid.core/sankeyDiagram-HTMAVEWB.mjs:725). Actual: Agentic Mermaid emits a path with opacity="0.5" but no blend mode; the probe returned mixBlend:false (src/sankey/renderer.ts:91-121). At crossings and overlaps, the composited color therefore differs from pinned Mermaid even after true gradients are fixed. Deliberate divergence: not identified in the inspected renderer comments or tests; the renderer claims partial opacity makes crossings readable, but does not record the missing multiply behavior. Missing contract: a two-crossing visual fixture asserting overlap compositing, or an explicit fidelity-ledger entry if multiply is intentionally excluded.
  • Medium — open-ended upstream icon integration is replaced by bounded fallback text in both Architecture and Mindmap. Repros:
    architecture-beta
      service pod(logos:kubernetes)[Pod]
    
    Loading
    mindmap
      Root
        Home
        ::icon(mdi mdi-home)
    
    Loading
    Expected: Architecture accepts any registered Iconify pack/name; Mindmap applies host-provided icon-font classes. These are the official integration contracts in skills/agentic-mermaid-diagram-workflow/references/upstream/architecture.md (“Icons”) and skills/agentic-mermaid-diagram-workflow/references/upstream/mindmap.md (“Icons and classes”). Actual: Architecture resolves only a finite MDI subset plus a few aliases and returns null for everything else (src/architecture/icons.ts:80-98), after which rendering uses a one-letter badge. Mindmap resolves only book, skull, or that same Architecture subset (src/mindmap/icons.ts:20-38), then emits a two-character text fallback (src/mindmap/renderer.ts:122-132). Thus syntactically valid, correctly integrated Mermaid icons can silently become K/HO, changing visual identity rather than reporting an unsupported integration. Deliberate divergence: yes—comments and src/__tests__/architecture-icons.test.ts explicitly require offline, finite, no-fetch behavior. Missing contract: either a bounded caller-supplied icon-pack registration API, or a structured verify warning for unresolved icons. Existing tests assert safe fallback but not that a user is told fidelity was lost. No separate image syntax is documented for these three families in the pinned vendored pages, so this audit does not claim a missing image grammar.
  • Low — Architecture accepts a non-upstream header alias. Repro:
    architecture
      service a(server)[A]
    
    Loading
    Expected: Mermaid 11.16.0 rejects line 1, requiring the literal architecture-beta; the local authority says “use the keyword architecture-beta” (skills/agentic-mermaid-diagram-workflow/references/upstream/architecture.md, “Syntax”), and the direct pinned probe returned Expecting token of type 'architecture-beta' but found architecture. Actual: Agentic Mermaid accepts both via /^architecture(?:-beta)?/ (src/architecture/parser.ts:49-50). Deliberate divergence: no explicit compatibility rationale found at that location. Missing contract: a pinned negative grammar test, or explicit documentation that architecture is an Agentic Mermaid extension and canonical serialization normalizes it to architecture-beta.

Correct / strengths

  • Architecture grammar is otherwise broad and structured: declared-before-use groups/services/junctions, nested in membership, item and {group} boundary endpoints, all arrow combinations, labels, duplicate/unknown checks, and 11.16.0 align row|column are represented (src/architecture/parser.ts:35-166,228-326). Targeted parser/integration/terminal tests cover grouped services, junctions, boundary routing, labels, bidirectional edges, nested frames, alignment, accessibility, config, and identities.
  • Architecture config has an honest wire-or-warn boundary: nodeSeparation and idealEdgeLengthMultiplier affect deterministic geometry; fcose-only edgeElasticity, numIter, randomize, and seed emit INEFFECTIVE_CONFIG rather than being silently accepted (src/architecture/config.ts:247-315). This is a reasonable deliberate renderer divergence from Mermaid’s fcose behavior.
  • Mindmap closely covers the pinned page: relative indentation (including unclear intermediate indentation), square/rounded/circle/bang/cloud/hexagon/default shapes, multiline Markdown Strings, ::icon(...), :::class ..., accessibility, and layout: tidy-tree all have exercised contracts (src/mindmap/parser.ts:20-207; src/__tests__/mindmap-gitgraph-doc-parity.test.ts). Structured operations cover add/remove/rename/reparent, shape/icon/class changes, cycle prevention, serialization, and verify (src/__tests__/mindmap-agent-ops.test.ts).
  • Sankey CSV fundamentals are strong: exactly three columns, blank lines/comments, quoted commas, doubled quotes, preserved quoted spacing, first-appearance node order, parallel links, finite non-negative values including zero, and loud self-loop/cycle diagnostics are tested (src/sankey/parser.ts:27-195; src/__tests__/sankey-parser.test.ts). The config surface covers width/height, source/target/static/gradient modes, all four alignments, values/prefix/suffix, legacy/outlined labels, node width/padding/colors (src/sankey/config.ts:34-141).
  • Sankey agent/identity/terminal enrollment is substantive: links remain occurrence-addressable across duplicates; rename/add/remove/set-value rebuild canonical source; source maps anchor every row; verify reports flow imbalance; SVG exposes node/link identities and values; ASCII/Unicode preserve order and proportional values. The targeted suite passed all 143 selected tests.

Uncertainties and residual risk

  • The requested plan.md and progress.md were absent at the supplied repository paths, so no stated divergence ledger or plan assumptions could be checked from them.
  • A browser-level upstream render oracle was not run. Direct mermaid.parse established the Architecture-header mismatch, but some subsequent Mindmap/Sankey probes hit the package’s Bun/DOMPurify integration error; claims above therefore rely on vendored official docs and pinned generated source where browser probing was unavailable.
  • Exponent-form Sankey values and multiline quoted CSV were investigated but are not reported as gaps: the available direct probe was not authoritative enough to establish a pinned rendered behavior. Full bun run test, typecheck, PNG/browser comparison, and mutation red→green checks were not run; only the focused 12-file suite was run.
  • The repository had no staged changes. It did have pre-existing untracked .pi-subagents/; no review edit was made to the repository.
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "Four concrete findings include severity, syntax repro, expected/actual behavior, local file:line evidence, pinned Mermaid docs/source citations, deliberate-divergence status, and missing contracts."
    }
  ],
  "changedFiles": [
    "src/sankey/config.ts",
    "src/sankey/layout.ts",
    "src/sankey/parser.ts",
    "src/sankey/renderer.ts",
    "src/sankey/types.ts",
    "src/agent/sankey-body.ts",
    "src/ascii/sankey.ts",
    "src/agent/core.ts",
    "src/agent/mutate.ts",
    "src/agent/verify.ts",
    "src/render-contract.ts",
    "src/render-family-hooks.ts"
  ],
  "testsAddedOrUpdated": [
    "src/__tests__/agent-sankey.test.ts",
    "src/__tests__/sankey-ascii.test.ts",
    "src/__tests__/sankey-integration.test.ts",
    "src/__tests__/sankey-parser.test.ts",
    "src/__tests__/sankey-renderer.test.ts",
    "src/__tests__/sankey-rubric-properties.test.ts",
    "src/__tests__/scene-effective-paint-contract.test.ts"
  ],
  "commandsRun": [
    {
      "command": "git status --short; git diff --stat; git diff --cached --name-status; git show --stat HEAD",
      "result": "passed",
      "summary": "Inspected PR commit scope; no staged files; only .pi-subagents/ was untracked."
    },
    {
      "command": "bun -e <pinned Mermaid/local syntax and Sankey SVG probe>",
      "result": "passed",
      "summary": "Confirmed architecture alias mismatch and confirmed local gradient SVG has no linearGradient, URL stroke, or mix-blend-mode."
    },
    {
      "command": "bun -e <initial public parseMermaid probe>",
      "result": "failed",
      "summary": "Exploratory command used a non-exported parseMermaid symbol; replaced with direct family parsers."
    },
    {
      "command": "bun -e <second agent core parse probe>",
      "result": "failed",
      "summary": "Exploratory command used a non-exported agent/core parse symbol; replaced with direct family parsers."
    },
    {
      "command": "bun test src/__tests__/architecture-parser.test.ts src/__tests__/architecture-icons.test.ts src/__tests__/architecture-config.test.ts src/__tests__/architecture-integration.test.ts src/__tests__/architecture-ascii.test.ts src/__tests__/mindmap-gitgraph-doc-parity.test.ts src/__tests__/mindmap-agent-ops.test.ts src/__tests__/sankey-parser.test.ts src/__tests__/sankey-renderer.test.ts src/__tests__/sankey-integration.test.ts src/__tests__/sankey-ascii.test.ts src/__tests__/agent-sankey.test.ts",
      "result": "passed",
      "summary": "143 passed, 0 failed, 702 expectations across 12 focused files."
    }
  ],
  "validationOutput": [
    "Pinned Mermaid rejected `architecture` while local Architecture parser accepted it.",
    "Local Sankey gradient probe: linearGradient=false, urlGradient=false, mixBlend=false, flat stroke=#246fce.",
    "Focused test run: 143 pass, 0 fail.",
    "git diff --cached --name-only produced no paths."
  ],
  "residualRisks": [
    "No browser-level upstream SVG oracle was run; some direct Mindmap/Sankey mermaid.parse probes were blocked by Bun/DOMPurify integration.",
    "Full suite, canonical typecheck, PNG comparison, and red-to-green mutation checks were not run.",
    "plan.md and progress.md were absent at the requested paths.",
    "Pre-existing untracked .pi-subagents/ remains, but nothing is staged."
  ],
  "noStagedFiles": true,
  "diffSummary": "Review-only audit; no repository files were edited. PR scope adds Sankey family implementation and enrollment across renderer, agent, terminal, verification, docs, and tests; Architecture/Mindmap were audited in current PR state.",
  "reviewFindings": [
    "blocker/high: src/sankey/renderer.ts:233-258 - gradient mode is a flat midpoint blend instead of Mermaid's true source-to-target SVG gradient.",
    "medium: src/sankey/renderer.ts:91-121 - ribbons omit Mermaid's mix-blend-mode:multiply overlap semantics.",
    "medium: src/architecture/icons.ts:80-98 and src/mindmap/icons.ts:20-38 - valid registered upstream icons silently degrade to text badges outside the finite bundled registry.",
    "low: src/architecture/parser.ts:49-50 - accepts non-upstream `architecture` header alias."
  ],
  "manualNotes": "The gradient mismatch is explicit and test-locked as a Scene-contract divergence; fixing parity requires a typed safe local resource reference, not merely changing the color mixer."
}

Review

  • Correct: PR #192 does establish a real 16-family built-in registry and executes every descriptor’s canonical example through parse, serialize/reparse, mutation, verify, layout, Scene, SVG, and terminal hooks (src/agent/families.ts:129-151,365-384; src/__tests__/section-a-family-descriptor-conformance.test.ts:207-306). The complete role × Scene-primitive matrix and rich-fixture census are materially stronger than file-presence-only enrollment (src/__tests__/section-a-family-descriptor-conformance.test.ts:308-367).
  • Correct: Unregistered upstream families are represented as preserved/diagnosed envelopes rather than silently treated as native. parseRegisteredMermaid creates family:upstream/<id> / family:unknown preserved bodies with a named diagnostic (src/agent/parse.ts:190-231), and UNREGISTERED_FAMILY_CAPABILITY_STATES consistently says diagnosed/source-preserved rather than native (src/agent/families.ts:154-171).
  • Correct: The source-preservation implementation genuinely retains wrapper text by default and whole-body opaque source (src/agent/serialize.ts:22-39,85-115), while structured comment loss is surfaced through COMMENT_DROPPED bookkeeping rather than being silent (src/agent/parse.ts:302-336).
  • Correct: Sankey’s midpoint-color substitution is not hidden in implementation comments: it is explicitly recorded as a divergence (eval/mermaid-sankey-bench/harvest.json:130-165) and renderer tests require the absence of <linearGradient>/url(#…) (src/__tests__/sankey-renderer.test.ts:58-70). That is good divergence documentation, but it conflicts with broader “native syntax parity/fidelity” gates as described below.

Blockers / P0 gaps

  • Blocker (P0 — fidelity claim is not semantically earned): Section A converts artifact classification into native without a feature-specific semantic oracle. featureState maps every executable, portable, and error inventory row directly to native (src/syntax-capability-ledger.ts:190-228); featureRows then attaches one test filename based only on the artifact id (src/syntax-capability-ledger.ts:230-269). For official documentation, the generator inventories headings and hashes section prose, not executable behavior (scripts/generate-upstream-mermaid-manifest.ts:390-445), and the special “evidence” dimension marks documented headings native (src/syntax-capability-ledger.ts:190-194). The ledger validator proves coordinates, counts, hashes, and classifications are internally consistent (src/syntax-capability-ledger.ts:485-579), not that the implementation realizes each feature’s meaning. A test can therefore pass while a feature’s implications are absent.
    • Sankey witness: linkColor: gradient is accepted and called “modeled,” but is rendered as one midpoint color because local paint-server references are forbidden (src/sankey/config.ts:6-14,33-42; src/sankey/renderer.ts:235-260). Upstream uses a source→target <linearGradient> (eval/mermaid-sankey-bench/harvest.json:130-135). This is a diagnosed divergence, not native Mermaid rendering fidelity.
    • Cross-family implication: “parse + stable serialize + some node/edge/label counts” cannot prove sequence activation/block nesting, ER cardinality endpoints, Gantt dependency/date semantics, GitGraph replay ancestry, Pie angle/value projection, or Radar curve-to-axis correspondence. The upstream bench checks public parse, verify.ok, layout counts/minima/term presence, canonical idempotence, and a structural no-drop count (src/__tests__/mermaid-upstream-suite-bench.test.ts:281-343); it does not compare a family-domain semantic projection with upstream’s parser/DB result.
  • Blocker (P0 — native parse/verify and native render can disagree): opaque fallback is counted as success even where rendering fails. Registered family parsing may return a whole-body opaque value and verifyMermaid only emits an advisory UNSUPPORTED_SYNTAX; the test explicitly asserts that this lint does not make verify.ok false (src/__tests__/opaque-unsupported-warning.test.ts:74-105). The same test limits renderability to only class, XY chart, and architecture and deliberately does not require the other opaque cases to render (src/__tests__/opaque-unsupported-warning.test.ts:38-71). Sankey’s cyclic input is the concrete seam: agent parsing succeeds as opaque and verification remains OK, while the native render parser/layout rejects the cycle. A family-wide descriptor still declares parse, verify, layout, SVG, and source preservation all native from one good example (src/agent/families.ts:365-384). A native fidelity gate must classify each construct/case across both agent and render routes, not infer family capability from hook invocation.
  • Blocker (P0 — the upstream authority is split across revisions): the generated manifest is pinned to Mermaid commit f3dea583…, but the executable upstream-suite bench asserts revision a2d96864… (src/__tests__/mermaid-upstream-suite-bench.test.ts:197-211). Manifest generation records the suite revision but does not require it to equal the policy commit; it only enforces that equality for the Mindmap/GitGraph companion oracle (scripts/generate-upstream-mermaid-manifest.ts:310-325). Thus “Mermaid 11.16.0 syntax fidelity” combines official pages/package surfaces from one commit with parser/DB cases from another without a checked compatibility declaration.
  • Blocker (P0 — Sankey’s divergence ledger is outside the Section A semantic authority): eval/mermaid-sankey-bench/harvest.json is cited by citizenship, but the upstream-manifest generator’s sourceArtifacts/syntaxFeatureCandidates include suite, Gantt, Mindmap/GitGraph, and official-doc artifacts—not the Sankey harvest (scripts/generate-upstream-mermaid-manifest.ts:340-380,430-452). Consequently the known gradient divergence cannot downgrade the corresponding Section A feature/dimension. This is the systemic reason a “fake gradient” can coexist with a native report.

P1 gaps: gates that are lexical, presence-only, or smoke-only

  • P1 — citizenship is primarily evidence-path presence and prose-term presence. Matrix cells pass when listed files exist (src/__tests__/diagram-family-citizenship.test.ts:247-286). The syntax/metaphor check verifies URLs, minimum string lengths, evidence path presence, and that the Markdown contains family labels/links (src/__tests__/diagram-family-citizenship.test.ts:337-394). Its behavioral cross-family gate uses one fixture per family and only checks correct kind, verify.ok, canonical idempotence, <svg, non-empty ASCII, and byte determinism (src/__tests__/diagram-family-citizenship.test.ts:288-335). These are valuable enrollment/smoke gates, but cannot justify every matrix cell being satisfied, especially mermaidSyntaxParity, domainProperties, interaction, accessibility, or source-preservation level.
  • P1 — official examples are harvested broadly but executed narrowly. The manifest extracts every fenced Mermaid example and hashes it (scripts/generate-upstream-mermaid-manifest.ts:500-540), yet mermaid-doc-showcase.test.ts executes exactly one selected example per built-in and asserts only SVG existence, finite tokens, strict external-reference safety, plus one Mindmap-specific visual check (src/__tests__/mermaid-doc-showcase.test.ts:33-77). The many remaining official examples are inventory entries, not an all-example executable fidelity corpus. This is especially weak for families with broad grammars such as Flowchart, Sequence, Class, and GitGraph.
  • P1 — wire-or-warn proves admission, not wiring. unknown-config-wire-or-warn.test.ts manually supplies one unknown key and one invalid documented value per family (src/__tests__/unknown-config-wire-or-warn.test.ts:8-37), then checks a warning and unchanged bytes (src/__tests__/unknown-config-wire-or-warn.test.ts:43-92). It does not derive every family key from the pinned semanticInventory.configKeys, nor require each valid key to cause a declared observable delta or a named no-op diagnostic. A semantically false implementation such as linkColor: gradient passes because the key is recognized and output changes to some color; nothing requires gradient stops at the endpoints. Similar risks apply to Sequence configuration (showSequenceNumbers, activation dimensions), GitGraph replay/presentation options, and XY orientation/axis config.
  • P1 — source-preservation levels are prose/manual claims rather than per-construct contracts. The ladder declares L2/L3/L4 statuses for all 16 families (docs/design/system/source-preservation-ladder.md:31-66), while descriptor conformance proves only canonical idempotence on a minimal example (src/__tests__/section-a-family-descriptor-conformance.test.ts:260-275). The upstream bench explicitly skips the semantic no-drop oracle if either side has no structured count, allowing structured→opaque transitions to be owned solely by byte/canonical round-trip (src/__tests__/mermaid-upstream-suite-bench.test.ts:326-341). Selected opaque fixtures prove exact preservation, but several are malformed/tolerated cases, only three must render, and the warning remains non-failing (src/__tests__/opaque-unsupported-warning.test.ts:21-42,74-105). This does not prove every documented-but-unmodeled construct follows its advertised L0/L1/L2 policy.
  • P1 — Section B is a Scene/style census, not syntax semantics. It checks that declared roles/channels appear, that a role style changes serialization, that backends are conformant, and that terminal output is non-empty/digested (src/section-b-capability-report.ts:225-382; src/__tests__/section-b-capability-report.test.ts:13-91). It never ties parsed domain objects to exact Scene marks/relations. Sankey’s link remains a valid connector with category/value channels whether its paint is a true gradient or a midpoint; Sequence could emit the right role names with wrong activation span, and ER could emit a relationship with reversed cardinalities. Role presence is necessary but not semantic fidelity.
  • P1 — accessibility and interaction are not closed cross-family contracts. The render-contract test verifies universal compact/spaced accessibility extraction (src/__tests__/section-a-render-contract.test.ts:424-431), and individual hooks sometimes inject accessibility into family models. But the registry conformance/census does not author accTitle/accDescr for every family and assert exact SVG title/description/ARIA association, layout/region ownership, terminal projection, and serialization. Interaction is even less uniform: the ladder says actions/clicks must never execute and should be preserved/exposed (docs/design/system/source-preservation-ladder.md:31-43), while Flowchart’s unmodeled click target is only tested as opaque/source-only warning (src/__tests__/opaque-unsupported-warning.test.ts:119-136). No registry gate requires modeled links/tooltips/callback intent to survive parse→serialize→scene/action sidecars without execution.

P2 observations

  • P2 — unknown config and official feature classification are hand-maintained in different vocabularies. Family config keys live in descriptors/runtime interfaces, upstream dot paths live in the manifest, and the test case table is a third roster. Enrollment equality catches a missing family, not a missing/renamed key or wrong owning section.
  • P2 — security policy unnecessarily conflates safe local paint servers with fetching references. Sankey’s renderer comments treat url(#gradient) as a fetching form (src/sankey/renderer.ts:235-239), although a typed, document-owned local gradient resource could be admitted similarly to typed marker resources. Until such a primitive exists, the output must remain explicitly diagnosed rather than native.

Built-in native claims vs unsupported upstream inventory

  • The 16 built-in native families are Flowchart, State, Sequence, Timeline, Class, ER, Journey, Architecture, XY Chart, Pie, Quadrant, Gantt, Mindmap, GitGraph, Radar, and Sankey. These are the only families for which this PR’s descriptor registry claims all ten family capabilities native.
  • The pinned upstream manifest also inventories 15 non-built-in upstream families: Swimlane, Requirement, C4, ZenUML, Block, Packet, Kanban, Event Modeling, Treemap, Venn, Ishikawa, Wardley, Cynefin, TreeView, and Railroad. C4 is inventory-only; the others are unsupported. Their preserved/diagnosed handling is not a defect and must not be included in the denominator for “16 built-in native families.” In addition, some headers inside otherwise built-in upstream rows remain unsupported (for example flowchart-elk and classDiagram-v2). Header status, family registration, and construct fidelity must remain separate axes.
  • Recommended wording: “16 built-in native family routes, with construct-level compatibility recorded separately”, not “Mermaid syntax fidelity across all families” until the P0 contracts below exist.

Registry-driven executable contracts that would catch these failures

Define one typed FamilyFidelityContract beside each built-in descriptor and make reports pure projections of executed receipts:

  1. Feature cases keyed to upstream IDs: { featureId, upstreamRevision, source, expectedAgentDisposition, expectedRenderDisposition, expectedSemanticSnapshot, expectedDiagnostics, divergenceId? }. Every manifest feature must resolve to one executable case or a named unsupported/divergence case. A report may say native only after its receipt passes.
  2. Family semantic projectors: normalized domain snapshots independent of SVG text: Flowchart nodes/edge endpoints/shapes; Sequence participant order/messages/blocks/activation intervals; ER entities/attributes/cardinalities; Gantt resolved start/end/dependency/status; GitGraph commit-parent graph/branch heads; XY series/type/domain; Pie slice values and angular shares; Radar axis IDs and curve vectors; Sankey endpoints/values/layers/ribbon widths and paint endpoints. Compare parse→serialize→reparse and, where feasible, upstream parser/DB snapshots.
  3. Config effect matrix derived from pinned config keys: every documented key is wired with an A/B semantic predicate, diagnosed-noop, or unsupported. For Sankey gradient, the predicate must observe a typed gradient resource with source/target stops; midpoint paint must produce a diagnosed divergence receipt, never native. For geometry options, compare positioned fields; for paint, compare typed Scene paint; for text, compare semantic text marks—not whole-SVG inequality.
  4. Agent/render seam contract: for every feature case, agent parse disposition, verify.ok, render resolution, layout, SVG, and terminal must agree according to one declared policy. An opaque agent success paired with render failure requires verify.ok=false or a capability receipt that clearly says source-preserved/non-renderable.
  5. Source ladder cases: per construct, assert exact authored preservation where L1/L2 is claimed; structured semantic stability where L3 is claimed; exact spans/region IDs where L4 is claimed. Forbid structured→opaque on serialization unless explicitly declared and diagnosed. Include wrapper, comments, init, accessibility, malformed syntax, and unknown future syntax.
  6. Scene relation contract: bind semantic snapshot IDs to emitted marks and relationships, not merely roles. Assert one-to-one/count/endpoints/value/status/category/accessible-name mappings and required primitive features. This catches reversed ER cardinality, missing Sequence activation spans, or Sankey midpoint “gradient.”
  7. Accessibility/interaction contract: a registry fixture per family with title/description plus each supported link/tooltip/callback/icon/image form; assert exact serialization, inert parsing, action-analysis metadata, SVG ARIA linkage, region identity, output-security result, and explicit terminal projection/diagnostic.
  8. Official-example all-run gate: execute every harvested official fence. At minimum require declared structured/opaque/reject disposition and semantic snapshot; representative subsets may retain image goldens, but inventory-only examples must not count as native evidence.
  9. Revision closure: every executable oracle must match the manifest commit or carry an explicit compatibility revision reviewed by a gate. Fail generation on the current f3dea583… vs a2d96864… split.
  10. Unsupported registry contract: separately iterate all upstream non-built-ins/unsupported headers and assert preserved source + exact diagnostic + no native capability claim. Do not force them through built-in mutation/layout/Scene gates.

Prioritized audit methodology

P0 — truthfulness and semantic safety (merge/claim blockers)

  1. Freeze the exact upstream revision and fail mixed-revision evidence.
  2. Join every known divergence harvest—including Sankey—into the manifest/Section A authority.
  3. Replace inferred native feature states with executed per-feature receipts.
  4. Gate agent parse/verify against render/layout disposition for every case.
  5. Downgrade Sankey gradient and any analogous substitutions to diagnosed until a typed local-gradient Scene resource and endpoint-stop test exist.

P1 — complete built-in fidelity coverage

  1. Add semantic projectors/contracts for all 16 built-ins and run all harvested official examples.
  2. Generate the valid-key wire/no-op matrix from upstream config inventory plus descriptor ownership.
  3. Turn source-preservation levels, accessibility, interactions, Scene relations, and serialization into registry-required contracts.
  4. Make Section A/B and citizenship consume these receipts instead of file paths, term checks, or one-example smoke results.

P2 — depth and reviewer evidence

  1. Add metamorphic/domain properties to semantic snapshots (e.g. Sankey scaling preserves relative widths, Pie permutation preserves shares, Radar axis permutation moves matching values, Gantt date translation preserves durations, Sequence insertion preserves unrelated lifelines).
  2. Add upstream differential visual/geometry checks where deterministic equivalence is meaningful; retain explicit tolerances and divergence IDs where implementation design differs.
  3. Keep curated galleries/goldens as reviewer evidence, but never use their existence or digest as a substitute for feature semantics.

Residual risk

  • This was a review-only audit. No repository source or test was edited.
  • The requested plan.md and progress.md were absent at the repository root, so they could not inform the audit.
  • Full CI was not rerun; findings are based on direct inspection of PR #192’s committed code, generated artifacts, and tests. The working tree had no staged files; only an untracked .pi-subagents/ directory was reported.
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "Concrete P0/P1/P2 findings cite manifest generation, syntax ledger, registry metadata, agent parse/serialization, config, Section A/B, citizenship, official-example, upstream-bench, Sankey, accessibility, and interaction files with line ranges."
    }
  ],
  "changedFiles": [],
  "testsAddedOrUpdated": [
    "src/__tests__/agent-sankey.test.ts",
    "src/__tests__/sankey-integration.test.ts",
    "src/__tests__/sankey-renderer.test.ts",
    "src/__tests__/scene-effective-paint-contract.test.ts",
    "src/__tests__/section-a-family-descriptor-conformance.test.ts",
    "src/__tests__/section-b-capability-report.test.ts",
    "src/__tests__/unknown-config-wire-or-warn.test.ts",
    "src/__tests__/mermaid-upstream-suite-bench.test.ts"
  ],
  "commandsRun": [
    {
      "command": "git status --short && git branch --show-current && git log -5 --oneline",
      "result": "passed",
      "summary": "Reviewed branch pr-192 at a3b1b3b3; no staged files, only untracked .pi-subagents/."
    },
    {
      "command": "git diff --stat && git diff --cached --stat && git diff --name-only main...HEAD",
      "result": "passed",
      "summary": "Confirmed the review scope against main and that the index had no staged diff."
    },
    {
      "command": "git show --stat --oneline HEAD && git show --format=fuller --no-ext-diff --name-status HEAD",
      "result": "passed",
      "summary": "Inspected PR #192's 146-file Sankey/enrollment commit and its test/artifact surface."
    },
    {
      "command": "python3 manifest inventory summaries for families/features/examples/header statuses",
      "result": "passed",
      "summary": "Confirmed 16 built-in native family mappings and 15 additional unsupported/inventory-only upstream families; exposed documented-vs-executable feature counts."
    },
    {
      "command": "bun run test / bun run typecheck",
      "result": "not-run",
      "summary": "Review-only static audit; no implementation changes were made."
    }
  ],
  "validationOutput": [
    "Section A native feature states are inferred from artifact status rather than feature-specific semantic outcomes.",
    "Sankey gradient is an explicit midpoint-color divergence that current native/citizenship gates do not downgrade.",
    "Agent opaque parse/verify success is not contractually aligned with native render success.",
    "Executable suite revision a2d96864… differs from manifest policy commit f3dea583… without a global equality gate.",
    "No repository files were modified or staged by this audit."
  ],
  "residualRisks": [
    "Full CI was not rerun.",
    "plan.md and progress.md were absent at the requested repository paths.",
    "Many harvested official examples remain inventory-only rather than semantically executed."
  ],
  "noStagedFiles": true,
  "diffSummary": "Review-only: no repository diff. Audited PR #192's committed 146-file change and wrote only the required external audit artifact.",
  "reviewFindings": [
    "blocker: src/syntax-capability-ledger.ts:190-269 - native syntax state is inferred from inventory status/test-file association, not feature semantics.",
    "blocker: src/agent/families.ts:365-384 and src/__tests__/opaque-unsupported-warning.test.ts:38-105 - one-example native capability claims mask opaque parse/render disagreement.",
    "blocker: scripts/generate-upstream-mermaid-manifest.ts:310-325 - executable suite and pinned manifest revisions are not required to match.",
    "blocker: eval/mermaid-sankey-bench/harvest.json:130-135 - upstream gradient semantics are replaced by midpoint paint while broader gates still permit native fidelity claims.",
    "note: citizenship, showcase, Section B, wire-or-warn, and source-ladder gates contain useful enrollment checks but are presence-, term-, digest-, or smoke-oriented rather than complete semantic contracts."
  ],
  "manualNotes": "The 15 non-built-in upstream families are intentionally unsupported/inventory-only and should remain distinct from gaps in the 16 built-in native claims."
}
{
"summary": [
{
"family": "flowchart",
"total": 112,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 7,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 23
},
{
"family": "state",
"total": 20,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 2,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 3
},
{
"family": "sequence",
"total": 36,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 14
},
{
"family": "class",
"total": 36,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 10,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 12
},
{
"family": "er",
"total": 23,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 3,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 9
},
{
"family": "timeline",
"total": 14,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 8
},
{
"family": "journey",
"total": 1,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 0
},
{
"family": "architecture",
"total": 6,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 0
},
{
"family": "xychart",
"total": 8,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 3
},
{
"family": "pie",
"total": 2,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 0
},
{
"family": "quadrant",
"total": 3,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 0
},
{
"family": "gantt",
"total": 11,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 2,
"renderFail": 2,
"roundtripFail": 0,
"warnings": 4
},
{
"family": "mindmap",
"total": 13,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 2
},
{
"family": "gitgraph",
"total": 35,
"parseFail": 1,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 1,
"renderFail": 2,
"roundtripFail": 0,
"warnings": 2
},
{
"family": "radar",
"total": 3,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 0
},
{
"family": "sankey",
"total": 8,
"parseFail": 0,
"wrongFamily": 0,
"opaque": 0,
"verifyFail": 0,
"renderFail": 0,
"roundtripFail": 0,
"warnings": 7
}
],
"failures": [
{
"family": "flowchart",
"index": 3,
"line": 98,
"first": "--- / config: / htmlLabels: false",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 66,
"line": 963,
"first": "flowchart TD / A@{ icon: \"fa:user\", form: \"square\", label: \"User Icon\", pos: \"t\", h: 60 }",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 67,
"line": 1011,
"first": "flowchart TD / %% My image with a constrained aspect ratio / A@{ img: \"https://mermaid.js.org/favicon.svg\", label: \"My example image label\", pos: \"t\", h: 60, constraint: \"on\" }",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 99,
"line": 1635,
"first": "flowchart TD / Start --> one / subgraph one [My Group]",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 100,
"line": 1682,
"first": "--- / config: / htmlLabels: false",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 101,
"line": 1754,
"first": "flowchart LR / A-->B / B-->C",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 102,
"line": 1783,
"first": "flowchart LR / A-->B / B-->C",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "class",
"index": 4,
"line": 160,
"first": "classDiagram / class `Animal Class!` / class `Car Class`",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 21,
"line": 737,
"first": "classDiagram / class Shape <<interface>>",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 22,
"line": 752,
"first": "classDiagram / class Shape / <<interface>> Shape",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 25,
"line": 844,
"first": "classDiagram / direction RL / class Student {",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 28,
"line": 930,
"first": "classDiagram / class Shape / callback Shape \"callbackFunction\" \"This is a tooltip for a callback\"",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 29,
"line": 958,
"first": "classDiagram / class Class01 / class Class02",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 31,
"line": 1077,
"first": "classDiagram / class Animal:::someclass / classDef someclass fill:#f96",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 32,
"line": 1094,
"first": "classDiagram / class Animal:::someclass { / -int sizeInFeet",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 33,
"line": 1120,
"first": "classDiagram / class Animal:::pink / class Mineral",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 34,
"line": 1153,
"first": "classDiagram / class Animal:::styleClass",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "state",
"index": 16,
"line": 453,
"first": "stateDiagram-v2 / [*] --> Still / Still --> [*]",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "state"
},
{
"family": "state",
"index": 17,
"line": 565,
"first": "stateDiagram / direction TB / ",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "state"
},
{
"family": "er",
"index": 5,
"line": 206,
"first": "erDiagram / CAR 1 to zero or more NAMED-DRIVER : allows / PERSON many(0) optionally to 0+ NAMED-DRIVER : is",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW"
],
"actualFamily": "er"
},
{
"family": "er",
"index": 9,
"line": 328,
"first": "erDiagram / CAR ||--o{ NAMED-DRIVER : allows / CAR {",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW"
],
"actualFamily": "er"
},
{
"family": "er",
"index": 18,
"line": 666,
"first": "erDiagram / id1||--||id2 : label / style id1 fill:#f9f,stroke:#333,stroke-width:4px",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW"
],
"actualFamily": "er"
},
{
"family": "gantt",
"index": 6,
"line": 386,
"first": "gantt / tickInterval 1week / weekday monday",
"parseOk": true,
"structured": true,
"verifyOk": false,
"renderOk": false,
"roundtripOk": true,
"warnings": [
"EMPTY_DIAGRAM"
],
"actualFamily": "gantt",
"renderError": "GanttError: GANTT_EMPTY: Gantt diagram has no tasks"
},
{
"family": "gantt",
"index": 10,
"line": 697,
"first": "--- / # Frontmatter config, YAML comments / title: Ignored if specified in chart",
"parseOk": true,
"structured": true,
"verifyOk": false,
"renderOk": false,
"roundtripOk": true,
"warnings": [
"UNRESOLVABLE_SCHEDULE"
],
"actualFamily": "gantt",
"renderError": "GanttError: GANTT_BAD_DATE: Invalid end date \"1s %% not yet official\" for dateFormat \"YYYY\""
},
{
"family": "gitgraph",
"index": 9,
"line": 396,
"first": "gitGraph / commit id: \"ZERO\" / branch develop",
"parseOk": true,
"structured": true,
"verifyOk": false,
"renderOk": false,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW",
"RENDER_FAILED"
],
"actualFamily": "gitgraph",
"renderError": "SceneValidationError: Scene validation failed: scene: parts[21]/0(shape:c6:shape).points: semantic \"833.395,248.04000000000002 843.395,258.04 833.395,268.04 823\" != crisp \"833.395,248.04 843.395,258.04 833.395,268.04 823.395,258.04\""
},
{
"family": "gitgraph",
"index": 14,
"line": 800,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": false,
"structured": false,
"verifyOk": false,
"renderOk": false,
"roundtripOk": false,
"warnings": [],
"parseError": "Duplicate gitGraph commit id 'Boston' on line 18; commit IDs must be unique.",
"renderError": "GitGraphParseError: Duplicate gitGraph commit id 'Boston' on line 18; commit IDs must be unique."
}
],
"rows": [
{
"family": "flowchart",
"index": 0,
"line": 31,
"first": "--- / title: Node / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 1,
"line": 59,
"first": "--- / title: Node with text / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 2,
"line": 76,
"first": "flowchart LR / id[\"This ❤ Unicode\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 3,
"line": 98,
"first": "--- / config: / htmlLabels: false",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 4,
"line": 122,
"first": "flowchart TD / Start --> Stop",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 5,
"line": 134,
"first": "flowchart LR / Start --> Stop",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 6,
"line": 156,
"first": "flowchart LR / id1(This is the text in the box)",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 7,
"line": 168,
"first": "flowchart LR / id1([This is the text in the box])",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 8,
"line": 180,
"first": "flowchart LR / id1[[This is the text in the box]]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 9,
"line": 192,
"first": "flowchart LR / id1[(Database)]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 10,
"line": 204,
"first": "flowchart LR / id1((This is the text in the circle))",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 11,
"line": 216,
"first": "flowchart LR / id1>This is the text in the box]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 12,
"line": 230,
"first": "flowchart LR / id1{This is the text in the box}",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 13,
"line": 242,
"first": "flowchart LR / id1{{This is the text in the box}}",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 14,
"line": 254,
"first": "flowchart TD / id1[/This is the text in the box/]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 15,
"line": 266,
"first": "flowchart TD / id1[\\This is the text in the box\\]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 16,
"line": 278,
"first": "flowchart TD / A[/Christmas\\]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 17,
"line": 290,
"first": "flowchart TD / B[\\Go shopping/]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 18,
"line": 302,
"first": "flowchart TD / id1(((This is the text in the circle)))",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 19,
"line": 389,
"first": "flowchart RL / A@{ shape: manual-file, label: \"File Handling\"} / B@{ shape: manual-input, label: \"User Input\"}",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 20,
"line": 405,
"first": "flowchart TD / A@{ shape: rect, label: \"This is a process\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 21,
"line": 417,
"first": "flowchart TD / A@{ shape: rounded, label: \"This is an event\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 22,
"line": 429,
"first": "flowchart TD / A@{ shape: stadium, label: \"Terminal point\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 23,
"line": 441,
"first": "flowchart TD / A@{ shape: subproc, label: \"This is a subprocess\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 24,
"line": 453,
"first": "flowchart TD / A@{ shape: cyl, label: \"Database\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 25,
"line": 465,
"first": "flowchart TD / A@{ shape: circle, label: \"Start\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 26,
"line": 477,
"first": "flowchart TD / A@{ shape: odd, label: \"Odd shape\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 27,
"line": 489,
"first": "flowchart TD / A@{ shape: diamond, label: \"Decision\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 28,
"line": 501,
"first": "flowchart TD / A@{ shape: hex, label: \"Prepare conditional\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 29,
"line": 513,
"first": "flowchart TD / A@{ shape: lean-r, label: \"Input/Output\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 30,
"line": 525,
"first": "flowchart TD / A@{ shape: lean-l, label: \"Output/Input\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 31,
"line": 537,
"first": "flowchart TD / A@{ shape: datastore, label: \"Datastore\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 32,
"line": 549,
"first": "flowchart TD / A@{ shape: trap-b, label: \"Priority action\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 33,
"line": 561,
"first": "flowchart TD / A@{ shape: trap-t, label: \"Manual operation\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 34,
"line": 573,
"first": "flowchart TD / A@{ shape: dbl-circ, label: \"Stop\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 35,
"line": 585,
"first": "flowchart TD / A@{ shape: text, label: \"This is a text block\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 36,
"line": 597,
"first": "flowchart TD / A@{ shape: notch-rect, label: \"Card\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 37,
"line": 609,
"first": "flowchart TD / A@{ shape: lin-rect, label: \"Lined process\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 38,
"line": 621,
"first": "flowchart TD / A@{ shape: sm-circ, label: \"Small start\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 39,
"line": 633,
"first": "flowchart TD / A@{ shape: framed-circle, label: \"Stop\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 40,
"line": 645,
"first": "flowchart TD / A@{ shape: fork, label: \"Fork or Join\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 41,
"line": 657,
"first": "flowchart TD / A@{ shape: hourglass, label: \"Collate\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 42,
"line": 669,
"first": "flowchart TD / A@{ shape: comment, label: \"Comment\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 43,
"line": 681,
"first": "flowchart TD / A@{ shape: brace-r, label: \"Comment\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 44,
"line": 693,
"first": "flowchart TD / A@{ shape: braces, label: \"Comment\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 45,
"line": 705,
"first": "flowchart TD / A@{ shape: bolt, label: \"Communication link\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 46,
"line": 717,
"first": "flowchart TD / A@{ shape: doc, label: \"Document\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 47,
"line": 729,
"first": "flowchart TD / A@{ shape: delay, label: \"Delay\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 48,
"line": 741,
"first": "flowchart TD / A@{ shape: das, label: \"Direct access storage\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 49,
"line": 753,
"first": "flowchart TD / A@{ shape: lin-cyl, label: \"Disk storage\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 50,
"line": 765,
"first": "flowchart TD / A@{ shape: curv-trap, label: \"Display\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 51,
"line": 777,
"first": "flowchart TD / A@{ shape: div-rect, label: \"Divided process\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 52,
"line": 789,
"first": "flowchart TD / A@{ shape: tri, label: \"Extract\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 53,
"line": 801,
"first": "flowchart TD / A@{ shape: win-pane, label: \"Internal storage\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 54,
"line": 813,
"first": "flowchart TD / A@{ shape: f-circ, label: \"Junction\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 55,
"line": 825,
"first": "flowchart TD / A@{ shape: lin-doc, label: \"Lined document\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 56,
"line": 837,
"first": "flowchart TD / A@{ shape: notch-pent, label: \"Loop limit\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 57,
"line": 849,
"first": "flowchart TD / A@{ shape: flip-tri, label: \"Manual file\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 58,
"line": 861,
"first": "flowchart TD / A@{ shape: sl-rect, label: \"Manual input\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 59,
"line": 873,
"first": "flowchart TD / A@{ shape: docs, label: \"Multiple documents\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 60,
"line": 885,
"first": "flowchart TD / A@{ shape: processes, label: \"Multiple processes\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 61,
"line": 897,
"first": "flowchart TD / A@{ shape: flag, label: \"Paper tape\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 62,
"line": 909,
"first": "flowchart TD / A@{ shape: bow-rect, label: \"Stored data\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 63,
"line": 921,
"first": "flowchart TD / A@{ shape: cross-circ, label: \"Summary\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 64,
"line": 933,
"first": "flowchart TD / A@{ shape: tag-doc, label: \"Tagged document\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 65,
"line": 945,
"first": "flowchart TD / A@{ shape: tag-rect, label: \"Tagged process\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 66,
"line": 963,
"first": "flowchart TD / A@{ icon: \"fa:user\", form: \"square\", label: \"User Icon\", pos: \"t\", h: 60 }",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 67,
"line": 1011,
"first": "flowchart TD / %% My image with a constrained aspect ratio / A@{ img: \"https://mermaid.js.org/favicon.svg\", label: \"My example image label\", pos: \"t\", h: 60, constraint: \"on\" }",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 68,
"line": 1028,
"first": "flowchart LR / A-->B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 69,
"line": 1040,
"first": "flowchart LR / A --- B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 70,
"line": 1052,
"first": "flowchart LR / A-- This is the text! ---B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 71,
"line": 1064,
"first": "flowchart LR / A---|This is the text|B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 72,
"line": 1076,
"first": "flowchart LR / A-->|text|B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 73,
"line": 1088,
"first": "flowchart LR / A-- text -->B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 74,
"line": 1100,
"first": "flowchart LR / A-.->B;",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 75,
"line": 1112,
"first": "flowchart LR / A-. text .-> B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 76,
"line": 1124,
"first": "flowchart LR / A ==> B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 77,
"line": 1136,
"first": "flowchart LR / A == text ==> B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 78,
"line": 1150,
"first": "flowchart LR / A ~~~ B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 79,
"line": 1164,
"first": "flowchart LR / A -- text --> B -- text2 --> C",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 80,
"line": 1176,
"first": "flowchart LR / a --> b & c--> d",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 81,
"line": 1188,
"first": "flowchart TB / A & B--> C & D",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 82,
"line": 1206,
"first": "flowchart TB / A --> C / A --> D",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 83,
"line": 1227,
"first": "flowchart LR / A e1@--> B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 84,
"line": 1244,
"first": "flowchart LR / A e1@==> B / e1@{ animate: true }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 85,
"line": 1264,
"first": "flowchart LR / A e1@--> B / e1@{ animation: fast }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 86,
"line": 1283,
"first": "flowchart LR / A e1@--> B / classDef animate stroke-dasharray: 9,5,stroke-dashoffset: 900,animation: dash 25s linear infinite;",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 87,
"line": 1313,
"first": "flowchart LR / A --o B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 88,
"line": 1325,
"first": "flowchart LR / A --x B",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 89,
"line": 1341,
"first": "flowchart LR / A o--o B / B <--> C",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 90,
"line": 1368,
"first": "flowchart TD / A[Start] --> B{Is it?} / B -->|Yes| C[OK]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 91,
"line": 1393,
"first": "flowchart TD / A[Start] --> B{Is it?} / B -- Yes --> C[OK]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 92,
"line": 1423,
"first": "flowchart LR / id1[\"This is the (text) in the box\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 93,
"line": 1437,
"first": "flowchart LR / A[\"A double quote:#quot;\"] --> B[\"A dec char:#9829;\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 94,
"line": 1468,
"first": "flowchart TB / c1-->a2 / subgraph one",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 95,
"line": 1492,
"first": "flowchart TB / c1-->a2 / subgraph ide1 [one]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 96,
"line": 1521,
"first": "flowchart TB / c1-->a2 / subgraph one",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 97,
"line": 1559,
"first": "flowchart LR / subgraph TOP / direction TB",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 98,
"line": 1599,
"first": "flowchart LR / subgraph subgraph1 / direction TB",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"COMMENT_DROPPED"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 99,
"line": 1635,
"first": "flowchart TD / Start --> one / subgraph one [My Group]",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 100,
"line": 1682,
"first": "--- / config: / htmlLabels: false",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 101,
"line": 1754,
"first": "flowchart LR / A-->B / B-->C",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 102,
"line": 1783,
"first": "flowchart LR / A-->B / B-->C",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX",
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 103,
"line": 1835,
"first": "flowchart LR / %% this is a comment A -- text --> B{node} / A -- text --> B -- text2 --> C",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"COMMENT_DROPPED"
],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 104,
"line": 1899,
"first": "flowchart LR / A e1@==> B / A e2@--> C",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 105,
"line": 1926,
"first": "flowchart LR / id1(Start)-->id2(Stop) / style id1 fill:#f9f,stroke:#333,stroke-width:4px",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 106,
"line": 1970,
"first": "flowchart LR / A:::someclass --> B / classDef someclass fill:#f96",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 107,
"line": 1986,
"first": "flowchart LR / A:::foo & B:::bar --> C:::foobar / classDef foo stroke:#f00",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 108,
"line": 2010,
"first": "flowchart LR / A:::myStyle --> B / classDef myStyle fill:#ff0000,stroke:#ffff00,stroke-width:4px",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 109,
"line": 2038,
"first": "flowchart TD / B[\"fa:fa-twitter for peace\"] / B-->C[fa:fa-ban forbidden]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 110,
"line": 2097,
"first": "flowchart TD / B[\"fa:fa-twitter for peace\"] / B-->C[\"fab:fa-truck-bold a custom icon\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "flowchart",
"index": 111,
"line": 2119,
"first": "flowchart LR / A[Hard edge] -->|Link text| B(Round edge) / B --> C{Decision}",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "flowchart"
},
{
"family": "sequence",
"index": 0,
"line": 20,
"first": "sequenceDiagram / Alice->>John: Hello John, how are you? / John-->>Alice: Great!",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 1,
"line": 49,
"first": "sequenceDiagram / participant Alice / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 2,
"line": 69,
"first": "sequenceDiagram / actor Alice / actor Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 3,
"line": 89,
"first": "sequenceDiagram / participant Alice@{ \"type\" : \"boundary\" } / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 4,
"line": 109,
"first": "sequenceDiagram / participant Alice@{ \"type\" : \"control\" } / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 5,
"line": 129,
"first": "sequenceDiagram / participant Alice@{ \"type\" : \"entity\" } / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 6,
"line": 149,
"first": "sequenceDiagram / participant Alice@{ \"type\" : \"database\" } / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 7,
"line": 169,
"first": "sequenceDiagram / participant Alice@{ \"type\" : \"collections\" } / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 8,
"line": 189,
"first": "sequenceDiagram / participant Alice@{ \"type\" : \"queue\" } / participant Bob",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 9,
"line": 213,
"first": "sequenceDiagram / participant A as Alice / participant J as John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 10,
"line": 234,
"first": "sequenceDiagram / participant API@{ \"type\": \"boundary\" } as Public API / actor DB@{ \"type\": \"database\" } as User Database",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 11,
"line": 260,
"first": "sequenceDiagram / participant API@{ \"type\": \"boundary\", \"alias\": \"Public API\" } / participant Auth@{ \"type\": \"control\", \"alias\": \"Auth Service\" }",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 12,
"line": 283,
"first": "sequenceDiagram / participant API@{ \"type\": \"boundary\", \"alias\": \"Internal Name\" } as External Name / participant DB@{ \"type\": \"database\", \"alias\": \"Internal DB\" } as External DB",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 13,
"line": 318,
"first": "sequenceDiagram / Alice->>Bob: Hello Bob, how are you ? / Bob->>Alice: Fine, thank you. And you?",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 14,
"line": 396,
"first": "sequenceDiagram / box Purple Alice & John / participant A",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 15,
"line": 482,
"first": "sequenceDiagram / participant Alice / participant John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 16,
"line": 503,
"first": "sequenceDiagram / Alice->>John: Hello John, how are you? / activate John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 17,
"line": 519,
"first": "sequenceDiagram / Alice->>+John: Hello John, how are you? / John-->>-Alice: Great!",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 18,
"line": 535,
"first": "sequenceDiagram / Alice->>+John: Hello John, how are you? / Alice->>+John: John, can you hear me?",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 19,
"line": 556,
"first": "sequenceDiagram / participant John / Note right of John: Text in note",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 20,
"line": 570,
"first": "sequenceDiagram / Alice->John: Hello John, how are you? / Note over Alice,John: A typical interaction",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 21,
"line": 586,
"first": "sequenceDiagram / Alice->John: Hello John,<br/>how are you? / Note over Alice,John: A typical interaction<br/>But now in two lines",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 22,
"line": 601,
"first": "sequenceDiagram / participant Alice as Alice<br/>Johnson / Alice->John: Hello John,<br/>how are you?",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 23,
"line": 628,
"first": "sequenceDiagram / Alice->John: Hello John, how are you? / loop Every minute",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 24,
"line": 671,
"first": "sequenceDiagram / Alice->>Bob: Hello Bob, how are you? / alt is sick",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 25,
"line": 713,
"first": "sequenceDiagram / par Alice to Bob / Alice->>Bob: Hello guys!",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 26,
"line": 740,
"first": "sequenceDiagram / par Alice to Bob / Alice->>Bob: Go help John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 27,
"line": 783,
"first": "sequenceDiagram / critical Establish a connection to the DB / Service-->DB: connect",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 28,
"line": 803,
"first": "sequenceDiagram / critical Establish a connection to the DB / Service-->DB: connect",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 29,
"line": 836,
"first": "sequenceDiagram / Consumer-->API: Book something / API-->BookingService: Start booking process",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 30,
"line": 891,
"first": "sequenceDiagram / participant Alice / participant John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 31,
"line": 921,
"first": "sequenceDiagram / Alice->>John: Hello John, how are you? / %% this is a comment",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"COMMENT_DROPPED"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 32,
"line": 938,
"first": "sequenceDiagram / A->>B: I #9829; you! / B->>A: I #9829; you #infin; times more!",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 33,
"line": 973,
"first": "sequenceDiagram / autonumber / Alice->>John: Hello John, how are you?",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 34,
"line": 1019,
"first": "sequenceDiagram / participant Alice / participant John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "sequence",
"index": 35,
"line": 1055,
"first": "sequenceDiagram / participant Alice / participant John",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sequence"
},
{
"family": "class",
"index": 0,
"line": 46,
"first": "--- / title: Animal example / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 1,
"line": 99,
"first": "--- / title: Bank example / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 2,
"line": 125,
"first": "classDiagram / class Animal / Vehicle <|-- Car",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 3,
"line": 144,
"first": "classDiagram / class Animal[\"Animal with a label\"] / class Car[\"Car with *! symbols\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 4,
"line": 160,
"first": "classDiagram / class `Animal Class!` / class `Car Class`",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 5,
"line": 186,
"first": "classDiagram / class BankAccount / BankAccount : +String owner",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 6,
"line": 207,
"first": "classDiagram / class BankAccount{ / +String owner",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 7,
"line": 231,
"first": "classDiagram / class BankAccount{ / +String owner",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 8,
"line": 262,
"first": "classDiagram / class Square~Shape~{ / int id",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 9,
"line": 329,
"first": "classDiagram / classA <|-- classB / classC *-- classD",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 10,
"line": 357,
"first": "classDiagram / classA --|> classB : Inheritance / classC --* classD : Composition",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 11,
"line": 385,
"first": "classDiagram / classA <|-- classB : implements / classC *-- classD : composition",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 12,
"line": 401,
"first": "classDiagram / Animal <|--|> Zebra",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 13,
"line": 446,
"first": "classDiagram / bar ()-- foo",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 14,
"line": 463,
"first": "classDiagram / class Class01 { / int amount",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 15,
"line": 490,
"first": "classDiagram / namespace BaseShapes { / class Triangle",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 16,
"line": 515,
"first": "classDiagram / namespace Auth[\"Authentication Service\"] { / class UserService {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 17,
"line": 554,
"first": "classDiagram / namespace Company.Engineering.Backend { / class Developer {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 18,
"line": 600,
"first": "classDiagram / namespace Platform { / namespace Auth {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 19,
"line": 657,
"first": "--- / config: / class:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 20,
"line": 712,
"first": "classDiagram / Customer \"1\" --> \"*\" Ticket / Student \"1\" --> \"1..*\" Course",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 21,
"line": 737,
"first": "classDiagram / class Shape <<interface>>",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 22,
"line": 752,
"first": "classDiagram / class Shape / <<interface>> Shape",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 23,
"line": 780,
"first": "classDiagram / class Shape{ / <<interface>>",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 24,
"line": 812,
"first": "classDiagram / %% This whole line is a comment classDiagram class Shape <<interface>> / class Shape{",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"COMMENT_DROPPED"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 25,
"line": 844,
"first": "classDiagram / direction RL / class Student {",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 26,
"line": 894,
"first": "classDiagram / note \"This is a general note\" / note for MyClass \"This is a note for a class\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 27,
"line": 912,
"first": "classDiagram / class Shape / link Shape \"https://www.github.com\" \"This is a tooltip for a link\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 28,
"line": 930,
"first": "classDiagram / class Shape / callback Shape \"callbackFunction\" \"This is a tooltip for a callback\"",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 29,
"line": 958,
"first": "classDiagram / class Class01 / class Class02",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 30,
"line": 1032,
"first": "classDiagram / class Animal / class Mineral",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "class"
},
{
"family": "class",
"index": 31,
"line": 1077,
"first": "classDiagram / class Animal:::someclass / classDef someclass fill:#f96",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 32,
"line": 1094,
"first": "classDiagram / class Animal:::someclass { / -int sizeInFeet",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 33,
"line": 1120,
"first": "classDiagram / class Animal:::pink / class Mineral",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 34,
"line": 1153,
"first": "classDiagram / class Animal:::styleClass",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "class"
},
{
"family": "class",
"index": 35,
"line": 1184,
"first": "--- / config: / class:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"INEFFECTIVE_CONFIG"
],
"actualFamily": "class"
},
{
"family": "state",
"index": 0,
"line": 30,
"first": "--- / title: Simple sample / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 1,
"line": 57,
"first": "stateDiagram / [*] --> Still / Still --> [*]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 2,
"line": 82,
"first": "stateDiagram-v2 / stateId",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 3,
"line": 94,
"first": "stateDiagram-v2 / state \"This is a state description\" as s2",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 4,
"line": 106,
"first": "stateDiagram-v2 / s2 : This is a state description",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 5,
"line": 123,
"first": "stateDiagram-v2 / s1 --> s2",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 6,
"line": 135,
"first": "stateDiagram-v2 / s1 --> s2: A transition",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 7,
"line": 151,
"first": "stateDiagram-v2 / [*] --> s1 / s1 --> [*]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 8,
"line": 182,
"first": "stateDiagram-v2 / [*] --> First / state First {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 9,
"line": 220,
"first": "stateDiagram-v2 / [*] --> First / ",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 10,
"line": 261,
"first": "stateDiagram-v2 / [*] --> First / First --> Second",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 11,
"line": 296,
"first": "stateDiagram-v2 / state if_state <<choice>> / [*] --> IsPositive",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"ROUTE_LABEL_ON_SHARED_TRUNK"
],
"actualFamily": "state"
},
{
"family": "state",
"index": 12,
"line": 323,
"first": "stateDiagram-v2 / state fork_state <<fork>> / [*] --> fork_state",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 13,
"line": 354,
"first": "stateDiagram-v2 / State1: The state with a note / note right of State1",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 14,
"line": 388,
"first": "stateDiagram-v2 / [*] --> Active / ",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 15,
"line": 425,
"first": "stateDiagram / direction LR / [*] --> A",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 16,
"line": 453,
"first": "stateDiagram-v2 / [*] --> Still / Still --> [*]",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "state"
},
{
"family": "state",
"index": 17,
"line": 565,
"first": "stateDiagram / direction TB / ",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX"
],
"actualFamily": "state"
},
{
"family": "state",
"index": 18,
"line": 618,
"first": "stateDiagram / direction TB / ",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "state",
"index": 19,
"line": 658,
"first": "stateDiagram / classDef yourState font-style:italic,font-weight:bold,fill:white / ",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "state"
},
{
"family": "er",
"index": 0,
"line": 25,
"first": "--- / title: Order example / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 1,
"line": 61,
"first": "erDiagram / CUSTOMER ||--o{ ORDER : places / CUSTOMER {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 2,
"line": 119,
"first": "erDiagram / \"This ❤ Unicode\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 3,
"line": 133,
"first": "erDiagram / \"This **is** _Markdown_\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 4,
"line": 194,
"first": "erDiagram / CAR ||--o{ NAMED-DRIVER : allows / PERSON }o..o{ NAMED-DRIVER : is",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 5,
"line": 206,
"first": "erDiagram / CAR 1 to zero or more NAMED-DRIVER : allows / PERSON many(0) optionally to 0+ NAMED-DRIVER : is",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW"
],
"actualFamily": "er"
},
{
"family": "er",
"index": 6,
"line": 232,
"first": "erDiagram / CAR ||--o{ NAMED-DRIVER : allows / CAR {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 7,
"line": 263,
"first": "erDiagram / PERSON { / string firstName",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 8,
"line": 288,
"first": "erDiagram / p[Person] { / string firstName",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 9,
"line": 328,
"first": "erDiagram / CAR ||--o{ NAMED-DRIVER : allows / CAR {",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW"
],
"actualFamily": "er"
},
{
"family": "er",
"index": 10,
"line": 379,
"first": "erDiagram / direction TB / CUSTOMER ||--o{ ORDER : places",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 11,
"line": 423,
"first": "erDiagram / direction LR / CUSTOMER ||--o{ ORDER : places",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 12,
"line": 489,
"first": "erDiagram / subgraph title1 / CUSTOMER",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 13,
"line": 523,
"first": "erDiagram / subgraph title1 / CUSTOMER",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 14,
"line": 539,
"first": "erDiagram / subgraph \"Customer Domain\" / CUSTOMER",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 15,
"line": 555,
"first": "erDiagram / subgraph id1 [title 1] / CUSTOMER",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 16,
"line": 594,
"first": "erDiagram / subgraph title1 / A1 ||--|| A2 : links",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 17,
"line": 636,
"first": "erDiagram / direction LR / subgraph TOP",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 18,
"line": 666,
"first": "erDiagram / id1||--||id2 : label / style id1 fill:#f9f,stroke:#333,stroke-width:4px",
"parseOk": true,
"structured": false,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"UNSUPPORTED_SYNTAX",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW"
],
"actualFamily": "er"
},
{
"family": "er",
"index": 19,
"line": 734,
"first": "erDiagram / direction TB / CAR:::someclass {",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 20,
"line": 774,
"first": "erDiagram / CAR { / string registrationNumber",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 21,
"line": 831,
"first": "erDiagram / CAR { / string registrationNumber",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "er",
"index": 22,
"line": 881,
"first": "--- / title: Order example / config:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "er"
},
{
"family": "journey",
"index": 0,
"line": 25,
"first": "journey / title My working day / section Go to work",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "journey"
},
{
"family": "gantt",
"index": 0,
"line": 37,
"first": "gantt / title A Gantt Diagram / dateFormat YYYY-MM-DD",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 1,
"line": 84,
"first": "gantt / dateFormat YYYY-MM-DD / title Adding GANTT diagram functionality to mermaid",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW"
],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 2,
"line": 175,
"first": "gantt / apple :a, 2017-07-20, 1w / banana :crit, b, 2017-07-23, 1d",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 3,
"line": 220,
"first": "gantt / title A Gantt Diagram Excluding Fri - Sat weekends / dateFormat YYYY-MM-DD",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW"
],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 4,
"line": 251,
"first": "gantt / dateFormat HH:mm / axisFormat %H:%M",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 5,
"line": 275,
"first": "gantt / dateFormat HH:mm / axisFormat %H:%M",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 6,
"line": 386,
"first": "gantt / tickInterval 1week / weekday monday",
"parseOk": true,
"structured": true,
"verifyOk": false,
"renderOk": false,
"roundtripOk": true,
"warnings": [
"EMPTY_DIAGRAM"
],
"actualFamily": "gantt",
"renderError": "GanttError: GANTT_EMPTY: Gantt diagram has no tasks"
},
{
"family": "gantt",
"index": 7,
"line": 413,
"first": "--- / displayMode: compact / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 8,
"line": 444,
"first": "gantt / title A Gantt Diagram / %% This is a comment",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 9,
"line": 638,
"first": "gantt / title Git Issues - days since last update / dateFormat X",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gantt"
},
{
"family": "gantt",
"index": 10,
"line": 697,
"first": "--- / # Frontmatter config, YAML comments / title: Ignored if specified in chart",
"parseOk": true,
"structured": true,
"verifyOk": false,
"renderOk": false,
"roundtripOk": true,
"warnings": [
"UNRESOLVABLE_SCHEDULE"
],
"actualFamily": "gantt",
"renderError": "GanttError: GANTT_BAD_DATE: Invalid end date \"1s %% not yet official\" for dateFormat \"YYYY\""
},
{
"family": "pie",
"index": 0,
"line": 21,
"first": "pie title Pets adopted by volunteers / \"Dogs\" : 386 / \"Cats\" : 85",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "pie"
},
{
"family": "pie",
"index": 1,
"line": 85,
"first": "--- / config: / pie:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "pie"
},
{
"family": "quadrant",
"index": 0,
"line": 30,
"first": "quadrantChart / title Reach and engagement of campaigns / x-axis Low Reach --> High Reach",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "quadrant"
},
{
"family": "quadrant",
"index": 1,
"line": 168,
"first": "--- / config: / quadrantChart:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "quadrant"
},
{
"family": "quadrant",
"index": 2,
"line": 249,
"first": "quadrantChart / title Reach and engagement of campaigns / x-axis Low Reach --> High Reach",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "quadrant"
},
{
"family": "gitgraph",
"index": 0,
"line": 32,
"first": "--- / title: Example Git diagram / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 1,
"line": 80,
"first": "gitGraph / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 2,
"line": 102,
"first": "gitGraph / commit id: \"Alpha\" / commit id: \"Beta\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 3,
"line": 135,
"first": "gitGraph / commit id: \"Normal\" / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 4,
"line": 165,
"first": "gitGraph / commit / commit id: \"Normal\" tag: \"v1.0.0\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 5,
"line": 196,
"first": "gitGraph / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 6,
"line": 230,
"first": "gitGraph / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 7,
"line": 273,
"first": "gitGraph / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 8,
"line": 331,
"first": "gitGraph / commit id: \"1\" / commit id: \"2\"",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 9,
"line": 396,
"first": "gitGraph / commit id: \"ZERO\" / branch develop",
"parseOk": true,
"structured": true,
"verifyOk": false,
"renderOk": false,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW",
"RENDER_FAILED"
],
"actualFamily": "gitgraph",
"renderError": "SceneValidationError: Scene validation failed: scene: parts[21]/0(shape:c6:shape).points: semantic \"833.395,248.04000000000002 843.395,258.04 833.395,268.04 823\" != crisp \"833.395,248.04 843.395,258.04 833.395,268.04 823.395,258.04\""
},
{
"family": "gitgraph",
"index": 10,
"line": 486,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 11,
"line": 573,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 12,
"line": 625,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 13,
"line": 709,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 14,
"line": 800,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": false,
"structured": false,
"verifyOk": false,
"renderOk": false,
"roundtripOk": false,
"warnings": [],
"parseError": "Duplicate gitGraph commit id 'Boston' on line 18; commit IDs must be unique.",
"renderError": "GitGraphParseError: Duplicate gitGraph commit id 'Boston' on line 18; commit IDs must be unique."
},
{
"family": "gitgraph",
"index": 15,
"line": 867,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 16,
"line": 907,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 17,
"line": 964,
"first": "gitGraph LR: / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 18,
"line": 1002,
"first": "gitGraph TB: / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 19,
"line": 1040,
"first": "gitGraph BT: / commit / commit",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 20,
"line": 1077,
"first": "--- / config: / gitGraph:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 21,
"line": 1111,
"first": "--- / config: / gitGraph:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 22,
"line": 1194,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 23,
"line": 1296,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 24,
"line": 1398,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 25,
"line": 1500,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 26,
"line": 1602,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 27,
"line": 1680,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 28,
"line": 1745,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 29,
"line": 1817,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 30,
"line": 1882,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 31,
"line": 1940,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 32,
"line": 1999,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 33,
"line": 2057,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "gitgraph",
"index": 34,
"line": 2115,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "gitgraph"
},
{
"family": "mindmap",
"index": 0,
"line": 36,
"first": "mindmap / root((mindmap)) / Origins",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW"
],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 1,
"line": 81,
"first": "mindmap / Root / A",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 2,
"line": 104,
"first": "mindmap / id[I am a square]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 3,
"line": 116,
"first": "mindmap / id(I am a rounded square)",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 4,
"line": 128,
"first": "mindmap / id((I am a circle))",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 5,
"line": 140,
"first": "mindmap / id))I am a bang((",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 6,
"line": 152,
"first": "mindmap / id)I am a cloud(",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 7,
"line": 164,
"first": "mindmap / id{{I am a hexagon}}",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 8,
"line": 176,
"first": "mindmap / I am the default shape",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 9,
"line": 198,
"first": "mindmap / Root / A",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 10,
"line": 220,
"first": "mindmap / Root / A[A]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 11,
"line": 253,
"first": "mindmap / Root / A",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "mindmap"
},
{
"family": "mindmap",
"index": 12,
"line": 274,
"first": "mindmap / id1[\"`**Root** with / a second line",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW"
],
"actualFamily": "mindmap"
},
{
"family": "timeline",
"index": 0,
"line": 25,
"first": "timeline / title History of Social Media Platform / 2002 : LinkedIn",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 1,
"line": 74,
"first": "timeline / title History of Social Media Platform / 2002 : LinkedIn",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 2,
"line": 110,
"first": "timeline / title Timeline of Industrial Revolution / section 17th-20th century",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW",
"LABEL_OVERFLOW"
],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 3,
"line": 148,
"first": "timeline / title England's History Timeline / section Stone Age",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW",
"LABEL_OVERFLOW"
],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 4,
"line": 175,
"first": "timeline / title MermaidChart 2023 Timeline / section 2023 Q1 <br> Release Personal Tier",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 5,
"line": 203,
"first": "timeline TD / title MermaidChart 2023 Timeline / section 2023 Q1 <br> Release Personal Tier",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 6,
"line": 237,
"first": "timeline / title History of Social Media Platform / 2002 : LinkedIn",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 7,
"line": 284,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 8,
"line": 338,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 9,
"line": 398,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 10,
"line": 434,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 11,
"line": 470,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 12,
"line": 506,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "timeline",
"index": 13,
"line": 542,
"first": "--- / config: / logLevel: 'debug'",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "timeline"
},
{
"family": "sankey",
"index": 0,
"line": 98,
"first": "--- / config: / sankey:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"FLOW_IMBALANCE",
"FLOW_IMBALANCE",
"FLOW_IMBALANCE",
"FLOW_IMBALANCE",
"FLOW_IMBALANCE",
"FLOW_IMBALANCE"
],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 1,
"line": 198,
"first": "sankey / / %% source,target,value",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"COMMENT_DROPPED"
],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 2,
"line": 221,
"first": "sankey / / Bio-conversion,Losses,26.862",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 3,
"line": 242,
"first": "sankey / / Pumped heat,\"Heating and cooling, homes\",193.026",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 4,
"line": 260,
"first": "sankey / / Pumped heat,\"Heating and cooling, \"\"homes\"\"\",193.026",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 5,
"line": 326,
"first": "--- / config: / sankey:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 6,
"line": 362,
"first": "--- / config: / sankey:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sankey"
},
{
"family": "sankey",
"index": 7,
"line": 398,
"first": "--- / config: / sankey:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "sankey"
},
{
"family": "xychart",
"index": 0,
"line": 24,
"first": "xychart / title \"Sales Revenue\" / x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 1,
"line": 115,
"first": "xychart-beta / title \"An Example Chart\" / x-axis [\"90d\", \"60d\", \"30d\", \"7d\", \"1d\", \"Current\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 2,
"line": 224,
"first": "--- / config: / themeVariables:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"COMMENT_DROPPED"
],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 3,
"line": 262,
"first": "--- / config: / xyChart:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 4,
"line": 291,
"first": "--- / config: / xyChart:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"INEFFECTIVE_CONFIG"
],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 5,
"line": 317,
"first": "xychart / title \"Smallest AI models scoring above 60% on MMLU\" / x-axis \"Date\" [\"Apr 2022\", \"Feb 2023\", \"Jul 2023\", \"Sep 2023\", \"Apr 2024\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [
"LABEL_OVERFLOW"
],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 6,
"line": 335,
"first": "xychart / title \"Quarterly Performance\" / x-axis [Q1, Q2, Q3, Q4]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "xychart"
},
{
"family": "xychart",
"index": 7,
"line": 369,
"first": "--- / config: / xyChart:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "xychart"
},
{
"family": "architecture",
"index": 0,
"line": 27,
"first": "architecture-beta / group api(cloud)[API] / ",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "architecture"
},
{
"family": "architecture",
"index": 1,
"line": 179,
"first": "architecture-beta / group api(cloud)[API] / service db1(database)[DB1] in api",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "architecture"
},
{
"family": "architecture",
"index": 2,
"line": 206,
"first": "architecture-beta / service src1(server)[Source 1] / service src2(server)[Source 2]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "architecture"
},
{
"family": "architecture",
"index": 3,
"line": 259,
"first": "architecture-beta / group sources(cloud)[Sources] / service src_a(server)[Source A] in sources",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "architecture"
},
{
"family": "architecture",
"index": 4,
"line": 324,
"first": "architecture-beta / service left_disk(disk)[Disk] / service top_disk(disk)[Disk]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "architecture"
},
{
"family": "architecture",
"index": 5,
"line": 422,
"first": "architecture-beta / group api(logos:aws-lambda)[API] / ",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "architecture"
},
{
"family": "radar",
"index": 0,
"line": 47,
"first": "--- / title: \"Grades\" / ---",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "radar"
},
{
"family": "radar",
"index": 1,
"line": 77,
"first": "radar-beta / title Restaurant Comparison / axis food[\"Food Quality\"], service[\"Service\"], price[\"Price\"]",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "radar"
},
{
"family": "radar",
"index": 2,
"line": 248,
"first": "--- / config: / radar:",
"parseOk": true,
"structured": true,
"verifyOk": true,
"renderOk": true,
"roundtripOk": true,
"warnings": [],
"actualFamily": "radar"
}
]
}

Agentic Mermaid Mermaid-11.16 syntax/implication audit

Branch pr-192, commit a3b1b3b3. Read-only audit of all 16 built-in families against the pinned vendored Mermaid 11.16 documentation and local package/source maps.

Executive verdict

The repository has strong route/enrollment/determinism machinery, but its aggregate native / syntax-parity claims are not feature-semantic claims. They can pass when official syntax is preserved only opaquely, silently misparsed, rendered with different semantics, or accepted by one parser and rejected by another. Sankey's flat midpoint “gradient” is one example of a systemic blind spot.

A probe of every exact mermaid fence in the 16 official syntax pages exercised 331 examples: 22 became opaque (Flowchart 7, State 2, Class 10, ER 3), one official GitGraph example failed parsing, and four fences failed rendering (Gantt 2, GitGraph 2; one overlaps the parse failure). Twenty-six examples were not simultaneously structured, verified, renderable, and round-trip stable. The committed showcase executes only one selected docs example per family.

Concrete family findings

Family Highest-value missed syntax or implication
Flowchart Edge IDs can receive class assignments syntactically, but the class paint is applied only to nodes; edge animation/style semantics disappear without warning.
State Legal trailing %% comments cause transitions to disappear from rendering; class Moving, Crash movement fails because whitespace around comma-separated IDs is rejected.
Sequence Official half-arrow tokens (`-
Class Inline/separate annotations disappear; bare dashed A .. B drops both endpoints and relation; backtick IDs containing spaces cannot be relation endpoints; safe link tooltips are discarded.
ER Official word cardinality syntax (1 to zero or more, many(0) optionally to 0+) disappears; multiple-class shorthand is rejected; implemented subgraphs are still diagnosed/documented as dropped.
Gantt Many official config implications are no-ops (barGap, config weekday, todayMarker, etc.); an official fence with inline task comments is parsed as comment text in the date/duration and fails rendering. Invalid-duration behavior is a deliberate but incompletely classified divergence.
Journey Mermaid accepts fractional scores such as 3.5; Agentic requires integers and cannot render them.
Timeline Upstream % comment becomes a visible period; non-upstream timeline TB is silently rendered horizontally while the agent body is opaque; typed labels retain literal <br>; mutation rejects valid clock/URL colons in events.
GitGraph Most syntax is strong, but the all-doc probe found an official duplicate-ID example rejected and an official cherry-pick example failing Scene precision validation. Synthetic deterministic IDs deliberately diverge from upstream random IDs and should be disclosed.
XY chart Unknown statements are silently discarded; showDataLabelOutsideBar, x-axis labelRotation, and theme dataLabelColor are official but byte-ineffective.
Pie Duplicate labels diverge from Mermaid first-wins semantics: Agentic renders both while mutation can address only the first.
Quadrant No verified material official-syntax loss in this pass; duplicate-label upstream behavior remains an oracle gap.
Radar No verified material official-syntax loss in this pass; resource limits/arity checks are explicit safety divergences.
Architecture Valid registered Iconify icons outside a finite local subset silently degrade to text badges; bare architecture is an Agentic alias rejected by pinned Mermaid and is not clearly classified as an extension.
Mindmap Valid host-provided icon classes outside the finite resolver silently degrade to two-character badges without a fidelity warning; otherwise official syntax coverage is strong.
Sankey Default gradient is a flat midpoint color; mix-blend-mode:multiply is also missing; quoted-field whitespace differs from upstream trimming and therefore changes identity; sankey[-beta][:] is overclaimed in the harvest although the colon form is rejected; custom relaxation/extent behavior is d3-inspired rather than geometry-compatible.

Systemic causes

  1. src/syntax-capability-ledger.ts maps artifact classifications to feature states without a feature-specific semantic oracle. Inventory/hash consistency is not implementation fidelity.
  2. src/agent/families.ts declares all ten capabilities native for every built-in from one canonical witness; opaque or construct-specific failures do not downgrade the family claim.
  3. src/__tests__/mermaid-upstream-suite-bench.test.ts checks parse, verify.ok, counts/minima/labels, idempotence, and no structural count drop. It does not compare normalized family semantics with Mermaid's parser/DB.
  4. src/__tests__/mermaid-doc-showcase.test.ts executes one selected docs example per family even though all official fences are harvested.
  5. Config wire-or-warn uses a manual one-key-per-family probe. Descriptor rosters list 234 documented keys, 102 explicitly no-op; the remaining keys are not each required to produce a semantic effect.
  6. Section B proves roles/primitives/channels exist, not that semantic relations are correct. A flat Sankey connector satisfies the same role census as a true gradient.
  7. Divergence ledgers (including Sankey's) are not inputs to Section A feature state, so a known divergence cannot downgrade native.
  8. Evidence revisions are split: the manifest pin is f3dea583…, while the executable upstream-suite bench asserts a2d96864… without a global compatibility gate.

Recommended contracts

P0 — truthfulness and silent-corruption blockers

  • Replace inferred feature-level native with executed receipts keyed to upstream feature IDs and one exact upstream revision.
  • Add normalized semantic projectors per family and compare parser/DB meaning, not SVG byte inequality or counts alone.
  • Require agent parse/verify, native parser/layout, SVG, and terminal dispositions to agree for every feature case.
  • Join every divergence ledger into Section A; downgrade known substitutions until their exact semantic predicate passes.
  • Fix the silent-loss cases first: Sequence arrows/semicolons/options, State comments, Class relations/annotations, ER aliases, Timeline comments, XY unknown statements.

P1 — completeness

  • Execute every harvested official fence with declared structured/opaque/reject disposition and a semantic snapshot.
  • Generate a config effect matrix from the pinned config inventory: every key must be wired with an A/B semantic predicate, diagnosed-noop, or unsupported.
  • Add typed local Scene resources for safe gradients; test source/target stops and overlap compositing.
  • Add per-construct source-preservation, accessibility, interaction, icon/image, and semantic-to-Scene identity contracts.

P2 — quality depth

  • Add family metamorphic laws and controlled upstream visual/geometry comparisons with explicit tolerances/divergence IDs.
  • Keep galleries/goldens as review evidence, never as substitutes for semantic receipts.

Detailed reports

  • 01-flow-state-sequence.md
  • 02-class-er-gantt.md
  • 03-journey-timeline-gitgraph.md
  • 04-charts.md
  • 05-architecture-mindmap-sankey.md
  • 06-cross-family-gates.md
  • official-doc-probe.json
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment