feat: honest image backends, a visual QA loop, and Iris as persona #17 - #16
Merged
Merged
Conversation
Kai claims Hugging Face and Figma image tooling in profiles/kai.md, but install.sh never installs, checks, or mentions an MCP server. Combined with the fact that no Claude model generates raster images natively, the persona confidently promises a capability the install does not deliver. Adds docs/proposals/image-generation.md: separates the three asset classes (vector marks, illustrative raster, composed layouts), documents the July 2026 backend landscape including the Canva Enterprise gate on brand kit autofill, and lays out six proposals from a zero-dependency visual QA loop through a possible Illustrator persona. No code or persona changes; review artifact only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTC8r2xtQrke5zzXYLmhfM
Kai claimed image tooling the product never installs. profiles/kai.md named Hugging Face MCP dynamic_space with FLUX.1-Krea-dev, Qwen-Image, and FLUX.1-Kontext-Dev, plus four Figma MCP tools. install.sh copies profiles, agents, and commands and never installs or checks an MCP server, so the persona described tools that were not there and then improvised. No Claude model generates raster images either, which makes the ceiling markup Kai writes itself. Proposal 1, honest capability boundary. The Personality paragraph now states the boundary directly, the Domain Expertise bullets are backend agnostic, and a new "Declare the Backend" behavior requires Kai to name the backend before promising an image, or say none is connected and offer the SVG path instead. Proposal 2, visual QA loop. New behavior requiring Kai to open and inspect any asset or mockup before showing it, score it against named criteria, name the single worst failure, revise one thing, and repeat up to three passes. Claude is multimodal on input, so this needs no vendor. README Kai section updated to match. The v0.5 roadmap entry keeps its original wording as a historical record. commands/kai.md carries the prose edits only; it excises Required Interactive Behaviors by convention, 16 of 16. Tests 123/123. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTC8r2xtQrke5zzXYLmhfM
Proposal 5 from docs/proposals/image-generation.md. Kai was carrying two jobs that share a vocabulary but not a skill set: designing screens, and producing the brand assets those screens display. Splitting them gives each a real lane. Iris — Brand & Illustration owns logo systems, wordmarks, icon sets, illustration, marketing graphics, and the licensing and provenance that come with generated assets. Four behaviors: Declare the Backend, Brand Brief, Visual QA Loop, Asset Provenance Record. Tier claude-opus-4-8, matching Kai. Kai keeps screens, flows, wireframes, device-frame mockups, and design systems, and drops to four behaviors. The Mood Board Prompt and Declare the Backend move to Iris; the QA loop splits along its seam, with Kai keeping the render-and-screenshot half for mockups and Iris taking the generated-asset half. Kai now specifies the assets a screen needs and hands off to Iris rather than generating them. Roster plumbing: tiers.conf, both coordinator profiles (four enumeration blocks each), README roster table and persona section and project structure, plugin.json, install.sh, and the CLI listings. Two new guards in the suite. CI never runs generate-agents.sh and never compared agents/ to profiles/, so a profile edited without regenerating passed green while the subagent served stale text; the same hole existed for hand-maintained commands/. Both are now checked per persona. Verified they fail on a deliberately unregenerated profile and pass once restored. Also adds the roster assertion for Sage, which was missing. Tests 123 to 128, all passing. Shellcheck clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTC8r2xtQrke5zzXYLmhfM
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTC8r2xtQrke5zzXYLmhfM
Auditing proposal 3 (a checked-in BRAND.md plus assets/MANIFEST.md and a claude-team brand init command) found two justifications that do not survive checking. It claims brand init would mirror branch start and session start; those write only to ~/.claude/, and the CLI has never written a committable file into a user's working tree. It claims to unblock the repo's missing publish/style-guide.md; that file was deliberately deleted in 04ace9e and consolidated to an org-level location. Half of it had also already shipped inside Iris's Brand Brief and Asset Provenance Record, and "persona names an artifact the repo does not define" is the established convention (Kai and Sasha have pointed at DesignSystem.swift with no schema since they were written). Proposal 4 is folded into proposal 6 rather than shipped here. A vendor MCP matrix in this repo would be documentation the project does not control, and it breaks the convention that every companion capability lives in its own repo while Works Well With stays one line and a link. Backend mechanics also serve Reiner, Ernie, Toni, and Kai, not just Iris. Prior-art research recorded for that skill. The load-bearing finding: neonwatty/logo-designer-skill generates SVG concepts with no image backend at all, which means the vector-mark problem needs no vendor. Iris now routes by asset class accordingly, treating hand-authored SVG as the primary path for logos and icons rather than a consolation prize, with a connected backend needed only for raster illustration. No vendor names remain anywhere in persona content. Also fixes two stale spots found in the audit: README credited Kai with image generation across five named vendors, contradicting his own profile, and his security bullet still referenced sanitizing generation prompts. The v0.5 roadmap entry keeps its wording as history. Tests 128/128, shellcheck clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTC8r2xtQrke5zzXYLmhfM
…onas Resolves the DEVLOG conflict by keeping both 2026-07-28 entries, and updates this branch's entry, which had gone stale: it still said proposals 3, 4, and 6 were open after the later commit dropped 3 and folded 4 into 6. The merge also surfaced a real bug, caught by the drift guard this branch adds. The upstream first-principle commit updated profiles/ and agents/ for Akira, Alex, Jordan, Morgan, Robin, and Sasha, but not commands/. "## First Principle" sits above "## Personality", outside the Required Interactive Behaviors block that commands/ legitimately excises, so all six slash commands were missing it. Anyone running /akira would have got a persona without the principle while the subagent had it. Now synced, matching each profile's placement. That is the guard's first real catch, on a bug it was not written for. Tests 128/128, shellcheck clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTC8r2xtQrke5zzXYLmhfM
d6veteran
marked this pull request as ready for review
July 28, 2026 18:39
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements proposals 1, 2, and 5 from
docs/proposals/image-generation.md, then formally closes out 3 and 4 based on what the implementation revealed. The proposal doc is included as the first commit and its status header records every decision.Why
profiles/kai.mdclaimed image tooling the product never installs: Hugging Face MCPdynamic_spacewith FLUX.1-Krea-dev, Qwen-Image, and FLUX.1-Kontext-Dev, plus four Figma MCP tools.install.shcopies profiles, agents, and commands and never installs or checks an MCP server. No Claude model generates raster images either, so Kai's real ceiling was markup it writes itself. The persona described tools that were not there and then improvised.What shipped
Proposal 1, honest capability boundary (persona behavior only; the
claude-team doctorcommand was declined). Domain Expertise is backend agnostic, and a new "Declare the Backend" behavior requires naming the backend before promising an image, or saying none is connected and offering what is actually deliverable.Proposal 2, visual QA loop. Open the artifact and inspect it before showing it: score against named criteria, name the single worst failure, revise one thing, up to three passes. Claude is multimodal on input, so this needs no vendor.
Proposal 5, split the lane. Iris — Brand & Illustration (#17,
claude-opus-4-8) owns logos, wordmarks, icon sets, illustration, marketing graphics, and asset licensing. Kai keeps screens, layout, and design systems, and specifies the assets a screen needs rather than generating them. The QA loop split along its seam rather than being deleted: Kai kept the render-and-screenshot half, Iris took the generated-asset half. Both personas ended at four behaviors.What was dropped, and why
Proposal 3 (a checked-in
BRAND.md+assets/MANIFEST.md+claude-team brand init) is dropped. Two of its justifications did not survive checking:brand initwould mirrorbranch startandsession start. Those write exclusively to~/.claude/. This CLI has never written a committable file into a user's working tree; its only project writes are.git/hooks/pre-commitand.git/info/exclude, both untracked by design.publish/style-guide.md. That file was deliberately deleted in04ace9e("consolidated to code-katz/style-guide.md"), so re-adding a per-repo brand file re-introduces what was removed on purpose.Half of it had also already shipped inside Iris's Brand Brief and Asset Provenance Record, and "persona names an artifact the repo does not define" is the established convention here (Kai and Sasha have pointed at
DesignSystem.swiftwith no schema since they were written). Accepted tradeoff, stated in the doc: Iris keeps improvising a manifest shape per project.Proposal 4 (wire a backend) is folded into Proposal 6 (companion skill) rather than shipped here. They were decomposed as two items and should not have been. A vendor MCP matrix in this repo would be documentation the project does not control, drifting on someone else's release schedule, and it breaks the convention that every companion capability (devlog, roadmap, plans, todo, publish, conductor) lives in its own repo while "Works Well With" stays one line and a link. Backend mechanics also serve Reiner, Ernie, Toni, and Kai, not only Iris.
Prior art for that skill is recorded in the doc. The load-bearing finding:
neonwatty/logo-designer-skillgenerates SVG concepts with no image backend at all, which means the vector-mark problem needs no vendor. Iris now routes by asset class accordingly, treating hand-authored SVG as the primary path for logos and icons rather than a consolation prize, with a connected backend needed only for raster illustration.Test hardening
CI ran shellcheck and the suite on two platforms, but never ran
generate-agents.shand never comparedagents/toprofiles/— the count check only counted files. A profile edited without regenerating passed green while the subagent served stale text. The same hole existed for hand-maintainedcommands/.Both are now checked per persona. Verified they fail on a deliberately unregenerated profile (
stale: robin(1),drift: robin(1)) and pass once restored. Also adds the missingclaude-team listassertion for Sage.Verification
bash tests/run.sh— 128/128, up from 123shellcheckon all five CI-linted files — cleangrep -rn "Recraft\|Gemini\|Hugging Face\|Canva\|FLUX" profiles/ commands/ agents/— no vendor names in persona contentprofiles/,commands/, andagents/Notes for review
README.md:853(v0.5 release notes) and the DEVLOG.gtm.md:416,commands/silicon-valley.md.