ChatDev 2.0: Dev All through LLM-powered Multi-Agent Collaboration
This report presents the forensic synthetic code analysis of OpenBMB/ChatDev, a Python project with 33,889 GitHub stars. SynthScan v2.0 examined 72,162 lines of code across 339 source files, recording 658 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 11.0 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 658 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 |
|---|---|---|---|---|
| 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 |