Agent switching should be icons first.
Every new harness is a clutter proposal
memi Studio speaks to eight harnesses: Memoire Native, Claude Code, Codex, OpenCode, Gemini, Ollama, Hermes, and a plain shell. Every one is useful to someone. Every one, granted default screen space, makes the composer worse for everyone else.
So the real design problem was never “support more agents.” Adding harness support is plumbing. The problem was building a switcher whose visual size does not scale with the integration list, and we did not solve it on the first try, or the second.
Three compaction passes in five days
The first dedicated de-cluttering pass came on 2026-05-22: simplify the agent switcher and its typography (commit 72e5fac). It helped, and it did not hold. Four days later, on the repo’s 48-commit hardening day, the composer agent controls were compacted again, twice in the same day (commits 2240b80 and 22519d5, 2026-05-26).
Two compaction commits before sundown is worth being honest about. It means the morning version still was not tight enough once we actually worked in it all day. Switcher clutter is not a state you fix, it is a pressure you keep relieving, because every feature that touches the composer wants to leave a control behind. The run mode rail went icon first in the same push (bd06f09), with hover labels following the next day so compact never meant cryptic.
Two commits pulling opposite directions
The same day produced a pair of commits that look contradictory on purpose: keep the composer agent switcher focused (540ffc2), and keep the local agent switcher visible (a836fa2). One removes things. One protects a thing from being removed.
That pair is the whole discipline. De-cluttering has its own failure mode: the purge that hides the control somebody relies on every day. A configured local agent is someone’s primary worker, and burying it under an advanced menu to win a cleanliness award would just trade one kind of friction for another.
The rule that resolved the tension: screen space is earned by readiness and use, not by existence. At the moment of switching, a designer needs exactly three facts. Which agent is selected. Whether it is ready. What happens when they press Run. Anything on the strip that does not serve one of those three is a candidate for the next compaction pass.
OpenCode graduates, with a test attached
OpenCode became the first test of the rule. It moved out of the advanced lane and into the composer switcher on the hardening day (commit a728b3a, 2026-05-26), and the commit did not just add a button. It came with a new 41-line workbench-context test guarding the exposure.
That detail is the lesson. Putting an agent on the default surface is a product claim: this is ready for daily work, with the same receipts and the same readiness states as Codex and Claude Code. Claims like that should land with a test asserting them, because the next refactor will not remember the argument that justified the button. When OpenCode graduated, the switcher gained one compact icon and zero explanatory text, which is what graduation is supposed to look like.
The clutter policy became data
The ending of this story is not a component, it is a JSON file. The harness manifest assigns every agent a visibility tier: Codex and Claude Code carry visibility “primary” and enabledByDefault true. OpenCode, Gemini, Ollama, Hermes, Memoire Native, and Shell carry visibility “advanced” and ship disabled by default.
This moved the clutter argument out of UI code entirely. The components render whatever the manifest says, so a well-meaning refactor cannot quietly flatten the two tiers back into one long equal-weight list. Promoting an agent later, the way OpenCode earned it, is a data change plus the test that guards it. Demoting one is the same. The debate about who deserves default prominence now happens in a manifest review, where it is explicit, instead of accreting silently in JSX.
Provider settings went through the same door: the long setup text was pushed one layer deeper (commit 3ca8b0f, 2026-05-26), so the switcher never explains anything. It only switches. Explanation lives in settings, where you go on purpose.
Choosing a worker, not an application
The reason any of this matters is that agent choice is a real decision designers make several times a day. Codex may be stronger in one repo. Claude Code may be the better reviewer for a flow critique. Ollama is the offline option. OpenCode may simply be what the team standardized on. The switch has to feel like changing tools mid-task, not like leaving one application for another.
The strip today: Codex, Claude Code, the local agent when configured, an advanced menu, mode, permission, Run. Eight harnesses behind it, seven controls in front of it, and the seven is enforced by data and tests rather than by anyone’s restraint. Restraint, we learned in five days of compaction commits, does not survive contact with a roadmap.