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.
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:path(e.g.,nodes[0].type) — the location is sometimes embedded in the message text but not as a fieldsuggestions— the fix guidance is either auto-generated generically or absenttitledifferentiation — all get "Validation Error"The
run()path doesn't have this problem because it raisesWorkflowValidationErrorwith tuple errors(message, path, suggestion)thatto_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:Fix
Change
WorkflowValidator.validate()to return(list[Diagnostic], list[Diagnostic])instead of(list[str], list[Diagnostic]). Each error Diagnostic carriestitle,suggestions, andcontext["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.