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
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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user