LLM 驱动的多市场股票智能分析系统:多源行情、实时新闻、决策看板与自动推送,支持零成本定时运行。 LLM-powered multi-market stock analysis system with multi-source market data, real-time news, decision dashboard, automated notifications, and cost-free scheduled runs.
This report summarizes scanner evidence for ZhuLinsen/daily_stock_analysis, a Python project with 66,148 GitHub stars. SynthScan examined 503,965 lines of code across 1104 source files, recording 11370 pattern matches distributed across 23 syntactic categories. The legacy adjusted pattern signal is 24.5 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 8516 finding(s).
Are imports declared and package/API names verified? 754 finding(s).
Are wrappers, guards, and repeated structures necessary? 10099 finding(s).
Which changes need focused human review? 11370 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 11370 distinct pattern matches across 23 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | main.py | 121 | def _warn_if_public_webui_without_auth(host: str) -> None: | CODE |
| LOW | main.py | 137 | def _resolve_web_service_bind(args: argparse.Namespace, config: Config) -> Tuple[str, int]: | CODE |
| LOW | main.py | 234 | def _get_stock_analysis_pipeline(): | CODE |
| LOW | main.py | 273 | def _reload_env_file_values_preserving_overrides() -> None: | CODE |
| LOW⚡ | main.py | 698 | def _can_reuse_market_context_for_review(summary: str, region: str) -> bool: | STRING |
| LOW⚡ | main.py | 708 | def _resolve_daily_market_context_market(market: str, normalized_region: str) -> str: | STRING |
| LOW⚡ | main.py | 717 | def _resolve_daily_market_context_target_date( | STRING |
| LOW | main.py | 478 | def _compute_trading_day_filter( | STRING |
| LOW | main.py | 529 | def _classify_stock_list_tokens( | STRING |
| LOW | main.py | 569 | def _run_market_review_with_shared_lock( | STRING |
| LOW | main.py | 602 | def _refresh_stock_index_cache_for_analysis(config: Config) -> None: | STRING |
| LOW | main.py | 619 | def _resolve_portfolio_stock_codes(args: argparse.Namespace) -> Optional[List[str]]: | STRING |
| LOW | main.py | 638 | def _prime_daily_market_context( | STRING |
| LOW | main.py | 732 | def _market_review_report_text(review_result: Any) -> str: | STRING |
| LOW | main.py | 741 | def _save_reused_market_review_report( | STRING |
| LOW | main.py | 843 | def _return_with_auto_backtest(result: bool) -> bool: | STRING |
| LOW | main.py | 1262 | def _run_analysis_with_runtime_scheduler_lock( | STRING |
| LOW | main.py | 1436 | def _resolve_scheduled_stock_codes(stock_codes: Optional[List[str]]) -> Optional[List[str]]: | STRING |
| LOW | main.py | 1492 | def _build_schedule_time_provider(default_schedule_time: str): | STRING |
| LOW | main.py | 1519 | def _build_schedule_times_provider(default_schedule_time: str): | STRING |
| LOW | evals/agent_trajectory/metrics.py | 177 | def _compute_tool_log_metrics( | CODE |
| LOW | evals/agent_trajectory/metrics.py | 236 | def compute_trajectory_metrics( | CODE |
| LOW | evals/agent_trajectory/metrics.py | 376 | def compute_stage_trajectory_metrics( | CODE |
| LOW | tests/test_backtest_service.py | 187 | def _seed_legacy_offshore_analysis( | CODE |
| LOW | tests/test_backtest_service.py | 263 | def test_kr_suffix_filter_reaches_legacy_bare_history(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 288 | def test_jp_suffix_filter_reaches_legacy_bare_history(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 313 | def test_unfiltered_rerun_uses_persisted_market_for_legacy_jp_kr_bare_codes( | CODE |
| LOW | tests/test_backtest_service.py | 366 | def test_unfiltered_rerun_rebuilds_legacy_cn_snapshot_for_indexed_bare_jp_code( | CODE |
| LOW | tests/test_backtest_service.py | 422 | def test_canonical_hk_query_does_not_backtest_legacy_bare_jp_collision( | CODE |
| LOW | tests/test_backtest_service.py | 483 | def test_run_backtest_rejects_invalid_eval_window_days_at_entry(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 495 | def test_run_backtest_accepts_dotted_exchange_prefix_and_filters_analysis_date_range(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 525 | def test_run_backtest_keeps_dotted_cn_code_match_when_analysis_history_is_dotted(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 563 | def test_run_backtest_matches_compact_prefixed_analysis_history_with_canonical_query(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 622 | def test_run_backtest_matches_compact_ss_alias_after_request_normalization(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 656 | def test_run_backtest_uses_bare_daily_bars_and_summary_for_compact_ss_history(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 725 | def test_run_backtest_uses_compact_forward_bars_when_analysis_history_is_bare_code(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 782 | def test_run_backtest_matches_compact_bj_code_shape_with_no_prefix_query(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 841 | def test_get_candidates_does_not_match_invalid_a_share_hk_cross_input(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 854 | def test_get_candidates_does_not_match_explicit_wrong_a_share_market(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 868 | def test_run_backtest_rejects_invalid_market_suffix_length_input(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 881 | def test_run_backtest_rejects_explicit_wrong_a_share_market(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 896 | def test_get_recent_evaluations_rejects_explicit_wrong_a_share_market(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 910 | def test_get_summary_rejects_explicit_wrong_a_share_market(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 923 | def test_run_backtest_bare_code_query_matches_dotted_history_records(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 967 | def test_run_backtest_uses_bare_daily_bars_for_dotted_history_record(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1027 | def test_run_backtest_does_not_mix_start_and_forward_bars_across_code_shapes(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1091 | def test_run_backtest_uses_exact_expected_start_across_code_aliases(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1177 | def test_run_backtest_replays_legacy_non_session_effective_date_from_local_bars( | CODE |
| LOW | tests/test_backtest_service.py | 1239 | def test_non_session_resolution_exposes_backtest_only_local_start( | CODE |
| LOW | tests/test_backtest_service.py | 1264 | def test_run_backtest_consumes_explicit_backtest_only_start(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1320 | def test_run_backtest_rebuilds_legacy_cn_snapshot_for_jp_history(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1405 | def test_run_backtest_refills_from_authoritative_start_date(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1499 | def test_run_backtest_rejects_all_stale_daily_window_candidates(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1587 | def test_run_backtest_supports_us_suffix_code_shape_when_run_with_suffix(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1620 | def test_run_backtest_preserves_supported_us_index_identity(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1664 | def test_run_backtest_us_suffix_query_matches_bare_history_and_summary(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1711 | def test_run_backtest_bare_us_query_matches_us_suffix_history_and_summary(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1758 | def test_us_code_queries_match_legacy_results_without_rerun(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1875 | def test_run_backtest_reaches_legacy_bare_hk_rows_from_supported_aliases(self) -> None: | CODE |
| LOW | tests/test_backtest_service.py | 1953 | def test_run_backtest_matches_hk_daily_shape_variants_for_prefixed_history(self) -> None: | CODE |
| 7901 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | requirements.txt | 1 | # =================================== | COMMENT |
| MEDIUM | requirements.txt | 3 | # =================================== | COMMENT |
| MEDIUM | docker/docker-compose.yml | 1 | # =================================== | COMMENT |
| MEDIUM | docker/docker-compose.yml | 3 | # =================================== | COMMENT |
| MEDIUM⚡ | tests/test_notification_sender.py | 434 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_notification_sender.py | 436 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_notification_sender.py | 747 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_notification_sender.py | 749 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_generate_index_from_csv.py | 664 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_generate_index_from_csv.py | 666 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 267 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 269 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 386 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 388 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 434 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 436 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 486 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 488 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 537 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 539 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 895 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 897 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1091 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1093 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1146 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1148 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1190 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1192 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1221 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1223 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1251 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1253 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1298 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1300 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1412 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1414 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1669 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1672 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1700 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 1702 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2077 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2078 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2080 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2505 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2507 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2926 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 2928 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 3072 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 3074 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 3200 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 3202 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 4059 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 4061 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 4210 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 4212 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 4389 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_web_intent_resolver.py | 4391 | # ========================================================================= | COMMENT |
| MEDIUM | tests/test_web_intent_resolver.py | 97 | # ========================================================================= | COMMENT |
| MEDIUM | tests/test_web_intent_resolver.py | 99 | # ========================================================================= | COMMENT |
| MEDIUM | tests/test_web_intent_resolver.py | 166 | # ========================================================================= | COMMENT |
| 644 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | main.py | 1363 | def run_server(): | CODE |
| LOW | main.py | 73 | except Exception as exc: | CODE |
| LOW | main.py | 151 | except Exception as exc: # pragma: no cover - defensive branch | CODE |
| LOW | main.py | 615 | except Exception as exc: # noqa: BLE001 - stock index freshness must not block analysis. | STRING |
| LOW | main.py | 770 | except Exception as exc: | STRING |
| LOW | main.py | 796 | except Exception as exc: | STRING |
| LOW | main.py | 1224 | except Exception as e: | STRING |
| LOW | main.py | 1233 | except Exception as e: | STRING |
| LOW | main.py | 1366 | except Exception as exc: # noqa: BLE001 - surface startup issues to caller promptly | STRING |
| LOW | main.py | 1417 | except Exception as exc: | STRING |
| LOW | main.py | 1432 | except Exception as exc: | STRING |
| LOW | main.py | 1486 | except Exception as exc: # pragma: no cover - defensive guard | STRING |
| LOW | main.py | 1562 | except Exception as exc: | STRING |
| LOW | main.py | 1573 | except Exception as exc: | STRING |
| LOW | main.py | 1580 | except Exception as exc: | STRING |
| LOW | main.py | 1719 | except Exception as e: | STRING |
| LOW | main.py | 1940 | except Exception as e: | STRING |
| LOW | evals/agent_trajectory/run_eval.py | 203 | except Exception as exc: | CODE |
| LOW | evals/agent_trajectory/run_eval.py | 223 | except Exception as exc: # pragma: no cover - exercised via monkeypatched failure | CODE |
| LOW | evals/agent_trajectory/run_eval.py | 236 | except Exception as exc: | CODE |
| LOW | tests/test_portfolio_service.py | 1162 | except Exception as exc: # pragma: no cover - asserted below | CODE |
| LOW | tests/test_portfolio_service.py | 1217 | except Exception as exc: # pragma: no cover - asserted below | CODE |
| LOW | tests/test_multi_agent.py | 4159 | except Exception as exc: | CODE |
| LOW | tests/test_multi_agent.py | 4212 | except Exception as exc: | CODE |
| LOW⚡ | tests/longbridge_live_smoke.py | 106 | except Exception as e: | CODE |
| LOW | tests/test_anspire_search.py | 481 | except Exception: | CODE |
| LOW | tests/test_social_sentiment_service.py | 129 | except Exception as exc: # pragma: no cover - thread collection | CODE |
| MEDIUM | tests/test_social_sentiment_service.py | 125 | def worker(): | CODE |
| LOW | tests/test_llm_usage.py | 1764 | except Exception as exc: | CODE |
| MEDIUM | tests/test_miaoxiang_fetcher.py | 574 | def active(): | CODE |
| LOW | tests/test_miaoxiang_fetcher.py | 578 | except Exception as exc: | CODE |
| LOW | tests/test_conversation_manager.py | 40 | except Exception as exc: # pragma: no cover - failures are asserted below | CODE |
| MEDIUM | tests/test_search_service_concurrency.py | 116 | def worker(): | CODE |
| MEDIUM | tests/test_search_service_concurrency.py | 173 | def worker(): | CODE |
| MEDIUM | tests/test_search_service_concurrency.py | 526 | def worker(): | CODE |
| LOW | tests/test_search_service_concurrency.py | 120 | except Exception as exc: # pragma: no cover - thread collection | CODE |
| LOW | tests/test_search_service_concurrency.py | 177 | except Exception as exc: # pragma: no cover - thread collection | CODE |
| LOW | tests/test_search_service_concurrency.py | 530 | except Exception as exc: # pragma: no cover - thread collection | CODE |
| MEDIUM | tests/test_storage.py | 456 | def ensure_record() -> None: | CODE |
| MEDIUM | tests/test_storage.py | 902 | def initialize_manager() -> None: | CODE |
| MEDIUM | tests/test_storage.py | 911 | def use_manager() -> None: | CODE |
| MEDIUM | tests/test_storage.py | 994 | def construct_directly() -> None: | CODE |
| MEDIUM | tests/test_storage.py | 1003 | def use_get_instance() -> None: | CODE |
| LOW | tests/test_storage.py | 460 | except Exception as exc: | CODE |
| LOW | tests/test_storage.py | 907 | except Exception as exc: | CODE |
| LOW | tests/test_storage.py | 923 | except Exception as exc: | CODE |
| LOW | tests/test_storage.py | 999 | except Exception as exc: | CODE |
| LOW | tests/test_storage.py | 1015 | except Exception as exc: | CODE |
| LOW | tests/test_data_fetcher_prefetch_stock_names.py | 294 | except Exception as exc: # pragma: no cover - thread collection | CODE |
| MEDIUM | tests/test_data_fetcher_prefetch_stock_names.py | 289 | def worker(): | CODE |
| LOW | tests/test_agent_sse_cleanup.py | 50 | except Exception as exc: | CODE |
| LOW | tests/test_main_schedule_mode.py | 85 | except Exception: | CODE |
| LOW | tests/test_main_schedule_mode.py | 2848 | except Exception: | CODE |
| LOW | tests/tw_institutional_live_smoke.py | 42 | except Exception: # noqa: BLE001 - cosmetic only; never block the smoke on console encoding | CODE |
| LOW | tests/test_run_diagnostics_p1.py | 106 | except Exception as exc: # pragma: no cover - exercised by queue behavior | CODE |
| LOW | tests/test_analysis_api_contract.py | 37 | except Exception: # pragma: no cover - optional dependency environments | CODE |
| LOW | tests/test_analysis_api_contract.py | 1232 | except Exception as exc: # pragma: no cover - exercised via assert below | CODE |
| LOW | tests/test_analysis_api_contract.py | 4060 | except Exception: # pragma: no cover - optional dependency environments | CODE |
| LOW | tests/test_stooq_fallback.py | 12 | except Exception: | CODE |
| LOW | tests/test_realtime_types.py | 64 | except Exception as exc: # pragma: no cover - thread collection | CODE |
| 998 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 40 | CODE | |
| LOW | webui.py | 18 | CODE | |
| LOW | main.py | 24 | CODE | |
| LOW | evals/agent_trajectory/run_eval.py | 27 | CODE | |
| LOW | evals/agent_trajectory/run_eval.py | 34 | CODE | |
| LOW | evals/agent_trajectory/metrics.py | 69 | CODE | |
| LOW | evals/agent_trajectory/metrics.py | 72 | CODE | |
| LOW | tests/test_screening_selection_variant.py | 3 | CODE | |
| LOW | tests/test_research_artifact_service.py | 4 | CODE | |
| LOW | tests/test_portfolio_service.py | 4 | CODE | |
| LOW | tests/test_agent_chat_executor.py | 4 | CODE | |
| LOW | tests/test_analysis_context_pack_prompt.py | 4 | CODE | |
| LOW | tests/test_generate_index_from_csv.py | 11 | CODE | |
| LOW | tests/test_generate_index_from_csv.py | 11 | CODE | |
| LOW | tests/test_generate_index_from_csv.py | 17 | CODE | |
| LOW | tests/test_analysis_context_builder.py | 4 | CODE | |
| LOW | tests/test_analysis_context_pack_overview.py | 4 | CODE | |
| LOW | tests/test_web_intent_resolver.py | 32 | CODE | |
| LOW | tests/test_web_intent_resolver.py | 1677 | CODE | |
| LOW | tests/test_web_intent_resolver.py | 1677 | CODE | |
| LOW | tests/test_market_light_service.py | 4 | CODE | |
| LOW | tests/test_main_portfolio.py | 1 | CODE | |
| LOW | tests/test_fetch_tushare_stock_list.py | 4 | CODE | |
| LOW | tests/test_multi_agent.py | 30 | CODE | |
| LOW | tests/test_multi_agent.py | 25 | CODE | |
| LOW | tests/conftest.py | 4 | CODE | |
| LOW | tests/test_decision_signal_repo.py | 4 | CODE | |
| LOW | tests/test_ci_workflow_contract.py | 4 | CODE | |
| LOW | tests/test_us_routing_priority.py | 4 | CODE | |
| LOW | tests/test_run_diagnostics_p2.py | 4 | CODE | |
| LOW | tests/test_runtime_scheduler_service.py | 4 | CODE | |
| LOW | tests/test_agent_pipeline.py | 20 | CODE | |
| LOW | tests/test_agent_pipeline.py | 21 | CODE | |
| LOW | tests/test_agent_pipeline.py | 21 | CODE | |
| LOW | tests/test_agent_pipeline.py | 22 | CODE | |
| LOW | tests/test_agent_pipeline.py | 22 | CODE | |
| LOW | tests/test_report_integrity.py | 16 | CODE | |
| LOW | tests/test_anspire_search.py | 27 | CODE | |
| LOW | tests/test_anspire_search.py | 27 | CODE | |
| LOW | tests/test_anspire_search.py | 28 | CODE | |
| LOW | tests/test_anspire_search.py | 29 | CODE | |
| LOW | tests/test_pipeline_index_targets.py | 20 | CODE | |
| LOW | tests/test_pipeline_index_targets.py | 24 | CODE | |
| LOW | tests/test_pipeline_index_targets.py | 24 | CODE | |
| LOW | tests/test_decision_signal_api.py | 4 | CODE | |
| LOW | tests/test_decision_signal_api.py | 19 | CODE | |
| LOW | tests/test_futu_distribution_contract.py | 4 | CODE | |
| LOW | tests/test_skill_opinion_outcomes.py | 4 | CODE | |
| LOW | tests/test_local_cli_backend.py | 4 | CODE | |
| LOW | tests/test_analysis_context_pack_schema.py | 4 | CODE | |
| LOW | tests/test_index_realtime_routing.py | 15 | CODE | |
| LOW | tests/test_daily_analysis_workflow_llm_env.py | 4 | CODE | |
| LOW | tests/test_agent_memory_decision_review.py | 4 | CODE | |
| LOW | tests/test_screening_history.py | 4 | CODE | |
| LOW | tests/test_stock_profile_api.py | 4 | CODE | |
| LOW | tests/test_alert_api.py | 4 | CODE | |
| LOW | tests/test_alert_api.py | 30 | CODE | |
| LOW | tests/test_alert_api.py | 21 | CODE | |
| LOW | tests/test_stock_index_remote_service.py | 4 | CODE | |
| LOW | tests/test_codex_tool_process.py | 4 | CODE | |
| 598 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | webui.py | 52 | except KeyboardInterrupt: | CODE |
| HIGH | main.py | 1931 | except KeyboardInterrupt: | CODE |
| HIGH | tests/test_runtime_scheduler_service.py | 503 | except ProcessLookupError: | CODE |
| HIGH | tests/test_runtime_scheduler_service.py | 547 | except ProcessLookupError: | CODE |
| HIGH | tests/longbridge_live_smoke.py | 35 | except ImportError: | CODE |
| HIGH | tests/test_anspire_search.py | 195 | except ImportError: | CODE |
| HIGH | tests/test_anspire_search.py | 246 | except ImportError: | CODE |
| HIGH | tests/test_codex_tool_process.py | 467 | except ProcessLookupError: | CODE |
| HIGH | tests/test_tushare_fetcher_get_stock_list.py | 49 | except ImportError: | CODE |
| HIGH | tests/test_agent_sse_cleanup.py | 44 | except asyncio.CancelledError: | CODE |
| HIGH | tests/test_main_schedule_mode.py | 2848 | except Exception: | CODE |
| HIGH | tests/test_main_schedule_mode.py | 85 | except Exception: | CODE |
| HIGH | tests/tw_institutional_live_smoke.py | 42 | except Exception: # noqa: BLE001 - cosmetic only; never block the smoke on console encoding | CODE |
| HIGH | tests/test_llm_param_recovery.py | 190 | except RuntimeError: | CODE |
| HIGH | tests/test_strategy_scheduler.py | 86 | except threading.BrokenBarrierError: | CODE |
| HIGH | tests/test_strategy_scheduler.py | 132 | except threading.BrokenBarrierError: | CODE |
| HIGH | data_provider/realtime_types.py | 67 | except (ValueError, TypeError): | CODE |
| HIGH | data_provider/futu_fetcher.py | 74 | except Exception: | CODE |
| HIGH | data_provider/futu_fetcher.py | 128 | except Exception: | CODE |
| HIGH | data_provider/tickflow_fetcher.py | 150 | except Exception: | CODE |
| HIGH | data_provider/tickflow_fetcher.py | 535 | except Exception: | CODE |
| HIGH | data_provider/yfinance_fundamental_adapter.py | 230 | except Exception: | CODE |
| HIGH | data_provider/akshare_fetcher.py | 2436 | except TypeError: | CODE |
| HIGH | data_provider/akshare_fetcher.py | 389 | except BaseException: | CODE |
| HIGH | data_provider/longbridge_fetcher.py | 124 | except Exception: | CODE |
| HIGH | data_provider/tencent_fetcher.py | 215 | except Exception: | CODE |
| HIGH | data_provider/base.py | 1574 | except Exception: | CODE |
| HIGH | scripts/generate_index_from_csv.py | 943 | except FileNotFoundError: | CODE |
| HIGH | scripts/generate_stock_index.py | 76 | except Exception: | CODE |
| HIGH | api/v1/endpoints/agent.py | 639 | except asyncio.CancelledError: | CODE |
| HIGH | bot/commands/ask.py | 433 | except (TypeError, ValueError): | CODE |
| HIGH | src/auth.py | 150 | except (ValueError, TypeError): | CODE |
| HIGH | src/config.py | 759 | except (ValueError, TypeError): | CODE |
| HIGH | src/config.py | 775 | except (ValueError, TypeError): | CODE |
| HIGH | src/logging_config.py | 45 | except ValueError: | CODE |
| HIGH | src/analyzer.py | 3056 | except Exception: | CODE |
| HIGH | src/analyzer.py | 2793 | except GenerationError: | CODE |
| HIGH | src/analyzer.py | 5341 | except json.JSONDecodeError: | CODE |
| HIGH | src/analyzer.py | 3721 | except AttributeError: | CODE |
| HIGH | src/storage.py | 3588 | except ValueError: | CODE |
| HIGH | src/search_service.py | 3639 | except ValueError: | CODE |
| HIGH | src/search_service.py | 3650 | except (TypeError, ValueError): | CODE |
| HIGH | src/search_service.py | 3630 | except (OSError, OverflowError, ValueError): | CODE |
| HIGH | src/search_service.py | 3657 | except ValueError: | CODE |
| HIGH | src/search_service.py | 88 | except BaseException: | CODE |
| HIGH | src/llm/local_cli_backend.py | 2661 | except OSError: | CODE |
| HIGH | src/llm/local_cli_backend.py | 2789 | except Exception: | CODE |
| HIGH | src/llm/local_cli_backend.py | 2151 | except OSError: | CODE |
| HIGH | src/llm/local_cli_backend.py | 2164 | except OSError: | CODE |
| HIGH | src/llm/usage.py | 943 | except Exception: | CODE |
| HIGH | src/llm/usage.py | 816 | except Exception: | CODE |
| HIGH | src/llm/usage.py | 854 | except Exception: | CODE |
| HIGH | src/core/market_review_lock.py | 226 | except FileNotFoundError: | CODE |
| HIGH | src/core/config_registry.py | 5230 | except (TypeError, ValueError): | CODE |
| HIGH | src/core/config_registry.py | 5236 | except (TypeError, ValueError): | CODE |
| HIGH | src/core/pipeline.py | 1184 | except (TypeError, ValueError): | CODE |
| HIGH | src/core/pipeline.py | 1197 | except (TypeError, ValueError): | CODE |
| HIGH | src/core/market_review_runtime.py | 29 | except GenerationError: | CODE |
| HIGH | src/notification_sender/feishu_sender.py | 55 | except ImportError: | CODE |
| HIGH | src/notification_sender/feishu_sender.py | 69 | except ImportError: | CODE |
| 47 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | main.py | 800 | CODE | |
| LOW | main.py | 1403 | CODE | |
| LOW | main.py | 1549 | CODE | |
| LOW | evals/agent_trajectory/metrics.py | 376 | CODE | |
| LOW | evals/agent_trajectory/metrics.py | 588 | CODE | |
| LOW | tests/test_portfolio_service.py | 1381 | CODE | |
| LOW | tests/test_multi_agent.py | 1624 | CODE | |
| LOW | tests/test_multi_agent.py | 2067 | CODE | |
| LOW | tests/test_multi_agent.py | 2090 | CODE | |
| LOW | tests/test_multi_agent.py | 2106 | CODE | |
| LOW | tests/test_multi_agent.py | 2138 | CODE | |
| LOW | tests/test_multi_agent.py | 2201 | CODE | |
| LOW | tests/test_runtime_scheduler_service.py | 465 | CODE | |
| LOW | tests/test_runtime_scheduler_service.py | 507 | CODE | |
| LOW | tests/test_anspire_search.py | 461 | CODE | |
| LOW | tests/test_screening_history.py | 35 | CODE | |
| LOW | tests/test_screening_history.py | 94 | CODE | |
| LOW | tests/test_screening_history.py | 230 | CODE | |
| LOW | tests/test_screening_history.py | 359 | CODE | |
| LOW | tests/test_alert_api.py | 142 | CODE | |
| LOW | tests/test_alert_api.py | 207 | CODE | |
| LOW | tests/test_llm_channel_config.py | 1111 | CODE | |
| LOW | tests/test_ask_command.py | 281 | CODE | |
| LOW | tests/test_market_review.py | 17 | CODE | |
| LOW | tests/test_agent_executor.py | 265 | CODE | |
| LOW | tests/test_agent_executor.py | 322 | CODE | |
| LOW | tests/test_agent_executor.py | 375 | CODE | |
| LOW | tests/test_agent_executor.py | 1250 | CODE | |
| LOW | tests/test_scheduled_analysis_claim.py | 90 | CODE | |
| LOW | tests/test_fetcher_logging.py | 127 | CODE | |
| LOW | tests/test_screening_event_context.py | 148 | CODE | |
| LOW | tests/test_storage.py | 41 | CODE | |
| LOW | tests/test_storage.py | 419 | CODE | |
| LOW | tests/test_storage.py | 1059 | CODE | |
| LOW | tests/test_storage.py | 1788 | CODE | |
| LOW | tests/test_notification.py | 965 | CODE | |
| LOW | tests/test_notification.py | 1000 | CODE | |
| LOW | tests/test_screening_condition_check.py | 51 | CODE | |
| LOW | tests/test_auth_status_setup_state.py | 103 | CODE | |
| LOW | tests/test_analyzer_prompt_language.py | 148 | CODE | |
| LOW | tests/test_analysis_api_contract.py | 166 | CODE | |
| LOW | tests/test_analysis_api_contract.py | 512 | CODE | |
| LOW | tests/test_analysis_api_contract.py | 3729 | CODE | |
| LOW | tests/test_analysis_api_contract.py | 4392 | CODE | |
| LOW | tests/test_analysis_history.py | 2592 | CODE | |
| LOW | tests/test_notification_empty_news_disclosure.py | 344 | CODE | |
| LOW | tests/test_notification_empty_news_disclosure.py | 366 | CODE | |
| LOW | data_provider/realtime_types.py | 234 | CODE | |
| LOW | data_provider/realtime_types.py | 405 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 236 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 351 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 401 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 428 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 460 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 483 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 506 | CODE | |
| LOW | data_provider/yfinance_fetcher.py | 794 | CODE | |
| LOW | data_provider/fundamental_adapter.py | 284 | CODE | |
| LOW | data_provider/tickflow_fetcher.py | 396 | CODE | |
| LOW | data_provider/yfinance_fundamental_adapter.py | 158 | CODE | |
| 304 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_searxng_env_docs.py | 45 | "SEARXNG_BASE_URLS: ${{ vars.SEARXNG_BASE_URLS || secrets.SEARXNG_BASE_URLS }}" | CODE |
| HIGH | tests/test_searxng_env_docs.py | 169 | "SEARXNG_TIMEOUT_SECONDS: ${{ vars.SEARXNG_TIMEOUT_SECONDS || secrets.SEARXNG_TIMEOUT_SECONDS }}" | CODE |
| HIGH⚡ | tests/test_etf_rotation.py | 194 | assert result.benchmark_equity.index.equals(result.equity.index) | CODE |
| HIGH⚡ | tests/test_etf_rotation.py | 465 | assert loaded.closes.index.equals(sessions) | CODE |
| HIGH | tests/test_storage.py | 282 | ("600519", "cn", "analysis", 12, "trace-12", "buy", "3d", "intraday", "2026-01-01", '{"decision_ | CODE |
| HIGH | tests/test_smoke_bot_index_entry.py | 698 | failed event still carries a structured ``stock_code`` (null) plus | STRING |
| HIGH⚡ | tests/test_chip_structure_fallback.py | 218 | """When LLM returns data_perspective: null, fill should still work.""" | STRING |
| HIGH | tests/test_bot_dispatcher_async.py | 96 | content='{"intent":"analysis","codes":["600519"],"strategy":null}', | CODE |
| HIGH⚡ | tests/test_trading_calendar.py | 23 | assert result.equals(sessions.tz_localize(None)) | CODE |
| HIGH | data_provider/longbridge_fetcher.py | 85 | GitHub Actions sets ``LONGBRIDGE_HTTP_URL: ${{ vars.X || secrets.X }}`` | STRING |
| HIGH | scripts/check_static_assets.py | 84 | "`cd apps/dsa-web && npm install && npm run build`.", | CODE |
| HIGH⚡ | bot/dispatcher.py | 396 | {"intent":"analysis","codes":["600519","000858"],"strategy":null} | CODE |
| HIGH⚡ | bot/dispatcher.py | 402 | {"intent":"chat","codes":[],"strategy":null} | CODE |
| HIGH⚡ | bot/dispatcher.py | 405 | {"intent":"none","codes":[],"strategy":null} | CODE |
| HIGH⚡ | bot/dispatcher.py | 408 | {"intent":"analysis","codes":["600519"],"strategy":null} | CODE |
| HIGH⚡ | bot/dispatcher.py | 411 | {"intent":"analysis","codes":[],"strategy":null} | CODE |
| HIGH | src/md2img.py | 61 | "cd apps/dsa-web && npm ci. Fallback to text." | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 802 | 输入: {"message": "茅台多少钱", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 803 | 输出: {"intents": [{"intent": "quote_lookup", "confidence": 0.95, "market": null, "stock_code": "600519", "stock_codes": [ | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 805 | 输入: {"message": "茅台和五粮液哪个好", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 806 | 输出: {"intents": [{"intent": "stock_analysis", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": ["60 | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 808 | 输入: {"message": "白酒板块怎么看", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 809 | 输出: {"intents": [{"intent": "sector_analysis", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": [], | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 811 | 输入: {"message": "我的持仓今天怎么样", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 812 | 输出: {"intents": [{"intent": "portfolio_analysis", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 814 | 输入: {"message": "帮我看下我持仓的股票的股价", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 815 | 输出: {"intents": [{"intent": "portfolio_analysis", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 817 | 输入: {"message": "帮我分析我所有的持仓股票", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 818 | 输出: {"intents": [{"intent": "portfolio_analysis", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 820 | 输入: {"message": "什么是市盈率", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 821 | 输出: {"intents": [{"intent": "general_chat", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": [], "s | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 824 | 输出: {"intents": [{"intent": "followup", "confidence": 0.9, "market": null, "stock_code": null, "stock_codes": [], "secto | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 829 | 输入: {"message": "看一下茅台股价和基本面", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 830 | 输出: {"intents": [{"intent": "quote_lookup", "confidence": 0.9, "market": null, "stock_code": "600519", "stock_codes": [] | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 832 | 输入: {"message": "查完五粮液再看下医药板块", "current_stock": null} | CODE |
| HIGH⚡ | src/agent/web_intent_types.py | 833 | 输出: {"intents": [{"intent": "quote_lookup", "confidence": 0.9, "market": null, "stock_code": "000858", "stock_codes": [] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 43 | __all__ = ['app'] | CODE |
| LOW | webui.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | main.py | 104 | logger = logging.getLogger(__name__) | CODE |
| LOW | main.py | 196 | def _setup_bootstrap_logging(debug: bool = False) -> None: | CODE |
| LOW⚡ | tests/test_web_intent_resolver.py | 909 | def update_context(self, key: str, value: Any) -> None: | CODE |
| LOW | tests/test_runtime_scheduler_service.py | 686 | def set_daily_task(self, task, run_immediately: bool) -> None: | CODE |
| LOW | tests/test_runtime_scheduler_service.py | 767 | def set_daily_task(self, task, run_immediately: bool) -> None: | CODE |
| LOW | tests/test_signal_attribution_supplement.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | tests/test_run_flow.py | 222 | def update_analysis_history_diagnostics(self, *, query_id: str, code: str, diagnostics: dict) -> None: | CODE |
| LOW⚡ | data_provider/realtime_types.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/alphavantage_fetcher.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/yfinance_fetcher.py | 55 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/fundamental_adapter.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/futu_fetcher.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/tickflow_fetcher.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/tickflow_fetcher.py | 552 | def _set_daily_cache(self, cache_key: Tuple[str, str, str, str], df: pd.DataFrame) -> None: | CODE |
| LOW | data_provider/yfinance_fundamental_adapter.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/akshare_fetcher.py | 62 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/akshare_fetcher.py | 437 | def _set_random_user_agent(self) -> None: | CODE |
| LOW | data_provider/efinance_fetcher.py | 119 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/efinance_fetcher.py | 318 | def _set_random_user_agent(self) -> None: | CODE |
| LOW | data_provider/longbridge_fetcher.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/finnhub_fetcher.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/__init__.py | 48 | __all__ = [ | CODE |
| LOW | data_provider/tushare_fetcher.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/tw_institutional_fetcher.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/baostock_fetcher.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/pytdx_fetcher.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/tencent_fetcher.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/miaoxiang_fetcher.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | data_provider/base.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | scripts/check_env.py | 73 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/app.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/__init__.py | 13 | __all__ = ["api_v1_router"] | CODE |
| LOW | api/v1/endpoints/alerts.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/auth.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/auth.py | 143 | def _set_session_cookie(response: Response, session_value: str, request: Request) -> None: | CODE |
| LOW | api/v1/endpoints/stocks.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/analysis.py | 103 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/__init__.py | 27 | __all__ = [ | CODE |
| LOW | api/v1/endpoints/intelligence.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/decision_signals.py | 46 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/agent.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/system_config.py | 46 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/backtest.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/portfolio.py | 48 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/usage.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/data.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/endpoints/history.py | 69 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/v1/schemas/__init__.py | 151 | __all__ = [ | CODE |
| LOW | api/middlewares/auth.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/middlewares/__init__.py | 13 | __all__ = ["ErrorHandlerMiddleware"] | CODE |
| LOW | api/middlewares/error_handler.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | bot/dispatcher.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | bot/dispatcher.py | 363 | def set_help_command_getter(self, getter: Callable) -> None: | CODE |
| LOW | bot/handler.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | bot/__init__.py | 37 | __all__ = [ | CODE |
| LOW | bot/platforms/dingtalk.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | bot/platforms/discord.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | bot/platforms/__init__.py | 56 | __all__ = [ | CODE |
| 162 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | data_provider/yfinance_fetcher.py | 98 | 转换股票代码为 Yahoo Finance 格式 Yahoo Finance 代码格式: - A股沪市:600519.SS (Shanghai Stock Exchange) | STRING |
| HIGH | data_provider/us_index_mapping.py | 47 | 判断代码是否为美股指数符号。 Args: code: 股票/指数代码,如 'SPX', 'DJI' Returns: True 表示是已知美股指数符号,否则 False | STRING |
| HIGH | data_provider/us_index_mapping.py | 66 | 判断代码是否为美股股票符号(排除美股指数)。 美股股票代码为 1-5 个大写字母,可选 .X 后缀如 BRK.B。 美股指数(SPX、DJI 等)明确排除。 Args: code: 股票 | STRING |
| HIGH | data_provider/us_index_mapping.py | 98 | 获取美股指数的 Yahoo Finance 符号与中文名称。 Args: code: 用户输入,如 'SPX', '^GSPC', 'DJI' Returns: (yf_symb | STRING |
| HIGH | data_provider/akshare_fetcher.py | 228 | 判断代码是否为美股股票(不包括美股指数)。 委托给 us_index_mapping 模块的 is_us_stock_code()。 Args: stock_code: 股票代码 Re | STRING |
| HIGH | data_provider/base.py | 1924 | 获取日线数据(自动切换数据源) 故障切换策略: 1. 美股指数/美股股票直接路由到 YfinanceFetcher 2. 当前注册表已识别的 A 股指数使用 | STRING |
| HIGH | api/v1/endpoints/stocks.py | 460 | 获取股票实时行情 获取指定股票的最新行情数据 Args: stock_code: 股票代码(如 600519、00700、AAPL) Returns: | STRING |
| HIGH | api/v1/endpoints/analysis.py | 349 | 触发股票分析 启动 AI 智能分析任务,支持单只或多只股票批量分析 流程: 1. 校验请求参数 2. 异步模式:检查重复 -> 提交任务队列 -> 返回 202 3. 同 | STRING |
| HIGH | api/v1/endpoints/analysis.py | 1171 | 查询分析任务状态 优先从任务队列查询,如果不存在则从数据库查询历史记录 Args: task_id: 任务 ID Returns: Ta | STRING |
| HIGH | api/v1/endpoints/history.py | 536 | 获取历史报告详情 根据分析历史记录主键 ID 或 query_id 获取完整的历史分析报告。 优先尝试按主键 ID(整数)查询,若参数不是合法整数则按 query_id 查询。 Args | STRING |
| HIGH | api/v1/endpoints/history.py | 953 | 获取历史报告的 Markdown 格式内容 根据分析历史记录 ID 或 query_id 生成与推送通知格式一致的 Markdown 报告。 Args: record_id: 分析历史记录主键 | STRING |
| HIGH | src/agent/skills/base.py | 141 | Load a single Skill from a YAML file. The YAML file must contain at minimum: ``name``, ``display_name``, ``desc | STRING |
| HIGH | src/services/stock_service.py | 94 | 获取股票历史行情 Args: stock_code: 股票代码 period: K 线周期 (daily/weekly/monthly) | STRING |
| HIGH | src/services/task_queue.py | 395 | Submit a single analysis task. Args: stock_code: Stock code stock_name: Option | STRING |
| HIGH | src/services/image_stock_extractor.py | 349 | 从图片中提取股票代码及名称(使用 Vision LLM)。 优先级:Gemini -> Anthropic -> OpenAI(首个可用)。 支持多 Key 轮询与重试(最多 3 次,指数退避)。 Ar | STRING |
| HIGH | src/services/history_service.py | 819 | Delete specified analysis history records. Args: record_ids: List of history record primar | STRING |
| HIGH | src/services/history_service.py | 970 | Generate a Markdown report for a single analysis history record. This method reconstructs an AnalysisR | STRING |
| HIGH | src/services/import_parser.py | 129 | Parse file bytes (CSV/Excel) into items. Args: data: File content bytes. filename: Optional fi | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_notification_sender.py | 1834 | # Step 2: upload must send raw bytes (not multipart) to match declared length | COMMENT |
| LOW⚡ | tests/longbridge_live_smoke.py | 100 | # Step 1: yfinance only | COMMENT |
| LOW | tests/longbridge_live_smoke.py | 126 | # Step 2: Supplement from Longbridge | COMMENT |
| LOW⚡ | tests/test_agent_executor.py | 1376 | # Step 1: LLM requests tool call | COMMENT |
| LOW⚡ | tests/test_agent_executor.py | 1385 | # Step 2: LLM returns final text | COMMENT |
| LOW | .claude/skills/analyze-pr/SKILL.md | 17 | ### Step 1: 同步最新代码基线 | COMMENT |
| LOW | .claude/skills/analyze-pr/SKILL.md | 32 | ### Step 2: 拉取 PR 基本信息 | COMMENT |
| LOW | .claude/skills/analyze-pr/SKILL.md | 47 | ### Step 3: 检查标题与描述完整性 | COMMENT |
| LOW | .claude/skills/analyze-pr/SKILL.md | 77 | ### Step 4: 优先使用 CI / Diff 证据 | COMMENT |
| LOW | .claude/skills/analyze-pr/SKILL.md | 89 | ### Step 5: 评估正确性与风险 | COMMENT |
| LOW | .claude/skills/analyze-pr/SKILL.md | 98 | ### Step 6: 生成评审文档 | COMMENT |
| LOW | .claude/skills/analyze-issue/SKILL.md | 17 | ### Step 1: 同步最新代码基线 | COMMENT |
| LOW | .claude/skills/analyze-issue/SKILL.md | 32 | ### Step 2: 拉取 Issue 信息 | COMMENT |
| LOW⚡ | .claude/skills/analyze-issue/SKILL.md | 46 | ### Step 3: 回答 4 个核心问题 | COMMENT |
| LOW⚡ | .claude/skills/analyze-issue/SKILL.md | 53 | ### Step 4: 结合仓库现状做证据检查 | COMMENT |
| LOW⚡ | .claude/skills/analyze-issue/SKILL.md | 60 | ### Step 5: 形成结论 | COMMENT |
| LOW | .claude/skills/analyze-issue/SKILL.md | 74 | ### Step 6: 生成分析文档 | COMMENT |
| LOW | .claude/skills/fix-issue/SKILL.md | 19 | ### Step 1: 确认分析基线 | COMMENT |
| LOW | .claude/skills/fix-issue/SKILL.md | 23 | ### Step 2: 同步最新代码基线并选择安全的工作方式 | COMMENT |
| LOW | .claude/skills/fix-issue/SKILL.md | 41 | ### Step 3: 实施修复 | COMMENT |
| LOW | .claude/skills/fix-issue/SKILL.md | 51 | ### Step 4: 按改动面验证 | COMMENT |
| LOW | .claude/skills/fix-issue/SKILL.md | 62 | ### Step 5: 更新 issue 分析文档 | COMMENT |
| LOW | .claude/skills/fix-issue/SKILL.md | 89 | ### Step 6: 需要确认的后续动作 | COMMENT |
| LOW⚡ | data_provider/base.py | 521 | # Step 2: 标准化列名 | COMMENT |
| LOW⚡ | data_provider/base.py | 524 | # Step 3: 数据清洗 | COMMENT |
| LOW⚡ | data_provider/base.py | 527 | # Step 4: 计算技术指标 | COMMENT |
| LOW | data_provider/base.py | 506 | # Step 1: 获取原始数据 | COMMENT |
| LOW⚡ | src/core/pipeline.py | 540 | # Step 2: 获取筹码分布 - 使用统一入口,带熔断保护 | COMMENT |
| LOW⚡ | src/core/pipeline.py | 639 | # Step 3: 趋势分析(基于交易理念)— 在 Agent 分支之前执行,供两条路径共用 | COMMENT |
| LOW⚡ | src/core/pipeline.py | 757 | # Step 5: 获取分析上下文(技术面数据) | COMMENT |
| LOW | src/core/pipeline.py | 514 | # Step 1: 获取实时行情(量比、换手率等)- 使用统一入口,自动故障切换 | COMMENT |
| LOW | src/core/pipeline.py | 681 | # Step 4: 多维度情报搜索(最新消息+风险排查+业绩预期) | COMMENT |
| LOW | src/core/pipeline.py | 777 | # Step 6: 增强上下文数据(添加实时行情、筹码、趋势分析结果、股票名称) | COMMENT |
| LOW | src/core/pipeline.py | 799 | # Step 7: 调用 AI 分析(传入增强的上下文和新闻) | COMMENT |
| LOW | src/core/pipeline.py | 943 | # Step 8: 保存分析历史记录 | COMMENT |
| LOW | src/core/pipeline.py | 3347 | # Step 1: 获取并保存数据 | COMMENT |
| LOW | src/core/pipeline.py | 3358 | # Step 2: AI 分析 | COMMENT |
| LOW⚡ | src/notification_sender/telegram_sender.py | 385 | # Step 1: temporarily protect markdown links | COMMENT |
| LOW⚡ | src/notification_sender/telegram_sender.py | 394 | # Step 2: escape remaining special chars | COMMENT |
| LOW⚡ | src/notification_sender/telegram_sender.py | 398 | # Step 3: restore links | COMMENT |
| LOW | src/notification_sender/slack_sender.py | 191 | # Step 1: 获取上传 URL | COMMENT |
| LOW | src/notification_sender/slack_sender.py | 209 | # Step 2: 上传文件内容(raw body,不能用 multipart) | COMMENT |
| LOW | src/notification_sender/slack_sender.py | 220 | # Step 3: 完成上传并分享到频道 | COMMENT |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 661 | for t in _extract_full_names_first(normalized): # Step 1: 全名实体扫描 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 665 | tokens.extend(_split_by_special_punct(t.text)) # Step 2: 标点/空白只切 gap | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 666 | tokens = _apply_code_extraction(tokens) # Step 3: 代码形提取 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 667 | tokens = _apply_market_extraction(tokens) # Step 4: 市场关键词 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 668 | tokens = _apply_clean_keyword_extraction(tokens) # Step 5: 无歧义关键词 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 669 | tokens = _apply_multi_extraction(tokens) # Step 6: 多策略匹配 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_notification_sender.py | 1834 | # Step 2: upload must send raw bytes (not multipart) to match declared length | COMMENT |
| LOW⚡ | tests/longbridge_live_smoke.py | 100 | # Step 1: yfinance only | COMMENT |
| LOW | tests/longbridge_live_smoke.py | 126 | # Step 2: Supplement from Longbridge | COMMENT |
| LOW⚡ | tests/test_agent_executor.py | 1376 | # Step 1: LLM requests tool call | COMMENT |
| LOW⚡ | tests/test_agent_executor.py | 1385 | # Step 2: LLM returns final text | COMMENT |
| LOW⚡ | data_provider/base.py | 521 | # Step 2: 标准化列名 | COMMENT |
| LOW⚡ | data_provider/base.py | 524 | # Step 3: 数据清洗 | COMMENT |
| LOW⚡ | data_provider/base.py | 527 | # Step 4: 计算技术指标 | COMMENT |
| LOW | data_provider/base.py | 506 | # Step 1: 获取原始数据 | COMMENT |
| LOW⚡ | src/core/pipeline.py | 540 | # Step 2: 获取筹码分布 - 使用统一入口,带熔断保护 | COMMENT |
| LOW⚡ | src/core/pipeline.py | 639 | # Step 3: 趋势分析(基于交易理念)— 在 Agent 分支之前执行,供两条路径共用 | COMMENT |
| LOW⚡ | src/core/pipeline.py | 757 | # Step 5: 获取分析上下文(技术面数据) | COMMENT |
| LOW | src/core/pipeline.py | 514 | # Step 1: 获取实时行情(量比、换手率等)- 使用统一入口,自动故障切换 | COMMENT |
| LOW | src/core/pipeline.py | 681 | # Step 4: 多维度情报搜索(最新消息+风险排查+业绩预期) | COMMENT |
| LOW | src/core/pipeline.py | 777 | # Step 6: 增强上下文数据(添加实时行情、筹码、趋势分析结果、股票名称) | COMMENT |
| LOW | src/core/pipeline.py | 799 | # Step 7: 调用 AI 分析(传入增强的上下文和新闻) | COMMENT |
| LOW | src/core/pipeline.py | 943 | # Step 8: 保存分析历史记录 | COMMENT |
| LOW | src/core/pipeline.py | 3347 | # Step 1: 获取并保存数据 | COMMENT |
| LOW | src/core/pipeline.py | 3358 | # Step 2: AI 分析 | COMMENT |
| LOW⚡ | src/notification_sender/telegram_sender.py | 385 | # Step 1: temporarily protect markdown links | COMMENT |
| LOW⚡ | src/notification_sender/telegram_sender.py | 394 | # Step 2: escape remaining special chars | COMMENT |
| LOW⚡ | src/notification_sender/telegram_sender.py | 398 | # Step 3: restore links | COMMENT |
| LOW | src/notification_sender/slack_sender.py | 191 | # Step 1: 获取上传 URL | COMMENT |
| LOW | src/notification_sender/slack_sender.py | 209 | # Step 2: 上传文件内容(raw body,不能用 multipart) | COMMENT |
| LOW | src/notification_sender/slack_sender.py | 220 | # Step 3: 完成上传并分享到频道 | COMMENT |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 661 | for t in _extract_full_names_first(normalized): # Step 1: 全名实体扫描 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 665 | tokens.extend(_split_by_special_punct(t.text)) # Step 2: 标点/空白只切 gap | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 666 | tokens = _apply_code_extraction(tokens) # Step 3: 代码形提取 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 667 | tokens = _apply_market_extraction(tokens) # Step 4: 市场关键词 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 668 | tokens = _apply_clean_keyword_extraction(tokens) # Step 5: 无歧义关键词 | CODE |
| LOW⚡ | src/agent/web_intent_tokenizer.py | 669 | tokens = _apply_multi_extraction(tokens) # Step 6: 多策略匹配 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/test_notification_sender.py | 850 | dummy_client.im.v1.file.create.assert_called_once() | CODE |
| CRITICAL | bot/platforms/feishu_stream.py | 173 | response = self._client.im.v1.message.reply(request) | CODE |
| CRITICAL | bot/platforms/feishu_stream.py | 186 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL | src/feishu_doc.py | 55 | response = self.client.docx.v1.document.create(create_request) | CODE |
| CRITICAL | src/feishu_doc.py | 87 | write_resp = self.client.docx.v1.document_block_children.create(batch_add_request) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_config_env_compat.py | 1006 | "EMAIL_GROUP_1": "user@example.com", | CODE |
| LOW | tests/test_config_env_compat.py | 1014 | self.assertEqual(emails, ["user@example.com"]) | CODE |
| LOW | tests/test_search_service_concurrency.py | 240 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_service_concurrency.py | 271 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_service_concurrency.py | 314 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_service_concurrency.py | 339 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 64 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 163 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 192 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 234 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 268 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 299 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 333 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 371 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 421 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 448 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 500 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1478 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1527 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1580 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1704 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1752 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1800 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 1888 | brave_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 2274 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 2324 | bocha_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_news_freshness.py | 2347 | bocha_keys=["dummy_key"], | CODE |
| LOW⚡ | tests/test_search_serpapi_provider.py | 307 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 52 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 78 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 113 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 151 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 187 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 221 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 248 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 349 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 391 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 433 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 468 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_serpapi_provider.py | 503 | provider = SerpAPISearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_tavily_provider.py | 57 | provider = TavilySearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_tavily_provider.py | 74 | self.assertEqual(_FakeTavilyClient.init_api_keys, ["dummy_key"]) | CODE |
| LOW | tests/test_search_tavily_provider.py | 85 | provider = TavilySearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_tavily_provider.py | 106 | provider = TavilySearchProvider(["dummy_key"]) | CODE |
| LOW | tests/test_search_tavily_provider.py | 145 | tavily_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_tavily_provider.py | 170 | tavily_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_tavily_provider.py | 196 | tavily_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_tavily_provider.py | 226 | tavily_keys=["dummy_key"], | CODE |
| LOW | tests/test_search_tavily_provider.py | 258 | tavily_keys=["dummy_key"], | CODE |
| LOW | bot/commands/ask.py | 217 | skill_id = self._parse_skill(["placeholder"] + remaining_args) if remaining_args else self._get_default_skill_id | CODE |
| LOW | src/core/config_registry.py | 165 | "placeholder": "optional provider/model override", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | data_provider/efinance_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' | STRING |
| HIGH | data_provider/tushare_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' | STRING |
| HIGH | data_provider/baostock_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' | STRING |
| HIGH | data_provider/pytdx_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' | STRING |
| HIGH | src/agent/memory.py | 0 | compatibility wrapper for legacy strategy-based callers. | STRING |
| HIGH | src/agent/skills/router.py | 0 | compatibility wrapper for legacy strategy-based callers. | STRING |
| HIGH | src/services/backtest_service.py | 0 | compatibility wrapper for legacy strategy-based callers. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_decision_signal_api.py | 1321 | CODE | |
| LOW | tests/test_stock_analyzer_bias.py | 22 | CODE | |
| LOW | tests/test_report_renderer.py | 23 | CODE | |
| LOW | tests/test_skill_opinion_weights.py | 48 | CODE | |
| LOW | tests/test_decision_signal_outcome_service.py | 36 | CODE | |
| LOW | tests/test_tickflow_fetcher.py | 147 | CODE | |
| LOW | api/v1/endpoints/decision_signals.py | 153 | CODE | |
| LOW | api/v1/endpoints/backtest.py | 99 | CODE | |
| LOW | api/v1/endpoints/portfolio.py | 492 | CODE | |
| LOW | src/search_service.py | 2404 | CODE | |
| LOW | src/llm/provider_cache.py | 167 | CODE | |
| LOW | src/core/market_review.py | 174 | CODE | |
| LOW | src/core/pipeline.py | 236 | CODE | |
| LOW | src/core/pipeline.py | 1460 | CODE | |
| LOW | src/repositories/decision_signal_repo.py | 159 | CODE | |
| LOW | src/repositories/decision_signal_outcome_repo.py | 36 | CODE | |
| LOW | src/repositories/intelligence_repo.py | 152 | CODE | |
| LOW | src/services/run_diagnostics.py | 868 | CODE | |
| LOW | src/services/run_diagnostics.py | 931 | CODE | |
| LOW | src/services/task_queue.py | 380 | CODE | |
| LOW | src/services/task_queue.py | 437 | CODE | |
| LOW | src/services/decision_signal_service.py | 197 | CODE | |
| LOW | src/services/daily_market_context.py | 103 | CODE | |
| LOW | src/services/history_service.py | 248 | CODE | |
| LOW | src/services/system_config_service.py | 3994 | CODE | |
| LOW | src/services/alert_indicators.py | 210 | CODE | |
| LOW | src/services/run_flow.py | 1245 | CODE | |
| LOW | src/services/alert_service.py | 310 | CODE | |
| LOW | src/services/analyzer_service.py | 68 | CODE | |
| LOW | src/services/decision_signal_outcome_service.py | 105 | CODE | |
| LOW | src/services/analysis_service.py | 77 | CODE | |
| LOW | src/services/screening/strategy.py | 451 | CODE | |
| LOW | src/services/screening/context.py | 49 | CODE | |
| LOW | src/services/screening/pipeline.py | 51 | CODE | |
| LOW | src/services/screening/ranker.py | 75 | CODE | |
| LOW | src/services/screening/ranker.py | 122 | CODE | |
| LOW | src/services/screening/ranker.py | 564 | CODE | |
| LOW | src/services/screening/daily.py | 63 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | evals/agent_trajectory/metrics.py | 94 | # Optional expectation for the multi-agent stage-aware reporter. An | COMMENT |
| MEDIUM | tests/test_phase_decision_guardrail.py | 2 | """Tests for Issue #1386 P5 phase decision guardrails.""" | STRING |
| MEDIUM | src/config.py | 1063 | agent_orchestrator_timeout_s: int = 600 # Cooperative timeout budget for the whole multi-agent pipeline | CODE |
| MEDIUM | src/config.py | 1088 | agent_event_monitor_enabled: bool = False # Enable periodic event-driven alert checks in schedule mode | CODE |
| MEDIUM | src/analyzer.py | 2675 | # Korean reuses the English scaffolding (same as market review / context pack); | COMMENT |
| MEDIUM | src/analyzer.py | 4333 | # Structural template language: Korean reuses the English scaffolding and only | COMMENT |
| MEDIUM | src/market_analyzer.py | 292 | # Structural/template language. Korean reuses the English scaffolding; | COMMENT |
| MEDIUM⚡ | src/agent/executor.py | 62 | # Optional whitelisted snapshots for multi-agent trajectory evaluation. | COMMENT |
| MEDIUM | src/agent/agents/base_agent.py | 245 | # Cap per-field size to avoid overwhelming the context window | COMMENT |
| MEDIUM | src/services/screening/ranker.py | 681 | # Do NOT fall back to internal 'reasoning_content' (chain-of-thought) as the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | evals/agent_trajectory/metrics.py | 261 | log_metrics = _compute_tool_log_metrics(log, total_steps=total_steps) | COMMENT |
| LOW | tests/test_web_intent_tokenizer.py | 1021 | COMMENT | |
| LOW | tests/test_stock_analyzer_bias.py | 161 | mock_get_config.return_value.bias_threshold = 5.0 | COMMENT |
| LOW | tests/test_stock_list_parser.py | 241 | @pytest.mark.parametrize( | COMMENT |
| LOW | tests/test_stock_list_parser.py | 281 | ("uSfd", "uSfd"), | COMMENT |
| LOW | docs/examples/litellm_config.example.yaml | 1 | # =================================== | COMMENT |
| LOW | docs/examples/litellm_config.example.yaml | 61 | - model_name: gemini/gemini-2.5-flash | COMMENT |
| LOW | docs/examples/litellm_config.example.yaml | 81 | # litellm_params: | COMMENT |
| LOW | scripts/test.sh | 1 | #!/bin/bash | COMMENT |
| LOW | src/config.py | 1281 | # 实时行情数据源优先级(逗号分隔) | COMMENT |
| LOW | src/market_analyzer.py | 701 | # """获取北向资金流入""" | COMMENT |
| LOW | src/search_service.py | 3261 | # Issue #2026: when STOCK_NAME_MAP maps a foreign ticker to a Chinese | COMMENT |
| LOW | src/agent/web_intent_types.py | 301 | } | COMMENT |
| LOW | src/agent/web_intent_types.py | 481 | # 双解皆合理——裸用打歧义 tag 交下游 LLM/确认消歧,不直接打 | COMMENT |
| LOW | src/agent/web_intent_resolver.py | 1341 | # 不随多元素基座重置失明 | COMMENT |
| LOW | src/agent/factory.py | 41 | _TOOL_REGISTRY = None | COMMENT |
| LOW | src/agent/llm_adapter.py | 101 | _OPT_IN_THINKING_MODELS: Dict[str, dict] = { | COMMENT |
| LOW | src/agent/tools/execution.py | 21 | COMMENT | |
| LOW | src/data/stock_mapping.py | 121 | # This map is the single source of truth for the English company identity | COMMENT |
| LOW | src/services/name_to_code_resolver.py | 41 | _AKSHARE_FAILURE_TTL = 300 # 5 MIN | COMMENT |
| LOW | src/services/stock_list_parser.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | src/services/stock_list_parser.py | 161 | # The ``us`` prefix is intentionally excluded here: ``_split_prefix`` only | COMMENT |
| LOW | src/services/stock_list_parser.py | 221 | # collisions don't get mis-split. Two shape families are recognised: | COMMENT |
| LOW | src/services/stock_list_parser.py | 541 | return "SH", ParseStatus.STOCK | COMMENT |
| LOW | src/services/stock_list_parser.py | 721 | exchange="UNKNOWN", | COMMENT |
| LOW | src/services/stock_list_parser.py | 741 | # pipeline receives the canonical uppercase code (and the explicit | COMMENT |
| LOW | src/services/stock_list_parser.py | 761 | # explicit ``us``-prefix stock symbols (silently splitting would | COMMENT |
| LOW | src/services/stock_list_parser.py | 821 | # ``_split_prefix`` recognises it uniformly. | COMMENT |
| LOW | src/services/stock_list_parser.py | 841 | # hide an index alias (``000300.SH`` is the canonical example). | COMMENT |
| LOW | src/services/stock_list_parser.py | 861 | # strict-suffix form (``000999.SH``). The splitter surfaces | COMMENT |
| LOW | src/services/stock_list_parser.py | 881 | # ``raw_upper`` starting with ``<EXCHANGE>.``. The normalizer | COMMENT |
| LOW | src/services/stock_list_parser.py | 901 | # ``sz399001.SZ`` / ``sz399006.SZ`` are the SZ-side mirror). | COMMENT |
| LOW | src/services/stock_list_parser.py | 1001 | unsupported_reason=( | COMMENT |
| LOW | src/services/stock_list_parser.py | 1021 | # | COMMENT |
| LOW | src/services/history_service.py | 141 | is_bse_code, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_anspire_search.py | 575 | print(" Windows PowerShell: $env:ANSPIRE_API_KEYS=\"your_api_key\"") | CODE |
| HIGH | tests/test_anspire_search.py | 576 | print(" Linux/Mac: export ANSPIRE_API_KEYS=\"your_api_key\"") | CODE |
| HIGH | tests/test_anspire_search.py | 646 | print(" Windows PowerShell: $env:ANSPIRE_API_KEYS=\"your_api_key\"") | CODE |
| HIGH | tests/test_anspire_search.py | 647 | print(" Linux/Mac: export ANSPIRE_API_KEYS=\"your_api_key\"") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_agent_pipeline.py | 3252 | """Test the _safe_int helper for robust sentiment_score parsing.""" | STRING |
| MEDIUM⚡ | tests/test_stock_list_parser.py | 430 | # Parsing the Chinese name must not elevate to index. | COMMENT |
| MEDIUM⚡ | tests/test_stock_list_parser.py | 399 | # elevate to index status — they degrade to stock (contract #3). | STRING |
| MEDIUM | src/services/stock_list_parser.py | 134 | # elevate a bare code to ``asset_type=index`` (contract #1). Other prefixes | COMMENT |
| MEDIUM | src/services/stock_list_parser.py | 674 | # re-elevate ``sh000300`` to ``index`` even though the caller asked for | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_agent_pipeline.py | 3335 | # Create a fresh Skill with default enabled=False | COMMENT |
| MEDIUM | tests/test_agent_registry.py | 852 | # Create a custom directory with an overriding strategy | COMMENT |
| MEDIUM | tests/test_agent_registry.py | 725 | # Create an invalid YAML file (should be skipped) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_market_analyzer_generate_text.py | 1443 | CODE | |
| MEDIUM | tests/test_llm_param_recovery.py | 169 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/config.py | 603 | # Check if the prefix is a known LiteLLM provider; if so, keep it. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_screening_ranker.py | 522 | return "I cannot provide structured output." | STRING |