<p>The mechanism is an old, well-mannered convention. Terminals have always had "OSC" escape sequences — Operating System Commands — little out-of-band messages a shell can emit that the terminal interprets instead of displaying. Setting the window title is one you've seen.</p><p>A few years ago, terminal authors agreed on a set of semantic OSC codes (133), later extended by VS Code (633), that let a shell narrate its own lifecycle:</p><ul><li><p><code>OSC 633 ; E ; &lt;command line&gt;</code> — "the command about to run is this"</p></li><li><p><code>OSC 133 ; C</code> — "output starts now"</p></li><li><p><code>OSC 133 ; D ; &lt;exit code&gt;</code> — "the previous command finished with this code"</p></li></ul><p>A shell emits these from its prompt hooks. The terminal parses them and stays silent (they never show up as garbage on screen). Conductor now registers handlers for 133 and 633 on each terminal and assembles them into a tidy record: command, start time, duration, exit code.</p><p>That's the whole idea. The hard part isn't parsing — it's getting your shell to emit them without wrecking your setup.</p><h2>The tightrope: don't break the prompt</h2><p>Here's the part I was genuinely nervous about. To make zsh emit those sequences, you have to inject <code>precmd</code>/<code>preexec</code> hooks into the user's interactive shell. Do that clumsily and you break the most personal, fiddly thing a developer owns: their prompt. Powerlevel10k with instant prompt. Carefully tuned aliases. Environment variables sourced from <code>.zshenv</code>. One wrong move and someone's terminal opens broken — the worst kind of bug, because it greets them every single time.</p><p>So Conductor uses the same careful dance VS Code does — a <code>ZDOTDIR</code> shim:</p><ol><li><p>When you open a terminal with integration on, Conductor points <code>ZDOTDIR</code> (the directory zsh reads its startup files from) at a tiny generated shim, and remembers your real one in <code>USER_ZDOTDIR</code>.</p></li><li><p>The shim's <code>.zshenv</code>, <code>.zprofile</code>, and <code>.zshrc</code> each do one thing first: source your real file, with <code>ZDOTDIR</code> temporarily restored so your config sees exactly what it expects.</p></li><li><p>Then the shim's <code>.zshrc</code> adds the three-line hook that emits the OSC sequences.</p></li><li><p>Finally it hands <code>ZDOTDIR</code> back, so your interactive session looks completely normal.</p></li></ol><pre><code class="language-zsh"># the entire injection, conceptually
__elyra_preexec() { print -rn -- $'\e]633;E;'"$1"$'\a\e]133;C\a'; }  # command + output-start
__elyra_precmd()  { print -rn -- $'\e]133;D;'"$?"$'\a'; }            # exit code
add-zsh-hook preexec __elyra_preexec
add-zsh-hook precmd  __elyra_precmd
</code></pre><p>Your prompt, your aliases, your env — untouched. They load from your real files exactly as before; Conductor just appends a quiet narrator at the end. (The first thing I asked after building it: "does your powerlevel10k prompt still look normal?" The answer — "det ser veldig bra ut" — was the whole ballgame.)</p><p>And it's opt-in. Off by default. You turn it on from the command palette, and only new terminals pick it up. Nothing changes under anyone's feet.</p><h2>What you get: a timeline that means something</h2><p>Turn it on (⌘K → Enable shell integration), open a fresh terminal, and run a few things. The 🕘 Timeline transforms.</p><p>Before (process names only):</p><pre><code class="language-text">14:31   vite    2m 14s   feed3
14:28   npm     18s      feed3
</code></pre><p>After (real commands + exit codes):</p><pre><code class="language-text">14:31  ✓   pnpm run build              2m 14s   feed3
14:28  ✓   git push origin main        3s       feed3
14:19  ✗ 1 pest --filter=Checkout      41s      inside-helpdesk
14:02  ✓   php artisan migrate         2s       feed3
</code></pre><p>Now it's a real record: the exact command, how long it took, and a green ✓ or red ✗ with the exit code. Click any row to jump back to the pane it ran in. Terminals without integration (other shells, or before you enabled it) keep the older process-name view — they coexist peacefully, deduped per terminal.</p><h2>The green check that watches your tests</h2><p>Exit codes unlock something I'd wanted for a while but couldn't do honestly until now: a per-project test badge in the sidebar.</p><p>When a command that looks like a test runner finishes — pest, phpunit, vitest, jest, pytest, cargo test, go test, and friends — Conductor remembers whether it passed, and shows it next to the project:</p><pre><code class="language-text">PINNED
  feed3            🟢  🐳2/2  ✓ test   ⎇ master
  inside-helpdesk      ✗ test          ⎇ main
</code></pre><p>Green means your last test run passed; red means it failed. No CI round-trip, no extra window — just a quiet glance at the bench telling you where things stand. (Earlier versions deliberately left this out, because faking a result without a real exit code would have been a lie. Now it's true, so it's here.)</p><h2>Why this one mattered</h2><p>Most features add a surface. This one added honesty. The terminal stopped being a black box that prints characters and became something that tells the cockpit what's actually happening — what you ran, and whether it worked. Everything downstream (the timeline, the test badge) flows from that one new fact.</p><p>And it kept the promise that's run through every release: it does the careful, invisible work so you don't have to. Your prompt is exactly as you left it. The integration is off until you want it. And when you do turn it on, the terminal quietly starts narrating — three little escape sequences at a time.</p><p>Flip it on, run your suite, and watch the green check appear. The cockpit is listening now — politely, and only when you ask. 🪵🔥</p><p><em>Elyra Conductor 0.7.0 — opt-in zsh shell integration (OSC 133/633) bringing real command lines and exit codes to the timeline, plus a per-project last-test badge. Your prompt and environment are sourced untouched. Signed and Apple-notarized. Conductor records and shows; it never reasons.</em></p>