Every kind of knowledge has one home. Find the owner before editing, so a fix lands once and every asset after it follows:
| The change | Its home |
|---|---|
| Brand facts: colours, fonts, logos, voice, graphic language | workspace/brand/ (brand-onboarding) |
| A deliverable or workflow the team asks for often | a runtime skill, skills/<name>/SKILL.md |
| Doctrine for every visual: hierarchy, type, colour, charts | skills/design-wiki/references/ |
| Identity, delivery and approval rules, how it talks | instructions.md (a budget test fails past about 8k tokens) |
| A rule a machine can count | a check in workspace/tools/ |
| A tool or data source | an MCP server in config/mcp.toml |
| Which model plays which role, effort, budgets | .env settings; Models |
Add a runtime skill
Start with the graphic the team asks for every week.
- Read two skills close to it (
skills/stills/,skills/thumbnails/) andskills/design-wiki/SKILL.md. - Create
skills/<name>/SKILL.mdas a real folder one level deep (MDA does not follow symlinks there). Frontmatter:nameis the folder;descriptionsays when to use it, in the words people use when they ask. Body: what good looks like, sizes, steps, the checks to run. Put depth inreferences/and keep the body small. Text only: binary files (fonts, images) go inskill-binaries/<name>/, because Context Hub takes only UTF-8 text; the stager puts them back beside the skill in the sandbox. - No brand facts, colours or libraries from a CDN in the skill: the brand pack supplies them.
uv run pytest -q tests/unit/test_taste_skills.py tests/unit/test_media_skills.pychecks frontmatter, size, links, and that every tool, script and check it names exists.- Try it with the request people actually send:
uv run design-agent ask "…". Look at the files. - Add an eval task if it matters (design-agent-evals), then redeploy (design-agent-deploy).
Vendored skills (HyperFrames and LangSmith, listed in skills-lock.json) are never edited: override them in a
sibling skill of ours, or send the change upstream.
Instructions, doctrine and checks
- Phrase rules as defaults with a reason, or as checks with evidence. A rule about the model is temporary; retest it when the model changes and delete what the new model outgrows.
- A rule a machine can count belongs in code, as a check, not in prose.
- After editing, run
uv run pytest -q, then compare before and after with the evals.
Tools
- MCP servers: copy
config/mcp.example.tomltoconfig/mcp.tomland declare servers. Locally, header values come from the environment (headers_env); on MDA a server that needs credentials names a workspace connection (connection), owned by the deployment or each person (owner). The example file has presets for Notion, Linear, GitHub, Figma and others (integrations). MDA serves HTTP and SSE only. Paper is configured withPAPER_*, not here (Paper). - Media keys:
OPENAI_API_KEY(images),ELEVENLABS_API_KEY(voice, music, sound effects),GROQ_API_KEY(transcription). - A new host tool is code in
src/design_agent/tools/: keys stay on the host and results drop into the sandbox as files. Follow the change discipline inAGENTS.md.
Models and cost
uv run design-agent config set DESIGN_AGENT_MODEL=provider:model, then
uv run design-agent test model. DESIGN_AGENT_JOB_BUDGET_USD makes the agent ask before passing
a budget; DESIGN_AGENT_HELPER_EFFORT_CAP caps helpers' effort. More: Customization.