fix: persist invalid draft forward routes

- Fix _validate_reachable_outcomes to skip unknown nodes (root cause)
- Add safety net in validate_workflow_draft for diagnostics exceptions
- Add test proving forward-route edits persist as invalid
This commit is contained in:
lda
2026-06-28 03:26:56 +07:00 Verified
parent dd3772b3df
commit 6259a05af0
3 changed files with 123 additions and 2 deletions
+7 -1
View File
@@ -64,7 +64,10 @@ def validate_workflow_draft(
return _invalid_result(_diagnostic_from_exception(exc))
if node_defs is not None:
workflow = workflow.model_copy(update={"node_defs": list(node_defs)})
diagnostics = _diagnostics_from_workflow_issues(workflow)
try:
diagnostics = _diagnostics_from_workflow_issues(workflow)
except (KeyError, ValueError) as exc:
return _invalid_result(_diagnostic_from_exception(exc))
if diagnostics:
return _invalid_result(*diagnostics)
if outcome_lookup is not None:
@@ -113,6 +116,9 @@ def patch_workflow_draft(
result = validate_workflow_draft(patched, node_defs=effective_node_defs)
if result["status"] == "valid":
patched = WorkflowDraft.model_validate(patched).model_dump(mode="json")
# Forward-route references to steps added later must persist as invalid
# so the next edit can resolve the missing edge. Always return the
# patched draft alongside diagnostics.
return {"draft": patched, **result}
+3 -1
View File
@@ -192,7 +192,9 @@ def _validate_reachable_outcomes(
reachable = reachable_node_ids(workflow.start, workflow.edges, nodes_by_id)
for node_id in reachable:
node = nodes_by_id[node_id]
node = nodes_by_id.get(node_id)
if node is None:
continue
declared_outcomes = declared_outcomes_for_step(node, node_defs)
wired = outgoing.get(node_id, set())
missing = declared_outcomes - wired