ChatDev 2.0: Dev All through LLM-powered Multi-Agent Collaboration
This report summarizes scanner evidence for OpenBMB/ChatDev, a Python project with 34,480 GitHub stars. SynthScan examined 72,162 lines of code across 339 source files, recording 669 pattern matches distributed across 19 syntactic categories. The legacy adjusted pattern signal is 11.7 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 297 finding(s).
Are imports declared and package/API names verified? 183 finding(s).
Are wrappers, guards, and repeated structures necessary? 376 finding(s).
Which changes need focused human review? 669 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 669 distinct pattern matches across 19 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | schema_registry/registry.py | 113 | def register_edge_condition_schema( | CODE |
| LOW⚡ | schema_registry/registry.py | 136 | def iter_edge_condition_schemas() -> Dict[str, EdgeConditionSchemaSpec]: | CODE |
| LOW⚡ | schema_registry/registry.py | 140 | def get_edge_condition_schema(name: str) -> EdgeConditionSchemaSpec: | CODE |
| LOW⚡ | schema_registry/registry.py | 147 | def register_edge_processor_schema( | CODE |
| LOW⚡ | schema_registry/registry.py | 170 | def iter_edge_processor_schemas() -> Dict[str, EdgeProcessorSchemaSpec]: | CODE |
| LOW⚡ | schema_registry/registry.py | 175 | def get_edge_processor_schema(name: str) -> EdgeProcessorSchemaSpec: | CODE |
| LOW⚡ | schema_registry/registry.py | 183 | def register_memory_store_schema( | CODE |
| LOW | schema_registry/registry.py | 206 | def iter_memory_store_schemas() -> Dict[str, MemoryStoreSchemaSpec]: | CODE |
| LOW | schema_registry/registry.py | 251 | def register_model_provider_schema( | CODE |
| LOW⚡ | schema_registry/registry.py | 272 | def iter_model_provider_schemas() -> Dict[str, ModelProviderSchemaSpec]: | CODE |
| LOW⚡ | schema_registry/registry.py | 276 | def get_model_provider_schema(name: str) -> ModelProviderSchemaSpec: | CODE |
| LOW⚡ | schema_registry/registry.py | 282 | def _ensure_edge_processor_builtins_loaded() -> None: | CODE |
| LOW⚡ | tools/export_design_template.py | 117 | def _format_placeholder_from_spec(self, spec: ConfigFieldSpec) -> str: | CODE |
| LOW | tools/export_design_template.py | 194 | def _format_recursive_placeholder(config_cls: type[BaseConfig], stack: list[type[BaseConfig]]) -> str: | CODE |
| LOW | entity/configs/dynamic_base.py | 246 | def iter_split_type_registrations() -> Dict[str, Type[SplitTypeConfig]]: | CODE |
| LOW⚡ | entity/configs/edge/dynamic_edge_config.py | 28 | def register_dynamic_edge_type( | CODE |
| LOW⚡ | entity/configs/edge/dynamic_edge_config.py | 38 | def get_dynamic_edge_type_config(name: str) -> type[BaseConfig]: | CODE |
| LOW⚡ | entity/configs/edge/dynamic_edge_config.py | 46 | def iter_dynamic_edge_type_registrations() -> Dict[str, type[BaseConfig]]: | CODE |
| LOW⚡ | entity/configs/edge/dynamic_edge_config.py | 50 | def iter_dynamic_edge_type_metadata() -> Dict[str, Dict[str, Any]]: | CODE |
| LOW | entity/configs/node/agent.py | 561 | def _preferred_provider_default(provider_names: List[str]) -> str: | CODE |
| LOW | entity/configs/node/agent.py | 567 | def _provider_registry_snapshot() -> tuple[List[str], Dict[str, Dict[str, Any]]]: | CODE |
| LOW | entity/configs/node/tooling.py | 48 | def iter_tooling_type_registrations() -> Dict[str, type[BaseConfig]]: | CODE |
| LOW | entity/configs/node/tooling.py | 52 | def iter_tooling_type_metadata() -> Dict[str, Dict[str, Any]]: | CODE |
| LOW⚡ | entity/configs/node/subgraph.py | 37 | def get_subgraph_source_config(name: str) -> type[BaseConfig]: | CODE |
| LOW⚡ | entity/configs/node/subgraph.py | 45 | def iter_subgraph_source_registrations() -> Dict[str, type[BaseConfig]]: | CODE |
| LOW⚡ | entity/configs/node/subgraph.py | 49 | def iter_subgraph_source_metadata() -> Dict[str, Dict[str, Any]]: | CODE |
| LOW | runtime/bootstrap/schema.py | 19 | def ensure_schema_registry_populated() -> None: | CODE |
| LOW | runtime/edge/processors/registry.py | 51 | def get_edge_processor_registration(name: str) -> EdgeProcessorRegistration: | CODE |
| LOW | runtime/edge/processors/registry.py | 60 | def iter_edge_processor_registrations() -> Dict[str, EdgeProcessorRegistration]: | CODE |
| LOW⚡ | runtime/edge/conditions/registry.py | 55 | def get_edge_condition_registration(name: str) -> EdgeConditionRegistration: | CODE |
| LOW⚡ | runtime/edge/conditions/registry.py | 65 | def iter_edge_condition_registrations() -> Dict[str, EdgeConditionRegistration]: | CODE |
| LOW⚡ | runtime/edge/conditions/registry.py | 71 | def build_edge_condition_manager( | CODE |
| LOW | runtime/edge/conditions/base.py | 184 | def _prepare_payload_for_target( | CODE |
| LOW | runtime/node/splitter.py | 240 | def create_splitter_from_config(split_config: "SplitConfig") -> Splitter: | CODE |
| LOW⚡ | runtime/node/agent/memory/registry.py | 44 | def get_memory_store_registration(name: str) -> MemoryStoreRegistration: | CODE |
| LOW⚡ | runtime/node/agent/memory/registry.py | 53 | def iter_memory_store_registrations() -> Dict[str, MemoryStoreRegistration]: | CODE |
| LOW | runtime/node/agent/memory/simple_memory.py | 161 | def _calculate_semantic_similarity(self, query: str, content: str) -> float: | CODE |
| LOW | runtime/node/agent/memory/simple_memory.py | 195 | def _calculate_lcs_similarity(self, s1: str, s2: str) -> float: | CODE |
| LOW | runtime/node/agent/memory/simple_memory.py | 210 | def _calculate_keyword_similarity(self, query: str, content: str) -> float: | CODE |
| LOW⚡ | runtime/node/agent/memory/file_memory.py | 201 | def _build_index_from_sources(self) -> None: | CODE |
| LOW | runtime/node/agent/memory/file_memory.py | 221 | def _validate_and_update_index(self) -> bool: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 92 | def _is_chat_completions_mode(self, client: Any) -> bool: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 289 | def _serialize_timeline_item_for_chat(self, item: Any) -> Optional[Any]: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 307 | def _serialize_message_for_chat(self, message: Message) -> Dict[str, Any]: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 328 | def _serialize_function_call_output_event_for_chat(self, event: FunctionCallOutputEvent) -> Dict[str, Any]: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 341 | def _transform_blocks_for_chat(self, blocks: List[Dict[str, Any]]) -> Union[str, List[Dict[str, Any]]]: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 359 | def _deserialize_chat_response(self, response: Any) -> Message: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 405 | def _append_chat_response_output(self, timeline: List[Any], response: Any) -> None: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 440 | def _serialize_message_for_responses(self, message: Message) -> Dict[str, Any]: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 454 | def _serialize_content_blocks(self, message: Message) -> List[Dict[str, Any]]: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 708 | def _parse_image_generation_call(self, payload: Any) -> MessageBlock: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 785 | def _serialize_function_call_output_event( | CODE |
| LOW⚡ | runtime/node/agent/providers/gemini_provider.py | 468 | def _encode_thought_signature(self, value: Any) -> Optional[str]: | CODE |
| LOW⚡ | runtime/node/agent/providers/gemini_provider.py | 658 | def _coerce_function_calling_config(self, payload: Any) -> genai_types.FunctionCallingConfig: | CODE |
| LOW⚡ | runtime/node/agent/providers/gemini_provider.py | 667 | def _coerce_automatic_function_calling(self, payload: Any) -> Any: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 145 | def _append_response_contents(self, timeline: List[Any], response: Any) -> None: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 168 | def _function_output_event_to_content( | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 210 | def _should_inline_attachment_as_text(self, block: MessageBlock) -> bool: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 225 | def _general_parts_to_function_response_parts(self, parts: List[genai_types.Part]) -> List[genai_types.FunctionRespo | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 239 | def _build_tool_response_part(self, message: Message) -> genai_types.Part: | CODE |
| 121 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server_main.py | 6 | CODE | |
| LOW | schema_registry/registry.py | 5 | CODE | |
| LOW | schema_registry/registry.py | 287 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | schema_registry/__init__.py | 3 | CODE | |
| LOW | mcp_example/mcp_server.py | 3 | CODE | |
| LOW | mcp_example/mcp_server.py | 4 | CODE | |
| LOW | mcp_example/mcp_server.py | 4 | CODE | |
| LOW | entity/configs/__init__.py | 3 | CODE | |
| LOW | entity/configs/__init__.py | 3 | CODE | |
| LOW | entity/configs/__init__.py | 4 | CODE | |
| LOW | entity/configs/__init__.py | 5 | CODE | |
| LOW | entity/configs/__init__.py | 5 | CODE | |
| LOW | entity/configs/__init__.py | 5 | CODE | |
| LOW | entity/configs/__init__.py | 6 | CODE | |
| LOW | entity/configs/__init__.py | 6 | CODE | |
| LOW | entity/configs/__init__.py | 6 | CODE | |
| LOW | entity/configs/__init__.py | 7 | CODE | |
| LOW | entity/configs/__init__.py | 7 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 8 | CODE | |
| LOW | entity/configs/__init__.py | 18 | CODE | |
| LOW | entity/configs/__init__.py | 18 | CODE | |
| LOW | entity/configs/__init__.py | 19 | CODE | |
| LOW | entity/configs/__init__.py | 20 | CODE | |
| LOW | entity/configs/__init__.py | 21 | CODE | |
| LOW | entity/configs/__init__.py | 21 | CODE | |
| LOW | entity/configs/__init__.py | 22 | CODE | |
| LOW | entity/configs/__init__.py | 23 | CODE | |
| LOW | entity/configs/__init__.py | 24 | CODE | |
| 121 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | schema_registry/registry.py | 288 | except Exception: | CODE |
| LOW | tools/validate_all_yamls.py | 72 | except Exception as e: | CODE |
| LOW | tools/sync_vuegraphs.py | 60 | except Exception as e: | CODE |
| MEDIUM | tools/sync_vuegraphs.py | 61 | print(f"Error processing {file_path}: {e}") | CODE |
| LOW | entity/messages.py | 302 | except Exception: | CODE |
| LOW | entity/messages.py | 361 | except Exception: | CODE |
| LOW | entity/configs/node/skills.py | 35 | except Exception: | CODE |
| LOW | runtime/edge/processors/function_processor.py | 38 | except Exception as exc: # pragma: no cover - defensive logging | CODE |
| LOW | runtime/edge/conditions/base.py | 67 | except Exception as exc: # pragma: no cover | CODE |
| LOW | runtime/edge/conditions/base.py | 108 | except Exception as exc: # pragma: no cover | CODE |
| LOW | runtime/node/agent/memory/embedding.py | 121 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/embedding.py | 141 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/embedding.py | 192 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/memory_base.py | 76 | except Exception: | CODE |
| LOW | runtime/node/agent/memory/mem0_memory.py | 131 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/mem0_memory.py | 187 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/simple_memory.py | 81 | except Exception: | CODE |
| LOW | runtime/node/agent/memory/simple_memory.py | 84 | except Exception: | CODE |
| LOW⚡ | runtime/node/agent/memory/file_memory.py | 186 | except Exception: | CODE |
| LOW⚡ | runtime/node/agent/memory/file_memory.py | 196 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/file_memory.py | 325 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/file_memory.py | 436 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/file_memory.py | 462 | except Exception as e: | CODE |
| LOW | runtime/node/agent/memory/blackboard_memory.py | 44 | except Exception: | CODE |
| LOW | runtime/node/agent/memory/blackboard_memory.py | 47 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 84 | except Exception as e: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 737 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/openai_provider.py | 768 | except Exception: | CODE |
| LOW⚡ | runtime/node/agent/providers/gemini_provider.py | 464 | except Exception: | CODE |
| LOW⚡ | runtime/node/agent/providers/gemini_provider.py | 475 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 278 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 420 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 571 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 612 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/gemini_provider.py | 621 | except Exception: | CODE |
| LOW | runtime/node/agent/providers/base.py | 106 | except Exception: | CODE |
| LOW | runtime/node/agent/tool/tool_manager.py | 83 | except Exception as exc: # pragma: no cover - passthrough to caller | CODE |
| LOW | runtime/node/executor/agent_executor.py | 167 | except Exception as e: | CODE |
| LOW | runtime/node/executor/agent_executor.py | 197 | except Exception as encoding_error: | CODE |
| LOW | runtime/node/executor/agent_executor.py | 685 | except Exception as exc: | CODE |
| LOW | runtime/node/executor/agent_executor.py | 817 | except Exception as exc: | CODE |
| LOW | runtime/node/executor/agent_executor.py | 933 | except Exception: | CODE |
| LOW | runtime/node/executor/agent_executor.py | 959 | except Exception: | CODE |
| LOW | runtime/node/executor/agent_executor.py | 1082 | except Exception as exc: | CODE |
| LOW | tests/test_websocket_send_message_sync.py | 115 | except Exception as exc: | CODE |
| MEDIUM | tests/test_websocket_send_message_sync.py | 112 | def worker(): | CODE |
| LOW | server/routes/sessions.py | 48 | except Exception as exc: | CODE |
| LOW | server/routes/sessions.py | 80 | except Exception as exc: | CODE |
| LOW | server/routes/execute.py | 50 | except Exception as exc: | CODE |
| LOW | server/routes/execute_sync.py | 180 | except Exception as exc: | CODE |
| LOW | server/routes/execute_sync.py | 235 | except Exception as exc: | CODE |
| MEDIUM | server/routes/execute_sync.py | 209 | def worker() -> None: | CODE |
| LOW | server/routes/workflows.py | 58 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 146 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 209 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 255 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 278 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 302 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 326 | except Exception as exc: | CODE |
| LOW | server/routes/workflows.py | 357 | except Exception as exc: | CODE |
| 54 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/export_design_template.py | 43 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | tools/export_design_template.py | 45 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tools/export_design_template.py | 113 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tools/export_design_template.py | 115 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | runtime/edge/conditions/base.py | 88 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | runtime/edge/conditions/base.py | 90 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | runtime/node/agent/providers/gemini_provider.py | 677 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | runtime/node/agent/providers/gemini_provider.py | 679 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/node/agent/providers/gemini_provider.py | 106 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/node/agent/providers/gemini_provider.py | 108 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/node/agent/providers/gemini_provider.py | 524 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/node/agent/providers/gemini_provider.py | 526 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/node/agent/providers/gemini_provider.py | 814 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/node/agent/providers/gemini_provider.py | 816 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_websocket_send_message_sync.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_websocket_send_message_sync.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_websocket_send_message_sync.py | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_websocket_send_message_sync.py | 47 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_websocket_send_message_sync.py | 74 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_websocket_send_message_sync.py | 76 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | utils/log_manager.py | 25 | # ================================================================ | COMMENT |
| MEDIUM | utils/log_manager.py | 27 | # ================================================================ | COMMENT |
| MEDIUM | utils/log_manager.py | 82 | # ================================================================ | COMMENT |
| MEDIUM | utils/log_manager.py | 84 | # ================================================================ | COMMENT |
| MEDIUM | utils/logger.py | 397 | # ================================================================ | COMMENT |
| MEDIUM | utils/logger.py | 399 | # ================================================================ | COMMENT |
| MEDIUM | workflow/graph.py | 45 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | workflow/graph.py | 47 | # ------------------------------------------------------------------ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | schema_registry/registry.py | 288 | except Exception: | CODE |
| HIGH | server/services/attachment_service.py | 95 | except OSError: | CODE |
| HIGH | server/services/attachment_service.py | 91 | except OSError: | CODE |
| HIGH | server/services/websocket_manager.py | 25 | except Exception: | CODE |
| HIGH | server/services/websocket_manager.py | 30 | except Exception: | CODE |
| HIGH | server/services/websocket_manager.py | 84 | except Exception: | CODE |
| HIGH | utils/workspace_scanner.py | 56 | except (FileNotFoundError, PermissionError, OSError): | CODE |
| HIGH | utils/logger.py | 30 | except Exception: | CODE |
| HIGH | utils/logger.py | 35 | except Exception: | CODE |
| HIGH | functions/function_calling/code_executor.py | 63 | except Exception: | CODE |
| HIGH | functions/function_calling/file.py | 213 | except (FileNotFoundError, PermissionError, OSError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate_all_yamls.py | 25 | CODE | |
| LOW | frontend/src/count_lines.py | 4 | CODE | |
| LOW | entity/messages.py | 289 | CODE | |
| LOW | entity/messages.py | 347 | CODE | |
| LOW | entity/configs/dynamic_base.py | 149 | CODE | |
| LOW | entity/configs/graph.py | 141 | CODE | |
| LOW | entity/configs/graph.py | 231 | CODE | |
| LOW | entity/configs/edge/edge_processor.py | 155 | CODE | |
| LOW | entity/configs/node/agent.py | 298 | CODE | |
| LOW | entity/configs/node/tooling.py | 101 | CODE | |
| LOW | runtime/node/splitter.py | 190 | CODE | |
| LOW | runtime/node/splitter.py | 240 | CODE | |
| LOW | runtime/node/splitter.py | 74 | CODE | |
| LOW | runtime/node/splitter.py | 158 | CODE | |
| LOW | runtime/node/agent/memory/simple_memory.py | 72 | CODE | |
| LOW | runtime/node/agent/memory/file_memory.py | 221 | CODE | |
| LOW | runtime/node/agent/providers/openai_provider.py | 596 | CODE | |
| LOW | runtime/node/agent/providers/openai_provider.py | 626 | CODE | |
| LOW | runtime/node/agent/providers/openai_provider.py | 673 | CODE | |
| LOW | runtime/node/agent/providers/gemini_provider.py | 110 | CODE | |
| LOW | runtime/node/agent/providers/gemini_provider.py | 168 | CODE | |
| LOW | runtime/node/agent/providers/gemini_provider.py | 254 | CODE | |
| LOW | runtime/node/agent/providers/gemini_provider.py | 408 | CODE | |
| LOW | runtime/node/agent/providers/gemini_provider.py | 454 | CODE | |
| LOW | runtime/node/agent/providers/gemini_provider.py | 528 | CODE | |
| LOW | runtime/node/agent/skills/manager.py | 132 | CODE | |
| LOW | runtime/node/agent/tool/tool_manager.py | 97 | CODE | |
| LOW | runtime/node/executor/loop_timer_executor.py | 25 | CODE | |
| LOW | runtime/node/executor/agent_executor.py | 614 | CODE | |
| LOW | runtime/node/executor/agent_executor.py | 963 | CODE | |
| LOW | server/routes/workflows.py | 72 | CODE | |
| LOW | server/routes/workflows.py | 157 | CODE | |
| LOW | server/services/message_handler.py | 24 | CODE | |
| LOW | server/services/attachment_service.py | 62 | CODE | |
| LOW | server/services/session_execution.py | 34 | CODE | |
| LOW | server/services/websocket_manager.py | 236 | CODE | |
| LOW | utils/workspace_scanner.py | 19 | CODE | |
| LOW | utils/function_manager.py | 42 | CODE | |
| LOW | utils/logger.py | 81 | CODE | |
| LOW | workflow/topology_builder.py | 94 | CODE | |
| LOW | workflow/topology_builder.py | 199 | CODE | |
| LOW | workflow/graph_manager.py | 321 | CODE | |
| LOW | workflow/executor/dynamic_edge_executor.py | 144 | CODE | |
| LOW | workflow/executor/dynamic_edge_executor.py | 215 | CODE | |
| LOW | workflow/executor/cycle_executor.py | 139 | CODE | |
| LOW | workflow/executor/cycle_executor.py | 287 | CODE | |
| LOW | workflow/executor/cycle_executor.py | 352 | CODE | |
| LOW | workflow/executor/cycle_executor.py | 434 | CODE | |
| LOW | workflow/executor/cycle_executor.py | 480 | CODE | |
| LOW | functions/edge_processor/transformers.py | 15 | CODE | |
| LOW | functions/function_calling/web.py | 42 | CODE | |
| LOW | functions/function_calling/web.py | 111 | CODE | |
| LOW | functions/function_calling/uv_related.py | 82 | CODE | |
| LOW | functions/function_calling/file.py | 169 | CODE | |
| LOW | functions/function_calling/deep_research.py | 195 | CODE | |
| LOW | functions/function_calling/deep_research.py | 301 | CODE | |
| LOW | check/check.py | 30 | CODE | |
| LOW | check/check_workflow.py | 25 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | frontend/public/tutorial-en.md | 598 | #### Step 1: Identify Initial Node | COMMENT |
| LOW⚡ | frontend/public/tutorial-en.md | 605 | #### Step 2: Build Scoped Subgraph | COMMENT |
| LOW⚡ | frontend/public/tutorial-en.md | 609 | #### Step 3: Nested Loop Detection | COMMENT |
| LOW⚡ | frontend/public/tutorial-en.md | 613 | #### Step 4: Inner Topological Sort | COMMENT |
| LOW⚡ | frontend/public/tutorial-en.md | 618 | #### Step 5: Layered Execution | COMMENT |
| LOW⚡ | frontend/public/tutorial-en.md | 624 | #### Step 6: Exit Condition Check | COMMENT |
| LOW | docs/user_guide/en/ws_frontend_logic.md | 18 | ### Step 1: File Selection Triggers Watch | COMMENT |
| LOW | docs/user_guide/en/ws_frontend_logic.md | 26 | ### Step 2: WebSocket Disconnection | COMMENT |
| LOW | docs/user_guide/en/ws_frontend_logic.md | 42 | ### Step 3: Load YAML | COMMENT |
| LOW | docs/user_guide/en/ws_frontend_logic.md | 53 | ### Step 4: WebSocket Reconnection | COMMENT |
| LOW⚡ | docs/user_guide/en/ws_frontend_logic.md | 79 | ### Step 1: Button Click Handler | COMMENT |
| LOW⚡ | docs/user_guide/en/ws_frontend_logic.md | 88 | ### Step 2: WebSocket Disconnection | COMMENT |
| LOW⚡ | docs/user_guide/en/ws_frontend_logic.md | 98 | ### Step 3: Load YAML | COMMENT |
| LOW⚡ | docs/user_guide/en/ws_frontend_logic.md | 104 | ### Step 4: WebSocket Reconnection | COMMENT |
| LOW⚡ | docs/user_guide/en/ws_frontend_logic.md | 114 | ## Step 5: Launch Button Clicked (After Reconnection) | COMMENT |
| LOW⚡ | docs/user_guide/en/execution_logic.md | 83 | #### Step 1: Unique Initial Node Identification | COMMENT |
| LOW⚡ | docs/user_guide/en/execution_logic.md | 89 | #### Step 2: Build Scoped Subgraph | COMMENT |
| LOW⚡ | docs/user_guide/en/execution_logic.md | 93 | #### Step 3: Nested Cycle Detection | COMMENT |
| LOW⚡ | docs/user_guide/en/execution_logic.md | 97 | #### Step 4: Inner Super Node Construction and Topological Sort | COMMENT |
| LOW⚡ | docs/user_guide/en/execution_logic.md | 106 | #### Step 5: Layered Execution | COMMENT |
| LOW⚡ | docs/user_guide/en/execution_logic.md | 112 | #### Step 6: Exit Condition Check | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 105 | # Step 2: Validate cycle entry uniqueness | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 125 | # Step 4: Execute cycle with iterations | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 215 | # Step 1: Detect nested cycles in the scoped subgraph | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 239 | # Step 4: Check if initial node is retriggered | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | schema_registry/registry.py | 73 | def _update_metadata(target: MutableMapping[str, Any], new_items: Mapping[str, Any] | None) -> None: | CODE |
| LOW | schema_registry/__init__.py | 32 | __all__ = [ | CODE |
| LOW | entity/enum_options.py | 70 | __all__ = [ | CODE |
| LOW | entity/configs/__init__.py | 28 | __all__ = [ | CODE |
| LOW | entity/configs/edge/__init__.py | 10 | __all__ = [ | CODE |
| LOW | entity/configs/node/__init__.py | 12 | __all__ = [ | CODE |
| LOW | runtime/__init__.py | 3 | __all__ = ["WorkflowMetaInfo", "WorkflowRunResult", "run_workflow"] | CODE |
| LOW | runtime/edge/processors/registry.py | 76 | __all__ = [ | CODE |
| LOW | runtime/edge/processors/__init__.py | 6 | __all__ = [ | CODE |
| LOW | runtime/edge/conditions/registry.py | 86 | __all__ = [ | CODE |
| LOW | runtime/edge/conditions/__init__.py | 6 | __all__ = [ | CODE |
| LOW | runtime/node/agent/memory/embedding.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | runtime/node/agent/memory/registry.py | 58 | __all__ = [ | CODE |
| LOW | runtime/node/agent/memory/__init__.py | 4 | __all__ = [ | CODE |
| LOW | runtime/node/agent/memory/mem0_memory.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | runtime/node/agent/memory/simple_memory.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | runtime/node/agent/memory/file_memory.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | runtime/node/agent/providers/__init__.py | 4 | __all__ = [ | CODE |
| LOW⚡ | runtime/node/agent/thinking/registry.py | 57 | __all__ = [ | CODE |
| LOW | runtime/node/agent/thinking/__init__.py | 4 | __all__ = [ | CODE |
| LOW | runtime/node/agent/skills/__init__.py | 3 | __all__ = [ | CODE |
| LOW | runtime/node/agent/tool/tool_manager.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | runtime/node/agent/tool/__init__.py | 3 | __all__ = [ | CODE |
| LOW | runtime/node/executor/__init__.py | 13 | __all__ = [ | CODE |
| LOW | runtime/node/executor/agent_executor.py | 1253 | def _update_memory(self, node: Node, input_data: str, inputs: List[Message], result: Message | str) -> None: | CODE |
| LOW | server/config_schema_router.py | 71 | __all__ = ["router"] | CODE |
| LOW | server/routes/__init__.py | 19 | __all__ = ["ALL_ROUTERS"] | CODE |
| LOW | server/services/session_execution.py | 22 | def set_waiting_for_input(self, session_id: str, node_id: str, input_data: Dict[str, Any]) -> None: | CODE |
| LOW | server/services/session_store.py | 101 | def update_session_status(self, session_id: str, status: SessionStatus, **kwargs: Any) -> None: | CODE |
| LOW | server/services/session_store.py | 112 | def set_session_error(self, session_id: str, error_message: str) -> None: | CODE |
| LOW | utils/schema_exporter.py | 135 | __all__ = [ | CODE |
| LOW | utils/attachments.py | 213 | def update_remote_file_id(self, attachment_id: str, remote_file_id: str) -> None: | CODE |
| LOW | utils/function_catalog.py | 348 | __all__ = [ | CODE |
| LOW | workflow/subgraph_loader.py | 81 | __all__ = ["load_subgraph_config"] | CODE |
| LOW | workflow/runtime/__init__.py | 12 | __all__ = [ | CODE |
| LOW | workflow/hooks/__init__.py | 5 | __all__ = ["WorkspaceArtifactHook", "WorkspaceArtifact"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | runtime/node/splitter.py | 201 | Factory function to create appropriate splitter. Args: split_type: One of 'message', 'regex', 'json_pat | STRING |
| HIGH | runtime/node/executor/factory.py | 39 | Create an executor for the requested node type. Args: node_type: Registered node type name | STRING |
| HIGH | runtime/node/executor/base.py | 79 | Execute the node logic. Args: node: Node definition to execute inputs: Input qu | STRING |
| HIGH | workflow/executor/cycle_executor.py | 140 | Validate that exactly one node in the cycle is triggered by external edges. Args: cycle_id | STRING |
| HIGH | functions/function_calling/file.py | 366 | Persist data to a workspace file while optionally registering it as an attachment. Args: path: Relativ | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/node/agent/providers/gemini_provider.py | 185 | # Check if we should inline this attachment as text | COMMENT |
| LOW | runtime/node/executor/loop_timer_executor.py | 47 | # Check if time limit has been reached | COMMENT |
| LOW | workflow/graph.py | 567 | # Check if any incoming edge has dynamic configuration | COMMENT |
| LOW | workflow/graph.py | 784 | # Check if node has output | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 157 | # Check if any external predecessor (node outside the cycle) triggers this node | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 329 | # Check if the edge from pred to node has trigger=true | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 567 | # Check if node is triggered (unless force_execute is True) | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 579 | # Check if any external node was triggered | COMMENT |
| LOW | functions/function_calling/web.py | 145 | # Check if limit reached | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | runtime/node/agent/memory/embedding.py | 173 | # Load the local embedding model (e.g., sentence-transformers) | COMMENT |
| MEDIUM | runtime/node/executor/agent_executor.py | 747 | # But strict routing is safer. If spec not found, it's a hallucination or error. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | utils/token_tracker.py | 138 | CODE | |
| LOW | utils/attachments.py | 72 | CODE | |
| LOW | utils/middleware.py | 78 | CODE | |
| LOW | utils/middleware.py | 87 | CODE | |
| LOW | functions/function_calling/uv_related.py | 222 | CODE | |
| LOW | functions/function_calling/file.py | 710 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | workflow/executor/cycle_executor.py | 105 | # Step 2: Validate cycle entry uniqueness | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 125 | # Step 4: Execute cycle with iterations | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 215 | # Step 1: Detect nested cycles in the scoped subgraph | COMMENT |
| LOW | workflow/executor/cycle_executor.py | 239 | # Step 4: Check if initial node is retriggered | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | functions/edge_processor/transformers.py | 71 | command = f"cd {workspace_root} && dir && uv run main.py" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | entity/configs/node/agent.py | 461 | description="Call parameters (temperature, top_p, etc.)", | COMMENT |
| LOW | entity/configs/node/tooling.py | 81 | # "parameters": ConfigFieldSpec( | COMMENT |
| LOW | functions/function_calling/file.py | 121 | # # Attachment store (user uploads or files registered via load_file) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | workflow/graph_manager.py | 126 | # Create a single layer with all nodes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | yaml_instance/ChatDev_v1.yaml | 253 | Test Reports of Source Codes: You should use `uv_run` function to run the code (don't forget to set timeout fo | CODE |
| LOW | yaml_instance/ChatDev_v1.yaml | 469 | If you need to run the code, don't forget to set timeout. | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/src/pages/WorkflowWorkbench.vue | 28 | <div v-else class="placeholder"> | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server/services/batch_run_service.py | 57 | async def run_task(task: BatchTask) -> None: | CODE |