{"id":23789,"date":"2008-06-06T16:19:48","date_gmt":"2008-06-06T16:19:48","guid":{"rendered":"https:\/\/scannn.com\/cathrynlavery-diagram-design-38-editorial-diagram-types-for-claude-code-codex-and-pi-self-contained-html-svg-no-shadows-no-mermaid-slop-%c2%b7-github\/"},"modified":"2008-06-06T16:19:48","modified_gmt":"2008-06-06T16:19:48","slug":"cathrynlavery-diagram-design-38-editorial-diagram-types-for-claude-code-codex-and-pi-self-contained-html-svg-no-shadows-no-mermaid-slop-%c2%b7-github","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/cathrynlavery-diagram-design-38-editorial-diagram-types-for-claude-code-codex-and-pi-self-contained-html-svg-no-shadows-no-mermaid-slop-%c2%b7-github\/","title":{"rendered":"cathrynlavery\/diagram-design: 38 editorial diagram types for Claude Code, Codex, and Pi. Self-contained HTML + SVG. No shadows. No Mermaid slop. \u00b7 GitHub"},"content":{"rendered":"\n<div id=\"\">\n<p dir=\"auto\"><strong>Editorial diagrams your designer won&#8217;t hate.<\/strong><\/p>\n<p dir=\"auto\"><a href=\"https:\/\/trendshift.io\/repositories\/26141?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-26141\" rel=\"nofollow\"><\/a><\/p>\n<p dir=\"auto\"><a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/docs\/screenshots\/architecture.png\"><img decoding=\"async\" src=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/raw\/main\/docs\/screenshots\/thumbs\/architecture.webp\" alt=\"Content site architecture\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<p dir=\"auto\"><a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/docs\/screenshots\/loop.png\"><img decoding=\"async\" src=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/raw\/main\/docs\/screenshots\/thumbs\/loop.webp\" alt=\"The self-improving loop\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<p dir=\"auto\"><em>New in 2.0 \u2014 the Loop: flywheels with a shared-memory hub. The dashed lines are the write-backs.<\/em><\/p>\n<p dir=\"auto\"><em>New in 2.3: semantic system patterns and optional accessible motion, while static output stays the default.<\/em><\/p>\n<p dir=\"auto\"><em>New in 2.5.10: ten more layout grammars \u2014 Sankey, fishbone, Wardley map, kanban, user journey, deployment, dependency graph, UML class, story map, and database schema.<\/em><\/p>\n<p dir=\"auto\">39 editorial diagram types for Claude Code, Codex, Factory Droid, Pi, and Agent Skills-compatible hosts. Self-contained HTML + SVG. No shadows. No Mermaid slop. Semantic patterns describe behavior separately from layout, so a queue, policy trace, or trust boundary can use the nearest existing type without expanding the type count. Static HTML remains the default; optional motion is available for ordered explanations. The skill also redraws draw.io or Mermaid sources at a chosen format, size, and detail level.<\/p>\n<p dir=\"auto\">No Figma. No generic rounded boxes. No 30-minute color-picking sessions.<\/p>\n<hr\/>\n<p dir=\"auto\">I write at <a href=\"https:\/\/littlemight.com?utm_source=diagram-design&amp;utm_medium=readme&amp;utm_campaign=github&amp;utm_content=intro\" rel=\"nofollow\">littlemight.com<\/a> (and run <a href=\"https:\/\/bestself.co?utm_source=diagram-design&amp;utm_medium=readme&amp;utm_campaign=github&amp;utm_content=intro\" rel=\"nofollow\">BestSelf.co<\/a> on the side). Every time I needed a diagram \u2014 an architecture sketch, a flowchart, a pyramid of what matters most \u2014 I&#8217;d ask Claude and get back a generic rounded-box thing that looked nothing like the rest of the site. I&#8217;d either fight with Figma for 30 minutes or just skip the diagram.<\/p>\n<p dir=\"auto\">So I built a Claude Code skill for it. Thirty-nine visual types, editorial quality, matches your brand in 60 seconds by reading your website.<\/p>\n<blockquote>\n<p dir=\"auto\"><em>The highest-quality move is usually deletion.<\/em> Every node earns its place. The accent color is reserved for the 1\u20132 things the reader should look at first. Target density: 4\/10.<\/p>\n<\/blockquote>\n<hr\/>\n<p dir=\"auto\">All 39 visual types ship in three static variants: minimal light, minimal dark, and full-editorial. Open any of them directly in a browser. There is no build step, JavaScript, or external image dependency.<\/p>\n<p><markdown-accessiblity-table\/><\/p>\n<p dir=\"auto\">The v2.5.10 release added the final ten types above. Compare their light, dark, and full-editorial variants in the <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/.github\/pr-previews\/editorial-diagrams-2.5.10.jpg\">30-variant contact sheet<\/a>.<\/p>\n<p dir=\"auto\"><strong>Browse the live gallery:<\/strong> <a href=\"https:\/\/cathrynlavery.github.io\/diagram-design\/\" rel=\"nofollow\">cathrynlavery.github.io\/diagram-design<\/a> \u2014 or open <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/assets\/index.html\"><code>skills\/diagram-design\/assets\/index.html<\/code><\/a> locally to flip through all 39 diagrams with light \/ dark \/ full-editorial tabs.<\/p>\n<hr\/>\n<p dir=\"auto\"><strong>Claude Code:<\/strong><\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\/plugin marketplace add cathrynlavery\/diagram-design&#10;\/plugin install diagram-design@diagram-design\">\n<pre lang=\"text\" class=\"notranslate\"><code>\/plugin marketplace add cathrynlavery\/diagram-design\n\/plugin install diagram-design@diagram-design\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Then enable updates once: run <code>\/plugin<\/code>, open <strong>Marketplaces<\/strong>, select <strong>diagram-design<\/strong>, and choose <strong>Enable auto-update<\/strong>. Claude Code disables auto-update by default for third-party marketplaces; after this toggle, it refreshes the marketplace and installed plugin in the background after startup. Run <code>\/reload-plugins<\/code> when prompted, or let the next session load the update.<\/p>\n<p dir=\"auto\"><strong>Codex:<\/strong><\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"codex plugin marketplace add cathrynlavery\/diagram-design&#10;codex plugin add diagram-design@diagram-design\">\n<pre>codex plugin marketplace add cathrynlavery\/diagram-design\ncodex plugin add diagram-design@diagram-design<\/pre>\n<\/div>\n<p dir=\"auto\">Codex refreshes configured Git marketplaces at startup. To fetch immediately, run <code>codex plugin marketplace upgrade diagram-design<\/code> and start a new session.<\/p>\n<p dir=\"auto\"><strong>Factory Droid:<\/strong><\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"droid plugin marketplace add https:\/\/github.com\/cathrynlavery\/diagram-design&#10;droid plugin install diagram-design@diagram-design --scope user\">\n<pre>droid plugin marketplace add https:\/\/github.com\/cathrynlavery\/diagram-design\ndroid plugin install diagram-design@diagram-design --scope user<\/pre>\n<\/div>\n<p dir=\"auto\">Droid tracks Git plugins by commit rather than the manifest&#8217;s display version. To fetch a merged update, run <code>droid plugin marketplace update diagram-design<\/code>, then <code>droid plugin update diagram-design@diagram-design --scope user<\/code>, and start a new session.<\/p>\n<p dir=\"auto\"><strong>Claude Cowork (organization marketplace):<\/strong> Organization GitHub marketplaces currently require a private or internal repository, so first mirror this public repository into one owned by your organization. In <strong>Organization settings \u2192 Plugins<\/strong>, choose <strong>Add plugin \u2192 GitHub<\/strong>, connect that mirror, and enable <strong>Sync automatically<\/strong> from the marketplace menu. Automatic sync runs when a pull request containing a plugin version bump is merged to the mirror&#8217;s default branch; direct pushes do not trigger the webhook. Install Diagram Design from the resulting organization marketplace.<\/p>\n<p dir=\"auto\"><strong>Pi:<\/strong><\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pi install https:\/\/github.com\/cathrynlavery\/diagram-design\">\n<pre>pi install https:\/\/github.com\/cathrynlavery\/diagram-design<\/pre>\n<\/div>\n<p dir=\"auto\">Run <code>\/reload<\/code> in an open Pi session. Pi makes the skill available for matching diagram requests; use <code>\/skill:diagram-design<\/code> to invoke it explicitly. Pi also loads the <code>\/export-diagram<\/code>, <code>\/import-mermaid<\/code>, <code>\/profile<\/code>, and <code>\/doctor<\/code> prompt templates. The unpinned Git install is intentional: Pi has no automatic package refresh, so run <code>pi update --extensions<\/code> to pull merged updates.<\/p>\n<p dir=\"auto\"><strong>Kiro:<\/strong> Import the Agent Skill from the repository subdirectory URL:<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/tree\/main\/skills\/diagram-design\">\n<pre lang=\"text\" class=\"notranslate\"><code>https:\/\/github.com\/cathrynlavery\/diagram-design\/tree\/main\/skills\/diagram-design\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Kiro copies imported skills into <code>.kiro\/skills\/<\/code> for a workspace or <code>~\/.kiro\/skills\/<\/code> globally, so re-import the URL to pick up updates. Custom agents that declare resources should include <code>skill:\/\/diagram-design\/**\/SKILL.md<\/code>.<\/p>\n<p dir=\"auto\"><strong>OpenCode:<\/strong> Copy or symlink <code>skills\/diagram-design\/<\/code> to <code>.opencode\/skills\/diagram-design<\/code> in a project or <code>~\/.config\/opencode\/skills\/diagram-design<\/code> globally. OpenCode has no Diagram Design marketplace package; copied installs update only when you replace the directory from a newer checkout.<\/p>\n<blockquote>\n<p dir=\"auto\"><strong>One-time migration:<\/strong> an existing standalone <code>npx skills add<\/code> copy will not start following the Codex marketplace automatically. Remove that standalone copy, then use the Codex marketplace commands above. Likewise, uninstall a personal Cowork copy and reinstall Diagram Design from your organization&#8217;s marketplace. Future marketplace version bumps then flow through each client&#8217;s native update path.<\/p>\n<\/blockquote>\n<p dir=\"auto\">Managed installs are convenient, but changes to <code>references\/style-guide.md<\/code> may be replaced by package updates. Saved profiles in <code>~\/.diagram-design\/profiles\/<\/code> survive updates, and projects with a <code>.diagram-design<\/code> marker are unaffected. Clone the repo and install the local path if you plan to customize the working style guide directly:<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone git@github.com:cathrynlavery\/diagram-design.git ~\/code\/diagram-design&#10;&#10;# Pi: register the checkout as a local package&#10;pi install ~\/code\/diagram-design&#10;&#10;# Claude Code: symlink the inner skill&#10;ln -s ~\/code\/diagram-design\/skills\/diagram-design ~\/.claude\/skills\/diagram-design&#10;&#10;# Other Agent Skills hosts: create only the roots you use&#10;mkdir -p ~\/.agents\/skills ~\/.cursor\/skills ~\/.cline\/skills ~\/.kiro\/skills ~\/.config\/opencode\/skills&#10;ln -s ~\/code\/diagram-design\/skills\/diagram-design ~\/.agents\/skills\/diagram-design&#10;ln -s ~\/code\/diagram-design\/skills\/diagram-design ~\/.cursor\/skills\/diagram-design&#10;ln -s ~\/code\/diagram-design\/skills\/diagram-design ~\/.cline\/skills\/diagram-design&#10;ln -s ~\/code\/diagram-design\/skills\/diagram-design ~\/.kiro\/skills\/diagram-design&#10;ln -s ~\/code\/diagram-design\/skills\/diagram-design ~\/.config\/opencode\/skills\/diagram-design\">\n<pre>git clone git@github.com:cathrynlavery\/diagram-design.git <span class=\"pl-k\">~<\/span>\/code\/diagram-design\n\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Pi: register the checkout as a local package<\/span>\npi install <span class=\"pl-k\">~<\/span>\/code\/diagram-design\n\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Claude Code: symlink the inner skill<\/span>\nln -s <span class=\"pl-k\">~<\/span>\/code\/diagram-design\/skills\/diagram-design <span class=\"pl-k\">~<\/span>\/.claude\/skills\/diagram-design\n\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Other Agent Skills hosts: create only the roots you use<\/span>\nmkdir -p <span class=\"pl-k\">~<\/span>\/.agents\/skills <span class=\"pl-k\">~<\/span>\/.cursor\/skills <span class=\"pl-k\">~<\/span>\/.cline\/skills <span class=\"pl-k\">~<\/span>\/.kiro\/skills <span class=\"pl-k\">~<\/span>\/.config\/opencode\/skills\nln -s <span class=\"pl-k\">~<\/span>\/code\/diagram-design\/skills\/diagram-design <span class=\"pl-k\">~<\/span>\/.agents\/skills\/diagram-design\nln -s <span class=\"pl-k\">~<\/span>\/code\/diagram-design\/skills\/diagram-design <span class=\"pl-k\">~<\/span>\/.cursor\/skills\/diagram-design\nln -s <span class=\"pl-k\">~<\/span>\/code\/diagram-design\/skills\/diagram-design <span class=\"pl-k\">~<\/span>\/.cline\/skills\/diagram-design\nln -s <span class=\"pl-k\">~<\/span>\/code\/diagram-design\/skills\/diagram-design <span class=\"pl-k\">~<\/span>\/.kiro\/skills\/diagram-design\nln -s <span class=\"pl-k\">~<\/span>\/code\/diagram-design\/skills\/diagram-design <span class=\"pl-k\">~<\/span>\/.config\/opencode\/skills\/diagram-design<\/pre>\n<\/div>\n<p dir=\"auto\">The shared skill lives at <code>skills\/diagram-design\/<\/code>. Pi discovers it through the repo&#8217;s standard <code>skills\/<\/code> package directory; Claude Code, Codex, Factory Droid, and other Agent Skills-compatible tools use the same files.<\/p>\n<hr\/>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Onboarding \u2014 make it look like <em>your<\/em> brand<\/h2>\n<p><a id=\"user-content-onboarding--make-it-look-like-your-brand\" class=\"anchor\" aria-label=\"Permalink: Onboarding \u2014 make it look like your brand\" href=\"#onboarding--make-it-look-like-your-brand\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">The whole point: ship editorial-quality diagrams in <strong>your<\/strong> colors and typography, not a generic template.<\/p>\n<p dir=\"auto\">Out of the box, diagrams render in a clean <strong>jet-black + atomic-tangerine<\/strong> palette (white-smoke paper, jet-black ink, atomic-tangerine accent, blue-slate muted, silver hairlines). Good enough to screenshot straight away. But 60 seconds of onboarding is better \u2014 the skill will pull your brand from your website and apply it across every diagram.<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"You:     &quot;onboard diagram-design to https:\/\/yoursite.com&quot;&#10;Agent:   \u2192 fetches the homepage&#10;         \u2192 extracts the dominant palette + font stack&#10;         \u2192 maps detected values to semantic roles:&#10;             paper, ink, muted, accent, link&#10;         \u2192 shows a proposed diff&#10;         \u2192 writes your tokens to references\/style-guide.md&#10;You:     &quot;yes, apply it&quot;\">\n<pre class=\"notranslate\"><code>You:     \"onboard diagram-design to https:\/\/yoursite.com\"\nAgent:   \u2192 fetches the homepage\n         \u2192 extracts the dominant palette + font stack\n         \u2192 maps detected values to semantic roles:\n             paper, ink, muted, accent, link\n         \u2192 shows a proposed diff\n         \u2192 writes your tokens to references\/style-guide.md\nYou:     \"yes, apply it\"\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Every new diagram now uses your colors. Your website&#8217;s paper color becomes the diagram background. Your CTA color becomes the focal accent. Your body font stack becomes the node label family.<\/p>\n<p dir=\"auto\">Brand matching also emits a fidelity receipt: sampled URLs, exact color roles, font families and weights, font source URLs, and any fallback. Public site fonts are used directly and verified after rendering rather than silently replaced with generic system fonts.<\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th>Detected from your site<\/th>\n<th>Becomes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>&lt;body&gt;<\/code> background<\/td>\n<td><code>paper<\/code> token<\/td>\n<\/tr>\n<tr>\n<td>Primary text color<\/td>\n<td><code>ink<\/code> token<\/td>\n<\/tr>\n<tr>\n<td>Secondary \/ caption text<\/td>\n<td><code>muted<\/code> token<\/td>\n<\/tr>\n<tr>\n<td>Cards or containers<\/td>\n<td><code>paper-2<\/code> token<\/td>\n<\/tr>\n<tr>\n<td>Most-used brand color (CTA, link, heading)<\/td>\n<td><code>accent<\/code> token<\/td>\n<\/tr>\n<tr>\n<td><code>&lt;h1&gt;<\/code> font family<\/td>\n<td><code>title<\/code> font<\/td>\n<\/tr>\n<tr>\n<td><code>&lt;body&gt;<\/code> font family<\/td>\n<td><code>node-name<\/code> font<\/td>\n<\/tr>\n<tr>\n<td><code>&lt;code&gt;<\/code> \/ <code>&lt;pre&gt;<\/code> font<\/td>\n<td><code>sublabel<\/code> font<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Contrast checks happen automatically<\/h3>\n<p><a id=\"user-content-contrast-checks-happen-automatically\" class=\"anchor\" aria-label=\"Permalink: Contrast checks happen automatically\" href=\"#contrast-checks-happen-automatically\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">Before writing tokens, the skill verifies WCAG AA contrast on <code>ink<\/code> over <code>paper<\/code>. If your site has a color that fails contrast at diagram sizes (9\u201312px), it proposes an adjusted value and explains why.<\/p>\n<p dir=\"auto\">Every diagram template gives the inline SVG an accessible name and description: <code>role=\"img\"<\/code>, a resolving <code>aria-labelledby<\/code>, and first-child <code>&lt;title&gt;<\/code> \/ <code>&lt;desc&gt;<\/code> slots. IDs are prefixed per diagram and variant, so multiple SVG exports can be safely inlined on one page without duplicate accessible-name IDs. Decorative specimen icons are hidden from assistive technology instead.<\/p>\n<p dir=\"auto\">Prefer to set tokens by hand? Open <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/style-guide.md\"><code>skills\/diagram-design\/references\/style-guide.md<\/code><\/a> and edit the table. Everything downstream reads from there \u2014 all 39 diagrams, the annotation primitive, and the gallery all inherit semantic role names (<code>accent<\/code>, not <code>#eb6c36<\/code>).<\/p>\n<p dir=\"auto\">The skill won&#8217;t silently ship default-skinned diagrams into a branded project. On first use in a new project, it checks if <code>style-guide.md<\/code> has been customized. If not, it pauses and asks:<\/p>\n<blockquote>\n<p dir=\"auto\"><em>&#8220;This is your first diagram in this project. The style guide is still at the default. Want to run onboarding, paste tokens manually, or proceed with default?&#8221;<\/em><\/p>\n<\/blockquote>\n<p dir=\"auto\">See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/onboarding.md\"><code>skills\/diagram-design\/references\/onboarding.md<\/code><\/a> for the full spec.<\/p>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Working with multiple clients<\/h3>\n<p><a id=\"user-content-working-with-multiple-clients\" class=\"anchor\" aria-label=\"Permalink: Working with multiple clients\" href=\"#working-with-multiple-clients\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">Onboard a brand once, save the result as a named profile, then add a <code>.diagram-design<\/code> marker containing <code>profile: &lt;slug&gt;<\/code> to each client project. Marker projects read <code>~\/.diagram-design\/profiles\/&lt;slug&gt;.md<\/code> directly, so parallel workspaces can use different brands without overwriting a shared installed <code>style-guide.md<\/code>.<\/p>\n<p dir=\"auto\">The profile library is shared across Claude Code, Codex, Factory Droid, and Pi. Use <code>\/diagram-design:profile<\/code> in Claude Code, <code>\/profile<\/code> in Factory Droid or Pi, or ask in natural language in any host. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/profiles.md\"><code>profiles.md<\/code><\/a> for the storage, marker, and recovery contract.<\/p>\n<hr\/>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# From a cloned checkout, open the gallery to see all 39 diagrams&#10;open skills\/diagram-design\/assets\/index.html       # macOS&#10;xdg-open skills\/diagram-design\/assets\/index.html  # Linux&#10;&#10;# In Claude Code, Codex, Factory Droid, or Pi, ask:&#10;# &quot;Make me an architecture diagram of my app: frontend, backend, database, Redis cache.&quot;&#10;# &quot;I need a quadrant showing Q2 projects by impact vs effort.&quot;&#10;# &quot;Give me a sequence of a bearer call with token refresh on 401.&quot;&#10;# (branching refresh uses the ALT combined-fragment grammar in type-sequence.md;&#10;#  see skills\/diagram-design\/assets\/example-sequence-oauth.html \u2014 not a full authorize-code handshake)\">\n<pre><span class=\"pl-c\"><span class=\"pl-c\">#<\/span> From a cloned checkout, open the gallery to see all 39 diagrams<\/span>\nopen skills\/diagram-design\/assets\/index.html       <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> macOS<\/span>\nxdg-open skills\/diagram-design\/assets\/index.html  <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Linux<\/span>\n\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> In Claude Code, Codex, Factory Droid, or Pi, ask:<\/span>\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> \"Make me an architecture diagram of my app: frontend, backend, database, Redis cache.\"<\/span>\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> \"I need a quadrant showing Q2 projects by impact vs effort.\"<\/span>\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> \"Give me a sequence of a bearer call with token refresh on 401.\"<\/span>\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> (branching refresh uses the ALT combined-fragment grammar in type-sequence.md;<\/span>\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span>  see skills\/diagram-design\/assets\/example-sequence-oauth.html \u2014 not a full authorize-code handshake)<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">Operator recipes for editable installs, first diagrams, brand setup, import, export, validation, Windows junctions, and reusable prompts live in <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/docs\/cookbook.md\"><code>docs\/cookbook.md<\/code><\/a>.<\/p>\n<p dir=\"auto\">Your agent will pick the right type, build the HTML, and save it. You can also start from a template directly:<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cp skills\/diagram-design\/assets\/template.html my-diagram.html        # minimal light&#10;cp skills\/diagram-design\/assets\/template-full.html my-diagram.html   # editorial with summary cards&#10;cp skills\/diagram-design\/assets\/template-motion.html my-diagram.html # optional accessible motion\">\n<pre>cp skills\/diagram-design\/assets\/template.html my-diagram.html        <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> minimal light<\/span>\ncp skills\/diagram-design\/assets\/template-full.html my-diagram.html   <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> editorial with summary cards<\/span>\ncp skills\/diagram-design\/assets\/template-motion.html my-diagram.html <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> optional accessible motion<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Semantic patterns and optional motion<\/h3>\n<p><a id=\"user-content-semantic-patterns-and-optional-motion\" class=\"anchor\" aria-label=\"Permalink: Semantic patterns and optional motion\" href=\"#semantic-patterns-and-optional-motion\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">When behavior matters, the skill chooses a semantic pattern first and a visual type second. The eight routed patterns cover fan-in queues and bottlenecks, repeated stage slots, unstructured-input transformation, paired policy traces, secure paved roads, governance catalogs, compensating security layers, and traceable block decomposition. Each pattern defines its triggers, primitives, budget, anti-patterns, static fallback, and nearest visual type in <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/semantic-patterns.md\"><code>semantic-patterns.md<\/code><\/a>.<\/p>\n<p dir=\"auto\">Motion is optional and does not create another visual type. <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/animation.md\"><code>animation.md<\/code><\/a> defines <code>none<\/code>, <code>reveal<\/code>, <code>step<\/code>, and <code>loop<\/code> modes with a complete static first frame, deterministic timing, and controls when interaction is available. Reduced-motion output shows the complete static frame and hides\/disables playback controls. Motion HTML uses the exact reviewed controller from <code>template-motion.html<\/code>; arbitrary or modified inline scripts, remote assets, CSS imports, and executable HTML attributes are rejected. The default is <code>none<\/code>: ordinary output remains static and script-free. <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/assets\/example-policy-trace-animated.html\"><code>example-policy-trace-animated.html<\/code><\/a> is the self-contained interactive example.<\/p>\n<hr\/>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Import from draw.io or Mermaid<\/h2>\n<p><a id=\"user-content-import-from-drawio-or-mermaid\" class=\"anchor\" aria-label=\"Permalink: Import from draw.io or Mermaid\" href=\"#import-from-drawio-or-mermaid\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">Already have diagrams in draw.io \/ diagrams.net or Mermaid? Point the skill at the source and it <strong>redraws<\/strong> them \u2014 same content, this design system, at whatever the destination needs.<\/p>\n<p dir=\"auto\"><a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/docs\/screenshots\/import-drawio.png\"><img decoding=\"async\" src=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/raw\/main\/docs\/screenshots\/thumbs\/import-drawio.webp\" alt=\"Redrawn from a .drawio file\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<p dir=\"auto\"><em>A 12-node draw.io file redrawn at <code>balanced<\/code> detail for a blog post. The source&#8217;s six pastel fills became one accent; its hand-dragged coordinates became a 4px grid.<\/em><\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\/diagram-design:import-drawio platform.drawio&#10;\/diagram-design:import-drawio platform.drawio --size=slide-16x9 --detail=simplified --audience=executive&#10;\/diagram-design:import-drawio platform.drawio --detail=faithful --format=png --page=all&#10;\/diagram-design:import-mermaid README.md --diagram=all&#10;\/diagram-design:import-mermaid architecture.mmd --size=slide-16x9 --detail=simplified\">\n<pre class=\"notranslate\"><code>\/diagram-design:import-drawio platform.drawio\n\/diagram-design:import-drawio platform.drawio --size=slide-16x9 --detail=simplified --audience=executive\n\/diagram-design:import-drawio platform.drawio --detail=faithful --format=png --page=all\n\/diagram-design:import-mermaid README.md --diagram=all\n\/diagram-design:import-mermaid architecture.mmd --size=slide-16x9 --detail=simplified\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Or just ask: <em>&#8220;redraw this drawio file for my deck&#8221;<\/em>, <em>&#8220;make this Mermaid block editorial&#8221;<\/em>, or <em>&#8220;\u3053\u306e Mermaid \u3092\u30b9\u30e9\u30a4\u30c9\u7528\u306b\u304d\u308c\u3044\u306b\u3057\u3066&#8221;<\/em>.<\/p>\n<p dir=\"auto\">Reads the common containers draw.io writes \u2014 <code>.drawio<\/code>, <code>.drawio.xml<\/code>, <code>.drawio.png<\/code> (embedded diagram), and <code>.drawio.svg<\/code> \u2014 including compressed payloads that look like base64 garbage in an editor.<br \/>\nFor Mermaid, it accepts <code>.mmd<\/code>, <code>.mermaid<\/code>, and one or more fenced <code>mermaid<\/code> blocks in Markdown. It parses text only: no rendering, JavaScript, browser, network, or followed click targets.<\/p>\n<p dir=\"auto\">The point isn&#8217;t conversion, it&#8217;s <strong>fitting the output to where it&#8217;s going<\/strong>. Same source file, three different diagrams:<\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th>Dial<\/th>\n<th>Options<\/th>\n<th>What it changes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Format<\/strong><\/td>\n<td><code>html<\/code> \u00b7 <code>svg<\/code> \u00b7 <code>png<\/code> \u00b7 <code>html+png<\/code><\/td>\n<td>The deliverable. SVG for Figma, PNG for slides, HTML for the web.<\/td>\n<\/tr>\n<tr>\n<td><strong>Size<\/strong><\/td>\n<td><code>doc-inline<\/code> \u00b7 <code>doc-wide<\/code> \u00b7 <code>slide-16x9<\/code> \u00b7 <code>slide-4x3<\/code> \u00b7 <code>social-og<\/code> \u00b7 <code>social-square<\/code> \u00b7 <code>print-a4-landscape<\/code> \u00b7 <code>print-letter-landscape<\/code> \u00b7 <code>fit<\/code><\/td>\n<td>The <code>viewBox<\/code> <strong>and the type ramp<\/strong> \u2014 a projected slide gets 16px node names, not 12px.<\/td>\n<\/tr>\n<tr>\n<td><strong>Detail<\/strong><\/td>\n<td><code>faithful<\/code> (\u226424 nodes, zoned) \u00b7 <code>balanced<\/code> (\u226412) \u00b7 <code>simplified<\/code> (\u22647)<\/td>\n<td>How much of the source survives, via a fixed degrade ladder \u2014 decorations, then duplicates, then leaf clusters, then infrastructure.<\/td>\n<\/tr>\n<tr>\n<td><strong>Audience<\/strong><\/td>\n<td><code>engineer<\/code> \u00b7 <code>mixed<\/code> \u00b7 <code>executive<\/code><\/td>\n<td>The <em>wording<\/em>, not the count. <code>Auth Service \/ JWT \u00b7 RS256 \u00b7 :8443<\/code> \u2192 <code>Auth Service \/ token check<\/code> \u2192 <code>Sign-in<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<p dir=\"auto\">Every import ends with a <strong>fidelity ledger<\/strong> \u2014 what got merged, collapsed, or dropped. You know the source; you&#8217;d notice anyway.<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Detail: balanced \u00b7 12 source nodes \u2192 8 drawn&#10;Collapsed: &quot;Token valid?&quot; decision \u2192 edge label on Gateway \u2192 Auth&#10;Dropped:   1 sticky note (&quot;legacy path, to be retired&quot;) \u2014 unconnected in source&#10;Kept in full: the request path (Web\/Mobile \u2192 Gateway \u2192 Orders \u2192 Postgres)\">\n<pre class=\"notranslate\"><code>Detail: balanced \u00b7 12 source nodes \u2192 8 drawn\nCollapsed: \"Token valid?\" decision \u2192 edge label on Gateway \u2192 Auth\nDropped:   1 sticky note (\"legacy path, to be retired\") \u2014 unconnected in source\nKept in full: the request path (Web\/Mobile \u2192 Gateway \u2192 Orders \u2192 Postgres)\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">What never carries over: source or renderer coordinates, source palette, source fonts, draw.io&#8217;s diagonal connector spaghetti, or Mermaid&#8217;s automatic layout. What always does: components, relationships, grouping, and direction. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/import-drawio.md\"><code>references\/import-drawio.md<\/code><\/a>, <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/import-mermaid.md\"><code>references\/import-mermaid.md<\/code><\/a>, and <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/output-spec.md\"><code>references\/output-spec.md<\/code><\/a>.<\/p>\n<hr\/>\n<p dir=\"auto\">Diagrams ship as self-contained HTML, but you can export the diagram itself for Figma, slides, or social cards. Use the slash command for your agent:<\/p>\n<p dir=\"auto\"><strong>Pi:<\/strong><\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\/export-diagram path\/to\/diagram.html&#10;\/export-diagram path\/to\/diagram.html --svg-only&#10;\/export-diagram path\/to\/diagram.html --png-only --scale=3&#10;\/export-diagram path\/to\/diagram.html --registry\">\n<pre class=\"notranslate\"><code>\/export-diagram path\/to\/diagram.html\n\/export-diagram path\/to\/diagram.html --svg-only\n\/export-diagram path\/to\/diagram.html --png-only --scale=3\n\/export-diagram path\/to\/diagram.html --registry\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\"><strong>Claude Code:<\/strong><\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\/diagram-design:export-diagram path\/to\/diagram.html&#10;\/diagram-design:export-diagram path\/to\/diagram.html --svg-only&#10;\/diagram-design:export-diagram path\/to\/diagram.html --png-only --scale=3&#10;\/diagram-design:export-diagram path\/to\/diagram.html --registry\">\n<pre class=\"notranslate\"><code>\/diagram-design:export-diagram path\/to\/diagram.html\n\/diagram-design:export-diagram path\/to\/diagram.html --svg-only\n\/diagram-design:export-diagram path\/to\/diagram.html --png-only --scale=3\n\/diagram-design:export-diagram path\/to\/diagram.html --registry\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Or just ask in natural language:<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"&quot;Export this diagram as SVG and PNG.&quot;&#10;&quot;Save my-diagram.html as PNG.&quot;\">\n<pre class=\"notranslate\"><code>\"Export this diagram as SVG and PNG.\"\n\"Save my-diagram.html as PNG.\"\n<\/code><\/pre>\n<\/div>\n<ul dir=\"auto\">\n<li><strong>SVG<\/strong> \u2014 extracts the <code>&lt;svg&gt;<\/code> node and injects Google Fonts so it renders standalone in browsers, Figma, and Illustrator.<\/li>\n<li><strong>PNG<\/strong> \u2014 rasterizes the diagram via Playwright at 2\u00d7 by default. One-time setup: <code>pip install playwright &amp;&amp; playwright install chromium<\/code>.<\/li>\n<\/ul>\n<p dir=\"auto\">Both formats are diagram-only \u2014 editorial cards and headers from <code>-full<\/code> variants aren&#8217;t included. For a screenshot of the full editorial layout, use your browser&#8217;s print-to-PDF or full-page screenshot. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/export.md\"><code>skills\/diagram-design\/references\/export.md<\/code><\/a> for the full procedure.<\/p>\n<p dir=\"auto\">For motion-enabled HTML, export the explicit final state: open <code>?motion=static<\/code>, wait for <code>document.fonts.ready<\/code>, and confirm the motion root has <code>data-frame=\"static\"<\/code> before capture. Use <code>?motion=step&amp;step=N<\/code> only when a named intermediate frame was requested.<\/p>\n<hr\/>\n<p dir=\"auto\">Progressive disclosure. <code>SKILL.md<\/code> routes behavior first when needed, then layout. Semantic, type, and animation references load only when relevant.<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"diagram-design\/&#10;\u251c\u2500\u2500 .agents\/plugins\/marketplace.json \u2014 Codex marketplace catalog&#10;\u251c\u2500\u2500 .claude-plugin\/                  \u2014 Claude marketplace + plugin manifest&#10;\u251c\u2500\u2500 .codex-plugin\/                   \u2014 Codex plugin manifest&#10;\u251c\u2500\u2500 .factory-plugin\/                 \u2014 Factory Droid marketplace + plugin manifest&#10;\u251c\u2500\u2500 commands\/&#10;\u2502   \u251c\u2500\u2500 export-diagram.md            \u2014 plugin export command&#10;\u2502   \u251c\u2500\u2500 import-drawio.md             \u2014 plugin draw.io import command&#10;\u2502   \u251c\u2500\u2500 import-mermaid.md            \u2014 plugin Mermaid import command&#10;\u2502   \u251c\u2500\u2500 profile.md                   \u2014 plugin client-profile command&#10;\u2502   \u2514\u2500\u2500 doctor.md                    \u2014 plugin environment diagnostics command&#10;\u251c\u2500\u2500 prompts\/&#10;\u2502   \u251c\u2500\u2500 export-diagram.md            \u2014 Pi `\/export-diagram` prompt template&#10;\u2502   \u251c\u2500\u2500 import-mermaid.md            \u2014 Pi Mermaid import prompt template&#10;\u2502   \u251c\u2500\u2500 profile.md                   \u2014 Pi `\/profile` prompt template&#10;\u2502   \u2514\u2500\u2500 doctor.md                    \u2014 Pi `\/doctor` diagnostics prompt template&#10;\u251c\u2500\u2500 skills\/&#10;\u2502   \u2514\u2500\u2500 diagram-design\/&#10;\u2502       \u251c\u2500\u2500 SKILL.md                 \u2014 philosophy, selection guide, checklist&#10;\u2502       \u251c\u2500\u2500 references\/              \u2014 loaded only when a type or primitive is chosen&#10;\u2502       \u2502   \u251c\u2500\u2500 style-guide.md       \u2014 single source of truth for colors + fonts&#10;\u2502       \u2502   \u251c\u2500\u2500 semantic-patterns.md \u2014 behavior patterns independent of layout&#10;\u2502       \u2502   \u251c\u2500\u2500 animation.md         \u2014 optional motion + accessibility contract&#10;\u2502       \u2502   \u251c\u2500\u2500 onboarding.md        \u2014 the URL-to-tokens flow&#10;\u2502       \u2502   \u251c\u2500\u2500 profiles.md          \u2014 named client profiles + project markers&#10;\u2502       \u2502   \u251c\u2500\u2500 import-drawio.md     \u2014 draw.io redraw procedure&#10;\u2502       \u2502   \u251c\u2500\u2500 import-mermaid.md    \u2014 Mermaid redraw procedure&#10;\u2502       \u2502   \u251c\u2500\u2500 output-spec.md       \u2014 format \u00d7 size \u00d7 detail level&#10;\u2502       \u2502   \u251c\u2500\u2500 export.md            \u2014 SVG \/ PNG export + sizing&#10;\u2502       \u2502   \u251c\u2500\u2500 export-registry.md   \u2014 block-metadata JSON sidecar export&#10;\u2502       \u2502   \u251c\u2500\u2500 type-architecture.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-flowchart.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-sequence.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-state.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-er.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-timeline.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-swimlane.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-quadrant.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-nested.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-tree.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-org-chart.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-layers.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-venn.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-pyramid.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-sankey.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-fishbone.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-wardley.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-kanban.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-journey.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-deployment.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-dependency.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-uml-class.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-story-map.md&#10;\u2502       \u2502   \u251c\u2500\u2500 type-db-schema.md&#10;\u2502       \u2502   \u251c\u2500\u2500 primitive-annotation.md&#10;\u2502       \u2502   \u251c\u2500\u2500 primitive-sketchy.md&#10;\u2502       \u2502   \u2514\u2500\u2500 primitive-terminal.md&#10;\u2502       \u251c\u2500\u2500 scripts\/&#10;\u2502       \u2502   \u251c\u2500\u2500 drawio_extract.py    \u2014 draw.io \u2192 structured IR&#10;\u2502       \u2502   \u251c\u2500\u2500 mermaid_extract.py   \u2014 Mermaid \u2192 structured IR&#10;\u2502       \u2502   \u2514\u2500\u2500 self_check.py        \u2014 packaged output self-check (runs installed)&#10;\u2502       \u2514\u2500\u2500 assets\/&#10;\u2502           \u251c\u2500\u2500 index.html           \u2014 live gallery, tabbed&#10;\u2502           \u251c\u2500\u2500 template*.html       \u2014 scaffolds for new diagrams&#10;\u2502           \u251c\u2500\u2500 example-&lt;type&gt;.html  \u2014 3 variants \u00d7 39 types&#10;\u2502           \u251c\u2500\u2500 example-loop-terminal.html&#10;\u2502           \u251c\u2500\u2500 example-quadrant-consultant.html&#10;\u2502           \u251c\u2500\u2500 example-import-drawio.html&#10;\u2502           \u251c\u2500\u2500 example-import-mermaid.html&#10;\u2502           \u251c\u2500\u2500 example-policy-trace-animated.html&#10;\u2502           \u2514\u2500\u2500 example-sequence-oauth*.html&#10;\u251c\u2500\u2500 scripts\/&#10;\u2502   \u251c\u2500\u2500 build-readme-thumbs.py       \u2014 regenerates docs\/screenshots\/thumbs\/&#10;\u2502   \u251c\u2500\u2500 bump-plugin-version.py       \u2014 synchronized Claude\/Codex\/Factory version bump&#10;\u2502   \u251c\u2500\u2500 render-canonical-screenshots.py \u2014 deterministic 39-type PNG catalog renderer&#10;\u2502   \u251c\u2500\u2500 verify-screenshot-freshness.py \u2014 source + screenshot digest gate&#10;\u2502   \u251c\u2500\u2500 verify-plugin-package.py     \u2014 version + marketplace package gate&#10;\u2502   \u251c\u2500\u2500 test-plugin-package.py       \u2014 adversarial package-gate tests&#10;\u2502   \u251c\u2500\u2500 lint-render.py               \u2014 Chromium rendered-layout checker&#10;\u2502   \u251c\u2500\u2500 verify-doctor.py             \u2014 doctor diagnostics contract gate&#10;\u2502   \u251c\u2500\u2500 test-verify-doctor.py        \u2014 doctor diagnostics adversarial tests&#10;\u2502   \u251c\u2500\u2500 verify-polar.py              \u2014 quantitative polar encoding gate&#10;\u2502   \u251c\u2500\u2500 test-verify-polar.py         \u2014 polar gate adversarial tests&#10;\u2502   \u251c\u2500\u2500 verify-sankey.py             \u2014 Sankey conservation + geometry gate&#10;\u2502   \u251c\u2500\u2500 test-verify-sankey.py        \u2014 Sankey gate adversarial tests&#10;\u2502   \u251c\u2500\u2500 test-verify-docs-sync.py     \u2014 docs\/routing-surface gate tests&#10;\u2502   \u2514\u2500\u2500 fixtures\/&#10;\u2502       \u251c\u2500\u2500 sample-flowchart.mmd&#10;\u2502       \u251c\u2500\u2500 sample-readme-with-mermaid.md&#10;\u2502       \u2514\u2500\u2500 sample-adversarial.mmd&#10;\u251c\u2500\u2500 docs\/cookbook.md                 \u2014 operator recipes for editable installs and common tasks&#10;\u251c\u2500\u2500 docs\/adr\/                        \u2014 short records of settled design decisions&#10;\u251c\u2500\u2500 docs\/screenshots\/                \u2014 full-resolution images + source-digest manifest.json&#10;\u2514\u2500\u2500 docs\/screenshots\/thumbs\/         \u2014 generated WebP previews the README renders\">\n<pre class=\"notranslate\"><code>diagram-design\/\n\u251c\u2500\u2500 .agents\/plugins\/marketplace.json \u2014 Codex marketplace catalog\n\u251c\u2500\u2500 .claude-plugin\/                  \u2014 Claude marketplace + plugin manifest\n\u251c\u2500\u2500 .codex-plugin\/                   \u2014 Codex plugin manifest\n\u251c\u2500\u2500 .factory-plugin\/                 \u2014 Factory Droid marketplace + plugin manifest\n\u251c\u2500\u2500 commands\/\n\u2502   \u251c\u2500\u2500 export-diagram.md            \u2014 plugin export command\n\u2502   \u251c\u2500\u2500 import-drawio.md             \u2014 plugin draw.io import command\n\u2502   \u251c\u2500\u2500 import-mermaid.md            \u2014 plugin Mermaid import command\n\u2502   \u251c\u2500\u2500 profile.md                   \u2014 plugin client-profile command\n\u2502   \u2514\u2500\u2500 doctor.md                    \u2014 plugin environment diagnostics command\n\u251c\u2500\u2500 prompts\/\n\u2502   \u251c\u2500\u2500 export-diagram.md            \u2014 Pi `\/export-diagram` prompt template\n\u2502   \u251c\u2500\u2500 import-mermaid.md            \u2014 Pi Mermaid import prompt template\n\u2502   \u251c\u2500\u2500 profile.md                   \u2014 Pi `\/profile` prompt template\n\u2502   \u2514\u2500\u2500 doctor.md                    \u2014 Pi `\/doctor` diagnostics prompt template\n\u251c\u2500\u2500 skills\/\n\u2502   \u2514\u2500\u2500 diagram-design\/\n\u2502       \u251c\u2500\u2500 SKILL.md                 \u2014 philosophy, selection guide, checklist\n\u2502       \u251c\u2500\u2500 references\/              \u2014 loaded only when a type or primitive is chosen\n\u2502       \u2502   \u251c\u2500\u2500 style-guide.md       \u2014 single source of truth for colors + fonts\n\u2502       \u2502   \u251c\u2500\u2500 semantic-patterns.md \u2014 behavior patterns independent of layout\n\u2502       \u2502   \u251c\u2500\u2500 animation.md         \u2014 optional motion + accessibility contract\n\u2502       \u2502   \u251c\u2500\u2500 onboarding.md        \u2014 the URL-to-tokens flow\n\u2502       \u2502   \u251c\u2500\u2500 profiles.md          \u2014 named client profiles + project markers\n\u2502       \u2502   \u251c\u2500\u2500 import-drawio.md     \u2014 draw.io redraw procedure\n\u2502       \u2502   \u251c\u2500\u2500 import-mermaid.md    \u2014 Mermaid redraw procedure\n\u2502       \u2502   \u251c\u2500\u2500 output-spec.md       \u2014 format \u00d7 size \u00d7 detail level\n\u2502       \u2502   \u251c\u2500\u2500 export.md            \u2014 SVG \/ PNG export + sizing\n\u2502       \u2502   \u251c\u2500\u2500 export-registry.md   \u2014 block-metadata JSON sidecar export\n\u2502       \u2502   \u251c\u2500\u2500 type-architecture.md\n\u2502       \u2502   \u251c\u2500\u2500 type-flowchart.md\n\u2502       \u2502   \u251c\u2500\u2500 type-sequence.md\n\u2502       \u2502   \u251c\u2500\u2500 type-state.md\n\u2502       \u2502   \u251c\u2500\u2500 type-er.md\n\u2502       \u2502   \u251c\u2500\u2500 type-timeline.md\n\u2502       \u2502   \u251c\u2500\u2500 type-swimlane.md\n\u2502       \u2502   \u251c\u2500\u2500 type-quadrant.md\n\u2502       \u2502   \u251c\u2500\u2500 type-nested.md\n\u2502       \u2502   \u251c\u2500\u2500 type-tree.md\n\u2502       \u2502   \u251c\u2500\u2500 type-org-chart.md\n\u2502       \u2502   \u251c\u2500\u2500 type-layers.md\n\u2502       \u2502   \u251c\u2500\u2500 type-venn.md\n\u2502       \u2502   \u251c\u2500\u2500 type-pyramid.md\n\u2502       \u2502   \u251c\u2500\u2500 type-sankey.md\n\u2502       \u2502   \u251c\u2500\u2500 type-fishbone.md\n\u2502       \u2502   \u251c\u2500\u2500 type-wardley.md\n\u2502       \u2502   \u251c\u2500\u2500 type-kanban.md\n\u2502       \u2502   \u251c\u2500\u2500 type-journey.md\n\u2502       \u2502   \u251c\u2500\u2500 type-deployment.md\n\u2502       \u2502   \u251c\u2500\u2500 type-dependency.md\n\u2502       \u2502   \u251c\u2500\u2500 type-uml-class.md\n\u2502       \u2502   \u251c\u2500\u2500 type-story-map.md\n\u2502       \u2502   \u251c\u2500\u2500 type-db-schema.md\n\u2502       \u2502   \u251c\u2500\u2500 primitive-annotation.md\n\u2502       \u2502   \u251c\u2500\u2500 primitive-sketchy.md\n\u2502       \u2502   \u2514\u2500\u2500 primitive-terminal.md\n\u2502       \u251c\u2500\u2500 scripts\/\n\u2502       \u2502   \u251c\u2500\u2500 drawio_extract.py    \u2014 draw.io \u2192 structured IR\n\u2502       \u2502   \u251c\u2500\u2500 mermaid_extract.py   \u2014 Mermaid \u2192 structured IR\n\u2502       \u2502   \u2514\u2500\u2500 self_check.py        \u2014 packaged output self-check (runs installed)\n\u2502       \u2514\u2500\u2500 assets\/\n\u2502           \u251c\u2500\u2500 index.html           \u2014 live gallery, tabbed\n\u2502           \u251c\u2500\u2500 template*.html       \u2014 scaffolds for new diagrams\n\u2502           \u251c\u2500\u2500 example-&lt;type&gt;.html  \u2014 3 variants \u00d7 39 types\n\u2502           \u251c\u2500\u2500 example-loop-terminal.html\n\u2502           \u251c\u2500\u2500 example-quadrant-consultant.html\n\u2502           \u251c\u2500\u2500 example-import-drawio.html\n\u2502           \u251c\u2500\u2500 example-import-mermaid.html\n\u2502           \u251c\u2500\u2500 example-policy-trace-animated.html\n\u2502           \u2514\u2500\u2500 example-sequence-oauth*.html\n\u251c\u2500\u2500 scripts\/\n\u2502   \u251c\u2500\u2500 build-readme-thumbs.py       \u2014 regenerates docs\/screenshots\/thumbs\/\n\u2502   \u251c\u2500\u2500 bump-plugin-version.py       \u2014 synchronized Claude\/Codex\/Factory version bump\n\u2502   \u251c\u2500\u2500 render-canonical-screenshots.py \u2014 deterministic 39-type PNG catalog renderer\n\u2502   \u251c\u2500\u2500 verify-screenshot-freshness.py \u2014 source + screenshot digest gate\n\u2502   \u251c\u2500\u2500 verify-plugin-package.py     \u2014 version + marketplace package gate\n\u2502   \u251c\u2500\u2500 test-plugin-package.py       \u2014 adversarial package-gate tests\n\u2502   \u251c\u2500\u2500 lint-render.py               \u2014 Chromium rendered-layout checker\n\u2502   \u251c\u2500\u2500 verify-doctor.py             \u2014 doctor diagnostics contract gate\n\u2502   \u251c\u2500\u2500 test-verify-doctor.py        \u2014 doctor diagnostics adversarial tests\n\u2502   \u251c\u2500\u2500 verify-polar.py              \u2014 quantitative polar encoding gate\n\u2502   \u251c\u2500\u2500 test-verify-polar.py         \u2014 polar gate adversarial tests\n\u2502   \u251c\u2500\u2500 verify-sankey.py             \u2014 Sankey conservation + geometry gate\n\u2502   \u251c\u2500\u2500 test-verify-sankey.py        \u2014 Sankey gate adversarial tests\n\u2502   \u251c\u2500\u2500 test-verify-docs-sync.py     \u2014 docs\/routing-surface gate tests\n\u2502   \u2514\u2500\u2500 fixtures\/\n\u2502       \u251c\u2500\u2500 sample-flowchart.mmd\n\u2502       \u251c\u2500\u2500 sample-readme-with-mermaid.md\n\u2502       \u2514\u2500\u2500 sample-adversarial.mmd\n\u251c\u2500\u2500 docs\/cookbook.md                 \u2014 operator recipes for editable installs and common tasks\n\u251c\u2500\u2500 docs\/adr\/                        \u2014 short records of settled design decisions\n\u251c\u2500\u2500 docs\/screenshots\/                \u2014 full-resolution images + source-digest manifest.json\n\u2514\u2500\u2500 docs\/screenshots\/thumbs\/         \u2014 generated WebP previews the README renders\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">This keeps the agent&#8217;s working context tight: routine diagrams load one type reference; behavior-rich diagrams add the routed semantic reference; animation adds its contract only when selected.<\/p>\n<p dir=\"auto\">Before submitting a new example, run <code>python3 scripts\/lint-skin.py &lt;your-new-example.html&gt;<\/code>.<br \/>\nThe repository-wide check <code>python3 scripts\/lint-skin.py --all --baseline<\/code> covers examples and templates and must stay green.<br \/>\nCI separately verifies semantic routing, animated-example structure, animated skin, every shipped motion asset, and adversarial mutations of the controller contract, reporting later gate outcomes even when an earlier gate fails. Semantic routing must pass <code>python3 scripts\/verify-semantic-motion.py --markdown-only<\/code>; the animated example has a separate <code>--example-only<\/code> gate. Every shipped motion template\/example must also pass <code>python3 scripts\/verify-motion.py --shipped<\/code>.<br \/>\nThe linter&#8217;s <code>a11y<\/code> category rejects diagram SVGs without a resolving accessible name,<br \/>\nan empty or misplaced title\/description, or unsafe bare <code>title<\/code> \/ <code>desc<\/code> IDs. It also pins the exact reviewed motion controller and rejects remote assets, CSS <code>@import<\/code>, non-fragment CSS <code>url()<\/code>, and executable attributes such as <code>onclick<\/code> or <code>srcdoc<\/code>.<br \/>\nIf you touch the draw.io import path, <code>python3 scripts\/verify-drawio-import.py<\/code> must also pass \u2014<br \/>\nit drives the real extractor against <code>scripts\/fixtures\/sample-architecture.drawio<\/code> in all four<br \/>\ncontainer formats and checks the references stay in sync.<br \/>\nIf you touch the Mermaid import path, <code>python3 scripts\/verify-mermaid-import.py<\/code> must also pass \u2014<br \/>\nit covers all supported grammars, multi-block Markdown, adversarial labels, trust-boundary<br \/>\nbehavior, resource caps, named failures, and reference\/command wiring.<\/p>\n<p dir=\"auto\">Label placement is gated geometrically: <code>python3 scripts\/verify-geometry.py --all<\/code> fails CI when a label mask overlaps a node declared later in the document, because the node fill would clip the text at render time. <code>python3 scripts\/test-verify-geometry.py<\/code> keeps that checker honest in both directions.<br \/>\nDiagrams using the traceable block decomposition pattern get a structural gate on top of that: <code>python3 scripts\/verify-block-registry.py --all<\/code> fails CI on a duplicate <code>data-block-id<\/code>, a <code>data-block-parent<\/code> that doesn&#8217;t resolve to another block in the same file, a cycle in the parent chain, a blank <code>data-block-id<\/code>, or a missing or blank <code>data-block-name<\/code> \u2014 the same defects that would make <code>--registry<\/code>&#8216;s exported JSON (see <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/export-registry.md\"><code>export-registry.md<\/code><\/a>) misrepresent the tree it claims to describe. <code>python3 scripts\/test-verify-block-registry.py<\/code> keeps that checker honest in both directions.<br \/>\nTreemaps get a second geometric gate, because their whole claim is that area <em>is<\/em> the encoding: <code>python3 scripts\/verify-treemap.py --all<\/code> fails CI when a cell&#8217;s share of the drawn area doesn&#8217;t match the value printed inside it, or when a label overruns the cell it names. It measures area error as a <em>relative<\/em> figure \u2014 an absolute one passes exactly the small cells most likely to be wrong. <code>python3 scripts\/test-verify-treemap.py<\/code> keeps it honest in both directions.<br \/>\nDocs and routing surfaces are themselves gated: <code>python3 scripts\/verify-docs-sync.py<\/code> fails CI if the SKILL.md description loses a type&#8217;s lexical hook, the gallery can&#8217;t reach a shipped example, the README tree names a file that doesn&#8217;t exist, a relative reference link is broken, a scanner-visible support path is not shipped inside the skill package, or any command\/prompt surface drifts from its routed reference. <code>python3 scripts\/test-verify-docs-sync.py<\/code> exercises those newer checks adversarially, including the strict-bundler behavior used by Hermes Agent. The skill also ships <code>skills\/diagram-design\/scripts\/self_check.py<\/code> \u2014 a distilled output checker installed agents can run on their own generated diagrams; <code>python3 scripts\/test-self-check.py<\/code> keeps it honest. Settled design decisions (why one pinned controller, why patterns never add types, the autoplay policy, the SKILL.md byte cap, why label placement is verified geometrically, and why client profiles use marker-first resolution) live as short ADRs in <code>docs\/adr\/<\/code> \u2014 read them before relitigating one, add one when you settle a new policy.<\/p>\n<p dir=\"auto\">All pull requests and pushes are automatically validated across Linux, Windows, and macOS runners via GitHub Actions CI (<code>.github\/workflows\/ci.yml<\/code>).<\/p>\n<p dir=\"auto\"><code>lint-skin.py<\/code> reads the source. <code>lint-render.py<\/code> renders it \u2014 headless Chromium<br \/>\nreports what actually got painted, which catches content cut off by the SVG<br \/>\nviewport, collapsed SVGs, horizontal page overflow, missing local assets and JS<br \/>\nerrors. Both run in CI on every pull request.<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pip install playwright &amp;&amp; playwright install chromium   # same dep as PNG export&#10;python3 scripts\/lint-render.py --self-test              # checks the checks&#10;python3 scripts\/lint-render.py --all                   # examples and templates&#10;python3 scripts\/lint-render.py &lt;your-new-example.html&gt;&#10;python3 scripts\/lint-render.py --fonts --all           # measure with the real webfonts\">\n<pre>pip install playwright <span class=\"pl-k\">&amp;&amp;<\/span> playwright install chromium   <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> same dep as PNG export<\/span>\npython3 scripts\/lint-render.py --self-test              <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> checks the checks<\/span>\npython3 scripts\/lint-render.py --all                   <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> examples and templates<\/span>\npython3 scripts\/lint-render.py <span class=\"pl-k\">&lt;<\/span>your-new-example.html<span class=\"pl-k\">&gt;<\/span>\npython3 scripts\/lint-render.py --fonts --all           <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> measure with the real webfonts<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">Clipping is measured by paint, not geometry: <code>getBoundingClientRect()<\/code> on an SVG<br \/>\nchild ignores stroke width, markers and filter bleed, and knows nothing about<br \/>\n<code>clip-path<\/code> or <code>overflow: visible<\/code>, so it both misses real clipping and invents<br \/>\nclipping that isn&#8217;t there. Instead each SVG is screenshot as authored and again<br \/>\nwith its <code>overflow<\/code> released, and the two are diffed \u2014 ink that appears outside<br \/>\nwas being cut off. Releases are staged \u2014 the SVG alone, then each clipping<br \/>\nancestor \u2014 so a wrapper release can&#8217;t mask spill at the SVG&#8217;s own edge, and an SVG<br \/>\nauthored <code>overflow: visible<\/code> inside a clipping wrapper is still checked.<br \/>\n<code>--self-test<\/code> asserts all of that on 23 cases, over half of them cases that must<br \/>\n<em>not<\/em> be flagged, and it also asserts the DOM is byte-identical after measuring.<\/p>\n<p dir=\"auto\">No golden images, so there is nothing to re-record and no PNGs in the repo.<br \/>\nNetwork is cut at the browser&#8217;s resolver, which covers WebSockets and anything<br \/>\nelse that bypasses request routing, with request routing as a second layer;<br \/>\n<code>--fonts<\/code> excludes exactly the two Google Fonts hostnames and allows them only<br \/>\nover HTTPS. Since the oracle is pixels, CI pins Playwright and its Chromium build<br \/>\nrather than installing whatever is newest.<\/p>\n<p dir=\"auto\"><strong>Font metrics differ between the default run and <code>--fonts<\/code>.<\/strong> With network<br \/>\nblocked \u2014 the default, and what CI runs \u2014 text is laid out in the fallback faces,<br \/>\nnot Instrument Serif and Geist. That is deterministic and machine-independent,<br \/>\nwhich is what a linter needs, but it is not what your reader sees. Run<br \/>\n<code>--fonts --all<\/code> locally when you care whether real text fits its box.<\/p>\n<p dir=\"auto\">At startup, the agent sees only the skill name and description. When a request matches, it loads <code>SKILL.md<\/code>; semantic, type, and animation references are pulled in only when relevant.<\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th>You ask for\u2026<\/th>\n<th>Agent loads<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>&#8220;Make me a flowchart&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/type-flowchart.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Build an architecture diagram&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/type-architecture.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Compare why these two policy requests differ&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/semantic-patterns.md<\/code> + <code>references\/type-flowchart.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Animate that policy trace&#8221;<\/td>\n<td>Prior selection + <code>references\/animation.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Onboard this skill to my site&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/onboarding.md<\/code> + <code>references\/style-guide.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Use my saved Acme client profile&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/profiles.md<\/code> + <code>~\/.diagram-design\/profiles\/acme.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Add an editorial callout to this diagram&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/primitive-annotation.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Give me a hand-drawn version&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/primitive-sketchy.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Give me a terminal \/ CLI-window version&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/primitive-terminal.md<\/code><\/td>\n<\/tr>\n<tr>\n<td>&#8220;Redraw this .drawio file for my deck&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/import-drawio.md<\/code> + <code>references\/output-spec.md<\/code> + the chosen type&#8217;s reference<\/td>\n<\/tr>\n<tr>\n<td>&#8220;Redraw this Mermaid block for my deck&#8221;<\/td>\n<td><code>SKILL.md<\/code> + <code>references\/import-mermaid.md<\/code> + <code>references\/output-spec.md<\/code> + the chosen type&#8217;s reference<\/td>\n<\/tr>\n<tr>\n<td>Routine static diagram-making (any of the 39 visual types)<\/td>\n<td>Only <code>SKILL.md<\/code> + that one type&#8217;s reference<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<p dir=\"auto\">No matter how many types exist, the agent only reads the one you need. Add a new type tomorrow and nothing else changes.<\/p>\n<hr\/>\n<ul dir=\"auto\">\n<li>A routine request (&#8220;make me a flowchart&#8221;) loads <code>SKILL.md<\/code> plus exactly one type reference \u2014 nothing else.<\/li>\n<li>Before drawing, the agent states the chosen type, pattern, size, and planned cuts, then renders.<\/li>\n<li>The output is one <code>.html<\/code> file that opens double-clicked, offline, with no network requests beyond Google Fonts.<\/li>\n<li>Screen readers announce the diagram&#8217;s title and description; <code>prefers-reduced-motion<\/code> shows the complete static frame.<\/li>\n<li><code>python3 skills\/diagram-design\/scripts\/self_check.py &lt;file&gt;<\/code> prints <code>OK<\/code> on the generated file.<\/li>\n<li>After brand onboarding, new diagrams use your site&#8217;s paper, ink, accent, and fonts \u2014 with a fidelity receipt naming each.<\/li>\n<\/ul>\n<p dir=\"auto\">If any of these fail, that&#8217;s a bug worth filing.<\/p>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">The design system (in one paragraph)<\/h2>\n<p><a id=\"user-content-the-design-system-in-one-paragraph\" class=\"anchor\" aria-label=\"Permalink: The design system (in one paragraph)\" href=\"#the-design-system-in-one-paragraph\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">One accent color, 1\u20132 focal elements per diagram. Three font families: Instrument Serif (title + italic callouts), Geist sans (node names), Geist Mono (technical sublabels). 1px hairline borders, no shadows, max border-radius 10px. Every coord, width, and gap divisible by 4 \u2014 non-negotiable, it&#8217;s what keeps the diagrams from feeling AI-generated. Mono is for technical content (ports, URLs, field types), not a blanket &#8220;dev&#8221; aesthetic. Coral-tinted focal nodes draw the eye to the 1\u20132 things that matter. Full spec in <a href=\"http:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/SKILL.md#5-design-system\"><code>SKILL.md<\/code><\/a>.<\/p>\n<hr\/>\n<ul dir=\"auto\">\n<li><strong>Annotation callout<\/strong> \u2014 italic Instrument Serif + dashed B\u00e9zier leader, for editorial asides that sit in the margins. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/primitive-annotation.md\"><code>skills\/diagram-design\/references\/primitive-annotation.md<\/code><\/a>.<\/li>\n<li><strong>Sketchy filter<\/strong> \u2014 SVG turbulence + displacement map for a hand-drawn variant. Good for essays, not for technical docs. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/primitive-sketchy.md\"><code>skills\/diagram-design\/references\/primitive-sketchy.md<\/code><\/a>.<\/li>\n<li><strong>Icon set<\/strong> \u2014 87 monochrome IT\/cloud icons (laptop, phone, user, server, database, Docker, Kubernetes, AWS, Azure, GitHub, Postgres\u2026) for richer architecture and sequence diagrams. Stroked icons from <a href=\"https:\/\/tabler.io\/icons\" rel=\"nofollow\">Tabler Icons<\/a> (MIT); brand silhouettes from <a href=\"https:\/\/simpleicons.org\" rel=\"nofollow\">Simple Icons<\/a> (CC0). Each icon uses <code>currentColor<\/code> so it inherits the editorial skin or your onboarded brand. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/references\/primitive-icons.md\"><code>skills\/diagram-design\/references\/primitive-icons.md<\/code><\/a>; browse the <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/skills\/diagram-design\/assets\/icons.html\">gallery<\/a>. Regenerate with <code>python scripts\/build-icons.py<\/code>.<\/li>\n<\/ul>\n<hr\/>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">When <em>not<\/em> to use this skill<\/h2>\n<p><a id=\"user-content-when-not-to-use-this-skill\" class=\"anchor\" aria-label=\"Permalink: When not to use this skill\" href=\"#when-not-to-use-this-skill\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<ul dir=\"auto\">\n<li><strong>Quick unicode diagrams<\/strong> for tweets or terminal output \u2192 wiretext-style skill.<\/li>\n<li><strong>Lists of anything<\/strong> \u2192 a table or bullets.<\/li>\n<li><strong>Before\/after comparisons<\/strong> \u2192 a table.<\/li>\n<li><strong>One-shape &#8220;diagrams&#8221;<\/strong> \u2014 a single box with a label \u2192 just write the sentence.<\/li>\n<\/ul>\n<p dir=\"auto\">Before drawing, ask: <em>would a reader learn more from this than from a well-written paragraph?<\/em> If no, don&#8217;t draw.<\/p>\n<hr\/>\n<p dir=\"auto\">Contributions are welcome \u2014 new diagram types, import grammar support, examples, docs, and tooling. See <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/CONTRIBUTING.md\">CONTRIBUTING.md<\/a> for the validation gates and workflows, and <a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design\/blob\/main\/CODE_OF_CONDUCT.md\">CODE_OF_CONDUCT.md<\/a> for community standards.<\/p>\n<hr\/>\n<p dir=\"auto\">Made by <strong>Cathryn Lavery<\/strong> \u2014 founder of <a href=\"https:\/\/bestself.co?utm_source=diagram-design&amp;utm_medium=readme&amp;utm_campaign=github&amp;utm_content=bio\" rel=\"nofollow\">BestSelf.co<\/a>. I write about AI, entrepreneurship, and designing nice-looking things at <a href=\"https:\/\/littlemight.com?utm_source=diagram-design&amp;utm_medium=readme&amp;utm_campaign=github&amp;utm_content=bio\" rel=\"nofollow\">littlemight.com<\/a> \u2014 blog + newsletter.<\/p>\n<p dir=\"auto\">If this is useful, <strong>star the repo<\/strong> and come <a href=\"https:\/\/x.com\/cathrynlavery\" rel=\"nofollow\">say hi on X<\/a>.<\/p>\n<\/div>\n<p><a href=\"https:\/\/github.com\/cathrynlavery\/diagram-design?utm_source=tldrdevops\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Editorial diagrams your designer won&#8217;t hate. New in 2.0 \u2014 the Loop: flywheels with a shared-memory hub. The dashed lines are the write-backs. New in 2.3: semantic system patterns and optional accessible motion, while static output stays the default. New in 2.5.10: ten more layout grammars \u2014 Sankey, fishbone, Wardley map, kanban, user journey, deployment, [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":23790,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-23789","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=23789"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23789\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/23790"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=23789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=23789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=23789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}