--- name: diagram-plantuml description: Embed PlantUML diagrams inside a Confluence page using the {plantuml} macro in the storage body. Use when a page needs a sequence, component, class, state, activity, deployment, or timing diagram and the macro name is not in the caller's muscle memory. --- # Diagram — PlantUML in Confluence PlantUML renders server-side on the Confluence PlantUML plugin. The macro is `{plantuml}`, the body is plain PlantUML between `@startuml` and `@enduml`, and the host (BASS) renders it through the bundled plugin — no external URL needed for private spaces. ## Hard rules - **Macro name is `plantuml`**, lowercase. `{PlantUML}` and `{plantUml}` both fail to render. - **Body goes inside ``**, not inside ``. The rich-text body treats the body as XHTML, which mangles `<`, `>`, and `&` that PlantUML relies on. - **Always include `@startuml` and `@enduml`** even though PlantUML accepts bodies without them. The Confluence renderer is stricter than the CLI. - **No diagram wider than ~900 px.** Confluence content columns are narrow; a wide diagram overflows on smaller screens. Split or simplify. - **No diagram inside an info / note / warning panel.** The renderer nests and crops. Put the diagram at body root, then put a `{tip}` after it with the takeaway. - **No diagram inside a code block.** Same nesting failure. - **Never paste a base64 PNG into the body** to skip PlantUML. If PlantUML can't render what you drew, simplify the diagram. ## Storage template ```xml Service: request Service --> Client: response @enduml]]> ``` The `!theme plain` directive keeps diagrams legible on the BASS light background; the `skinparam dpi 150` is the right size for the Confluence column width. Drop both when a diagram already has its own `skinparam` block. ## Workflow 1. Decide the diagram type. See [references/diagram-types.md](references/diagram-types.md) for the cheat sheet (sequence, component, class, state, activity, deployment, timing, use case, ER, mindmap). 2. Draft the PlantUML in a `.puml` scratch file. Run `plantuml -tpng -checkonly -failfast2 file.puml` if `plantuml` is on `$PATH` — fast feedback loop before posting. 3. Wrap in the storage template above. 4. Add a one-line caption directly after the macro using a `{tip}` block or a bolded sentence; do not rely on the title attribute (some renderers strip it). 5. Hand the body to the `page-reviewer` skill. The reviewer re-runs the syntax check on every `{plantuml}` block. ## Common patterns - **Sequence with notes:** use `note left of Alice: …` / `note right of Bob: …`. Inside an `alt`/`opt`/`loop` block, the note attaches to the branch. - **Component / C4:** use `!include ` only if the BASS PlantUML plugin has the C4 stdlib. If unsure, prefer hand-drawn `component` arrows. - **State:** use `state "Long label" as S1` to avoid breaking state names that contain spaces. - **Timing:** use `robust` for digital signals and `analog` for continuous; mixing them on one line is a render error. ## Troubleshooting | Symptom | Likely cause | |---------|--------------| | Macro renders as plain text | Macro name wrong, or the body is inside `` instead of `` | | Diagram renders empty | `@startuml / @enduml missing, or body has unescaped < / >` outside CDATA | | Diagram crops on the right | Width over the column budget — split or simplify | | Theme reverts to dark on dark space | Use `!theme plain` explicitly; some renderers ignore the page theme | | C4 include fails | Plugin doesn't ship the stdlib — switch to hand-drawn arrows | Full troubleshooting table: [references/troubleshooting.md](references/troubleshooting.md). ## Related | Skill | Role | |-------|------| | `confluence-page` | Owns the storage body; delegates diagrams here | | `page-reviewer` | Re-runs the syntax check on every `{plantuml}` block |