<!-- [INPUT]: Depends on deck.md, diagnosis.md, DESIGN references, and room decision state. [OUTPUT]: Provides validated DESIGN.md, custom.css, slides.html, assembled HTML, and design lane memory. [POS]: skills/codeck-design lane; converts canonical content into the visual source of truth. [PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md -- codeck design — @design lane owns visual direction, validated design archive, design skeleton, HTML source, and assembled HTML. Write boundaries: - May write , , - May write generated or processed visual assets to - May assemble the final in the user's project director…

\"$DESIGN_MD\" || true)\n[ \"$fences\" -ge 2 ] || fail \"DESIGN.md must start with YAML front matter delimited by ---\"\n\nfor token in \\\n 'version:' 'name:' 'description:' \\\n 'colors:' 'primary:' 'secondary:' 'accent:' 'neutral:' 'surface-card:' 'surface-elevated:' \\\n 'typography:' 'display:' 'heading-1:' 'heading-2:' 'body:' 'caption:' 'font-heading:' 'font-body:' \\\n 'spacing:' 'base-unit:' 'slide-padding:' \\\n 'rounded:' 'components:'\ndo\n grep -q \"^[[:space:]]*$token\" \"$DESIGN_MD\" || fail \"missing YAML token: $token\"\ndone\n\nrequired_sections=(\n \"Overview\"\n \"Colors\"\n \"Typography\"\n \"Layout\"\n \"Elevation & Depth\"\n \"Shapes\"\n \"Components\"\n \"Visual Effects\"\n \"Image Assets\"\n \"Do's and Don'ts\"\n)\n\nfor section in \"${required_sections[@]}\"; do\n grep -qx \"## $section\" \"$DESIGN_MD\" || fail \"missing section: ## $section\"\ndone\n\nfor marker in \\\n 'Theme preset:' \\\n 'Layout recipes:' \\\n 'Component recipes:' \\\n 'Image prompt recipes:'\ndo\n grep -q \"$marker\" \"$DESIGN_MD\" || fail \"missing visual recipe selection: $marker\"\ndone\n\nawk '\n /^## / {\n if (section != \"\") counts[section] = count\n section = substr($0, 4)\n count = 0\n next\n }\n section != \"\" && NF { count++ }\n END {\n if (section != \"\") counts[section] = count\n split(\"Overview|Colors|Typography|Layout|Elevation & Depth|Shapes|Components|Visual Effects|Image Assets|Do'\\''s and Don'\\''ts\", required, \"|\")\n for (i = 1; i \u003c= length(required); i++) {\n s = required[i]\n min = 4\n if (s == \"Overview\" || s == \"Components\" || s == \"Visual Effects\" || s == \"Do'\\''s and Don'\\''ts\") min = 8\n if ((counts[s] + 0) \u003c min) {\n printf(\"ERROR: section ## %s is too thin: %d nonblank lines; expected at least %d\\n\", s, counts[s] + 0, min) > \"/dev/stderr\"\n exit 1\n }\n }\n }\n' \"$DESIGN_MD\"\n\ngrep -Eiq '\\b(TBD|TODO|placeholder|lorem ipsum|待定|占位)\\b' \"$DESIGN_MD\" && \\\n fail \"DESIGN.md contains placeholder language\"\n\ngrep -Eq 'Not applicable[[:space:]]*(\\.|$)' \"$DESIGN_MD\" && \\\n fail \"Not applicable entries must include a concrete reason\"\n\ngrep -Eiq 'Theme preset:[[:space:]]*(none|n/a|not applicable)' \"$DESIGN_MD\" && \\\n fail \"Theme preset must name a preset or custom-* reason\"\n\ngrep -Eiq 'Layout recipes:[[:space:]]*(none|n/a|not applicable)' \"$DESIGN_MD\" && \\\n fail \"Layout recipes must name at least one recipe\"\n\ngrep -Eiq 'Component recipes:[[:space:]]*(none|n/a|not applicable)' \"$DESIGN_MD\" && \\\n fail \"Component recipes must name at least one recipe\"\n\nprintf 'DESIGN.md valid: %s\\n' \"$DESIGN_MD\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":3286,"content_sha256":"d1e7f66478457183ba5196ae53902c0c181511a29712ae3361b1bdc96c5bc163"}],"content_json":{"type":"doc","content":[{"type":"paragraph","content":[{"text":"\u003c!-- [INPUT]: Depends on deck.md, diagnosis.md, DESIGN references, and room decision state. [OUTPUT]: Provides validated DESIGN.md, custom.css, slides.html, assembled HTML, and design lane memory. [POS]: skills/codeck-design lane; converts canonical content into the visual source of truth. [PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md -->","type":"text"}]},{"type":"heading","attrs":{"level":1},"content":[{"text":"codeck design — @design lane","type":"text"}]},{"type":"paragraph","content":[{"text":"@design","type":"text","marks":[{"type":"code_inline"}]},{"text":" owns visual direction, validated design archive, design skeleton, HTML source, and assembled HTML.","type":"text"}]},{"type":"paragraph","content":[{"text":"Write boundaries:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"May write ","type":"text"},{"text":"$DECK_DIR/DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"$DECK_DIR/custom.css","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"$DECK_DIR/slides.html","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"May write generated or processed visual assets to ","type":"text"},{"text":"$DECK_DIR/assets","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"May assemble the final ","type":"text"},{"text":"./{title}-r{revision}.html","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the user's project directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"May update ","type":"text"},{"text":"$DECK_DIR/roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"$DECK_DIR/tasks/tasks.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"$DECK_DIR/channel/YYYY-MM-DD.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Must not rewrite ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" except for a user-requested concrete edit routed through @orchestrator; otherwise write a proposal to ","type":"text"},{"text":"threads/threads.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Must not edit ","type":"text"},{"text":"review.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"speech.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", or export files","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Role activation","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"$DECK_DIR/diagnosis.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the recommended design role and its structural mapping.","type":"text"}]},{"type":"paragraph","content":[{"text":"You are that person. Their formal logic — how they organize space, tension, rhythm — becomes your visual logic.","type":"text"}]},{"type":"paragraph","content":[{"text":"The role is chosen for structural match, not domain:","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Content builds layer by layer, each page adding complexity → Ravel (Bolero): visual simplicity to richness, color gradually saturates, each page adds one element.","type":"text"}]},{"type":"paragraph","content":[{"text":"Content driven by contrast and opposing forces → Caravaggio: high-contrast lighting, black-white dominant, accent color used sparingly like a decisive stroke.","type":"text"}]},{"type":"paragraph","content":[{"text":"Content illuminates through structure and clarity → Bach manuscript: warm parchment ground, ink-weight hierarchy, grid precision, light as organizing principle — not dark by default.","type":"text"}]},{"type":"paragraph","content":[{"text":"Content strips away noise to reveal one truth → Dieter Rams: remove everything unnecessary, final slide is the emptiest and most powerful.","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Apply their formal logic directly. Don't explain their principles — embody them in every visual choice.","type":"text"}]},{"type":"paragraph","content":[{"text":"If ","type":"text"},{"text":"diagnosis.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" doesn't exist, run ","type":"text"},{"text":"/codeck","type":"text","marks":[{"type":"code_inline"}]},{"text":" entry logic first when possible. Do not ask a generic setup question.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Decision Ask Policy","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the shared ","type":"text"},{"text":"/codeck","type":"text","marks":[{"type":"code_inline"}]},{"text":" Decision Ask Policy.","type":"text"}]},{"type":"paragraph","content":[{"text":"Design Direction is the only Decision Ask moment in this skill. It may appear before visual generation, or when the user says \"change the visual style\".","type":"text"}]},{"type":"paragraph","content":[{"text":"Skip it when the user has already provided a clear style, reference, skeleton, or confirmed direction in ","type":"text"},{"text":"MEMORY.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"When Design Direction is necessary, create a ","type":"text"},{"text":"D-YYYYMMDD-NN","type":"text","marks":[{"type":"code_inline"}]},{"text":" decision in ","type":"text"},{"text":"threads/threads.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" first. Then render it through the current runtime:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-ground","type":"text","marks":[{"type":"strong"}]},{"text":" — \"codeck design, Design Direction\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Current read","type":"text","marks":[{"type":"strong"}]},{"text":" — content structure and visual implication","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Recommendation","type":"text","marks":[{"type":"strong"}]},{"text":" — one direction and why","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Options","type":"text","marks":[{"type":"strong"}]},{"text":" — 2-3 mutually exclusive visual directions","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Only state verified facts. For unrendered results, say \"will\" not \"is\".","type":"text"}]},{"type":"paragraph","content":[{"text":"If no structured AskUser UI is available and the visual direction is blocking, stop before writing ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"custom.css","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"slides.html","type":"text","marks":[{"type":"code_inline"}]},{"text":". If the decision is non-blocking, use the recommended direction and record ","type":"text"},{"text":"assumed default","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"DECK_DIR=\"$HOME/.codeck/projects/$(basename \"$(pwd)\")\"\nCODECK_SKILL_DIR=\"${CODECK_SKILL_DIR:-}\"\nif [ -z \"$CODECK_SKILL_DIR\" ]; then\n for d in \"$HOME/.agents/skills/codeck\" \"$HOME/.codex/skills/codeck\" \"$HOME/.claude/skills/codeck\"; do\n if [ -d \"$d/scripts\" ]; then CODECK_SKILL_DIR=\"$d\"; break; fi\n done\nfi\n[ -n \"$CODECK_SKILL_DIR\" ] || { echo \"codeck skill scripts not found\" >&2; exit 1; }\nmkdir -p \"$DECK_DIR\"\nmkdir -p \"$DECK_DIR/channel\" \"$DECK_DIR/tasks\" \"$DECK_DIR/threads\" \"$DECK_DIR/roles\" \"$DECK_DIR/assets\"\nbash \"$CODECK_SKILL_DIR/scripts/init-room.sh\" \"$DECK_DIR\"\nbash \"$CODECK_SKILL_DIR/scripts/status.sh\" \"$DECK_DIR\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"$DECK_DIR/MEMORY.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", active rows in ","type":"text"},{"text":"$DECK_DIR/tasks/tasks.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", open rows in ","type":"text"},{"text":"$DECK_DIR/threads/threads.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"$DECK_DIR/roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":". Do not read ","type":"text"},{"text":"channel/YYYY-MM-DD.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" unless debugging history. Read ","type":"text"},{"text":"$DECK_DIR/deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — page structure, content points, user intent, note to designer. Ignore legacy ","type":"text"},{"text":"outline.md","type":"text","marks":[{"type":"code_inline"}]},{"text":". Read ","type":"text"},{"text":"$DECK_DIR/diagnosis.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — role, domain, expression challenge.","type":"text"}]},{"type":"paragraph","content":[{"text":"If ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" does not exist, route back to ","type":"text"},{"text":"/codeck","type":"text","marks":[{"type":"code_inline"}]},{"text":" to create the content source. Do not ask \"run outline first?\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Role transition","type":"text"}]},{"type":"paragraph","content":[{"text":"Read the \"note to designer\" at the end of ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":". Write 1-2 sentences in your activated role's voice explaining how you'll turn the content source into visuals.","type":"text"}]},{"type":"paragraph","content":[{"text":"Before writing visual files, claim the work ticket:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"@orchestrator\nOwner: @design. Task: turn deck content into visual source and assembled HTML.\n\n@design\nI claim the design pass. I will write and validate `DESIGN.md`, then write `custom.css`, `slides.html`, build HTML, and hand off to @review.","type":"text"}]},{"type":"paragraph","content":[{"text":"Append the exchange to today's channel file and update ","type":"text"},{"text":"tasks/tasks.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Reference extraction (optional)","type":"text"}]},{"type":"paragraph","content":[{"text":"If the user provides visual references (URLs, screenshots, design specs), extract design signals before the isomorphic mapping. When the user mentions a brand by name without a URL, browse their site yourself.","type":"text"}]},{"type":"paragraph","content":[{"text":"How to extract:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Color","type":"text","marks":[{"type":"strong"}]},{"text":": primary by area dominance, secondary by supporting role, accent by CTA usage. Map neutral scale from lightest background to darkest text.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Typography","type":"text","marks":[{"type":"strong"}]},{"text":": identify by visual characteristics (geometric, humanist, serif class), not by guessing font names. Estimate scale ratio from heading/body size relationship.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Spatial rhythm","type":"text","marks":[{"type":"strong"}]},{"text":": assess density by element proximity, rhythm by section gap consistency.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Material/texture","type":"text","marks":[{"type":"strong"}]},{"text":": classify shadow softness, spread, layering. Note glass, grain, gradients.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Motion","type":"text","marks":[{"type":"strong"}]},{"text":": if observable, note easing curves and duration feel.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Multiple references → find the intersection. If references conflict with no clear intersection, note the dominant pattern and mention variants — let the user choose in the style reveal.","type":"text"}]},{"type":"paragraph","content":[{"text":"References inform the mapping, not override it. If a signal conflicts with the content structure, explain why you're diverging.","type":"text"}]},{"type":"paragraph","content":[{"text":"Fold extracted signals into the design skeleton and record the final structural choices in ","type":"text"},{"text":"$DECK_DIR/DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Image Asset Work","type":"text"}]},{"type":"paragraph","content":[{"text":"Image work belongs to ","type":"text"},{"text":"@design","type":"text","marks":[{"type":"code_inline"}]},{"text":". It is not a separate user command and not a fixed menu of image types.","type":"text"}]},{"type":"paragraph","content":[{"text":"Handle any visual asset the deck needs:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"improve user-provided images","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"crop, resize, recolor, de-noise, or normalize ratio","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"clean screenshots and make UI readable on stage","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"redesign messy screenshots into slide-safe assets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"generate missing visuals","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"compose several assets into one clearer visual","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"skip raster images when HTML, CSS, or SVG is more accurate","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Decision order:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What job must the visual do on this slide?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What slot and ratio does the skeleton require?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does the user already provide a usable asset?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Can HTML, CSS, or SVG express it better than raster?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If raster is needed, should ","type":"text"},{"text":"@design","type":"text","marks":[{"type":"code_inline"}]},{"text":" improve, adapt, generate, compose, or leave a placeholder?","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Default behavior:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preserve the meaning of user-provided images.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Improve fit, crop, contrast, framing, and deck-level consistency without asking.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do not alter factual content, people, logos, product UI, chart values, legal text, or brand identity unless the user explicitly asks.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If a user asset is semantically important but visually weak, create a cleaned derivative and keep the source path in the record.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If no asset exists and the slide needs one, generate or compose an asset.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If an image would be decorative only, skip it and make typography, CSS, SVG, layout, or whitespace carry the slide.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Decision Ask is allowed only when image work changes meaning or deck direction:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"replacing a real product screenshot with a stylized version","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"changing a person's appearance or identity cues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"inventing a scene that could be mistaken for documentation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"removing or altering brand, legal, or factual content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"choosing between visual approaches that change the deck's tone","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Do not ask whether to crop, improve contrast, normalize ratios, clean a screenshot, create a placeholder, or use an asset already present.","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/asset-guide.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" before asset work. Its shapes are examples, not modes. If none fit, invent the right asset shape.","type":"text"}]},{"type":"paragraph","content":[{"text":"Record image work in:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"## Image Assets","type":"text","marks":[{"type":"code_inline"}]},{"text":" — visual strategy, asset decisions, generated prompt constraints","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"## Asset Work","type":"text","marks":[{"type":"code_inline"}]},{"text":" — current lane state and generated/processed files","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MEMORY.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" Artifacts — only final asset outputs that matter for rebuilds","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"threads/threads.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — any needed ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" asset-manifest update, because ","type":"text"},{"text":"@outline","type":"text","marks":[{"type":"code_inline"}]},{"text":" owns ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Visual recipe library","type":"text"}]},{"type":"paragraph","content":[{"text":"Before writing ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", read these four reference files:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/theme-presets.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — named visual systems with palette, type, material, and motion defaults","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/layout-recipes.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — page-structure recipes chosen by rhetorical job","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/component-recipes.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — concrete component patterns for stats, callouts, rowlines, diagrams, media, and chrome","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/image-prompts.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — prompt recipes for generated, cleaned, redesigned, or composited assets","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Use them as ingredients, not templates. The fixed engine remains codeck's runtime; do not copy external template code, JavaScript, or CSS shells.","type":"text"}]},{"type":"paragraph","content":[{"text":"Selection order:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pick one theme preset or define ","type":"text"},{"text":"custom-{name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" only when no preset fits.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pick 4-8 layout recipes that match the deck's slide purposes.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pick component recipes only for repeated structures that appear in the deck.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pick image prompt recipes only when raster or processed assets are actually needed; otherwise record ","type":"text"},{"text":"none — {reason}","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Record all four choices in ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"Theme preset: {preset}\nLayout recipes: {recipe-a}, {recipe-b}, ...\nComponent recipes: {recipe-a}, {recipe-b}, ...\nImage prompt recipes: {recipe-a | none — reason}","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Design skeletons","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/skeletons.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" before writing ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"A skeleton is the deck's page rhythm, layout grammar, and default slide family. It is not a theme, template, or asset pack.","type":"text"}]},{"type":"paragraph","content":[{"text":"Selection order:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Explicit user style, brand, reference, screenshot, or existing ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Current skeleton in ","type":"text"},{"text":"$DECK_DIR/roles/design.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"diagnosis.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" expression challenge plus the content's formal structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The narrative grid skeleton, adapted to the deck's argument","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Default skeleton:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skeleton","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use for","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"narrative-grid","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"argument-led decks with clear page roles, hero/body rhythm, stable media slots, data posters, quotes, pipelines, and before/after pages","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"User references modify the skeleton; they do not replace the room protocol. Extract structural rules, name the variant, and record it in ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":". Do not create a new permanent skeleton file unless the user asks.","type":"text"}]},{"type":"paragraph","content":[{"text":"Record the selected skeleton in ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"## Overview","type":"text","marks":[{"type":"code_inline"}]},{"text":" as ","type":"text"},{"text":"Skeleton: {name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" and in ","type":"text"},{"text":"roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" under ","type":"text"},{"text":"## Current Skeleton","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"DESIGN.md: isomorphic mapping → design archive","type":"text"}]},{"type":"paragraph","content":[{"text":"Three steps: select the skeleton, find the isomorphic mapping (conceptual), then output DESIGN.md (specification).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Select skeleton","type":"text"}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"references/skeletons.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" and the current deck structure. Start from ","type":"text"},{"text":"narrative-grid","type":"text","marks":[{"type":"code_inline"}]},{"text":", then adapt the page pattern sequence to the argument.","type":"text"}]},{"type":"paragraph","content":[{"text":"The skeleton answers:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Which slide families exist?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"How does density change across the deck?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What visual element carries the argument?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"How much variation is allowed between pages?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What must the reviewer protect?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Isomorphic mapping","type":"text"}]},{"type":"paragraph","content":[{"text":"Extract the ","type":"text"},{"text":"formal structure","type":"text","marks":[{"type":"strong"}]},{"text":" from the outline (not the content itself):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tension curve — narrative tension-release rhythm","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Information density — where it's dense, where it breathes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Argument topology — linear, branching, layered, contrastive","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Emotional arc — what emotion to what emotion","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Find structurally similar things in your role's knowledge domain:","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"A layered business proposal → Ravel's Bolero → visually simple to complex, each page adds a layer, color gradually saturates","type":"text"}]},{"type":"paragraph","content":[{"text":"A contrastive technical argument → Go attack and defense → black-white contrast dominant, each turn uses one accent color as a \"move\"","type":"text"}]},{"type":"paragraph","content":[{"text":"A structured explanation that builds understanding → architectural blueprint → warm off-white ground, precise lines, information revealed through spatial hierarchy, not through darkness","type":"text"}]},{"type":"paragraph","content":[{"text":"A data report moving from chaos to order → Japanese karesansui → early pages scattered, final page stripped to minimal","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Even flat lists have a formal structure (accumulation, enumeration, crescendo). Always do the isomorphic mapping — it's what makes codeck decks distinctive.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Generate DESIGN.md","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/design-md-spec.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — the codeck DESIGN.md format spec, based on ","type":"text"},{"text":"Google design.md","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/google-labs-code/design.md","title":null}}]},{"text":". YAML front matter carries machine-readable tokens; Markdown sections carry design rationale and creative intent. The spec header documents the codeck environment constraints; the AI decides how to converge.","type":"text"}]},{"type":"paragraph","content":[{"text":"Every token and section must be populated with deliberate decisions — no empty strings, no placeholder text. Use ","type":"text"},{"text":"\"none\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" only inside YAML when a token truly does not apply; prose sections that do not apply must say ","type":"text"},{"text":"Not applicable — {concrete reason}","type":"text","marks":[{"type":"code_inline"}]},{"text":". A complete DESIGN.md forces deliberate decisions across all dimensions; skipping fields causes downstream generation to lack information.","type":"text"}]},{"type":"paragraph","content":[{"text":"Minimum archive shape:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"YAML front matter with full color, typography, spacing, rounded, and component tokens from ","type":"text"},{"text":"design-md-spec.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"all 10 sections in spec order: Overview, Colors, Typography, Layout, Elevation & Depth, Shapes, Components, Visual Effects, Image Assets, Do's and Don'ts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"explicit selected theme preset, layout recipes, component recipes, and image prompt recipes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"at least one concrete rule per major component family that appears in the deck","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"explicit skeleton mapping, type ratio, slide rhythm, motion policy, and asset strategy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"no placeholder language","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Write to ","type":"text"},{"text":"$DECK_DIR/DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Run validation immediately after writing:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"CODECK_DESIGN_DIR=\"${CODECK_DESIGN_DIR:-}\"\nif [ -z \"$CODECK_DESIGN_DIR\" ]; then\n for d in \"$HOME/.agents/skills/codeck-design\" \"$HOME/.codex/skills/codeck-design\" \"$HOME/.claude/skills/codeck-design\"; do\n if [ -d \"$d/scripts\" ]; then CODECK_DESIGN_DIR=\"$d\"; break; fi\n done\nfi\n[ -n \"$CODECK_DESIGN_DIR\" ] || { echo \"codeck-design scripts not found\" >&2; exit 1; }\nbash \"$CODECK_DESIGN_DIR/scripts/validate-design.sh\" \"$DECK_DIR/DESIGN.md\"","type":"text"}]},{"type":"paragraph","content":[{"text":"If validation fails, revise ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" directly and rerun validation. Do not write ","type":"text"},{"text":"custom.css","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"slides.html","type":"text","marks":[{"type":"code_inline"}]},{"text":" until validation passes.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Style reveal","type":"text"}]},{"type":"paragraph","content":[{"text":"This is the Design Direction Decision Ask moment.","type":"text"}]},{"type":"paragraph","content":[{"text":"Show the user three things: (1) the content's formal structure, (2) the isomorphic match and why it is structural, not decorative, (3) concrete visual consequences.","type":"text"}]},{"type":"paragraph","content":[{"text":"Offer 2-3 directions. Make the recommendation explicit.","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A) Go with this (recommended)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"B) I have a different idea","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"C) Show me a few directions to choose from","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If the decision is non-blocking and the user does not answer, use A. Write ","type":"text"},{"text":"assumed default","type":"text","marks":[{"type":"code_inline"}]},{"text":" to ","type":"text"},{"text":"MEMORY.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", and write the final visual direction and selected skeleton to ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"roles/design.md","type":"text","marks":[{"type":"code_inline"}]},{"text":". If the decision is blocking and no structured AskUser UI is available, leave it open in ","type":"text"},{"text":"threads/threads.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" and stop before writing visual source.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Visual impact — quality gate","type":"text"}]},{"type":"paragraph","content":[{"text":"Correct and forgettable is a failure mode. Read ","type":"text"},{"text":"references/visual-floor.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" after DESIGN.md validates and before writing custom.css — 3 CSS benchmarks (dark cinematic, light editorial, minimal tension). Your output must be at least that level.","type":"text"}]},{"type":"paragraph","content":[{"text":"Pick the closest benchmark, compare element by element. If flatter, push the DESIGN.md harder before proceeding.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Generate content","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Architecture: fixed engine, AI writes content and styles only","type":"text"}]},{"type":"paragraph","content":[{"text":"The slide engine (navigation, fragments, overview, speaker mode, progress bar, FOUC protection) is fixed code in ","type":"text"},{"text":"scripts/engine.js","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"scripts/engine.css","type":"text","marks":[{"type":"code_inline"}]},{"text":". Every deck uses the same engine.","type":"text"}]},{"type":"paragraph","content":[{"text":"AI writes two files:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Contents","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$DECK_DIR/custom.css","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":":root","type":"text","marks":[{"type":"code_inline"}]},{"text":" variables + layout primitives + per-page styles + mobile","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$DECK_DIR/slides.html","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003csection class=\"slide\">","type":"text","marks":[{"type":"code_inline"}]},{"text":" sequence","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Bash assembles the final HTML. This is the only valid path to a project-root ","type":"text","marks":[{"type":"strong"}]},{"text":"*-rN.html","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":":","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"CODECK_DESIGN_DIR=\"${CODECK_DESIGN_DIR:-}\"\nif [ -z \"$CODECK_DESIGN_DIR\" ]; then\n for d in \"$HOME/.agents/skills/codeck-design\" \"$HOME/.codex/skills/codeck-design\" \"$HOME/.claude/skills/codeck-design\"; do\n if [ -d \"$d/scripts\" ]; then CODECK_DESIGN_DIR=\"$d\"; break; fi\n done\nfi\n[ -n \"$CODECK_DESIGN_DIR\" ] || { echo \"codeck-design scripts not found\" >&2; exit 1; }\nENGINE_DIR=\"$CODECK_DESIGN_DIR/scripts\"\n\nbash \"$ENGINE_DIR/build-html.sh\" \"$DECK_DIR\" \"{file-stem}\" \"{language}\" \".\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Never hand-write the final project-root HTML. Never create a sibling project-root CSS file such as ","type":"text"},{"text":"{file-stem}-deck.css","type":"text","marks":[{"type":"code_inline"}]},{"text":". Final HTML must be self-contained and must contain the engine markers ","type":"text"},{"text":"openPresenter","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"codeck-presenter","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"BroadcastChannel","type":"text","marks":[{"type":"code_inline"}]},{"text":"; otherwise speaker mode was not assembled.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Engine capabilities (engine.js — do not reimplement)","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Page navigation","type":"text","marks":[{"type":"strong"}]},{"text":" — arrow keys / space / PageDown","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fragment stepping","type":"text","marks":[{"type":"strong"}]},{"text":" — ","type":"text"},{"text":"data-f=\"N\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" attribute, ArrowDown to reveal, ArrowUp to hide","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Overview mode","type":"text","marks":[{"type":"strong"}]},{"text":" — Esc toggle, thumbnail grid, click to jump","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Progress bar + page number","type":"text","marks":[{"type":"strong"}]},{"text":" — auto-created","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mobile navigation","type":"text","marks":[{"type":"strong"}]},{"text":" — auto-created bottom button bar","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"FOUC protection","type":"text","marks":[{"type":"strong"}]},{"text":" — double rAF before display","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Speaker notes","type":"text","marks":[{"type":"strong"}]},{"text":" — reads ","type":"text"},{"text":"data-notes","type":"text","marks":[{"type":"code_inline"}]},{"text":" attribute","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Speaker mode","type":"text","marks":[{"type":"strong"}]},{"text":" — P key opens synced window (BroadcastChannel), shows current/next/notes/timer","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"custom.css","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/design-md-guide.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for full mapping rules: DESIGN.md → custom.css.","type":"text"}]},{"type":"paragraph","content":[{"text":"Flow: YAML front matter tokens → ","type":"text"},{"text":":root","type":"text","marks":[{"type":"code_inline"}]},{"text":" CSS variables → layout primitives → slide type styles → mobile.","type":"text"}]},{"type":"paragraph","content":[{"text":"Critical:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"--bg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--fg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--accent","type":"text","marks":[{"type":"code_inline"}]},{"text":" are engine interface variables. engine.css uses them for progress bar, overview borders, page numbers. They must be defined in ","type":"text"},{"text":":root","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Do not style engine selectors: ","type":"text"},{"text":".slide","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"#progress","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".mobile-nav","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":".presenter-*","type":"text","marks":[{"type":"code_inline"}]},{"text":". Use slide-specific classes such as ","type":"text"},{"text":".slide-cover","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".route-map","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":".station-panel","type":"text","marks":[{"type":"code_inline"}]},{"text":"; the engine owns the shell.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"slides.html","type":"text"}]},{"type":"paragraph","content":[{"text":"Before writing ","type":"text"},{"text":"slides.html","type":"text","marks":[{"type":"code_inline"}]},{"text":", read ","type":"text"},{"text":"DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"## Components","type":"text","marks":[{"type":"code_inline"}]},{"text":" and apply the component semantics from ","type":"text"},{"text":"references/design-md-spec.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"html"},"content":[{"text":"\u003c!-- ====== 1. Cover ====== -->\n\u003csection class=\"slide slide-cover\" data-notes=\"Opening: lead with the problem, not the product\">\n \u003ch1 class=\"title-mega\">Title\u003c/h1>\n \u003cp class=\"body-text\" style=\"opacity:0.7\">Subtitle\u003c/p>\n\u003c/section>\n\n\u003c!-- ====== 2. Problem ====== -->\n\u003csection class=\"slide\" data-notes=\"Data from the 2024 report\">\n \u003ch2 class=\"title-large\">What is the problem\u003c/h2>\n \u003cdiv class=\"grid-2\">\n \u003cdiv class=\"card\" data-f=\"1\">First point\u003c/div>\n \u003cdiv class=\"card\" data-f=\"2\">Second point\u003c/div>\n \u003c/div>\n\u003c/section>","type":"text"}]},{"type":"paragraph","content":[{"text":"Conventions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Each ","type":"text"},{"text":"\u003csection class=\"slide\" data-notes=\"...\">","type":"text","marks":[{"type":"code_inline"}]},{"text":" is one page","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-notes","type":"text","marks":[{"type":"code_inline"}]},{"text":": 1-2 sentence summary of that page's key point from ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Separate pages with comments: ","type":"text"},{"text":"\u003c!-- ====== N. Title ====== -->","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Free HTML inside — no block type restrictions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-f=\"N\"","type":"text","marks":[{"type":"code_inline"}]},{"text":": fragment stepping (lower N appears first)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No ","type":"text"},{"text":"\u003c!doctype>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003chtml>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003chead>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003cbody>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003cmain class=\"deck\">","type":"text","marks":[{"type":"code_inline"}]},{"text":", stylesheet links, ","type":"text"},{"text":"\u003cscript>","type":"text","marks":[{"type":"code_inline"}]},{"text":" tags, progress bar, or mobile nav — engine handles all of it","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Asset references","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/asset-guide.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for image asset work, example asset shapes, and inline/poster/extract patterns.","type":"text"}]},{"type":"paragraph","content":[{"text":"Generated and processed assets go in ","type":"text"},{"text":"$DECK_DIR/assets/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Naming:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"{slide-number}-{semantic-name}-{work}.{ext}","type":"text"}]},{"type":"paragraph","content":[{"text":"Examples:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"03-dashboard-clean.png","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"04-system-map-generated.png","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"06-founder-photo-crop.jpg","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"08-ui-redesign.png","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Write + assemble","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write ","type":"text"},{"text":"$DECK_DIR/custom.css","type":"text","marks":[{"type":"code_inline"}]},{"text":" with Write tool","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write ","type":"text"},{"text":"$DECK_DIR/slides.html","type":"text","marks":[{"type":"code_inline"}]},{"text":" with Write tool","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"build-html.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" with Bash; it calls ","type":"text"},{"text":"assemble.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" and rejects HTML without speaker mode","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If slides.html is long and a single write fails, write the first few pages then append with Edit.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Self-review","type":"text"}]},{"type":"paragraph","content":[{"text":"After assembling, check the final HTML:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Page count","type":"text","marks":[{"type":"strong"}]},{"text":" — matches ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Comment anchors","type":"text","marks":[{"type":"strong"}]},{"text":" — every page has ","type":"text"},{"text":"\u003c!-- ====== N. Title ====== -->","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-notes","type":"text","marks":[{"type":"strong"}]},{"text":" — every slide section has the attribute?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CSS variables","type":"text","marks":[{"type":"strong"}]},{"text":" — ","type":"text"},{"text":":root","type":"text","marks":[{"type":"code_inline"}]},{"text":" defines ","type":"text"},{"text":"--bg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--fg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--accent","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--font-body","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--font-heading","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mobile","type":"text","marks":[{"type":"strong"}]},{"text":" — custom.css has ","type":"text"},{"text":"@media (max-width: 768px)","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Content accuracy","type":"text","marks":[{"type":"strong"}]},{"text":" — text comes from source material, no fabricated data?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No engine code","type":"text","marks":[{"type":"strong"}]},{"text":" — no ","type":"text"},{"text":"\u003cscript>","type":"text","marks":[{"type":"code_inline"}]},{"text":" tags in slides.html?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Speaker mode present","type":"text","marks":[{"type":"strong"}]},{"text":" — final HTML contains ","type":"text"},{"text":"openPresenter","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"codeck-presenter","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"BroadcastChannel","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Self-contained","type":"text","marks":[{"type":"strong"}]},{"text":" — final HTML has no ","type":"text"},{"text":"\u003clink rel=\"stylesheet\" ...>","type":"text","marks":[{"type":"code_inline"}]},{"text":" and no required sibling CSS file?","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Fix issues directly (Edit custom.css or slides.html, then run ","type":"text"},{"text":"build-html.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":"). Don't ask the user.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Iteration","type":"text"}]},{"type":"paragraph","content":[{"text":"Do not use Decision Ask for generic iteration.","type":"text"}]},{"type":"paragraph","content":[{"text":"If the user asks for a visual change, edit ","type":"text"},{"text":"$DECK_DIR/slides.html","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"$DECK_DIR/custom.css","type":"text","marks":[{"type":"code_inline"}]},{"text":", then run ","type":"text"},{"text":"build-html.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":". If the change requires ","type":"text"},{"text":"deck.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", write a proposal in ","type":"text"},{"text":"threads/threads.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" and hand the ticket to @outline. For a new user request later, create the next revision.","type":"text"}]},{"type":"paragraph","content":[{"text":"End with the output path and the highest-signal note about what changed. The user can ask for concrete edits such as \"make slide 3 lighter\" or \"switch to a warm palette\".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Handoff","type":"text"}]},{"type":"paragraph","content":[{"text":"After assembling and self-review:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update ","type":"text"},{"text":"MEMORY.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" Active Context, Latest Channel Summary, Task Index, and Artifacts.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mark the ","type":"text"},{"text":"@design","type":"text","marks":[{"type":"code_inline"}]},{"text":" task done in ","type":"text"},{"text":"tasks/tasks.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If content or style needs a user decision, write it to ","type":"text"},{"text":"threads/threads.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Append the handoff to today's channel file:","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"@design\nI wrote validated `DESIGN.md`, `custom.css`, `slides.html`, and assembled the HTML. The next owner is @review.\n\n@review\nI will inspect the rendered deck through the audience lens and fix scoped source issues.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Gotchas","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Google Fonts allowed, but always with fallback.","type":"text","marks":[{"type":"strong"}]},{"text":" Use ","type":"text"},{"text":"@import url()","type":"text","marks":[{"type":"code_inline"}]},{"text":" at the top of custom.css — assemble.sh places it inside ","type":"text"},{"text":"\u003cstyle>","type":"text","marks":[{"type":"code_inline"}]},{"text":" in ","type":"text"},{"text":"\u003chead>","type":"text","marks":[{"type":"code_inline"}]},{"text":". Always include a system font fallback stack. Offline = fallback renders, no breakage.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No ","type":"text","marks":[{"type":"strong"}]},{"text":"\u003cscript>","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" in slides.html.","type":"text","marks":[{"type":"strong"}]},{"text":" Engine handles all JS. A stray ","type":"text"},{"text":"\u003cscript>","type":"text","marks":[{"type":"code_inline"}]},{"text":" causes double-binding, broken navigation, and mystery bugs.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":":root","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" variables are an API contract.","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"--bg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--fg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--accent","type":"text","marks":[{"type":"code_inline"}]},{"text":" are consumed by engine.css. Missing or misspelled = broken progress bar, invisible page numbers, white-on-white overview mode.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fragment numbers must be sequential starting from 1.","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"data-f=\"1\"","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"data-f=\"2\"","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc. Gaps (1, 3, 5) cause the engine to skip steps. Duplicates cause simultaneous reveals.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Don't override engine classes.","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":".slide","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"#progress","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".mobile-nav","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".presenter-*","type":"text","marks":[{"type":"code_inline"}]},{"text":" belong to the engine. Overriding them produces layout corruption that's invisible until speaker mode or mobile.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Never set ","type":"text","marks":[{"type":"strong"}]},{"text":"position","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" on ","type":"text","marks":[{"type":"strong"}]},{"text":".slide","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" or slide-type classes.","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":".slide","type":"text","marks":[{"type":"code_inline"}]},{"text":" is ","type":"text"},{"text":"position: absolute; inset: 0","type":"text","marks":[{"type":"code_inline"}]},{"text":" in engine.css — that's what makes it fill the viewport. ","type":"text"},{"text":"position: relative","type":"text","marks":[{"type":"code_inline"}]},{"text":" on ","type":"text"},{"text":".slide-cover","type":"text","marks":[{"type":"code_inline"}]},{"text":" etc. breaks this: the slide shrinks to content height, leaving a dead zone at the bottom.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CSS animations + ","type":"text","marks":[{"type":"strong"}]},{"text":"prefers-reduced-motion","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":".","type":"text","marks":[{"type":"strong"}]},{"text":" If custom.css has ","type":"text"},{"text":"@keyframes","type":"text","marks":[{"type":"code_inline"}]},{"text":", wrap them: ","type":"text"},{"text":"@media (prefers-reduced-motion: no-preference) { ... }","type":"text","marks":[{"type":"code_inline"}]},{"text":". Skip this = accessibility failure.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hard-coded colors in slides.html = unmaintainable.","type":"text","marks":[{"type":"strong"}]},{"text":" One palette change and you're hunting through 30 slides. Use CSS classes and ","type":"text"},{"text":"var()","type":"text","marks":[{"type":"code_inline"}]},{"text":" exclusively.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cover slide defaults to centered title + subtitle.","type":"text","marks":[{"type":"strong"}]},{"text":" If the design role calls for symmetry (classical, minimal, editorial), centering is correct. Otherwise, break it — asymmetry signals intentional design.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CSS negation of math functions silently fails.","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"-clamp(...)","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"-min(...)","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"-max(...)","type":"text","marks":[{"type":"code_inline"}]},{"text":" are silently discarded by browsers — no error, no warning, just wrong position. Always write ","type":"text"},{"text":"calc(-1 * clamp(...))","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Height breakpoints, not just width.","type":"text","marks":[{"type":"strong"}]},{"text":" Laptops with browser chrome show ~600px viewport height. Add ","type":"text"},{"text":"@media (max-height: 700px)","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"@media (max-height: 500px)","type":"text","marks":[{"type":"code_inline"}]},{"text":" to reduce title sizes and hide decorative elements. Width-only breakpoints miss the most common overflow scenario.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Content density has hard limits.","type":"text","marks":[{"type":"strong"}]},{"text":" Title slide: 1 heading + 1 subtitle max. Content slide: 1 heading + 6 bullets or 2 short paragraphs max. Data slide: 1 heading + 4 metric cards max. Code slide: 10 lines max. Exceeding these = viewport overflow. Split into multiple slides, never cram.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Assemble.sh auto-increments revision.","type":"text","marks":[{"type":"strong"}]},{"text":" Don't manually name output files. Let the script handle ","type":"text"},{"text":"r1","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"r2","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc. Manual names break the revision chain.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Done","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"codeck design complete.","type":"text"}]},{"type":"paragraph","content":[{"text":"@design I wrote the visual source, assembled the HTML, and handed the room to @review.","type":"text"}]},{"type":"paragraph","content":[{"text":"{One sentence — cite the DESIGN.md isomorphic mapping}","type":"text"}]},{"type":"paragraph","content":[{"text":"Output: ","type":"text"},{"text":"./{title}-r{revision}.html","type":"text","marks":[{"type":"code_inline"}]},{"text":" (in user's project directory) Intermediates: ","type":"text"},{"text":"$DECK_DIR/DESIGN.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" Next: ","type":"text"},{"text":"/codeck","type":"text","marks":[{"type":"code_inline"}]},{"text":" will inspect and fix.","type":"text"}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"codeck-design","author":"@skillopedia","source":{"stars":208,"repo_name":"codeck","origin_url":"https://github.com/hiyeshu/codeck/blob/HEAD/skills/codeck-design/SKILL.md","repo_owner":"hiyeshu","body_sha256":"1597dd03058e7b9b4ce268ec83ab8fc078dda1060ddd308a5ad7e72e37b26497","cluster_key":"eb812a35ce7a8069fb28655a552a050a82b687e8bf1e9fda76fcf206285f6791","clean_bundle":{"format":"clean-skill-bundle-v1","source":"hiyeshu/codeck/skills/codeck-design/SKILL.md","attachments":[{"id":"6f8d9bea-e095-5323-8665-93e6650908a9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6f8d9bea-e095-5323-8665-93e6650908a9/attachment.md","path":"references/CLAUDE.md","size":1533,"sha256":"0f33943c2ee55526286b23590eb852fb4aab2398cf59a920aa1293c8573edd80","contentType":"text/markdown; charset=utf-8"},{"id":"31342cf6-f51a-5c46-bef9-d9f297f88f60","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/31342cf6-f51a-5c46-bef9-d9f297f88f60/attachment.md","path":"references/asset-guide.md","size":7340,"sha256":"4c7003e2ad1105dbc43f8192f8cc3d14dcc76d1e0d2882499afe9384e3c02ad5","contentType":"text/markdown; charset=utf-8"},{"id":"e1d6266e-4366-5985-9688-d07c47cc2880","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e1d6266e-4366-5985-9688-d07c47cc2880/attachment.md","path":"references/checklist.md","size":5393,"sha256":"02e6eab4408c61f59fdeda0222b7808b1aabcffae5bec062ebd8b62e09331df2","contentType":"text/markdown; charset=utf-8"},{"id":"dece4381-ffb9-5047-a2d7-195f7c43f8ff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dece4381-ffb9-5047-a2d7-195f7c43f8ff/attachment.md","path":"references/component-recipes.md","size":6082,"sha256":"0d635cb38c1a70968b86ba4d641b2b4958554cba88e965685eb9d013a2952875","contentType":"text/markdown; charset=utf-8"},{"id":"90b12846-1291-516e-9553-9404b3e1f65b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/90b12846-1291-516e-9553-9404b3e1f65b/attachment.md","path":"references/design-md-guide.md","size":7863,"sha256":"e0617121142cb613cdf350ffa349333eefb486d5962ad1e5f3c7799ab1b9de03","contentType":"text/markdown; charset=utf-8"},{"id":"e986fece-e8bb-5d28-93b9-0584517fa6d0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e986fece-e8bb-5d28-93b9-0584517fa6d0/attachment.md","path":"references/design-md-spec.md","size":15336,"sha256":"90a65f27c02bb791b0a518323b0ff1605db993f0969034403ed419d2d6f81086","contentType":"text/markdown; charset=utf-8"},{"id":"95d90402-ef1e-53eb-9a4c-6e5cd31ee1e2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/95d90402-ef1e-53eb-9a4c-6e5cd31ee1e2/attachment.md","path":"references/image-prompts.md","size":5929,"sha256":"86a5005f9c53815c958fa518384aeea6b6e4d9c79def782b45cd071f7c790f0b","contentType":"text/markdown; charset=utf-8"},{"id":"856490a2-d264-5bc9-bc58-a758a0d00088","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/856490a2-d264-5bc9-bc58-a758a0d00088/attachment.md","path":"references/layout-recipes.md","size":7040,"sha256":"19255cdab4cb6edb7029c817c8cba9d869dd6ed89829bf152f94f327907341e5","contentType":"text/markdown; charset=utf-8"},{"id":"c6c5f34d-4d2b-58fc-81c3-9a40fba9b3da","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c6c5f34d-4d2b-58fc-81c3-9a40fba9b3da/attachment.md","path":"references/skeletons.md","size":9327,"sha256":"2b11e17e1995788817fe80512515fb3269aaa5a8c6b56237dc46231ec1dd6bdb","contentType":"text/markdown; charset=utf-8"},{"id":"5b17da26-bfef-5826-b43e-3d7b818cae09","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5b17da26-bfef-5826-b43e-3d7b818cae09/attachment.md","path":"references/theme-presets.md","size":5831,"sha256":"e9274bbf0961d43da395e82a5eaf38ee5e4615668350288b78c6a07bc19dde33","contentType":"text/markdown; charset=utf-8"},{"id":"6aec5c02-6872-531f-8af7-0996fd74c130","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6aec5c02-6872-531f-8af7-0996fd74c130/attachment.md","path":"references/visual-floor.md","size":11046,"sha256":"4ed005a5e969b4ec89681b6c905c1be6622703024c49f95ca336ff901737464a","contentType":"text/markdown; charset=utf-8"},{"id":"64f4919e-2653-5099-b193-b5ca8e80c6ec","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/64f4919e-2653-5099-b193-b5ca8e80c6ec/attachment.md","path":"scripts/CLAUDE.md","size":872,"sha256":"4c338628e897c0fa10983275de54dd0c211cd1ec9f7d858daff8cfeb8f2a37e4","contentType":"text/markdown; charset=utf-8"},{"id":"a9722dc5-4457-56b4-9c8b-7effafd9f267","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a9722dc5-4457-56b4-9c8b-7effafd9f267/attachment.sh","path":"scripts/assemble.sh","size":2517,"sha256":"c1d5c5b665be158f376b5cafe1f96aeb48f8b3b9d8d6d27953b6ce890ce44443","contentType":"application/x-sh; charset=utf-8"},{"id":"f7bfa4d9-b630-5a15-8a25-b530a07d31f6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f7bfa4d9-b630-5a15-8a25-b530a07d31f6/attachment.sh","path":"scripts/build-html.sh","size":2675,"sha256":"5424ec0f98694920ebba0a2da08d283b1404d75aa1bf9f01d77c08cc4c88825c","contentType":"application/x-sh; charset=utf-8"},{"id":"16d4605a-572d-5c56-b16d-d6863681b41e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/16d4605a-572d-5c56-b16d-d6863681b41e/attachment.css","path":"scripts/engine.css","size":17289,"sha256":"a449dfbf61688ef55b0927890b8c11820320516c9c141c2e1daf04fd449bb322","contentType":"text/css; charset=utf-8"},{"id":"591ebe44-1c31-5436-aa9b-48e183d7f4bd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/591ebe44-1c31-5436-aa9b-48e183d7f4bd/attachment.js","path":"scripts/engine.js","size":22189,"sha256":"b23e6528ada25dbf8ed33a878a3e911e1e69c47cc4e445ba72e4ecdc85cbcb4f","contentType":"application/javascript; charset=utf-8"},{"id":"bf312507-5f2a-5a7c-9bf4-c1bd82067659","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bf312507-5f2a-5a7c-9bf4-c1bd82067659/attachment.sh","path":"scripts/validate-design.sh","size":3286,"sha256":"d1e7f66478457183ba5196ae53902c0c181511a29712ae3361b1bdc96c5bc163","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"b74c51b5ddab051d83143c18bd425db1b5073071e1fb3d2a043faa704ce0fa7d","attachment_count":17,"text_attachments":17,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/codeck-design/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"browser-automation-scraping","category_label":"Browser"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"browser-automation-scraping","import_tag":"clean-skills-v1","description":"Designer role. Reads deck.md, generates a single HTML presentation file\nwith CSS design system + JS slide engine + per-slide content.\nAccepts visual references (URLs, screenshots, design specs) and\nextracts design signals to inform the isomorphic mapping.\nUse whenever the user says \"design slides\", \"generate deck\",\n\"generate the deck\", \"build slides\", \"visual style\",\n\"reference this style\", \"like this design\",\n\"design\", \"generate slides\", \"visual style\", \"reference this style\",\nor wants to turn an outline into actual slides.\n"}},"renderedAt":1782979336510}

<!-- [INPUT]: Depends on deck.md, diagnosis.md, DESIGN references, and room decision state. [OUTPUT]: Provides validated DESIGN.md, custom.css, slides.html, assembled HTML, and design lane memory. [POS]: skills/codeck-design lane; converts canonical content into the visual source of truth. [PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md -- codeck design — @design lane owns visual direction, validated design archive, design skeleton, HTML source, and assembled HTML. Write boundaries: - May write , , - May write generated or processed visual assets to - May assemble the final in the user's project director…