Deprecated skill kept only for legacy reference. Do not use for new doc visuals; prefer `nano-banana-2`, then `nano-banana`, then `ai-image-generation`, with flow/diagram fallback when image-first is not the right fit.
⛔ DEPRECATED — KHÔNG SỬ DỤNG CHO VISUAL ASSET MỚI. Skill này và
render_visual.pyKHÔNG còn được sử dụng để tạo visual asset cho tài liệu kỹ thuật. Output dạng card-show / card-grid đã bị loại bỏ hoàn toàn khỏi workflowcreate-doc.mdvà R6.Thay thế bằng:
nano-banana-2/nano-banana(ưu tiên cao nhất) — image-native generation chất lượng cao- Research-Adapt — tìm hình ảnh từ web, adapt qua
nano-banana-2; nếu cần model/capability khác thì mở sangai-image-generationdoc-visual-editorial-flow— khi cần editorial sketchMọi asset hiện tại ở dạng card-show phải được thay thế. Xem R6 và
create-doc.mdBước 3 để biết thứ tự ưu tiên mới.
Nội dung bên dưới giữ lại cho mục đích tham khảo cấu trúc spec/JSON cũ. KHÔNG dùng để tạo asset mới.
Use this skill to create deterministic .png teaching visuals locally, but do not reduce the job to "render some cards."
This skill is not the default choice for every high-craft documentation image.
If the target quality is closer to the repo's stronger image-native family such as assets/dsa/images, or the article needs a richer and more natural visual metaphor than a scripted renderer can comfortably provide, prefer nano-banana-2 or nano-banana first.
The default target is a visual-explainer:
If the repo already has a strong local visual language for the same family, preserve that first.
assets/dsa/images is a good example of repo-native quality to learn from, not flatten.
Do not use this skill for:
For those, use a more appropriate skill or workflow.
Read only what you need:
references/presets.md when choosing visual tone and palette familyreferences/visual-kinds.md when choosing the layout familyIf the doc or folder needs a stronger visual identity first, use design-md before this skill.
If the visual clearly wants a poster-like editorial explainer, use doc-visual-editorial-flow instead.
Use this skill when the reader would benefit from a visual artifact such as:
Do not ask whether the section is literally named VISUAL.
Ask whether a PNG would make the section easier to understand, remember, or trust.
Before choosing layout, research the visual idea-space.
Default approach:
2-5 references on the web that match the same teaching jobHard rules:
The output must be a new visual based on the idea, not a cloned reference.
Do not start from "which template do I have?" Start from "what should the reader feel happening in this topic?"
Examples:
If the same layout would look equally plausible for five unrelated topics, it is probably too generic.
content_typePick one:
techglossaryproductgamecareerThis controls the preset palette and typographic tone.
visual_kindPick the layout family that matches the teaching job:
state_traceboundary_mapworkflow_mapcompare_carddecision_maprouter_maptaxonomy_cardmental_model_cardapi_family_mapIf unsure:
state_traceboundary_mapworkflow_mapcompare_carddecision_maprouter_maptaxonomy_cardmental_model_cardapi_family_mapcompare_card, decision_map, router_map, and taxonomy_card are useful, but they are not the default answer for everything.
Before JSON, write a compact internal brief:
If the brief sounds like "a few cards with bullets," the brief is probably too weak.
Keep copy short enough to scan inside an image, but let the structure carry the teaching job.
Rules:
state_lines, core, side, and lane labels instead of forcing everything into one flat panel listExample state_trace:
{
"content_type": "tech",
"visual_kind": "state_trace",
"title": "Bubble Sort",
"subtitle": "Watch local swaps turn into a sorted suffix, one pass at a time.",
"eyebrow": "Sorting / State Trace",
"panels": [
{
"heading": "Pass 1 starts with local disorder",
"tag": "Setup",
"body": "The largest value is still free to drift right.",
"state_lines": [
"start: [5, 3, 8, 1, 2]",
"5>3 swap -> [3, 5, 8, 1, 2]",
"8>1 swap -> [3, 5, 1, 8, 2]",
"8>2 swap -> [3, 5, 1, 2, 8]"
],
"bullets": [
"Only adjacent inversions are repaired",
"But the pass still locks one global fact"
]
},
{
"heading": "Payoff",
"tag": "Invariant",
"body": "After one full pass, the largest element of the unsorted region is fixed at the end.",
"state_lines": [
"suffix locked: [..., 8]"
]
}
],
"output_path": "assets/dsa/images/example-state-trace.png"
}
Example boundary_map:
{
"content_type": "tech",
"visual_kind": "boundary_map",
"title": "Ports & Adapters",
"subtitle": "The core owns decisions. Technology stays at the boundary.",
"eyebrow": "Architecture / Boundary Map",
"left_label": "Driver side",
"right_label": "Driven side",
"core": {
"heading": "Application Core",
"tag": "CORE",
"body": "Use cases and policy live here.",
"bullets": [
"Inbound port receives intent",
"Outbound port requests capability",
"Business rules stay framework-agnostic"
]
},
"panels": [
{
"side": "left",
"heading": "REST Controller",
"tag": "Driver",
"bullets": ["Translate HTTP to a use-case command"]
},
{
"side": "left",
"heading": "CLI Command",
"tag": "Driver",
"bullets": ["Starts the same use case from batch entry"]
},
{
"side": "right",
"heading": "Repository Adapter",
"tag": "Driven",
"bullets": ["Implements persistence port"]
},
{
"side": "right",
"heading": "Payment Adapter",
"tag": "Driven",
"bullets": ["Implements payment capability outside the core"]
}
],
"output_path": "assets/system-design/images/example-boundary-map.png"
}
Use palette_overrides when the workflow or design-md brief has already locked a document-specific Visual DNA. Do not fall back to a generic preset color story when the article needs a distinct visual identity.
Run:
python3 .agents/skills/doc-visual-png/scripts/render_visual.py --spec /path/to/spec.json
The script writes the final .png to output_path and creates parent directories if needed.
Use the normal markdown image pattern:

The image should lead the explanation. The prose should sharpen the takeaway, not repeat every label.
Minimum verification:
.png file existsresearch -> brief -> spec -> render, not spec first, metaphor later.COMPARE is often the right place for the image.README.md, router_map is useful, but not every hub should look like a chooser.