{"record":{"id":"9c658ebc4170b06a","repo":"OpenBMB/ChatDev","slug":"workflow-logical-issues-detected-for-config-path","errorCode":null,"errorMessage":"Workflow logical issues detected for '{config_path}':\n{formatted}","messagePattern":"Workflow logical issues detected for '(.+?)':\n(.+?)","errorType":"validation","errorClass":"DesignError","httpStatus":null,"severity":"warning","filePath":"check/check.py","lineNumber":89,"sourceCode":"        raw_data = dict(raw_data)\n        raw_data[\"vars\"] = merged_vars\n\n    data = prepare_design_mapping(raw_data, source=str(config_path))\n\n    schema_errors = validate_design(data, set_defaults=set_defaults, fn_module_ref=fn_module)\n    if schema_errors:\n        formatted = \"\\n\".join(f\"- {err}\" for err in schema_errors)\n        raise DesignError(f\"Design validation failed for '{config_path}':\\n{formatted}\")\n\n    try:\n        design = DesignConfig.from_dict(data, path=\"root\")\n    except ConfigError as exc:\n        raise DesignError(f\"Design parsing failed for '{config_path}': {exc}\") from exc\n\n    logic_errors = check_workflow_structure(data)\n    if logic_errors:\n        formatted = \"\\n\".join(f\"- {err}\" for err in logic_errors)\n        raise DesignError(f\"Workflow logical issues detected for '{config_path}':\\n{formatted}\")\n    else:\n        print(\"Workflow OK.\")\n\n    graph = data.get(\"graph\") or {}\n    _ensure_supported(graph)\n\n    return design\n\n\ndef check_config(yaml_content: Any) -> str:\n    if not isinstance(yaml_content, dict):\n        return \"YAML root must be a mapping\"\n\n    # Skip placeholder resolution during save - users may configure env vars at runtime\n    # Use yaml_content directly instead of prepare_design_mapping()\n    schema_errors = validate_design(yaml_content)\n    if schema_errors:\n        formatted = \"\\n\".join(f\"- {err}\" for err in schema_errors)","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/check/check.py#L71-L107","documentation":"404 returned by the Vue graph content GET endpoint when the loader returns None, meaning the requested filename has no stored content. This is the expected not-found signal, distinct from the 500 read-failure path.","triggerScenarios":"GET graph content for a filename that was never uploaded, was deleted, or whose save failed earlier.","commonSituations":"Fetching a graph by a stale name after it was renamed/deleted; typos or wrong extension in the filename; frontend referencing graphs from an old environment.","solutions":["List available graphs (or check storage) to confirm the exact filename.","Re-upload/save the graph content if it should exist.","Handle 404 gracefully in the client by prompting re-creation."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"const exists = await api.listGraphs().then(g => g.includes(filename));\nif (!exists) return;","typeGuard":"async function graphExists(name: string): Promise<boolean> { return (await listGraphs()).includes(name); }","tryCatchPattern":"catch (e) { if (e.status === 404) offerToCreateGraph(filename); }","preventionTips":["Fetch the graph list before deep-linking to a graph","Keep client references in sync with deletions"],"tags":["vuegraph","not-found","fastapi"],"backgroundTag":"resource-not-found","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}