<p>Most releases add a feature. This one added a sense. Three of them, actually. v0.9.15 is about closing feedback loops that used to be blind spots: the agent can now check whether its own defaults are still valid, survive a broken extension gracefully, and <em>look at</em> the UI it builds. Here's the why and how, with examples.</p><h2>1. <code>elyra doctor preflight</code>: catch stale defaults before they bite</h2><p><strong>Why.</strong> Model IDs churn constantly. Providers ship <code>gpt-5.6</code>, retire a dated snapshot, rename something — and suddenly a default your config points at doesn't exist anymore. The failure mode is nasty: everything looks fine until a build or a session tries to resolve the model and dies with a cryptic error. We hit exactly this ourselves: a default pointing at a removed <code>claude-sonnet-4-20250514</code> sailed past our normal checks and only blew up at publish time.</p><p><strong>How.</strong> A new offline command validates every configured default against the registry — no API calls, instant:</p><pre><code class="language-text">$ elyra doctor preflight
✓ All default models resolve against the registry.

Newer models available for configured defaults:
  - openai: gpt-5.4 → gpt-5.6, gpt-5.5
</code></pre><p>Two jobs in one:</p><ul><li><p><strong>Correctness:</strong> if a default points at a model that's no longer in the registry, you get a red line and a non-zero exit (CI-friendly) instead of a runtime surprise.</p></li><li><p><strong>Freshness:</strong> it nudges you when a newer model exists in the same family. The version comparison is deliberately conservative — it only suggests clean aliases in the same family with the same flavor, so it never pushes you from a stable <code>gpt-5.6</code> onto a dated snapshot or a different <code>-mini</code> variant.</p></li></ul><p>This is the un-glamorous kind of feature that quietly prevents the exact class of bug we spent real time cleaning up.</p><h2>2. A broken extension no longer takes down your whole session</h2><p><strong>Why.</strong> Extensions are optional add-ons — a PHP language server, database tools, design tools. But a single broken one used to be fatal. We lived this: after an upgrade, <code>npm</code> left a half-extracted <code>mysql2</code> inside the <code>db-tools</code> extension, and Elyra refused to start at all with a raw <code>Cannot find module 'mysql2/promise'</code> and a Node require stack. One optional database driver, and the whole agent was down.</p><p><strong>How.</strong> A failed optional extension is now skipped, not fatal — and the message tells you how to fix it instead of dumping a stack trace:</p><pre><code class="language-text">⚠ Skipped extension "…/db-tools/extensions/index.ts": Cannot find module
  'mysql2/promise'. This usually means a missing dependency; try reinstalling
  it. Elyra continues without it.
</code></pre><p>Elyra starts, you keep working, and you fix the driver when it's convenient. A broken add-on should degrade to "that one tool is unavailable," never "the app won't launch."</p><h2>3. Visual QA: the agent can see the UI it builds</h2><p><strong>Why.</strong> This is the timely one. Every model Elyra now defaults to — Claude Sonnet 5, GPT-5.6, Grok 4.5 — is multimodal. That means the agent can genuinely <em>look</em> at a rendered screen, not just reason about the code that produces it. A coding agent that writes a component but can never see it is working blindfolded.</p><p><strong>How.</strong> The <code>design-tools</code> extension (<code>/design</code>) grew real eyes:</p><ul><li><p><strong>Element screenshots.</strong> Focus on exactly the component you changed, not the whole page: </p><pre><code class="language-text">screenshot_url  url=http://localhost:5173  selector="#pricing-card"
</code></pre></li><li><p><strong>Console capture.</strong> The image comes back <em>with</em> the browser's errors and failed requests — because a visual bug is very often a JavaScript error in disguise. The agent sees both at once.</p></li><li><p><code>design_diff</code><strong>: before/after.</strong> The headline. Capture the UI, make a change, capture again, and diff: </p><pre><code class="language-text">screenshot_url url=http://localhost:5173      # before…agent edits the component…screenshot_url url=http://localhost:5173      # afterdesign_diff                                   # compares the last two
</code></pre><p>Both images go to the model with one instruction: <em>describe what changed, and flag anything that looks like an unintended regression versus an intended change.</em> That turns "I changed some CSS, hope nothing else moved" into an actual visual review.</p></li></ul><p>The loop this closes — build UI → look at UI → notice the delta → iterate — is something surprisingly few coding agents do well.</p><h2>Also: Grok 4.5 is the new xAI default</h2><p>Small but worth noting: the default xAI model is now <code>grok-4.5</code> (reasoning, text + image), keeping the default current instead of lagging on an older build — exactly the kind of drift <code>doctor preflight</code> now helps you catch.</p><h2>The through-line</h2><p>Three features, one idea: <strong>give the agent feedback about things it couldn't previously observe.</strong> Its own configuration (are my defaults still real and current?), its own failure modes (an extension broke — keep going and say why), and the visual result of its work (here's the screen, here's what changed). Good agents aren't just good at generating; they're good at <em>checking</em>. This release is a step toward an agent that checks its own work at every layer.</p><pre><code class="language-bash">npm install -g @elyracode/coding-agent@0.9.15
elyra doctor preflight     # is my config current?
</code></pre>