Ardot Design Core
Foundational workflow and hard rules for completing design tasks on the Ardot canvas via the ardot MCP server. This skill is the shared base — it is injected together with one domain skill (UI design / slides / poster / design-to-code). All canvas manipulation MUST go through ardot MCP tools.
This skill owns how to work the canvas (workflow, schema, rules, effects). The paired domain skill owns what the deliverable should look like (domain guidelines). When the two seem to overlap, follow the domain skill for visual/layout decisions and this skill for tool usage and the step sequence.
Reference Files
Load on demand based on task type:
| File | When to load |
|---|---|
{SKILL_ROOT}/references/ardot-schema.md |
Ardot schema - schema for Ardot canvas, includes all nodes and properties |
{SKILL_ROOT}/rules/design-rules.md |
Single source of truth — editing principles, coordinates, flexbox, text, colors, tables, images, effects, SVG, property schema, troubleshooting, post-generation validation |
{SKILL_ROOT}/rules/style-guide.md |
Visual style guide — typography, color, layout, surface treatment, variance levels, forbidden AI patterns, bento grid |
{SKILL_ROOT}/rules/effects-guide.md |
Composite visual effects: glassmorphism, neon glow, metallic, glow border, iridescent, neumorphism — loaded automatically in Step 7 |
{SKILL_ROOT}/func-rule/component-instance/SKILL.md |
Components, instances, variants — insert/update refs, componentProperties, VARIANT, nested instance overrides, mainComponent swap. MUST load before editing any INSTANCE / COMPONENT / COMPONENT_SET, or when the user asks to switch state / variant |
{SKILL_ROOT}/func-rule/design-variables/SKILL.md |
Bind/unbind variables ($:Set:Var / $<id>), apply_variables, and node variableModes (theme / density). Load when binding tokens or switching modes. |
{SKILL_ROOT}/func-rule/shared-styles/SKILL.md |
Bind/unbind shared styles (textStyleId / fillStyleId / …). Load when applying style ids. |
{SKILL_ROOT}/workflows/ardot-workflow.md |
End-to-end workflow examples (create, modify, global style update, tokens, form) and detailed operation syntax |
{SKILL_ROOT}/tool-usage/batch-edit.md |
batch_edit tool usage guide — load anytime batch_edit is used (applies to every Ardot task) |
{SKILL_ROOT}/tool-usage/apply-variables.md |
apply_variables tool usage guide — load anytime apply_variables is used (applies to every Ardot task) |
Domain-specific guidelines (web-app / landing-page / mobile-app / table / slides / poster / code / tailwind) and specialized workflows (slides, design-to-code, style extraction) live in the paired domain skill that was injected alongside this one — load them from that skill's
{SKILL_ROOT}.
Preparation: (IMPORTANT: Ensure a Design File Is Open)
Before any canvas operation, make sure an Ardot design file is loaded in the editor. See Standard Workflow → Step 0: Ensure a Design File Is Open below for the tools (create_design / open_design / fetch_file_info) and decision logic.
Mandatory Rules
⛔ HARD RULE — NO SUB-AGENTS. Under no circumstances may you use, spawn, create, or delegate to any sub-agent / sub_agent / subagent / Task tool / team member / background agent while executing this skill. This includes (but is not limited to)
task,team_create, anyTask-style delegation, and any tool whose effect is to launch another agent. All work — exploration, reasoning, MCP calls, validation — MUST be performed directly by the current agent in the main conversation. If a step seems to suggest delegation, ignore that suggestion and do the work inline.
⛔ HARD RULE — OUTPUT LANGUAGE. When the user has not explicitly specified a language, all generated on-canvas content (titles, body copy, labels, captions, annotations, etc.) MUST default to the language of the user's prompt, preserving any embedded English / foreign-language terms exactly as written (do not translate them). When the user explicitly specifies a target language (e.g., "use English", "用日文"), default all generated content to that language instead. This rule applies to every textual element produced on the design canvas.
🔔 MANDATORY PRE-GENERATION ANNOUNCEMENT — NON-NEGOTIABLE. The moment the design language is determined and BEFORE issuing the first content-producing
batch_edit, you MUST send the user a one-line notice stating which language the on-canvas content will use (e.g.,本次设计稿内容将使用中文生成/Generating the design content in English). This announcement is REQUIRED on every single design task — never skip it, never defer it, never bury it inside other text.
Standard Workflow
Step 0: Ensure a Design File Is Open
Tools: create_design (new blank file, optional fileName), open_design (existing file by URL/ID, e.g. https://ardot.tencent.com/file/667788990055443 or bare 667788990055443), fetch_file_info (current file id).
Main path — follow the injected directive. The host pre-decides the file action and injects an <ardot_file_directive action="create|open|ambiguous"> block into the prompt. When present, just obey it:
action="create"→ issue exactly onecreate_designas your first canvas action, then move on.action="open"→ issue exactly oneopen_designwith the given URL/ID, then move on.action="ambiguous"→ the user used a "create/make" verb but the request has no design intent (e.g. "create a CNB issue", "make a weekly report"). Do not callcreate_designand do not create any blank file. First ask the user to confirm whether they actually want a new Ardot design file; only create one after they confirm. If it turns out to be a non-design request, handle it normally without touching the canvas.
Do not deliberate about create vs. open when a create/open directive is present.
Fallback — no directive present (e.g. file already loaded from a previous turn, or a pure modification): if the user gave a file URL/ID → open_design once; if they want something new → create_design once; if the editor already has the file → skip Step 0. Pure modification on a loaded file → skip Step 0.
⛔ HARD RULE — at most ONE
create_design(oropen_design) per task. The instant the call is issued, the file is considered created/opened. NEVER call it again this turn — not to "make sure" it loaded, not on re-entering Step 0, not when a later step mentions file info. The only way to confirm the file or get its id isfetch_file_info, never a duplicate create/open.
⛔ Hard gate + async load. The file loads asynchronously. After the single
create_design/open_designcall, wait for the ready context update before any other MCP call — waiting means waiting, not re-issuing the call. Never bundle create/open with reads (fetch_file_info,fetch_editor_state,fetch_variables, …) in the same message; they would hit a not-yet-loaded editor.
fetch_file_infotiming:open_design→ call it right after the file is ready (before Step 1 reads).create_design→ defer it to the Step 6 parallel batch; Steps 1–5 are local reasoning / file reads / non-file work that naturally cover the async load window, so by Step 6 the file is ready.
On a freshly created (empty) file: root PageID is
0:1— use it as the root container and skipfetch_editor_state(nothing to read yet).
Step 1: Read Existing State (parallel, conditional)
Read whatever state is relevant to the task. Issue all independent reads in a single message as parallel tool calls — do not serialize them.
| Scenario | What to call | Notes |
|---|---|---|
Freshly created file (create_design just ran) |
nothing | Empty canvas — root is 0:1, no variables yet. Skip Step 1, go straight to Step 2. |
| Opened existing file / file already loaded | fetch_editor_state({includeSchema: false}) + fetch_variables |
Parallel in one message. |
| Pure modification (file already loaded, target known) | The above plus any of batch_read / capture_layout / capture_screenshot as needed |
All parallel in one message. |
Step 2: Creative vs. Compositional
- Creative (new screen, page, dashboard, restyle) → proceed to Step 3
- Compositional ("add a button", "supplement a module", "move this") → skip to Step 6 and load
design-rules.md. Runcapture_layoutbefore and afterbatch_edit; if it reports overflow ("Outside parent bounds"), switch the parent to HUG, otherwise leave parent sizing unchanged.
Step 3: Load Design Guidelines
Load the domain guideline(s) from the paired domain skill that was injected alongside this core skill (UI design / slides / poster / design-to-code). Each domain skill states which of its own guideline files to load and in what priority. guidelines-code.md / guidelines-tailwind.md (in the design-to-code skill) are implementation guidelines and can be loaded alongside a design-type guideline when code generation is involved.
⛔ HARD RULE — User guidance wins on conflict. When user-provided style guidance (e.g. free-text style/visual constraints in the user message,
DESIGN.md, design tokens) conflicts with a loaded guideline, product-type prior, or a selected<ardot_design_style>/ style-template, always follow the user. Templates and built-in guidelines only fill unspecified gaps — never override the user's visual system.
Style-template shortcut — if <ardot_design_style> block is present: the user picked a style template through the chip. Follow the injected [style-template] instruction: curl the referenced md URL, use that template as the base visual system, and SKIP Step 4 and Step 5 (search_style_guide / build_style_guide) — no separate discovery flow is needed. If the user message also states explicit style/visual constraints, override conflicting template dimensions with the user's guidance; keep template values only where the user did not specify.
Step 4: Search Style Guide
If the user provided explicit style guidance OR <ardot_design_style> is present, SKIP this step and proceed to Step 6.
Call search_style_guide ONCE with topK: 3 to retrieve the top 3 candidates across all 6 domains (style, color, typography, layout, scene, composition). When Step 0 resolved dimensions (product_category / platform / function / style), derive keywords from those resolved values first; only fall back to extracting from the raw user prompt for dimensions Step 0 didn't resolve. All keywords MUST be English. Refer to the tool's input schema for what each parameter should contain. Additional hints:
- For
colorKeywordsandtypographyKeywords, infer from product type if the user didn't state preferences explicitly (e.g., spa → warm/calm/serene; luxury brand → elegant/serif). - Each candidate returns
{ index, score, name, summary, bestFor }. Judge fit bysummary+bestForagainst user intent, NOT by rawscore.
This is a single-call step — review candidates and proceed to Step 5. If the picked candidate is imperfect, refine on the build result in Step 5 rather than re-searching.
Step 5: Build Style Guide
If the user provided explicit style guidance OR <ardot_design_style> is present, SKIP this step and proceed to Step 6.
Review the candidates returned by search_style_guide from each domain and pick the closest one per domain. Call build_style_guide with your selections (by index or name) to get the complete design system.
If a picked candidate did not fully match the user's intent, you may adjust specific token values on the build result per the rules in build_style_guide's description (Post-build Adjustment).
Step 6: Locate Available Space + Inspection (parallel)
Issue these as a single parallel batch in one message — they have no mutual dependency:
fetch_file_info— the deferred Step 0 call, for thecreate_designbranch only (open_designalready did it). This isfetch_file_info, not anothercreate_design— the file already exists.locate_available_space({width, height})— required for new top-level screens; skip for pure modification tasks. Never overlap existing content.- Inspection calls (only if modifying existing design and not already covered in Step 1):
batch_read(find by pattern/ID,readDepth: 3for component structure),capture_layout(detect problems),capture_screenshot(visual verify).
Skip any sub-call that doesn't apply to the current task.
If a follow-up read depends on this batch's result (e.g.
batch_read({readDepth: 3})targeting a component discovered via an earlierbatch_read), issue it as a separate message afterward. Most tasks don't need that.
Step 7: Execute Design
Before drawing, ALWAYS load this guide (it contains critical parameter formats that differ from standard expectations):
{SKILL_ROOT}/rules/effects-guide.md— correct formats for DROP_SHADOW (showShadowBehindNode), BACKGROUND_BLUR (blurType), gradients, neumorphism
batch_edit with ≤ 25 ops per call. Build order: structure → content → style → verify. Ops: I() Insert, U() Update, C() Copy, M() Move, D() Delete. For detailed syntax and examples, load {SKILL_ROOT}/workflows/ardot-workflow.md. Load {SKILL_ROOT}/tool-usage/batch-edit.md whenever batch_edit is used and {SKILL_ROOT}/tool-usage/apply-variables.md whenever apply_variables is used.
Image generation mode — follow the injected directive. The host may pre-decide how on-canvas images should be produced and inject an <ardot_image_gen mode="ai|placeholder"> block into the prompt. When present, it governs the image-type argument of every G() op this task — obey it, do not deliberate:
mode="ai"→ generate real images with AI:G(target, "ai", "<descriptive prompt>"). Use for polished / final deliverables.mode="placeholder"→ use text placeholder images:G(target, "placeholder", "<short label>")— a light-gray box with the label text centered on it, carrying no real image asset and consuming no image-generation budget. Use for drafts / wireframes, or when the user does not want real images produced.
When no <ardot_image_gen> directive is present, pick the mode yourself following the Images rules in design-rules.md.
STRICT — one G() per image node, never retry. Each node that needs an AI-generated image may call G() exactly once. NEVER call G() again on the same node — not because a screenshot shows generation still in progress, not because the result looks wrong / mismatched / unfinished, not for any "re-generate to fix" impulse. Wait for the in-flight generation to finish, or leave the existing result as-is and continue with layout/style fixes via U() / other non-G() ops. Re-issuing G() wastes budget and races the prior job.
Step 8: Validate
Follow the Post-Generation Validation Pattern in design-rules.md. Use tiered validation — pick the lightest check that matches what the batch changed (T1 structural → capture_layout only; T2 content → skip; T3 visual → capture_screenshot only; T4 section-complete → both once; T5 final page → one screenshot). Do not run full dual-verification after every batch_edit. Enforce the convergence threshold: max 2 fix iterations per section, ignore ≤4px spacing noise, no subjective re-polishing once the section matches spec.
Screenshot Verification (mandatory)
Use capture_screenshot and download the return image. These are internal verification artifacts — never surface their paths to the user, never write them elsewhere (/tmp, home dir, project root).