fix(workflows): close re-review gaps in the pull round-trip + partial-failure UI

A re-review of eaf5ace surfaced three follow-ups, all in the fixes themselves:

- pull vs an old server: a returned empty `definition` can only mean a server
  predating the definition-in-list field (a real zero-step workflow is rejected
  at apply). Emitting a stepless `[[workflows]]` block would just fail the next
  apply, so `wire_workflow_to_manifest` now warns and skips it instead.
- base_ms/backoff defaults: the pull mapper keyed its default-omission off a
  hardcoded `500` literal. `default_base_ms` is now `pub` + re-exported, and the
  mapper omits whatever equals `default_base_ms()` / `WorkflowBackoff::default()`
  — no drift if a default ever changes.
- dashboard: a run that succeeds with an `on_error = continue` step failure now
  carries a partial-failure note in `run.error` (from the compute_advance
  change); the run-detail view rendered it as a red failure, contradicting the
  green "succeeded" badge. It now renders as a `.notice` (warning) for a
  succeeded run, `.error` only for a failed one.

Verified: fmt + clippy -D warnings clean; 450 lib tests; 5 workflow CLI
journeys (incl. the pull→plan round-trip); dashboard npm run check clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
MechaCat02
2026-07-12 19:08:21 +02:00
parent eaf5ace30f
commit aeebdd2f3f
4 changed files with 40 additions and 18 deletions

View File

@@ -230,7 +230,12 @@
<span class="badge st-{detail.run.status}">{detail.run.status}</span>
</h3>
{#if detail.run.error}
<p class="error">{detail.run.error}</p>
<!-- A succeeded run can still carry an `error` note when a step failed
under `on_error = continue` — surface it as a warning, not a
red failure, so the green badge and message don't contradict. -->
<p class={detail.run.status === 'succeeded' ? 'notice' : 'error'}>
{detail.run.error}
</p>
{/if}
<h4>DAG</h4>
@@ -341,6 +346,9 @@
.error {
color: var(--color-danger);
}
.notice {
color: var(--color-warning, var(--text-muted));
}
.muted {
color: var(--text-muted);
}