From dc10e9bcc5d7fdb3c4097d2d333f3749071e8a20 Mon Sep 17 00:00:00 2001 From: Fini Date: Thu, 2 Jul 2026 21:21:48 +0800 Subject: [PATCH] feat(ai): require image fills on avatar/photo slots The design-loop prompt teaches the G(...) image-fill op but never required using it, so a model built avatar/photo frames and left them as empty colored squares. Add a hard rule: every avatar, photo, thumbnail, hero, or logo slot must get an image fill via G(id, "search", "") in the same batch that creates the frame. --- crates/op-ai-skills/skills/phases/agent/design-agent.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/op-ai-skills/skills/phases/agent/design-agent.md b/crates/op-ai-skills/skills/phases/agent/design-agent.md index 4ef2ffbcc..1c900a0d0 100644 --- a/crates/op-ai-skills/skills/phases/agent/design-agent.md +++ b/crates/op-ai-skills/skills/phases/agent/design-agent.md @@ -106,6 +106,10 @@ A new screen or page MUST open as a new top-level frame placed to the **right** Bottom navigation bars span the full screen width. Tabs are evenly spread across that width. Every navigation tab MUST have BOTH an icon and a text label beneath it — never icon-only or label-only tabs. +### Every image slot gets a real image fill + +Any avatar, profile photo, client/user thumbnail, product image, hero, or logo slot MUST receive an image fill via `G(id, "search", "")` — never leave it as an empty frame or a flat colored square. The subject is 2–3 English keywords UNIQUE per image, derived from the surrounding row/card (a client-row avatar is `G(avatarFrame, "search", "man portrait")`, a dish card is `G(imgFrame, "search", "pasta plate")`). Emit the `G(...)` op in the SAME batch that creates the frame so no placeholder is left unfilled. + ### Reuse design-system components Prefer components found in `get_editor_state` components / retrieved via `batch_get` over rebuilding primitives. Use `$variable` references over hardcoded color hex values or numeric sizes.