From aebcb5dd24dcd01fe0e615743723a8f9899edd7c Mon Sep 17 00:00:00 2001
From: buildnwrite <39439424+ggplab@users.noreply.github.com>
Date: Tue, 18 Aug 2026 16:18:33 +0900
Subject: [PATCH] fix(lint): allow Korean fallback stacks (#83)
Document and validate exact Korean proportional and monospace fallback stacks, with strict regression coverage and synchronized plugin version 2.4.6.
---
.claude-plugin/plugin.json | 2 +-
.codex-plugin/plugin.json | 2 +-
scripts/lint-skin.py | 4 ++
scripts/test-lint-a11y.py | 43 +++++++++++++++++++
.../diagram-design/references/output-spec.md | 3 +-
5 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
index dde9063..e4b6903 100644
--- a/.claude-plugin/plugin.json
+++ b/.claude-plugin/plugin.json
@@ -1,7 +1,7 @@
{
"name": "diagram-design",
"description": "Create branded architecture, IT current-state, flowchart, sequence, state machine, ER/data model, timeline, swimlane, quadrant, radar/spider, loop/flywheel, nested, tree, org chart, layer stack, Venn, pyramid/funnel, bar, line, Gantt and scatter charts, high-level, process, medallion, data flow, DP integration, or DP security matrix diagrams as standalone HTML/SVG/PNG. Redraw .drawio/.drawio.png/.drawio.svg or Mermaid .mmd sources at a chosen size/detail; onboard brand tokens from a website; add semantic patterns, callouts, accessible motion, or sketchy/hand-drawn styling.",
- "version": "2.4.5",
+ "version": "2.4.6",
"author": {
"name": "Cathryn Lavery",
"url": "https://github.com/cathrynlavery"
diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json
index df7d7fc..7798b26 100644
--- a/.codex-plugin/plugin.json
+++ b/.codex-plugin/plugin.json
@@ -1,7 +1,7 @@
{
"name": "diagram-design",
"description": "Create branded architecture, IT current-state, flowchart, sequence, state machine, ER/data model, timeline, swimlane, quadrant, radar/spider, loop/flywheel, nested, tree, org chart, layer stack, Venn, pyramid/funnel, bar, line, Gantt and scatter charts, high-level, process, medallion, data flow, DP integration, or DP security matrix diagrams as standalone HTML/SVG/PNG. Redraw .drawio/.drawio.png/.drawio.svg or Mermaid .mmd sources at a chosen size/detail; onboard brand tokens from a website; add semantic patterns, callouts, accessible motion, or sketchy/hand-drawn styling.",
- "version": "2.4.5",
+ "version": "2.4.6",
"author": {
"name": "Cathryn Lavery",
"url": "https://github.com/cathrynlavery"
diff --git a/scripts/lint-skin.py b/scripts/lint-skin.py
index 9209400..22cfeab 100644
--- a/scripts/lint-skin.py
+++ b/scripts/lint-skin.py
@@ -59,6 +59,10 @@ ALLOWED_FONTS = {
"noto sans jp",
"yu gothic",
"noto sans mono cjk jp",
+ "apple sd gothic neo",
+ "noto sans kr",
+ "malgun gothic",
+ "noto sans mono cjk kr",
"system-ui",
"sans-serif",
"serif",
diff --git a/scripts/test-lint-a11y.py b/scripts/test-lint-a11y.py
index 45aa051..f3c6663 100644
--- a/scripts/test-lint-a11y.py
+++ b/scripts/test-lint-a11y.py
@@ -406,6 +406,49 @@ def main() -> int:
"font-family: unsupported font family: Yu Gothic UI",
directory,
)
+ kr_name_svg = VALID_SVG.replace("fixture-title", "kr-name-stack-title").replace(
+ "fixture-desc", "kr-name-stack-desc"
+ )
+ require_pass(
+ "kr-name-stack",
+ kr_name_svg.replace(
+ "",
+ '인증 서비스\n',
+ ),
+ directory,
+ )
+ kr_mono_svg = VALID_SVG.replace("fixture-title", "kr-mono-stack-title").replace(
+ "fixture-desc", "kr-mono-stack-desc"
+ )
+ require_pass(
+ "kr-mono-stack",
+ kr_mono_svg.replace(
+ "",
+ '포트 443\n',
+ ),
+ directory,
+ )
+ kr_css_svg = VALID_SVG.replace("fixture-title", "kr-css-stack-title").replace(
+ "fixture-desc", "kr-css-stack-desc"
+ )
+ require_pass(
+ "kr-css-stack",
+ '\n' + kr_css_svg,
+ directory,
+ )
+ malgun_semilight_svg = VALID_SVG.replace(
+ "fixture-title", "malgun-semilight-title"
+ ).replace("fixture-desc", "malgun-semilight-desc")
+ require_lint_finding(
+ "malgun-gothic-semilight",
+ '\n'
+ + malgun_semilight_svg,
+ "font-family: unsupported font family: Malgun Gothic Semilight",
+ directory,
+ )
spec = importlib.util.spec_from_file_location("build_icons", BUILD_ICONS)
if spec is None or spec.loader is None:
diff --git a/skills/diagram-design/references/output-spec.md b/skills/diagram-design/references/output-spec.md
index 0debb79..42ccf2b 100644
--- a/skills/diagram-design/references/output-spec.md
+++ b/skills/diagram-design/references/output-spec.md
@@ -142,9 +142,10 @@ Geist has no CJK coverage. When labels contain Japanese, Chinese, or Korean text
```svg
認証サービス
+인증 서비스
```
-For mono sublabels use `'Geist Mono', 'Noto Sans Mono CJK JP', monospace`. CJK glyphs render ~10% wider than Latin at the same size — budget box width accordingly, and prefer 12px names over 8px sublabels for CJK, which goes muddy below 10px.
+The Hiragino/Yu Gothic stack carries no Hangul glyphs, so Korean labels need the Korean stack — don't reuse the Japanese one. For mono sublabels use `'Geist Mono', 'Noto Sans Mono CJK JP', monospace` (Japanese) or `'Geist Mono', 'Noto Sans Mono CJK KR', monospace` (Korean). CJK glyphs render ~10% wider than Latin at the same size — budget box width accordingly, and prefer 12px names over 8px sublabels for CJK, which goes muddy below 10px.
---