Skip to content

WorkflowValidator.validate() returns list[str] — validation errors lack structured path/suggestion data #219

@spinje

Description

@spinje

Problem

WorkflowValidator.validate() returns (list[str], list[Diagnostic]) — errors as plain strings, warnings as Diagnostics. This means validation errors in the validate-only path lack structured data:

  • No path (e.g., nodes[0].type) — the location is sometimes embedded in the message text but not as a field
  • No suggestions — the fix guidance is either auto-generated generically or absent
  • No title differentiation — all get "Validation Error"

The run() path doesn't have this problem because it raises WorkflowValidationError with tuple errors (message, path, suggestion) that to_diagnostics() converts to rich Diagnostics.

Why it matters now

Task 144's unified titled format renders At: location and suggestions for every error type. Validation errors from the validate-only path are visibly bare compared to everything else:

# Validate-only path (bare):
✗ Validation failed (1 error):

  1. Unknown node type: 'httpp'

# Run path (rich, via WorkflowValidationError):
Error: Validation Error

Unknown node type 'httpp'
  At: nodes[0].type

  → Use 'shell', 'http', 'llm', 'file', or 'mcp'

Fix

Change WorkflowValidator.validate() to return (list[Diagnostic], list[Diagnostic]) instead of (list[str], list[Diagnostic]). Each error Diagnostic carries title, suggestions, and context["path"] from the validation check that produced it.

This requires updating the validator's internal checks to produce Diagnostics instead of strings, and updating all callers that read the errors list.

Context

Discovered during Task 144 (Diagnostic Rendering Redesign) baseline evaluation. Filed as out-of-scope for that task — the validator's return type is an architectural change affecting multiple consumers.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions