fix(pipelines): activity-axis label clarity + select failed node on cascade failure (#9931)

* fix(pipelines): clarify activity-window axis label + select failed node on cascade failure

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(pipelines): clear active draft so failed-node focus is not masked

PipelineGraphEditor gives an open draft (activeDraftPath) priority over
selection via openScriptPath, so the cascade-failure focus set only selection
and stayed masked while a draft pane was open.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Ruben Fiszel
2026-07-05 17:10:06 +02:00
committed by GitHub
co-authored by Claude Opus 4.8
parent 377c02ec47
commit 5769b6036c
2 changed files with 19 additions and 2 deletions
@@ -147,9 +147,10 @@
></div>
{/if}
</div>
<!-- Always-on window axis: the period the bars span. -->
<!-- Always-on window axis: the period the bars span. The `from` prefix keeps
the left edge from reading as a date header for the run list below it. -->
<div class="flex justify-between text-3xs text-tertiary tabular-nums mt-0.5">
<span>{fmtTime(from)}</span>
<span>from {fmtTime(from)}</span>
<span>now</span>
</div>
</div>
@@ -1480,6 +1480,14 @@
} else {
const failed = [...res.statuses.entries()].filter(([, s]) => s.status === 'failure')
const skipped = [...res.statuses.values()].filter((s) => s.status === 'skipped').length
// Surface the failed node's error in the details pane. Clear the
// active draft too — it has pane priority over `selection`
// (openScriptPath), so a bare selection would stay masked while a
// draft is open.
if (failed.length > 0) {
pe.activeDraftPath = undefined
pe.selection = { kind: 'runnable', runnable_kind: 'script', path: failed[0][0] }
}
sendUserToast(
`Chain run failed at ${failed.map(([p]) => p).join(', ')}` +
(skipped > 0 ? ` — ${skipped} downstream skipped` : ''),
@@ -1616,6 +1624,14 @@
} else {
const failed = [...res.statuses.entries()].filter(([, s]) => s.status === 'failure')
const skipped = [...res.statuses.values()].filter((s) => s.status === 'skipped').length
// Surface the failed node's error in the details pane. Clear the
// active draft too — it has pane priority over `selection`
// (openScriptPath), so a bare selection would stay masked while a
// draft is open.
if (failed.length > 0) {
pe.activeDraftPath = undefined
pe.selection = { kind: 'runnable', runnable_kind: 'script', path: failed[0][0] }
}
sendUserToast(
`Bounded run failed at ${failed.map(([p]) => p).join(', ')}` +
(skipped > 0 ? ` — ${skipped} downstream skipped` : ''),