Agent Release started out borrowing the share icon. I wanted to give the app its own — but it still had to belong to the family alongside coach and share. So I asked Claude to have gpt-image-2 make ten candidates and show me a sheet I could point at.

From round 1 I liked »terminal-up« best. But as a set they didn't follow our brand. I asked to focus on release rather than merge, and to match the style of the other product icons. Claude wrote the prompts and ran them through gpt-image-2 — a round two and a round three. Each round got closer — right tile, right orange, right glyph.
They still didn't belong as a set. I put them next to the real share and coach icons, and I could see it straight away:

The two on the left are the real ones. The three on the right are round 3. Same color, same tile — but the real ones have a glow and some speed streaks the candidates don't.
For three rounds Claude had been describing our brand to gpt-image-2 in words: hex codes, dark tile, glow, flat vector. Carefully. And it kept missing, because the exact glow and speed streaks that tie the icons together as one set are a texture you can't write your way to.
So I stopped asking for another description and asked this instead:
The lesson
That was the shift — no more words about the style, but the two real icons as input. Instead of describing the family, Claude gave gpt-image-2 the family itself: Claude ran the same edit instruction from both real icons — share and coach — asking only for the glyph to be swapped. This is the command that made the winner:
pks image --model gpt-image-2 --resolution 1024 \
--input _ref-share.png "$(cat edit-instruction.txt)" \
--output from-share-2.png
--input puts gpt-image-2 in edit mode: the prompt becomes a change to the image you give it — not a description it has to guess from. So the new icon inherits the glow, speed streaks and neon, because they were already in the reference.

The share-based ones won (share had the richest glow). One more edit removed the ring around the glyph, and the shipped icon was ready:

What I took away
I don't write the prompts to gpt-image-2 — Claude does. What I add is taste: noticing when something doesn't belong. And the thing I learned here was the move: instead of asking for one more description, I chose to give the model the reference. When an AI-generated thing won't fit into a family that already exists, stop describing the family and give the model the family instead.
A reference image beats a description. I'll reach for the reference first next time.
Show Claude's prompts to gpt-image-2
Claude's prompts
I didn't write the prompts below — Claude did, along the way. I'm keeping them because the shift from describing to showing is clearest in them. All verbatim from design/icon-candidates/ in the Agent Release repo.
Round 1 — describe the glyph. Minimal prompt, no tile or background pinned down. The result was a black rocket on a white background.
(The prompt ends there — that stray »A« is verbatim; it's all that got typed.)
Round 3 — describe the whole style. The careful version: hex codes, tile, glow, flat vector. Closer — but the texture (glow rings, speed streaks) is still missing, because it isn't in the words.
Round 4 — show the style. This is where it turned. Claude ran the same edit instruction from both existing icons — share (--input _ref-share.png) and coach (--input _ref-coach.png) — telling gpt-image-2 to change only the glyph. The share-based one won (share had the richest glow). This is the exact text that sat in edit-instruction.txt in the command above:
Round 5 — one more thing. Same technique, one change: remove the ring around the glyph. That became the shipped icon.
The pattern in the last two is the same: keep everything, change only the one thing.
