🔬 Harness Vibe Research with Self-evolving AI Scientists
This report presents the forensic synthetic code analysis of EvoScientist/EvoScientist, a Python project with 4,529 GitHub stars. SynthScan v2.0 examined 158,066 lines of code across 458 source files, recording 5680 pattern matches distributed across 19 syntactic categories. The overall adjusted score of 50.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 5680 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 | 102 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 104 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 331 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 333 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 374 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 376 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 432 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 434 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 578 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 580 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 623 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 625 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 710 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 712 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 923 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hitl.py | 925 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_hitl.py | 798 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_hitl.py | 800 | # ============================================================================= | 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 |
| 941 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 | 108 | def test_empty_requests_auto_approves(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 114 | def test_session_auto_approve(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 337 | def test_auto_approve_default(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 367 | def test_shell_allow_list_set(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 380 | async def test_interrupt_from_updates_mode(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 438 | def test_parse_approval_approve(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 444 | def test_parse_approval_reject(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 489 | def test_should_auto_approve_non_execute(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 494 | def test_should_auto_approve_empty(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 499 | def test_should_auto_approve_execute_no_allowlist(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 588 | async def test_register_and_resolve_reply(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 629 | def test_prompt_fn_called_for_execute(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 718 | def test_hitl_interrupt_on_helper_gates_on_auto_approve(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 723 | def test_hitl_interrupt_on_helper_returns_shell_tools(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 934 | def test_dangerous_is_approved_under_session_grant(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 1022 | def test_async_factory_guards_research_agents(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 1030 | def test_async_factory_does_not_guard_internal_agents(self): | CODE |
| LOW⚡ | tests/test_hitl.py | 1040 | def test_delegation_prompt_explains_blocked_command_relay(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 | 156 | def test_non_execute_tool_auto_approves(self): | CODE |
| LOW | tests/test_hitl.py | 181 | def test_execute_with_matching_allow_list(self): | CODE |
| LOW | tests/test_hitl.py | 206 | def test_execute_not_in_allow_list_prompts(self): | CODE |
| LOW | tests/test_hitl.py | 236 | def test_run_in_background_not_in_allow_list_prompts(self): | CODE |
| LOW | tests/test_hitl.py | 270 | def test_run_in_background_in_allow_list_auto_approves(self): | CODE |
| LOW | tests/test_hitl.py | 299 | def test_delete_only_request_prompts_not_auto_approved(self): | CODE |
| LOW | tests/test_hitl.py | 349 | def test_shell_allow_list_default(self): | CODE |
| LOW | tests/test_hitl.py | 417 | async def test_updates_without_interrupt_skipped(self): | CODE |
| LOW | tests/test_hitl.py | 456 | def test_parse_approval_unrecognized(self): | CODE |
| LOW | tests/test_hitl.py | 463 | def test_format_approval_prompt(self): | CODE |
| LOW | tests/test_hitl.py | 477 | def test_format_approval_prompt_multiple(self): | CODE |
| LOW | tests/test_hitl.py | 516 | 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 | 546 | def test_should_auto_approve_allowlist_match(self): | CODE |
| LOW | tests/test_hitl.py | 561 | def test_should_auto_approve_delete_not_cleared(self): | CODE |
| LOW | tests/test_hitl.py | 604 | def test_try_resolve_no_pending(self): | CODE |
| LOW | tests/test_hitl.py | 612 | async def test_reply_timeout_returns_none(self): | CODE |
| LOW | tests/test_hitl.py | 658 | def test_prompt_fn_not_called_for_auto_approve(self): | CODE |
| LOW | tests/test_hitl.py | 685 | def test_prompt_fn_not_called_for_non_execute(self): | CODE |
| LOW | tests/test_hitl.py | 734 | def test_auto_mode_implies_auto_approve_so_nothing_is_armed(self): | CODE |
| LOW | tests/test_hitl.py | 745 | def test_hitl_interrupt_on_reaches_create_deep_agent(self): | CODE |
| LOW | tests/test_hitl.py | 816 | def test_dangerous_command_rejected_under_auto_approve(self, monkeypatch): | CODE |
| LOW | tests/test_hitl.py | 836 | def test_everyday_command_approved_under_auto_approve(self, monkeypatch): | CODE |
| LOW | tests/test_hitl.py | 848 | def test_session_grant_blanket_approves_dangerous(self, monkeypatch): | CODE |
| LOW | tests/test_hitl.py | 862 | def test_interactive_dangerous_calls_prompt(self, monkeypatch): | CODE |
| LOW | tests/test_hitl.py | 882 | def test_schedule_task_always_prompts_not_auto_cleared(self, monkeypatch): | CODE |
| LOW | tests/test_hitl.py | 905 | def test_malformed_request_is_not_auto_approved(self, monkeypatch): | CODE |
| LOW | tests/test_hitl.py | 950 | def test_length_matches_all_approved(self): | CODE |
| LOW | tests/test_hitl.py | 961 | def test_empty_batch_returns_empty(self): | CODE |
| LOW | tests/test_hitl.py | 972 | def test_get_default_backend_applies_forced_guard(self): | CODE |
| LOW | tests/test_hitl.py | 983 | def test_get_default_backend_defaults_to_config_auto_approve(self): | CODE |
| LOW | tests/test_hitl.py | 1052 | def test_build_hitl_resume_is_id_keyed(self): | CODE |
| LOW | tests/test_hitl.py | 1058 | def test_two_parallel_subagent_interrupts_drain_without_crash(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 |
| 3102 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 | 117 | except Exception: | CODE |
| LOW | tests/test_background_middleware.py | 60 | 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 | 758 | except Exception as exc: | CODE |
| LOW | EvoScientist/sessions.py | 1814 | except Exception: | CODE |
| LOW | EvoScientist/sessions.py | 1876 | except Exception: | CODE |
| LOW⚡ | EvoScientist/sessions.py | 1380 | except Exception: | STRING |
| LOW | EvoScientist/sessions.py | 1320 | except Exception: # pragma: no cover - never let UI break sweep | STRING |
| LOW | EvoScientist/sessions.py | 1565 | except Exception: | STRING |
| LOW | EvoScientist/sessions.py | 1704 | 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 | 1336 | except Exception: | CODE |
| LOW | EvoScientist/backends.py | 1349 | except Exception: | CODE |
| LOW | EvoScientist/backends.py | 1766 | except Exception as exc: | 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/expert_async_subagent.py | 160 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/expert_async_subagent.py | 187 | 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 | 98 | except Exception: | CODE |
| LOW | EvoScientist/middleware/memory.py | 467 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/memory.py | 484 | except Exception as e: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 261 | except Exception as fb_exc: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 331 | except Exception as fb_exc: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 458 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 476 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 92 | except Exception: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 213 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 262 | 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 | 318 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/error_normalization.py | 331 | except Exception as exc: | CODE |
| LOW | EvoScientist/middleware/background.py | 31 | except Exception: | CODE |
| LOW | EvoScientist/middleware/active_team.py | 76 | except Exception: | CODE |
| LOW | EvoScientist/middleware/active_team.py | 108 | except Exception: | CODE |
| LOW | EvoScientist/middleware/active_team.py | 112 | except Exception: | CODE |
| LOW | EvoScientist/middleware/utils.py | 61 | 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 |
| 457 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_middleware_utils.py | 8 | 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 | 241 | CODE | |
| LOW | tests/test_wechat_channel.py | 246 | 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_route_async_specs.py | 13 | CODE | |
| LOW | tests/test_observation_memory.py | 1 | CODE | |
| LOW | tests/test_active_team_middleware.py | 3 | CODE | |
| LOW | tests/test_cli_async_runtime.py | 9 | 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_picker_widgets.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_command_goto_none_crash.py | 35 | CODE | |
| LOW | tests/test_command_goto_none_crash.py | 48 | CODE | |
| LOW | tests/test_expert_container.py | 3 | CODE | |
| LOW | tests/test_tui_completion_window.py | 11 | 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_runtime.py | 3 | CODE | |
| LOW | tests/test_mcp_client.py | 392 | CODE | |
| LOW | tests/test_mcp_client.py | 615 | CODE | |
| LOW | tests/test_graph_gateway.py | 3 | CODE | |
| LOW | tests/test_experts_command.py | 3 | CODE | |
| LOW | tests/test_middleware_event_sink.py | 11 | 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_panel_widget.py | 10 | 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/test_channel_sends.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_webui_launcher.py | 11 | CODE | |
| LOW | tests/test_status_bar.py | 3 | CODE | |
| LOW | tests/test_expert_async_subagent.py | 3 | CODE | |
| 413 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_background_middleware.py | 131 | out = _run_bg(dangerous=True).invoke({"command": "cat /etc/hosts && cat ../x"}) | CODE |
| HIGH⚡ | tests/test_background_middleware.py | 133 | 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 | 113 | result = validate_command("cd /etc && cat passwd") | CODE |
| HIGH⚡ | tests/test_backends.py | 141 | assert validate_command("cd /etc && ls", dangerous=True) is None | CODE |
| HIGH⚡ | tests/test_backends.py | 1356 | "cat /data/file.txt && ssh host 'ls /home/username/project'", | CODE |
| HIGH⚡ | tests/test_backends.py | 1363 | == "cat ./data/file.txt && ssh host 'ls /home/username/project'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1497 | command = "cat /data/file.txt && ssh host 'ls /home/username/project'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1504 | == "cat ./data/file.txt && ssh host 'ls /home/username/project'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1710 | result = validate_command("echo ok && chmod 777 file") | CODE |
| HIGH⚡ | tests/test_backends.py | 1726 | assert validate_command("mkdir build && cd build") is None | CODE |
| HIGH⚡ | tests/test_backends.py | 2063 | assert check_dangerous_command("a || bash") is None | CODE |
| HIGH⚡ | tests/test_backends.py | 2064 | assert check_dangerous_command("a && bash") is None | CODE |
| HIGH⚡ | tests/test_backends.py | 2152 | "ls -la && curl http://x -o y", | CODE |
| HIGH⚡ | tests/test_backends.py | 2153 | "ls -la || rm x", | CODE |
| HIGH | tests/test_backends.py | 1210 | command = f"mkdir -p {tmp_workspace}/test-sanitized && echo ok" | CODE |
| HIGH | tests/test_backends.py | 1398 | command = "echo __EVOSCI_SSH_REMOTE_0__ && ssh host 'ls /home'" | CODE |
| HIGH⚡ | tests/test_backends.py | 1709 | """chmod after && should be caught.""" | STRING |
| HIGH⚡ | tests/test_backends.py | 1725 | """Normal && chains should be fine.""" | STRING |
| HIGH⚡ | EvoScientist/backends.py | 632 | "for example: ssh host 'cd /home/user/project && python train.py'." | CODE |
| HIGH | EvoScientist/backends.py | 379 | a chain (``a; b``, ``a && b``, ``a | b``) must match, so an allow-listed | STRING |
| HIGH | EvoScientist/backends.py | 513 | >>> [(i, h, r, e) for _, i, h, r, e in _ssh_invocations("cat x && ssh -p 22 host 'pwd'")] | STRING |
| HIGH | EvoScientist/backends.py | 560 | >>> _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 | 269 | ``{"workspace": null}`` or ``{"workspace": []}`` would parse fine, pass | STRING |
| 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 | 1165 | async def _set_user_version(conn: aiosqlite.Connection, version: int) -> None: | STRING |
| LOW⚡ | EvoScientist/EvoScientist.py | 103 | def set_active_config(cfg) -> None: | CODE |
| LOW | EvoScientist/EvoScientist.py | 231 | 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/runtime.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/runtime.py | 217 | def _settle_abandoned_tasks(self) -> None: | CODE |
| LOW | EvoScientist/runtime.py | 314 | def _set_handle_result(handle: RuntimeHandle[Any], result: Any) -> None: | CODE |
| LOW | EvoScientist/runtime.py | 321 | def _set_handle_exception(handle: RuntimeHandle[Any], exc: BaseException) -> None: | CODE |
| LOW | EvoScientist/runtime.py | 559 | __all__ = [ | 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/code_interpreter.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/async_watcher.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/memory.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/model_fallback.py | 77 | def set_fallback_chain(chain: list[tuple[str, str]]) -> None: | CODE |
| LOW | EvoScientist/middleware/tool_selector.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/configurable_model.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/__init__.py | 43 | __all__ = [ | CODE |
| LOW⚡ | EvoScientist/middleware/ask_user.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | EvoScientist/middleware/tool_history_repair.py | 45 | 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/llm/deepseek.py | 15 | logger = logging.getLogger(__name__) | 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 | 47 | __all__ = [ | CODE |
| LOW | EvoScientist/config/onboard/__init__.py | 34 | __all__ = ["run_onboard"] | CODE |
| LOW | EvoScientist/deploy/__init__.py | 22 | __all__ = ["server"] | CODE |
| LOW | EvoScientist/stream/sink.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | EvoScientist/mcp/registry.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | EvoScientist/mcp/client.py | 26 | 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 | 3373 | def _set_status_usage_baseline(self, input_tokens: int) -> None: | CODE |
| LOW | EvoScientist/cli/tui_interactive.py | 3384 | def update_status_after_compact(self, tokens_after: int) -> None: | CODE |
| LOW | EvoScientist/cli/tui_interactive.py | 3410 | def _set_status_streaming_text(self, text: str | None) -> None: | CODE |
| LOW | EvoScientist/cli/channel.py | 107 | def _set_channel_response(msg_id: str, response: str) -> None: | CODE |
| LOW | EvoScientist/cli/__init__.py | 15 | __all__ = [ | CODE |
| LOW | EvoScientist/cli/interactive.py | 592 | 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 |
| 75 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_hitl.py | 745 | CODE | |
| LOW | tests/test_async_watcher_middleware.py | 18 | CODE | |
| LOW | EvoScientist/sessions.py | 465 | CODE | |
| LOW | EvoScientist/sessions.py | 591 | CODE | |
| LOW | EvoScientist/sessions.py | 1580 | CODE | |
| LOW | EvoScientist/background.py | 234 | CODE | |
| LOW | EvoScientist/runtime.py | 456 | CODE | |
| LOW | EvoScientist/backends.py | 164 | CODE | |
| LOW | EvoScientist/backends.py | 304 | CODE | |
| LOW | EvoScientist/backends.py | 715 | CODE | |
| LOW | EvoScientist/backends.py | 987 | CODE | |
| LOW | EvoScientist/backends.py | 1022 | CODE | |
| LOW | EvoScientist/backends.py | 1053 | CODE | |
| LOW | EvoScientist/backends.py | 1303 | CODE | |
| LOW | EvoScientist/backends.py | 1534 | CODE | |
| LOW | EvoScientist/backends.py | 1637 | CODE | |
| LOW | EvoScientist/utils.py | 43 | CODE | |
| LOW | EvoScientist/utils.py | 85 | CODE | |
| LOW | EvoScientist/ccproxy_manager.py | 55 | CODE | |
| LOW | EvoScientist/middleware/tool_selector.py | 71 | CODE | |
| LOW | EvoScientist/middleware/error_normalization.py | 64 | CODE | |
| LOW | EvoScientist/middleware/ask_user.py | 245 | CODE | |
| LOW | EvoScientist/middleware/tool_history_repair.py | 60 | CODE | |
| LOW | EvoScientist/middleware/tool_history_repair.py | 156 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 835 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 996 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 1167 | CODE | |
| LOW | EvoScientist/tools/skill_manager.py | 10 | CODE | |
| LOW | EvoScientist/llm/models.py | 327 | CODE | |
| LOW | EvoScientist/llm/patches.py | 50 | CODE | |
| LOW | EvoScientist/llm/patches.py | 94 | CODE | |
| LOW | EvoScientist/llm/patches.py | 355 | CODE | |
| LOW | EvoScientist/llm/patches.py | 392 | CODE | |
| LOW | EvoScientist/llm/patches.py | 866 | CODE | |
| LOW | EvoScientist/llm/patches.py | 1249 | CODE | |
| LOW | EvoScientist/memory/autoskills/candidates.py | 124 | CODE | |
| LOW | EvoScientist/config/onboard/steps.py | 1108 | CODE | |
| LOW | EvoScientist/config/onboard/wizard.py | 67 | CODE | |
| LOW | EvoScientist/config/onboard/wizard.py | 156 | CODE | |
| LOW | EvoScientist/config/onboard/wizard.py | 479 | CODE | |
| LOW | EvoScientist/config/onboard/channels.py | 25 | CODE | |
| LOW | EvoScientist/config/onboard/channels.py | 828 | CODE | |
| LOW | EvoScientist/config/onboard/channels.py | 848 | CODE | |
| LOW | EvoScientist/config/onboard/helpers.py | 366 | CODE | |
| LOW | EvoScientist/config/onboard/helpers.py | 661 | CODE | |
| LOW | EvoScientist/deploy/webui.py | 48 | CODE | |
| LOW | EvoScientist/stream/events.py | 804 | CODE | |
| LOW | EvoScientist/stream/events.py | 858 | CODE | |
| LOW | EvoScientist/stream/events.py | 569 | CODE | |
| LOW | EvoScientist/stream/display.py | 277 | CODE | |
| LOW | EvoScientist/stream/display.py | 651 | CODE | |
| LOW | EvoScientist/stream/display.py | 1035 | CODE | |
| LOW | EvoScientist/stream/display.py | 1313 | CODE | |
| LOW | EvoScientist/stream/display.py | 1431 | CODE | |
| LOW | EvoScientist/stream/display.py | 1524 | 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 | |
| 110 more matches not shown… | ||||
| 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 | 667 | # Step 1: Validate | COMMENT |
| LOW | EvoScientist/config/onboard/helpers.py | 683 | # 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 | 207 | 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 | 383 | Check non-fallbackable conditions, then delegate to ``_try_fallbacks``. Args: primary_exc: The exception ra | STRING |
| HIGH | EvoScientist/tools/skill_manager.py | 18 | Manage user-installable skills: install from GitHub or local path, list available skills, browse remote skills, get deta | STRING |
| HIGH | EvoScientist/llm/models.py | 332 | 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 | 27 | 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 | 672 | 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 | 800 | 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 |
|---|---|---|---|---|
| LOW | tests/test_stt.py | 261 | # EvoSci config set stt_enabled true | COMMENT |
| LOW | EvoScientist/sessions.py | 1301 | # have threads where the latest N checkpoints sit ABOVE a | COMMENT |
| LOW | EvoScientist/sessions.py | 1621 | try: | COMMENT |
| LOW | EvoScientist/EvoScientist.py | 81 | # tool selector). Cached separately from the main model; falls back to the main | COMMENT |
| LOW | EvoScientist/EvoScientist.py | 601 | # only when the yaml-async spec list is non-empty. An expert-only setup | COMMENT |
| LOW | EvoScientist/EvoScientist.py | 621 | # expert name, no notification is enqueued, and the main agent never | COMMENT |
| LOW | EvoScientist/middleware/expert_async_subagent.py | 241 | COMMENT | |
| LOW | EvoScientist/middleware/tool_selector.py | 301 | from langchain.agents.middleware import LLMToolSelectorMiddleware | COMMENT |
| LOW | EvoScientist/tools/skills_manager.py | 121 | # SKILL.md body (post-frontmatter). Populated by ``_parse_skill_md`` so | COMMENT |
| LOW | EvoScientist/tools/skills_manager.py | 161 | body = content[match.end() :].lstrip() | COMMENT |
| LOW | EvoScientist/llm/context_window.py | 41 | # Tencent Hunyuan HY3 — 262K context (OpenRouter ``tencent/hy3``). | COMMENT |
| LOW | EvoScientist/llm/models.py | 401 | if _is_openai_proxy: | COMMENT |
| LOW | EvoScientist/llm/models.py | 461 | # Moonshot: disable thinking for pre-K3 models to prevent LangChain from | COMMENT |
| LOW | EvoScientist/llm/models.py | 481 | # so enabling `summary` is safe. See langchain-ai/langchain#37777. | COMMENT |
| LOW | EvoScientist/llm/patches.py | 81 | _patch_anthropic_proxy_compat() | COMMENT |
| LOW | EvoScientist/llm/patches.py | 781 | # Patch (module-level): silence langgraph_api's OpenAPI schema-generation | COMMENT |
| LOW | EvoScientist/llm/patches.py | 841 | # Patch (lazy, Anthropic protocol): strip foreign reasoning blocks from | COMMENT |
| LOW | EvoScientist/llm/patches.py | 961 | COMMENT | |
| LOW | EvoScientist/llm/patches.py | 1061 | # --------------------------------------------------------------------------- | 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 | # ``mcp.yaml``. Use the cached helper so multiple ``build_async_subagent_graph`` | COMMENT |
| LOW | EvoScientist/subagents/expert_container_async.py | 321 | _get_default_middleware, | COMMENT |
| LOW | EvoScientist/memory/observations/store.py | 361 | for document, entries in parsed | COMMENT |
| LOW | EvoScientist/config/settings.py | 201 | # non-blocking via AsyncSubAgent. Currently affects writing-agent and | COMMENT |
| LOW | EvoScientist/config/settings.py | 221 | # so widening never redirects their traffic off-box. | COMMENT |
| LOW | EvoScientist/config/settings.py | 241 | # Empty string => the host's local IANA zone (resolved via tzlocal), falling | COMMENT |
| LOW | EvoScientist/config/settings.py | 261 | # Keep the auto-started langgraph dev subprocess running after the CLI | COMMENT |
| LOW | EvoScientist/config/settings.py | 281 | recursion_limit: int = 1_000_000 | COMMENT |
| LOW | EvoScientist/config/settings.py | 321 | default_workdir: str = "" | COMMENT |
| LOW | EvoScientist/config/settings.py | 461 | enable_ask_user: bool = True # Enable ask_user tool for agent-initiated questions | COMMENT |
| LOW | EvoScientist/config/settings.py | 921 | """ | COMMENT |
| LOW | EvoScientist/config/onboard/wizard.py | 561 | f"bytes ({exc}); revert will fall back to a re-serialized " | COMMENT |
| LOW | EvoScientist/config/onboard/wizard.py | 601 | # we re-snapped here, declining the save after Reset would | 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/channel.py | 481 | COMMENT | |
| LOW | EvoScientist/cli/interactive.py | 821 | async def _on_handle_session_resume( | 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 | 301 | # Shell B blocks until Shell A's health-check finishes, then sees the | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 321 | _LOG_OFFSET_AT_START: int = 0 | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 841 | config_file = _packaged_langgraph_config() | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 901 | RUNTIME.pid_dir.mkdir(parents=True, exist_ok=True) | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 921 | COMMENT | |
| LOW | EvoScientist/langgraph_dev/manager.py | 941 | # who want a clean workspace can opt out via: | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 961 | # MCP normally; async sub-agents stay disabled (no langgraph dev | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 1201 | """ | COMMENT |
| LOW | EvoScientist/langgraph_dev/manager.py | 1281 | if is_langgraph_dev_running(port=port, host=host): | COMMENT |
| LOW | .github/workflows/publish.yml | 1 | name: Publish to PyPI | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_langgraph_manager.py | 404 | # 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 | 696 | # a multi-agent DB where a third-party tool shares the same | COMMENT |
| MEDIUM | EvoScientist/backends.py | 43 | # 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 | 122 | # Multi-agent orchestration is the killer use case: ``Promise.all`` over | COMMENT |
| MEDIUM⚡ | EvoScientist/langgraph_dev/manager.py | 1176 | # High-level orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_skills_manager.py | 768 | # Create a fake repo structure | COMMENT |
| MEDIUM | tests/test_sessions.py | 2831 | # Create a valid but empty SQLite DB (no checkpoints table). | COMMENT |
| MEDIUM⚡ | tests/test_mcp_client.py | 1693 | # Create a fake executable in a temp bin dir | COMMENT |
| MEDIUM | tests/test_mcp_client.py | 131 | # Create a fake executable next to sys.executable | COMMENT |
| MEDIUM | tests/test_channel_debug.py | 178 | # Create a minimal concrete channel | COMMENT |
| MEDIUM | EvoScientist/utils.py | 113 | # Create a formatted display of the prompt | COMMENT |
| MEDIUM | EvoScientist/channels/standalone.py | 103 | # Create a lightweight manager for the consumer to use | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_cli_serve.py | 14 | CODE | |
| LOW | tests/test_cli_serve.py | 49 | CODE | |
| LOW | tests/fakes.py | 207 | CODE | |
| LOW | tests/test_cli_deploy.py | 24 | CODE | |
| LOW | tests/test_cli_deploy.py | 70 | CODE | |
| LOW | tests/test_cli_deploy.py | 128 | CODE | |
| LOW | EvoScientist/backends.py | 1476 | CODE | |
| LOW | EvoScientist/middleware/memory.py | 620 | CODE | |
| LOW | EvoScientist/middleware/memory.py | 231 | CODE | |
| LOW | EvoScientist/tools/skills_manager.py | 467 | CODE | |
| LOW | EvoScientist/stream/display.py | 651 | CODE | |
| LOW | EvoScientist/stream/display.py | 1431 | CODE | |
| LOW | EvoScientist/cli/tui_runtime.py | 107 | CODE | |
| LOW | EvoScientist/cli/tui_interactive.py | 1531 | CODE | |
| LOW | EvoScientist/cli/tui_backends.py | 21 | CODE | |
| LOW | EvoScientist/cli/tui_backends.py | 51 | CODE | |
| LOW | EvoScientist/cli/interactive.py | 391 | CODE | |
| LOW | EvoScientist/cli/commands.py | 113 | CODE | |
| LOW | EvoScientist/cli/commands.py | 1442 | CODE | |
| LOW | EvoScientist/cli/commands.py | 2110 | CODE | |
| LOW | EvoScientist/cli/commands.py | 454 | CODE | |
| LOW | EvoScientist/langgraph_dev/manager.py | 789 | 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 |
|---|---|---|---|---|
| LOW | EvoScientist/tools/skills_manager.py | 854 | # Check if local path exists | COMMENT |
| LOW | EvoScientist/tools/skills_manager.py | 1204 | # Check if it's a built-in skill (read-only, cannot be uninstalled) | COMMENT |
| LOW | EvoScientist/config/settings.py | 205 | # Set False to run fully in-process — saves the startup cost in scenarios | COMMENT |
| LOW | EvoScientist/config/onboard/steps.py | 1323 | # Check if any selected servers require npx | COMMENT |
| LOW | EvoScientist/stream/display.py | 989 | # Check if any sub-agent is active | COMMENT |
| LOW | EvoScientist/mcp/client.py | 858 | # 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 | 276 | # 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 |
|---|---|---|---|---|
| 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 | 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 | 554 | channel._access_token = "fake-token" | CODE |
| LOW⚡ | tests/test_feishu_channel.py | 670 | channel._access_token = "fake-token" | CODE |
| LOW⚡ | tests/test_feishu_channel.py | 680 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 199 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 343 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 361 | channel._access_token = "fake-token" | CODE |
| LOW | tests/test_feishu_channel.py | 618 | 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 | 180 | kwargs["placeholder"] = placeholder | CODE |
| 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 | 667 | # Step 1: Validate | COMMENT |
| LOW | EvoScientist/config/onboard/helpers.py | 683 | # Step 2: Offer to install | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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 | 925 | # azure-ignore is not sufficient). The only robust fix is to drop these items | COMMENT |
| MEDIUM | EvoScientist/mcp/client.py | 237 | # Forward by keyword: robust against future SDK signature changes | COMMENT |
| LOW | EvoScientist/cli/tui_interactive.py | 2462 | # errors; callers just return so the send is dropped. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_llm.py | 2425 | CODE | |
| MEDIUM | tests/test_mcp_client.py | 582 | CODE | |
| MEDIUM | tests/test_async_notifier.py | 96 | CODE | |
| MEDIUM | tests/test_async_notifier.py | 964 | CODE |