Teaching robots my taste
Not long ago my coding agents were smart and completely generic. Ask for a settings page and you got a settings page: the average of every settings page on the internet, indigo button included. Ask for a pull request and you got code with a comment narrating every line, like a nature documentary about a for loop.
Then I found skills, and they changed how I work with agents.
A skill is a folder with a SKILL.md file in it: plain written instructions that an agent loads when the task in front of it matches the skill's description. There's no fine-tuning and no plugin API. Someone who is good at a thing writes down how they do it, and your agent does it their way from then on. Claude Code and Codex both read them. Suddenly my question changed from "how do I prompt this better" to "who has already written down how to do this well". The answer turned out to be a lot of talented people.
The rabbit hole
The first one that rewired my brain was poteto-mode, from pstack by poteto (Lauren Tan). It sets how the agent works: concise answers, subagents used on purpose, and, in its own words, "unslopped prose, simple code, and verified work". Every task I give an agent now runs in it. pstack also comes with a drawer of smaller tools I lean on all the time: teach and bro to explain things to me in plain words, correct for mistakes agents keep repeating, blast-radius before a risky change, interrogate when a design decision is contested, and no-comments and unslop to clean up a diff before anyone has to read it.
Then design, which I care about more than is strictly healthy. Emil Kowalski's paid course, aiforui.dev, comes with 28 emil-* skills: typography, color, surfaces, animation, forms, polish, performance, and a few that strip out the tells of AI-generated code, design and writing. They became the base of how my agents do design. His free repo, emilkowalski/skills, gave me pick-ui-library, break-ui (feed a component the worst data imaginable and report everything that breaks) and write-swift.
Jakub Krehel's skills became my second opinion: the better-* family for layout, typography, colors, accessibility, UI details, interface copy and a whole-interface review, plus interface-review for diffs, build-design for building from a Figma file or a screenshot, and state-machine, which renders every state of a component on a throwaway page so you can work on each one.
elayadesign/ai-design-skills has landing-page-design, a complete system for landing pages that covers intake questions, page structure, copywriting and strict visual rules.
And Matt Pocock's skills gave me two I use constantly: grilling, which grills me relentlessly about a plan, and writing-for-agents, for writing documents an agent will actually follow.
I didn't write any of these. I want to be loud about that, because the rest of this post is about the one part that is mine, and it's mostly glue.
The itch
The trouble with finding a lot of great skills is that now you have a lot of great skills.
Each one has to be installed, on every machine, for every agent. Each one has to be remembered, because an agent won't always reach for the right one on its own. Some overlap, and a few disagree. Run five design skills at once and they pull a screen five ways. And they all keep improving upstream, so whatever I copied last week is already out of date.
What I wanted was easy to say and annoying to do: every codebase I touch, on every machine, follows the skills I like, every time, without me pasting a list into the chat.
My first attempt was a skill called mauricio-taste, and it told the agent to read two files. catalog.md was a list of 30 links to other people's skills, with one firm instruction: "Follow the source. Do not copy skill text into this repo." preferences.md, the part that was supposed to hold my actual taste, said, in full:
TODO: Maurício, fill this in with your working preferences.
Nothing is recorded here yet.
A taste skill with no taste in it. Agents read it very carefully and learned nothing about me, which, to be fair, was accurate.
One skill to route them all
So I rebuilt it as one routing skill, borrowing the layout of Emil's skills repo. There's a single way in. Every task starts with:
/mauricio-taste <task>
That starts poteto-mode, and then a routing table looks at what kind of work this is and points the agent at the right upstream skill. A few real rows:
| Work | Use |
|---|---|
| Any UI work | my design notes, which run the emil-* and better-* skills in order |
| Swift | write-swift |
| Writing or fixing a skill | emil-writing-skills, then writing-for-agents to prune |
| Explaining something to me | teach, then bro if it reads as jargon |
| Mistakes agents keep repeating | correct |
| A risky change, before it ships | blast-radius |
| "Grill me" | grilling |
The UI row hides most of the work. Design gets its own short notes: which skill to run at each step (decide, foundations, build, finish, review, ship), one or two at a time, looking at the screen between runs. The emil-* skills are the base, the better-* skills are a second opinion, and the notes settle arguments in one line: "Where they disagree, the emil-* skill wins." The ordering is mine. Every skill it orders is someone else's.
Rerun to update
The other half is an install script that lives next to the skill. On a new machine I clone my repo, run install.sh, and it:
- installs pstack as a Claude Code plugin, or updates it, and links it so Codex reads the same files
- clones each GitHub source, or pulls it if it's already there, and links only the skills I picked
- installs the 28 course skills with my aiforui.dev token, which never goes in the repo
- links my own skills
- removes links to anything I dropped, and prints "missing" when a skill disappears from its source
Rerun it on any machine and every source is up to date.
That mattered, because the list did not sit still. The first version of the installer pulled 8 skills from t3dotgg/tstack for pull request work. Five minutes later I took them out again, because they overlapped with poteto-mode. The next day design-to-motion left elayadesign's repo, so it left mine too. Then the course skills arrived, and the free Emil skills I linked went from nine to four.
- Oct 2631first installer, tstack included
- 5 min later22tstack out
- Oct 2721design-to-motion left its repo
- Oct 3044the course skills arrive
- Nov 244writing-for-agents in
Skills named in install.sh at each change, plus the 28 course skills from October 30 on. pstack installs whole as a plugin and isn't counted here.
What's actually mine
Very little, by count.
- pstack58poteto, the whole plugin
- aiforui.dev28Emil Kowalski, paid course
- Jakub Krehel10jakubkrehel/skills
- Emil Kowalski3emilkowalski/skills
- Matt Pocock2mattpocock/skills
- elayadesign1ai-design-skills
- me2the glue and a hill climb
Counted from install.sh at the latest commit, the installed pstack plugin and the 28 course skills. 102 of the 104 are someone else's.
The two that are mine:
- mauricio-taste itself: the routing table, a review step where a fresh agent checks every change and its findings only count if it ran something to prove them, and a short list of my rules.
- design-hill-climb, which improves an existing screen round by round, scoring screenshots against my design checklist, and only when I ask for it.
Plus the design notes that put the upstream design skills in order.
The rules are where my taste lives, and they're mostly small and petty, in the best way. "No em dashes anywhere." "Pick one default instead of adding an option." Things I said to agents so many times that writing them down once was cheaper than typing them again.
How a task finds its skill
If you want your own
- Steal before you write. Someone has probably already written a better skill than you would. Find them, and credit them.
- Link, don't copy. Pulling from the source keeps the credit attached and the updates coming.
- Have one way in. A routing table beats remembering a hundred skill names.
- Pick a winner in writing. When two skills disagree, say which one wins, or the agent will split the difference.
- Make updating one command. If it's annoying, you won't do it, and your copies will rot.
My taste, it turns out, is mostly other people's taste, picked carefully and wired together. I'm fine with that. The robots can't tell the difference, and at least now they know who to ask.