🔬 Harness Vibe Research with Self-evolving AI Scientists
This report presents the forensic synthetic code analysis of EvoScientist/EvoScientist, a Python project with 4,180 GitHub stars. SynthScan v2.0 examined 134,931 lines of code across 413 source files, recording 4733 pattern matches distributed across 19 syntactic categories. The overall adjusted score of 51.6 places this repository in the Strong 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 4733 distinct pattern matches across 19 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 |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_hitl.py | 17 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 19 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 50 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 52 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 141 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 143 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 333 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 335 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 376 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 378 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 434 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 436 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 560 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 562 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 605 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 607 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_hitl.py | 102 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_hitl.py | 104 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 14 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 74 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 76 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 145 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 204 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tool_error_handler.py | 206 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_ccproxy_manager.py | 87 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_ccproxy_manager.py | 89 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_ccproxy_manager.py | 204 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_ccproxy_manager.py | 206 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 23 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 25 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 41 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 43 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 125 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 127 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 221 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 223 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 242 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 244 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 268 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 270 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 294 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 296 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 310 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_ccproxy_manager.py | 312 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_serde_default_rich_exception.py | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_serde_default_rich_exception.py | 34 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_serde_default_rich_exception.py | 139 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_serde_default_rich_exception.py | 141 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_serde_default_rich_exception.py | 206 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_serde_default_rich_exception.py | 209 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_stream_state.py | 10 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_stream_state.py | 12 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_stream_state.py | 63 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_stream_state.py | 65 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_stream_state.py | 362 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_stream_state.py | 364 | # ============================================================================= | COMMENT |
| 844 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_hitl.py | 23 | def test_interrupt_event_structure(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 37 | def test_interrupt_defaults_review_configs(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 41 | def test_interrupt_multiple_action_requests(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 56 | def test_handle_interrupt_sets_pending(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 147 | def test_empty_requests_auto_approves(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 153 | def test_session_auto_approve(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 339 | def test_auto_approve_default(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 369 | def test_shell_allow_list_set(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 382 | async def test_interrupt_from_updates_mode(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 440 | def test_parse_approval_approve(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 446 | def test_parse_approval_reject(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 491 | def test_should_auto_approve_non_execute(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 496 | def test_should_auto_approve_empty(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 501 | def test_should_auto_approve_execute_no_allowlist(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 570 | async def test_register_and_resolve_reply(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 611 | def test_prompt_fn_called_for_execute(self): | CODE |
| LOW | tests/test_hitl.py | 69 | def test_pending_interrupt_starts_none(self): | CODE |
| LOW | tests/test_hitl.py | 73 | def test_interrupt_does_not_affect_other_state(self): | CODE |
| LOW | tests/test_hitl.py | 87 | def test_done_after_interrupt_preserves_pending(self): | CODE |
| LOW | tests/test_hitl.py | 194 | def test_non_execute_tool_auto_approves(self): | CODE |
| LOW | tests/test_hitl.py | 218 | def test_execute_with_matching_allow_list(self): | CODE |
| LOW | tests/test_hitl.py | 242 | def test_execute_not_in_allow_list_prompts(self): | CODE |
| LOW | tests/test_hitl.py | 271 | def test_run_in_background_not_in_allow_list_prompts(self): | CODE |
| LOW | tests/test_hitl.py | 304 | def test_run_in_background_in_allow_list_auto_approves(self): | CODE |
| LOW | tests/test_hitl.py | 351 | def test_shell_allow_list_default(self): | CODE |
| LOW | tests/test_hitl.py | 419 | async def test_updates_without_interrupt_skipped(self): | CODE |
| LOW | tests/test_hitl.py | 458 | def test_parse_approval_unrecognized(self): | CODE |
| LOW | tests/test_hitl.py | 465 | def test_format_approval_prompt(self): | CODE |
| LOW | tests/test_hitl.py | 479 | def test_format_approval_prompt_multiple(self): | CODE |
| LOW | tests/test_hitl.py | 517 | def test_should_auto_approve_run_in_background_no_allowlist(self): | CODE |
| LOW | tests/test_hitl.py | 532 | def test_should_auto_approve_config_true(self): | CODE |
| LOW | tests/test_hitl.py | 545 | def test_should_auto_approve_allowlist_match(self): | CODE |
| LOW | tests/test_hitl.py | 586 | def test_try_resolve_no_pending(self): | CODE |
| LOW | tests/test_hitl.py | 594 | async def test_reply_timeout_returns_none(self): | CODE |
| LOW | tests/test_hitl.py | 639 | def test_prompt_fn_not_called_for_auto_approve(self): | CODE |
| LOW | tests/test_hitl.py | 665 | def test_prompt_fn_not_called_for_non_execute(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 32 | def test_returns_tool_message(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 64 | def test_content_includes_retry_guidance(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 83 | def test_success_passes_through(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 93 | def test_command_passes_through(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 102 | def test_exception_returns_error_tool_message(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 114 | def test_exception_does_not_propagate(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 122 | def test_keyboard_interrupt_propagates(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 130 | def test_various_exception_types(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 152 | async def test_success_passes_through(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 187 | async def test_exception_does_not_propagate(self): | CODE |
| LOW⚡ | tests/test_tool_error_handler.py | 195 | async def test_keyboard_interrupt_propagates(self): | CODE |
| LOW | tests/test_tool_error_handler.py | 44 | def test_content_includes_tool_name(self): | CODE |
| LOW | tests/test_tool_error_handler.py | 53 | def test_content_includes_traceback(self): | CODE |
| LOW | tests/test_tool_error_handler.py | 163 | async def test_command_passes_through(self): | CODE |
| LOW | tests/test_tool_error_handler.py | 174 | async def test_exception_returns_error_tool_message(self): | CODE |
| LOW⚡ | tests/test_ccproxy_manager.py | 99 | def test_uses_health_live_endpoint(self, mock_get): | CODE |
| LOW⚡ | tests/test_ccproxy_manager.py | 210 | def test_writes_codex_mapping_override(self, tmp_path): | CODE |
| LOW | tests/test_ccproxy_manager.py | 174 | def test_passes_generated_config(self, mock_popen, mock_running, tmp_path): | CODE |
| LOW | tests/test_ccproxy_manager.py | 190 | def test_config_write_failure_starts_without_config( | CODE |
| LOW | tests/test_ccproxy_manager.py | 339 | def test_oauth_mode_raises_no_binary(self, mock_avail): | CODE |
| LOW | tests/test_ccproxy_manager.py | 351 | def test_oauth_mode_raises_no_auth(self, mock_avail, mock_auth): | CODE |
| LOW | tests/test_ccproxy_manager.py | 362 | def test_openai_oauth_mode_starts( | CODE |
| LOW | tests/test_ccproxy_manager.py | 382 | def test_both_oauth_starts_both( | CODE |
| LOW | tests/test_ccproxy_manager.py | 401 | def test_openai_oauth_raises_no_binary_editable(self, mock_avail, mock_edit): | CODE |
| 2394 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_tool_error_handler.py | 68 | except Exception: | CODE |
| LOW | tests/test_async_watcher_middleware.py | 25 | except Exception: | CODE |
| LOW | tests/test_async_watcher_middleware.py | 33 | except Exception: | CODE |
| LOW | tests/conftest.py | 137 | except Exception: | CODE |
| LOW | tests/test_background_middleware.py | 52 | except Exception: | CODE |
| LOW | tests/test_observation_memory.py | 479 | except Exception as exc: | CODE |
| MEDIUM | tests/test_stream_utils.py | 41 | content = '#!/usr/bin/env python3\n"""\nSkill Packager\n"""\n\nprint(f"Error: not found")' | CODE |
| LOW | tests/test_bus_integration.py | 23 | except Exception: | CODE |
| LOW⚡ | tests/test_background.py | 44 | except Exception: | CODE |
| LOW | tests/test_stream_recovery.py | 65 | except Exception: | CODE |
| LOW⚡ | EvoScientist/sessions.py | 460 | except Exception: # pragma: no cover - defensive (config import errors) | CODE |
| LOW⚡ | EvoScientist/sessions.py | 531 | except Exception as exc: | CODE |
| LOW | EvoScientist/sessions.py | 238 | except Exception as exc: # pragma: no cover - defensive | CODE |
| LOW | EvoScientist/sessions.py | 343 | except Exception as exc: | CODE |
| LOW | EvoScientist/sessions.py | 714 | except Exception as exc: | CODE |
| LOW | EvoScientist/sessions.py | 1766 | except Exception: | CODE |
| LOW⚡ | EvoScientist/sessions.py | 1335 | except Exception: | STRING |
| LOW | EvoScientist/sessions.py | 1275 | except Exception: # pragma: no cover - never let UI break sweep | STRING |
| LOW | EvoScientist/sessions.py | 1520 | except Exception: | STRING |
| LOW | EvoScientist/sessions.py | 1656 | except Exception: | STRING |
| LOW | EvoScientist/paths.py | 140 | except Exception: | CODE |
| LOW | EvoScientist/update_check.py | 44 | except Exception: | CODE |
| LOW | EvoScientist/update_check.py | 57 | except Exception: | CODE |
| LOW | EvoScientist/update_check.py | 68 | except Exception: | CODE |
| LOW | EvoScientist/background.py | 133 | except Exception: | CODE |
| LOW | EvoScientist/background.py | 140 | except Exception: | CODE |
| LOW | EvoScientist/backends.py | 1022 | except Exception: | CODE |
| LOW | EvoScientist/backends.py | 1035 | except Exception: | CODE |
| LOW | EvoScientist/ccproxy_manager.py | 74 | except Exception: | CODE |
| LOW⚡ | EvoScientist/ccproxy_manager.py | 166 | except Exception as exc: | CODE |
| LOW | EvoScientist/ccproxy_manager.py | 283 | except Exception: | CODE |
| LOW | EvoScientist/stt.py | 133 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/context_overflow.py | 36 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/context_overflow.py | 54 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/async_watcher.py | 74 | except Exception: | CODE |
| LOW | EvoScientist/middleware/async_watcher.py | 107 | except Exception: | CODE |
| LOW | EvoScientist/middleware/memory.py | 458 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/memory.py | 475 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 91 | except Exception: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 291 | except Exception as fb_exc: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 385 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 403 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 135 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 185 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/configurable_model.py | 60 | except Exception: | CODE |
| LOW | EvoScientist/middleware/configurable_model.py | 158 | except Exception: | CODE |
| LOW | EvoScientist/middleware/configurable_model.py | 186 | except Exception: | CODE |
| LOW | EvoScientist/middleware/error_normalization.py | 213 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/error_normalization.py | 226 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/background.py | 28 | except Exception: | CODE |
| LOW | EvoScientist/middleware/utils.py | 42 | except Exception: | CODE |
| LOW | EvoScientist/middleware/scheduler.py | 72 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/scheduler.py | 89 | except Exception as e: | CODE |
| LOW⚡ | EvoScientist/middleware/scheduler.py | 128 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/scheduler.py | 162 | except Exception: | CODE |
| LOW | EvoScientist/middleware/memory_lifecycle.py | 82 | except Exception: | CODE |
| LOW | EvoScientist/middleware/memory_lifecycle.py | 112 | except Exception: | CODE |
| LOW | EvoScientist/middleware/tool_error_handler.py | 48 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/tool_error_handler.py | 60 | except Exception as exc: | CODE |
| LOW | EvoScientist/tools/skills_manager.py | 509 | except Exception: | CODE |
| 422 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_serde_default_rich_exception.py | 17 | CODE | |
| LOW | tests/test_serve_agent_holder.py | 9 | CODE | |
| LOW | tests/test_async_watcher_middleware.py | 8 | CODE | |
| LOW | tests/test_channel_notification_origin.py | 4 | CODE | |
| LOW | tests/stream_v3_fakes.py | 3 | CODE | |
| LOW | tests/test_thread_selector.py | 3 | CODE | |
| LOW | tests/test_cli_resume_flag.py | 3 | CODE | |
| LOW | tests/test_configurable_model_middleware.py | 9 | CODE | |
| LOW | tests/test_wechat_channel.py | 240 | CODE | |
| LOW | tests/test_wechat_channel.py | 245 | CODE | |
| LOW | tests/test_async_subagent_swap.py | 8 | CODE | |
| LOW | tests/test_autoskills.py | 1 | CODE | |
| LOW | tests/test_async_subagent_factory.py | 10 | CODE | |
| LOW | tests/test_observation_memory.py | 1 | CODE | |
| LOW | tests/test_llm.py | 10 | CODE | |
| LOW | tests/test_file_mentions.py | 3 | CODE | |
| LOW | tests/test_langgraph_schema_generator_silenced.py | 11 | CODE | |
| LOW | tests/test_error_normalization_middleware.py | 10 | CODE | |
| LOW | tests/test_langgraph_dev_deploy_mode.py | 9 | CODE | |
| LOW | tests/test_agent_loader.py | 3 | CODE | |
| LOW | tests/test_load_subagents.py | 8 | CODE | |
| LOW | tests/test_langgraph_dev_http.py | 6 | CODE | |
| LOW | tests/test_langgraph_dev_workspace_sidecar.py | 17 | CODE | |
| LOW | tests/test_cli_serve.py | 3 | CODE | |
| LOW | tests/test_graph_gateway.py | 3 | CODE | |
| LOW | tests/test_model_passthrough_patch.py | 11 | CODE | |
| LOW | tests/test_subagent_summarize.py | 10 | CODE | |
| LOW | tests/test_ollama_discovery.py | 9 | CODE | |
| LOW | tests/test_langgraph_manager.py | 8 | CODE | |
| LOW | tests/test_cli_channel_bus_mode.py | 3 | CODE | |
| LOW | tests/test_stream_cancel.py | 3 | CODE | |
| LOW | tests/test_agent_mcp_cache.py | 3 | CODE | |
| LOW | tests/test_profile_memory_middleware.py | 1 | CODE | |
| LOW | tests/test_gateway_background_runs.py | 1 | CODE | |
| LOW | tests/test_tui_widgets.py | 7 | CODE | |
| LOW | tests/test_model_fallback.py | 7 | CODE | |
| LOW | tests/test_diff_format.py | 3 | CODE | |
| LOW | tests/test_resume_hint.py | 3 | CODE | |
| LOW | tests/fakes.py | 3 | CODE | |
| LOW | tests/test_stt.py | 7 | CODE | |
| LOW | tests/test_channel_command_ui.py | 1 | CODE | |
| LOW | tests/test_status_bar.py | 3 | CODE | |
| LOW | tests/test_runtime_context_middleware.py | 1 | CODE | |
| LOW | tests/test_tui_banner_position.py | 17 | CODE | |
| LOW | tests/test_channel_comprehensive.py | 15 | CODE | |
| LOW | tests/test_cli_deploy.py | 12 | CODE | |
| LOW | tests/test_code_interpreter_middleware.py | 10 | CODE | |
| LOW | EvoScientist/_winloop.py | 26 | CODE | |
| LOW | EvoScientist/EvoScientist.py | 42 | CODE | |
| LOW | EvoScientist/paths.py | 3 | CODE | |
| LOW | EvoScientist/update_check.py | 8 | CODE | |
| LOW | EvoScientist/background.py | 17 | CODE | |
| LOW | EvoScientist/__init__.py | 8 | CODE | |
| LOW | EvoScientist/ccproxy_manager.py | 11 | CODE | |
| LOW | EvoScientist/stt.py | 17 | CODE | |
| LOW | EvoScientist/middleware/context_overflow.py | 10 | CODE | |
| LOW | EvoScientist/middleware/code_interpreter.py | 30 | CODE | |
| LOW | EvoScientist/middleware/async_watcher.py | 21 | CODE | |
| LOW | EvoScientist/middleware/memory.py | 11 | CODE | |
| LOW | EvoScientist/middleware/model_fallback.py | 14 | CODE | |
| 356 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/fakes.py | 116 | def update_status_after_compact(self, tokens_after: int) -> None: | CODE |
| LOW | EvoScientist/sessions.py | 1120 | async def _set_user_version(conn: aiosqlite.Connection, version: int) -> None: | STRING |
| LOW⚡ | EvoScientist/EvoScientist.py | 88 | def set_active_config(cfg) -> None: | CODE |
| LOW | EvoScientist/EvoScientist.py | 216 | def set_chat_model_instance(instance, key: tuple[str | None, str | None]) -> None: | CODE |
| LOW | EvoScientist/paths.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/paths.py | 145 | def set_workspace_root(path: str | Path) -> None: | CODE |
| LOW | EvoScientist/paths.py | 208 | def set_active_workspace(path: str | Path) -> None: | CODE |
| LOW | EvoScientist/update_check.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/background.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/utils.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | EvoScientist/ccproxy_manager.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/stt.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/context_overflow.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/async_watcher.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/memory.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 65 | def set_ui_emit(fn: Callable[[str, str], None] | None) -> None: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 109 | def set_fallback_chain(chain: list[tuple[str, str]]) -> None: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/configurable_model.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/__init__.py | 41 | __all__ = [ | CODE |
| LOW⚡ | EvoScientist/middleware/ask_user.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/memory_lifecycle.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/tool_error_handler.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/tools/__init__.py | 11 | __all__ = [ | CODE |
| LOW | EvoScientist/memory/__init__.py | 34 | __all__ = [ | CODE |
| LOW | EvoScientist/memory/scheduler.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | EvoScientist/memory/agents/memory_worker.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/memory/agents/__init__.py | 9 | __all__ = [ | CODE |
| LOW | EvoScientist/memory/agents/observation_linker.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/memory/observations/tools.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/memory/observations/__init__.py | 40 | __all__ = [ | CODE |
| LOW | EvoScientist/config/__init__.py | 30 | __all__ = [ | CODE |
| LOW | EvoScientist/config/onboard/prompter.py | 115 | __all__ = [ | CODE |
| LOW | EvoScientist/config/onboard/constants.py | 43 | __all__ = [ | CODE |
| LOW | EvoScientist/config/onboard/__init__.py | 34 | __all__ = ["run_onboard"] | CODE |
| LOW | EvoScientist/deploy/__init__.py | 22 | __all__ = ["server"] | CODE |
| LOW⚡ | EvoScientist/mcp/registry.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | EvoScientist/mcp/client.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/mcp/__init__.py | 29 | __all__ = [ | CODE |
| LOW⚡ | EvoScientist/cli/rich_command_ui.py | 226 | def update_status_after_compact(self, input_tokens: int) -> None: | CODE |
| LOW | EvoScientist/cli/async_notifier.py | 103 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/cli/tui_interactive.py | 3052 | def _set_status_usage_baseline(self, input_tokens: int) -> None: | CODE |
| LOW | EvoScientist/cli/tui_interactive.py | 3063 | def update_status_after_compact(self, tokens_after: int) -> None: | CODE |
| LOW | EvoScientist/cli/tui_interactive.py | 3089 | def _set_status_streaming_text(self, text: str | None) -> None: | CODE |
| LOW | EvoScientist/cli/channel.py | 102 | def _set_channel_response(msg_id: str, response: str) -> None: | CODE |
| LOW | EvoScientist/cli/__init__.py | 15 | __all__ = [ | CODE |
| LOW | EvoScientist/cli/interactive.py | 518 | def _set_status_streaming_text(text: str | None) -> None: | CODE |
| LOW | EvoScientist/cli/clipboard.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/cli/widgets/ask_user_widget.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/cli/widgets/ask_user_widget.py | 131 | def set_future(self, future: asyncio.Future) -> None: | CODE |
| LOW⚡ | EvoScientist/cli/widgets/ask_user_widget.py | 340 | def _update_choices(self) -> None: | CODE |
| LOW | EvoScientist/cli/widgets/model_picker.py | 259 | def _update_filter(self) -> None: | CODE |
| LOW | EvoScientist/cli/widgets/model_picker.py | 272 | def _update_rows(self) -> None: | CODE |
| LOW | EvoScientist/cli/widgets/subagent_widget.py | 84 | def update_name(self, name: str, description: str = "") -> None: | STRING |
| LOW | EvoScientist/cli/widgets/subagent_widget.py | 219 | def _update_visibility(self) -> None: | CODE |
| LOW | EvoScientist/cli/widgets/summarization_widget.py | 121 | def set_content(self, text: str) -> None: | CODE |
| LOW | EvoScientist/cli/widgets/mcp_loader_widget.py | 80 | def update_server(self, name: str, state: str, detail: str = "") -> None: | CODE |
| LOW | EvoScientist/cli/widgets/__init__.py | 20 | __all__ = [ | CODE |
| LOW | EvoScientist/cli/widgets/mcp_browser.py | 155 | def _update_display(self) -> None: | CODE |
| 69 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_async_watcher_middleware.py | 18 | CODE | |
| LOW | tests/test_event_loop.py | 26 | CODE | |
| LOW | EvoScientist/sessions.py | 465 | CODE | |
| LOW | EvoScientist/sessions.py | 547 | CODE | |
| LOW | EvoScientist/sessions.py | 1535 | CODE | |
| LOW | EvoScientist/background.py | 234 | CODE | |
| LOW | EvoScientist/backends.py | 71 | CODE | |
| LOW | EvoScientist/backends.py | 413 | CODE | |
| LOW | EvoScientist/backends.py | 685 | CODE | |
| LOW | EvoScientist/backends.py | 720 | CODE | |
| LOW | EvoScientist/backends.py | 751 | CODE | |
| LOW | EvoScientist/backends.py | 989 | CODE | |
| LOW | EvoScientist/backends.py | 1179 | CODE | |
| LOW | EvoScientist/utils.py | 21 | CODE | |
| LOW | EvoScientist/utils.py | 63 | CODE | |
| LOW | EvoScientist/ccproxy_manager.py | 55 | CODE | |
| LOW | EvoScientist/middleware/ask_user.py | 245 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 465 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 642 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 766 | CODE | |
| LOW | EvoScientist/tools/skill_manager.py | 9 | CODE | |
| LOW | EvoScientist/llm/models.py | 427 | CODE | |
| LOW | EvoScientist/llm/patches.py | 38 | CODE | |
| LOW | EvoScientist/llm/patches.py | 82 | CODE | |
| LOW | EvoScientist/llm/patches.py | 341 | CODE | |
| LOW | EvoScientist/llm/patches.py | 378 | CODE | |
| LOW | EvoScientist/llm/patches.py | 413 | CODE | |
| LOW | EvoScientist/memory/autoskills/candidates.py | 124 | CODE | |
| LOW | EvoScientist/config/onboard/steps.py | 1073 | CODE | |
| LOW | EvoScientist/config/onboard/wizard.py | 66 | CODE | |
| LOW | EvoScientist/config/onboard/wizard.py | 151 | CODE | |
| LOW | EvoScientist/config/onboard/wizard.py | 474 | CODE | |
| LOW | EvoScientist/config/onboard/channels.py | 24 | CODE | |
| LOW | EvoScientist/config/onboard/channels.py | 819 | CODE | |
| LOW | EvoScientist/config/onboard/channels.py | 838 | CODE | |
| LOW | EvoScientist/config/onboard/helpers.py | 343 | CODE | |
| LOW | EvoScientist/config/onboard/helpers.py | 638 | CODE | |
| LOW | EvoScientist/stream/events.py | 740 | CODE | |
| LOW | EvoScientist/stream/events.py | 794 | CODE | |
| LOW | EvoScientist/stream/events.py | 505 | CODE | |
| LOW | EvoScientist/stream/display.py | 517 | CODE | |
| LOW | EvoScientist/stream/display.py | 899 | CODE | |
| LOW | EvoScientist/stream/display.py | 1183 | CODE | |
| LOW | EvoScientist/stream/display.py | 1282 | CODE | |
| LOW | EvoScientist/stream/display.py | 1347 | CODE | |
| LOW | EvoScientist/stream/utils.py | 140 | CODE | |
| LOW | EvoScientist/stream/summarization.py | 15 | CODE | |
| LOW | EvoScientist/stream/v3_payloads.py | 56 | CODE | |
| LOW | EvoScientist/stream/tool_results.py | 18 | CODE | |
| LOW | EvoScientist/stream/diff_format.py | 66 | CODE | |
| LOW | EvoScientist/stream/state.py | 364 | CODE | |
| LOW | EvoScientist/stream/state.py | 152 | CODE | |
| LOW | EvoScientist/mcp/registry.py | 162 | CODE | |
| LOW | EvoScientist/mcp/registry.py | 289 | CODE | |
| LOW | EvoScientist/mcp/client.py | 418 | CODE | |
| LOW | EvoScientist/mcp/client.py | 492 | CODE | |
| LOW | EvoScientist/mcp/client.py | 616 | CODE | |
| LOW | EvoScientist/cli/file_mentions.py | 414 | CODE | |
| LOW | EvoScientist/cli/rich_command_ui.py | 112 | CODE | |
| LOW | EvoScientist/cli/tui_interactive.py | 276 | CODE | |
| 92 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_background_middleware.py | 133 | out = run_in_background.invoke({"command": "cat /etc/hosts && cat ../x"}) | CODE |
| HIGH⚡ | tests/test_background_middleware.py | 135 | assert captured["command"] == "cat /etc/hosts && cat ../x" # no ./ rewrite | CODE |
| HIGH | tests/test_langgraph_dev_workspace_sidecar.py | 83 | '{"workspace": null}', # workspace present but null → Path(None) TypeError | CODE |
| HIGH⚡ | tests/test_backends.py | 110 | result = validate_command("cd /etc && cat passwd") | CODE |
| HIGH⚡ | tests/test_backends.py | 138 | assert validate_command("cd /etc && ls", dangerous=True) is None | CODE |
| HIGH⚡ | tests/test_backends.py | 1281 | "cat /data/file.txt && ssh host 'ls /home/username/project'", | CODE |
| HIGH⚡ | tests/test_backends.py | 1288 | == "cat ./data/file.txt && ssh host 'ls /home/username/project'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1412 | command = "cat /data/file.txt && ssh host 'ls /home/username/project'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1419 | == "cat ./data/file.txt && ssh host 'ls /home/username/project'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1547 | result = validate_command("echo ok && chmod 777 file") | CODE |
| HIGH⚡ | tests/test_backends.py | 1563 | assert validate_command("mkdir build && cd build") is None | CODE |
| HIGH | tests/test_backends.py | 1145 | command = f"mkdir -p {tmp_workspace}/test-sanitized && echo ok" | CODE |
| HIGH | tests/test_backends.py | 1319 | command = "echo __EVOSCI_SSH_REMOTE_0__ && ssh host 'ls /home'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1546 | """chmod after && should be caught.""" | STRING |
| HIGH⚡ | tests/test_backends.py | 1562 | """Normal && chains should be fine.""" | STRING |
| HIGH⚡ | EvoScientist/backends.py | 364 | "for example: ssh host 'cd /home/user/project && python train.py'." | CODE |
| HIGH | EvoScientist/backends.py | 245 | >>> [(i, h, r, e) for _, i, h, r, e in _ssh_invocations("cat x && ssh -p 22 host 'pwd'")] | STRING |
| HIGH | EvoScientist/backends.py | 292 | >>> _ssh_remote_command_spans("cat /tmp/x && ssh host 'pwd'") | STRING |
| HIGH | EvoScientist/middleware/error_normalization.py | 10 | ``{"message": …, "status_code": …, "body": …, "headers": null, | STRING |
| HIGH | EvoScientist/middleware/error_normalization.py | 11 | "raw_response": null, "data": {…}}`` with no ``error`` / ``class`` / | STRING |
| HIGH | EvoScientist/langgraph_dev/manager.py | 215 | ``{"workspace": null}`` or ``{"workspace": []}`` would parse fine, pass | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | EvoScientist/prompts.py | 183 | ## Step 5: Write Report | COMMENT |
| LOW⚡ | EvoScientist/prompts.py | 189 | ## Step 6: Verify | COMMENT |
| LOW | EvoScientist/prompts.py | 105 | ## Step 3: Execute & Debug | COMMENT |
| LOW | EvoScientist/prompts.py | 130 | ## Step 4: Evaluate & Iterate | COMMENT |
| LOW⚡ | EvoScientist/prompts.py | 88 | return "\n".join(["## Step 1: Intake & Scope", *bullets]) | STRING |
| LOW⚡ | EvoScientist/prompts.py | 91 | _EXPERIMENT_WORKFLOW_EXECUTION = """## Step 2: Plan (Recommended Structure) | STRING |
| LOW | EvoScientist/config/onboard/helpers.py | 644 | # Step 1: Validate | COMMENT |
| LOW | EvoScientist/config/onboard/helpers.py | 660 | # Step 2: Offer to install | COMMENT |
| LOW | EvoScientist/skills/find-skills/SKILL.md | 20 | ## Step 1: Search for Skills | COMMENT |
| LOW | EvoScientist/skills/find-skills/SKILL.md | 42 | ## Step 2: Present Options | COMMENT |
| LOW | EvoScientist/skills/find-skills/SKILL.md | 50 | ## Step 3: Install | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 206 | ### Step 1: Spawn all runs (with-skill AND baseline) using `task` tool | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 236 | ### Step 2: While runs are in progress, draft assertions | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 242 | ### Step 3: As runs complete, capture timing data | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 254 | ### Step 4: Grade, aggregate, and launch the viewer | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 287 | ### Step 5: Read the feedback | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 330 | ### Step 1: Generate trigger eval queries | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 347 | ### Step 2: Review with user | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 356 | ### Step 3: Run the optimization loop | COMMENT |
| LOW | EvoScientist/skills/skill-creator/SKILL.md | 377 | ### Step 4: Apply the result | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/grader.md | 21 | ### Step 1: Read the Transcript | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/grader.md | 27 | ### Step 2: Examine Output Files | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/grader.md | 33 | ### Step 3: Evaluate Each Assertion | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/grader.md | 43 | ### Step 4: Extract and Verify Claims | COMMENT |
| LOW | EvoScientist/skills/skill-creator/agents/grader.md | 61 | ### Step 5: Read User Notes | COMMENT |
| LOW | EvoScientist/skills/skill-creator/agents/grader.md | 68 | ### Step 6: Critique the Evals | COMMENT |
| LOW | EvoScientist/skills/skill-creator/agents/grader.md | 81 | ### Step 7: Write Grading Results | COMMENT |
| LOW | EvoScientist/skills/skill-creator/agents/grader.md | 101 | ### Step 8: Read Executor Metrics and Timing | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 22 | ### Step 1: Read Both Outputs | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 29 | ### Step 2: Understand the Task | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 37 | ### Step 3: Generate Evaluation Rubric | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 60 | ### Step 4: Evaluate Each Output Against the Rubric | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 68 | ### Step 5: Check Assertions (if provided) | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 77 | ### Step 6: Determine the Winner | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/comparator.md | 87 | ### Step 7: Write Comparison Results | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 23 | ### Step 1: Read Comparison Result | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 29 | ### Step 2: Read Both Skills | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 39 | ### Step 3: Read Both Transcripts | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 49 | ### Step 4: Analyze Instruction Following | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 59 | ### Step 5: Identify Winner Strengths | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 69 | ### Step 6: Identify Loser Weaknesses | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 77 | ### Step 7: Generate Improvement Suggestions | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 87 | ### Step 8: Write Analysis Results | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 205 | ### Step 1: Read Benchmark Data | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 211 | ### Step 2: Analyze Per-Assertion Patterns | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 220 | ### Step 3: Analyze Cross-Eval Patterns | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 227 | ### Step 4: Analyze Metrics Patterns | COMMENT |
| LOW⚡ | EvoScientist/skills/skill-creator/agents/analyzer.md | 234 | ### Step 5: Generate Notes | COMMENT |
| LOW | EvoScientist/skills/skill-creator/agents/analyzer.md | 249 | ### Step 6: Write Notes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | EvoScientist/__init__.py | 45 | Lazily import and cache package-level attributes. Args: name: The attribute name to look up. Returns: | STRING |
| HIGH | EvoScientist/ccproxy_manager.py | 214 | Start ccproxy serve as a background process. Args: port: Port number for the proxy server. Returns: | STRING |
| HIGH | EvoScientist/middleware/model_fallback.py | 238 | Walk the fallback chain, trying each model until one succeeds. Shared implementation for both sync and async middle | STRING |
| HIGH | EvoScientist/middleware/model_fallback.py | 340 | Check non-fallbackable conditions, then delegate to ``_try_fallbacks``. Args: primary_exc: The exception ra | STRING |
| HIGH | EvoScientist/tools/skill_manager.py | 16 | Manage user-installable skills: install from GitHub or local path, list available skills, browse remote skills, get deta | STRING |
| HIGH | EvoScientist/llm/models.py | 432 | Get a chat model instance. Args: model: Model name (short name like 'claude-sonnet-4-6' or full ID | STRING |
| HIGH | EvoScientist/subagents/_factory.py | 23 | Build a deployable graph for the ``name`` sub-agent defined in yaml. Args: name: The sub-agent's key in one | STRING |
| HIGH | EvoScientist/config/settings.py | 612 | Coerce a value to the expected field type. Args: value: The value to coerce. field_type: The target | STRING |
| HIGH | EvoScientist/langgraph_dev/manager.py | 552 | Start langgraph dev as a background subprocess. Args: workspace_dir: Working directory for the subprocess ( | STRING |
| HIGH | EvoScientist/commands/implementation/model.py | 10 | Parse model name and provider from argument list. Args: args: Non-empty argument list (model_name [provider | STRING |
| HIGH | EvoScientist/channels/imessage/targets.py | 150 | Parse an iMessage target string. Supports formats: - chat_id:123 - chat_guid:abc-def - chat_identifier: | STRING |
| HIGH | EvoScientist/channels/imessage/rpc_client.py | 127 | Send a JSON-RPC request and wait for response. Args: method: RPC method name params: Me | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_langgraph_manager.py | 279 | # ensure_langgraph_dev — high-level orchestration | COMMENT |
| MEDIUM | …erature/SIGIR2026_public_arxiv_systematic_survey_zh.md | 126 | ## 5. Search Agents、RAG 与推理:从单轮检索到轨迹级策略学习 | COMMENT |
| MEDIUM | …erature/SIGIR2026_public_arxiv_systematic_survey_zh.md | 148 | ### 5.4 长视频与时空 grounding 说明 agentic reasoning 已跨出文本 | COMMENT |
| MEDIUM | …erature/SIGIR2026_public_arxiv_systematic_survey_en.md | 128 | ## 5. Search Agents, RAG, and Reasoning: From Single-Turn Retrieval to Trajectory-Level Policy Learning | COMMENT |
| MEDIUM | EvoScientist/sessions.py | 652 | # a multi-agent DB where a third-party tool shares the same | COMMENT |
| MEDIUM | EvoScientist/backends.py | 31 | # If the agent hallucinates an absolute system path, we block it. | COMMENT |
| MEDIUM⚡ | EvoScientist/ccproxy_manager.py | 332 | # High-level orchestration | COMMENT |
| MEDIUM | EvoScientist/middleware/code_interpreter.py | 69 | # Multi-agent orchestration is the killer use case: ``Promise.all`` over | COMMENT |
| MEDIUM⚡ | EvoScientist/langgraph_dev/manager.py | 897 | # High-level orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_stt.py | 261 | # EvoSci config set stt_enabled true | COMMENT |
| LOW | EvoScientist/EvoScientist.py | 61 | # _ensure_config(new_cfg) has overwritten the active config — causing | COMMENT |
| LOW | EvoScientist/llm/context_window.py | 41 | # Order matters — first match wins; put more specific patterns first. | COMMENT |
| LOW | EvoScientist/llm/models.py | 121 | _FALSEY_ENV_VALUES = {"0", "false", "no", "off"} | COMMENT |
| LOW | EvoScientist/llm/models.py | 501 | if _is_openai_proxy: | COMMENT |
| LOW | EvoScientist/llm/models.py | 561 | COMMENT | |
| LOW | EvoScientist/llm/patches.py | 741 | # ``{"description": docstring}`` — the endpoint still ends up in the | COMMENT |
| LOW | EvoScientist/llm/patches.py | 781 | _langgraph_schema_silenced_patched = True | COMMENT |
| LOW | EvoScientist/llm/patches.py | 921 | # Empty-string fallback for ALL DeepSeek models (not just | COMMENT |
| LOW | EvoScientist/llm/patches.py | 941 | # Without this, async sub-agents stay on the model their graph was compiled | COMMENT |
| LOW | EvoScientist/llm/errors.py | 101 | for. | COMMENT |
| LOW | EvoScientist/llm/errors.py | 161 | # Kept here rather than imported from ``models.py`` to keep the | COMMENT |
| LOW | EvoScientist/subagents/_factory.py | 81 | COMMENT | |
| LOW | EvoScientist/config/settings.py | 181 | # LLM Settings | COMMENT |
| LOW | EvoScientist/config/settings.py | 201 | enable_async_subagents: bool = True | COMMENT |
| LOW | EvoScientist/config/settings.py | 221 | # back to UTC if it can't be determined; set e.g. "Europe/London" to pin one. | COMMENT |
| LOW | EvoScientist/config/settings.py | 241 | # each count as 1) before raising GraphRecursionError. Resets on every | COMMENT |
| LOW | EvoScientist/config/settings.py | 281 | # Workspace Settings | COMMENT |
| LOW | EvoScientist/config/settings.py | 421 | COMMENT | |
| LOW | EvoScientist/mcp/client.py | 21 | COMMENT | |
| LOW | EvoScientist/mcp/client.py | 101 | # ============================================================================= | COMMENT |
| LOW | EvoScientist/cli/async_notifier.py | 61 | # drains for any current_thread_id (back-compat for direct callers). | COMMENT |
| LOW | EvoScientist/cli/tui_interactive.py | 701 | # whose workspace differs from the one the langgraph dev | COMMENT |
| LOW | EvoScientist/cli/channel.py | 461 | COMMENT | |
| LOW | EvoScientist/cli/interactive.py | 761 | # in a worker thread so the asyncio event loop keeps | COMMENT |
| LOW | EvoScientist/cli/commands.py | 1541 | console.print("[dim]Press Ctrl+C to stop.[/dim]\n") | COMMENT |
| LOW | EvoScientist/langgraph_dev/__init__.py | 21 | # loop that serves runs. Forcing the Proactor loop policy here — at import, | COMMENT |
| LOW | EvoScientist/langgraph_dev/main_graph.py | 21 | from langgraph.graph.state import CompiledStateGraph | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 241 | COMMENT | |
| LOW | EvoScientist/langgraph_dev/manager.py | 261 | _PROCESS_WORKSPACE: Path | None = None | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 481 | _unlink_workspace_sidecar() | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 601 | # (a) Our own previous langgraph dev (PID matches RUNTIME.pid_file) — kill it. | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 621 | # is genuinely free so the upcoming bind() doesn't race a | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 661 | # scans lines this subprocess writes — never a stale URL left in the | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 681 | sub_env["EVOSCIENTIST_WORKSPACE_DIR"] = str(workspace_dir) | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 701 | # ``EvoSci`` / ``EvoSci serve``. The CLI's main agent already loaded | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 921 | background workers will fail. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_skills_manager.py | 748 | # Create a fake repo structure | COMMENT |
| MEDIUM | tests/test_event_loop.py | 181 | # Create a fresh loop | COMMENT |
| MEDIUM | tests/test_sessions.py | 2817 | # Create a valid but empty SQLite DB (no checkpoints table). | COMMENT |
| MEDIUM⚡ | tests/test_mcp_client.py | 1300 | # Create a fake executable in a temp bin dir | COMMENT |
| MEDIUM | tests/test_mcp_client.py | 124 | # Create a fake executable next to sys.executable | COMMENT |
| MEDIUM | tests/test_channel_debug.py | 177 | # Create a minimal concrete channel | COMMENT |
| MEDIUM | EvoScientist/utils.py | 91 | # Create a formatted display of the prompt | COMMENT |
| MEDIUM | EvoScientist/channels/standalone.py | 96 | # Create a lightweight manager for the consumer to use | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | EvoScientist/tools/skills_manager.py | 500 | # Check if local path exists | COMMENT |
| LOW | EvoScientist/tools/skills_manager.py | 815 | # Check if it's a built-in skill (read-only, cannot be uninstalled) | COMMENT |
| LOW | EvoScientist/config/settings.py | 197 | # Set False to run fully in-process — saves the startup cost in scenarios | COMMENT |
| LOW | EvoScientist/config/onboard/steps.py | 1288 | # Check if any selected servers require npx | COMMENT |
| LOW | EvoScientist/stream/display.py | 853 | # Check if any sub-agent is active | COMMENT |
| LOW | EvoScientist/mcp/client.py | 682 | # Check if any pattern contains wildcard characters | COMMENT |
| LOW | EvoScientist/commands/implementation/mcp_install.py | 70 | # Check if it's a tag — fall through to browser | COMMENT |
| LOW | EvoScientist/skills/skill-creator/scripts/run_eval.py | 88 | # Check if the model called load_skill with the right skill name | COMMENT |
| LOW | EvoScientist/skills/skill-creator/scripts/init_skill.py | 207 | # Check if directory already exists | COMMENT |
| LOW | EvoScientist/channels/middleware.py | 275 | # Check if already has pending request | COMMENT |
| LOW | EvoScientist/channels/imessage/targets.py | 185 | # Check if remainder is a chat target | COMMENT |
| LOW | EvoScientist/channels/imessage/rpc_client.py | 214 | # Check if it's a response (has id) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_cli_serve.py | 12 | CODE | |
| LOW | tests/test_cli_serve.py | 46 | CODE | |
| LOW | tests/fakes.py | 207 | CODE | |
| LOW | tests/test_cli_deploy.py | 23 | CODE | |
| LOW | tests/test_cli_deploy.py | 67 | CODE | |
| LOW | EvoScientist/middleware/memory.py | 611 | CODE | |
| LOW | EvoScientist/middleware/memory.py | 231 | CODE | |
| LOW | EvoScientist/stream/display.py | 517 | CODE | |
| LOW | EvoScientist/stream/display.py | 1282 | CODE | |
| LOW | EvoScientist/cli/tui_runtime.py | 66 | CODE | |
| LOW | EvoScientist/cli/tui_interactive.py | 1282 | CODE | |
| LOW | EvoScientist/cli/tui_backends.py | 18 | CODE | |
| LOW | EvoScientist/cli/tui_backends.py | 46 | CODE | |
| LOW | EvoScientist/cli/interactive.py | 331 | CODE | |
| LOW | EvoScientist/cli/commands.py | 75 | CODE | |
| LOW | EvoScientist/cli/commands.py | 2026 | CODE | |
| LOW | EvoScientist/cli/commands.py | 408 | CODE | |
| LOW | EvoScientist/channels/mixins.py | 141 | CODE | |
| LOW | EvoScientist/channels/consumer.py | 208 | CODE | |
| LOW | EvoScientist/channels/dingtalk/channel.py | 319 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_background_middleware.py | 0 | cross-platform command that sleeps for *seconds* and exits 0. | STRING |
| HIGH | tests/test_background.py | 0 | cross-platform command that sleeps for *seconds* and exits 0. | STRING |
| HIGH | tests/test_backends.py | 0 | cross-platform command that sleeps for *seconds* and exits 0. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | EvoScientist/prompts.py | 183 | ## Step 5: Write Report | COMMENT |
| LOW⚡ | EvoScientist/prompts.py | 189 | ## Step 6: Verify | COMMENT |
| LOW | EvoScientist/prompts.py | 105 | ## Step 3: Execute & Debug | COMMENT |
| LOW | EvoScientist/prompts.py | 130 | ## Step 4: Evaluate & Iterate | COMMENT |
| LOW⚡ | EvoScientist/prompts.py | 88 | return "\n".join(["## Step 1: Intake & Scope", *bullets]) | STRING |
| LOW⚡ | EvoScientist/prompts.py | 91 | _EXPERIMENT_WORKFLOW_EXECUTION = """## Step 2: Plan (Recommended Structure) | STRING |
| LOW | EvoScientist/config/onboard/helpers.py | 644 | # Step 1: Validate | COMMENT |
| LOW | EvoScientist/config/onboard/helpers.py | 660 | # Step 2: Offer to install | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_dingtalk_channel.py | 128 | channel._access_token = "fake-token" | CODE |
| LOW⚡ | tests/test_dingtalk_channel.py | 250 | channel._access_token = "fake-token" | CODE |
| LOW⚡ | tests/test_feishu_channel.py | 553 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 198 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 342 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 360 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 617 | channel._access_token = "fake-token" | CODE |
| LOW⚡ | tests/test_additional_channel_smoke.py | 27 | chat_id="user@example.com", | CODE |
| LOW⚡ | tests/test_additional_channel_smoke.py | 29 | metadata={"chat_id": "user@example.com"}, | CODE |
| LOW | EvoScientist/config/onboard/helpers.py | 157 | kwargs["placeholder"] = placeholder | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_llm.py | 2188 | # Should not raise, just return the payload as-is | COMMENT |
| MEDIUM | tests/test_langgraph_dev_http.py | 112 | # Ollama suffix — robust to future static Ollama entries in the registry. | COMMENT |
| MEDIUM⚡ | EvoScientist/llm/patches.py | 803 | # azure-ignore is not sufficient). The only robust fix is to drop these items | COMMENT |
| LOW | EvoScientist/cli/tui_interactive.py | 2164 | # errors; callers just return so the send is dropped. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_llm.py | 1939 | CODE | |
| MEDIUM | tests/test_async_notifier.py | 96 | CODE | |
| MEDIUM | tests/test_async_notifier.py | 964 | CODE |