Advisory issues read as advice rather than failure
Docs / docs (push) Successful in 21s
Playwright Tests / test-playwright (1, 2) (push) Failing after 2m37s
Playwright Tests / test-playwright (2, 2) (push) Canceled after 35s
Playwright Tests / merge-reports (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Test Backend / test-backend (push) Canceled after 0s
Compose Smoke Test / test-compose (push) Canceled after 0s

`ADVISORY_ISSUES` moves next to `ValidationIssue` in pipeline.py, and the
model derives an `advisory` flag from its own code, so the distinction the
engine already made ships to the client instead of being re-guessed there.

The dock keeps its summary in `--destructive` only when a real fault is
among the issues and paints an advisory row `--muted-foreground`; the
canvas leaves advisories off a node's dot and border entirely, since node
status has three colours and no warning tier.

biome checks the generated `openapi.json`, which nothing formats since the
SDK script dropped its format pass — ignore it like the other generated
files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Gf7WaExcJ9bs3kfJXB3nK
This commit is contained in:
2026-08-25 21:46:40 +02:00
co-authored by Claude Opus 5
parent 4a2337f4de
commit 3af5342a2b
9 changed files with 59 additions and 14 deletions
+1 -4
View File
@@ -54,6 +54,7 @@ from fluksio.flow.nodes import (
TriggerNode,
)
from fluksio.flow.pipeline import (
ADVISORY_ISSUES,
NodeOutcome,
Pipeline,
RunCacheLookup,
@@ -81,10 +82,6 @@ logger = logging.getLogger(__name__)
HOOK_PREFIX = "/hooks"
# Validation codes that are worth saying but do not stop a flow running, so
# neither the brain graph nor the health summary treats them as a fault.
ADVISORY_ISSUES = frozenset({"unauthenticated_hook"})
# How long a node gets to close what it opened before the rebuild moves on.
# A node's `stop` talks to whatever it connected to, and a broker that has gone
# away can leave it waiting for an acknowledgement that never arrives — which
+14 -2
View File
@@ -25,7 +25,7 @@ from concurrent.futures import Future, ThreadPoolExecutor, wait
from contextlib import contextmanager
from typing import Any, Literal, Protocol
from pydantic import BaseModel
from pydantic import BaseModel, computed_field
from fluksio.flow import logs
from fluksio.flow.artifacts import is_reference
@@ -41,9 +41,15 @@ logger = logging.getLogger(__name__)
#: manual run shows up in the history — but it is no one's idempotency key.
MANUAL_RUN_PREFIX = "manual-"
# Validation codes that are worth saying but do not stop a flow running, so
# neither the brain graph nor the health summary treats them as a fault.
# Lives here rather than beside the controller so `ValidationIssue` can carry
# the distinction itself, and every reader gets it for free.
ADVISORY_ISSUES = frozenset({"unauthenticated_hook"})
class ValidationIssue(BaseModel):
"""A problem that keeps a flow from running correctly."""
"""Something wrong with a flow — a fault, or merely advisory."""
code: Literal[
"cycle",
@@ -60,6 +66,12 @@ class ValidationIssue(BaseModel):
port: str | None = None
message_name: str | None = None
@computed_field # type: ignore[prop-decorator]
@property
def advisory(self) -> bool:
"""Worth saying, but not a fault — the UI says so in a softer tone."""
return self.code in ADVISORY_ISSUES
class ValueSource(BaseModel):
"""Who caused a message to take its current value.