<p><strong>Elyra Conductor v0.8.8</strong></p><p>There's a particular kind of tired that comes from running four coding agents at once. Not physically tired — you're just sitting there — but attention-tired. Every few minutes you alt-tab through six terminal tabs going "is this one done? is this one stuck? did that one need something from me twenty minutes ago and I just... didn't notice?"</p><p>That's the tax nobody talks about when people say "just run more agents in parallel." Parallelism is free. Knowing what's happening is not.</p><p>So this release is about paying down that tax.</p><h2>Why</h2><p>A few days ago I was reading through <a target="_blank" rel="noopener noreferrer nofollow" href="https://github.com/ogulcancelik/herdr">herdr</a> — a terminal-based agent multiplexer with a genuinely great pitch:</p><blockquote><p>"every agent at a glance — blocked, working, done. real terminal views, not a wrapped interpretation."</p></blockquote><p>That line stuck with me. Not the tmux-in-your-terminal part — Conductor already has its own take on that (worktrees, split panes, the agent command center) — but the vocabulary. "Blocked, working, done." Three words, no ambiguity, no color-only signaling that fails you the moment you're colorblind or just not looking closely enough.</p><p>We had a decision to make: do we make Elyra a first-class citizen inside tools like herdr, or do we build that "herd view" natively into Conductor, since — as I put it at the time — "Conductor is already 80% there"? We'd already shipped an Agent Dashboard with presence tracking, worktree awareness, and an auto-merge queue. The missing piece wasn't a new subsystem. It was just... making the existing signal impossible to miss, without making it a whole extra window you have to remember to open.</p><p>We went with option (b).</p><h2>How</h2><h3>Step 1 — pick a vocabulary and stick to it everywhere</h3><p>Before touching any UI, we renamed the meaning of our existing states (not the wire format — that stays internal) into one consistent set used everywhere: on the tab dot, in the Agent Dashboard, and now in the new strip.</p><pre><code class="language-js">// Herdr-style semantic vocabulary — shared by every surface in the app.
const PRESENCE_LABEL = {
  working: "Working",
  waiting: "Blocked — needs your input",
  idle:    "Idle",
  exited:  "Done",
};
const HERD_GLYPH = { working: "▶", waiting: "⏸", idle: "○", exited: "✓" };
</code></pre><p>That's the whole trick, really. "Waiting" is blocked. "Exited" is done. Once you say it in those words, the UI almost designs itself — you want blocked agents to be the loudest thing on screen, because a blocked agent is wasted wall-clock time.</p><h3>Step 2 — sort by urgency, not by tab order</h3><pre><code class="language-js">const HERD_ORDER = { waiting: 0, working: 1, idle: 2, exited: 3 };

let herdChips = $derived.by(() =&gt; {
  const chips = tabs
    .filter((t) =&gt; t.kind === "agent")
    .map((t) =&gt; ({ tab: t, state: agentPresence[t.id] ?? "idle" }));
  chips.sort((a, b) =&gt; (HERD_ORDER[a.state] ?? 9) - (HERD_ORDER[b.state] ?? 9));
  return chips;
});
</code></pre><p>Nothing fancy — just: whichever agent is costing you time floats to the front of the strip. You don't scan for it. It's just... first.</p><h3>Step 3 — put it where your eyes already are</h3><p>This is the part I think actually matters. We didn't add a sidebar widget or a menu bar icon you have to remember exists. We put a chip directly next to the tab strip — the thing you're looking at anyway, every time you switch context:</p><pre><code class="language-svelte">&lt;div class="herd-strip"&gt;
  {#each herdChips.slice(0, HERD_MAX_CHIPS) as h (h.tab.id)}
    &lt;button
      class="herd-chip {h.state}"
      onclick={() =&gt; focusTab(h.tab)}
      title={`${h.tab.title || "elyra"} — ${PRESENCE_LABEL[h.state]}`}
    &gt;
      &lt;span class="herd-glyph"&gt;{HERD_GLYPH[h.state]}&lt;/span&gt;{h.tab.title || "elyra"}
    &lt;/button&gt;
  {/each}
  {#if herdChips.length &gt; HERD_MAX_CHIPS}
    &lt;button class="herd-chip more" onclick={() =&gt; (agentDashboardOpen = true)}&gt;
      +{herdChips.length - HERD_MAX_CHIPS}
    &lt;/button&gt;
  {/if}
&lt;/div&gt;
</code></pre><p>In practice it looks like this — a row of little pills, sitting quietly until something needs you:</p><pre><code class="language-text">⏸ elyra-web   ▶ feature/login   ✓ elyra   ○ elyra-conductor   +2
</code></pre><p>Click <code>⏸ elyra-web</code> and you're there. No dashboard, no modal, no "let me find which tab that was." If you're running more than six at once (respect, honestly), the overflow collapses into a <code>+N</code> that opens the full Agent Dashboard — the deeper view with status lines, last-activity timestamps, and the auto-merge queue for anything whose PR just went green.</p><h3>Step 4 — make the dashboard agree with the strip</h3><p>The last thing we wanted was two systems that almost say the same thing. So the Agent Dashboard rows got the same glyphs, the same labels, the same sort order:</p><pre><code class="language-js">const PRESENCE_GLYPH = { working: "▶", waiting: "⏸", idle: "○", exited: "✓" };
</code></pre><p>Consistency is a feature. If ⏸ means "blocked" on the strip, it better mean "blocked" everywhere else too.</p><h2>Try it</h2><p>Open a couple of worktrees, drop an Elyra agent into each one (🌳 Worktrees → 🤖 Agent), and go do something else in another tab for a minute. When one of them needs you, you don't have to go hunting — the strip tells you before you even switch tabs.</p><pre><code class="language-bash">git worktree add ../myapp.worktrees/feature-x -b feature-x
# open an agent there from the Worktrees panel
</code></pre><p>That's the whole feature, honestly. Small, quiet, and exactly the kind of thing that only proves its worth on the fifth agent you spin up, not the first.</p><h2>What's next</h2><p>The herd strip is the "at a glance" layer. The Agent Dashboard is the "tell me more" layer. Between the two, the loop we set out to build a few releases ago — spin up a worktree → drop in an agent → watch it work → merge when it's green — finally has a face you can glance at from across the room.</p><p>Full changelog for <a target="_blank" rel="noopener noreferrer nofollow" href="https://github.com/kwhorne/elyra-conductor/releases/tag/v0.8.8">v0.8.8 is here</a>. As always: Conductor conducts, it doesn't reason — every glyph in this post is just us rendering a state Elyra already told us about.</p>