PanWatch — AI stock monitoring for A-shares, HK & US markets, powered by TradingAgents. Portfolio insights, real-time alerts & automated reports.|盯盘侠:覆盖 A股/港股/美股的 AI 盯盘、持仓分析、实时提醒与自动报告。
This report summarizes scanner evidence for TNT-Likely/PanWatch, a Python project with 2,069 GitHub stars. SynthScan examined 137,658 lines of code across 745 source files, recording 2712 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 26.7 (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? 1488 finding(s).
Are imports declared and package/API names verified? 385 finding(s).
Are wrappers, guards, and repeated structures necessary? 2205 finding(s).
Which changes need focused human review? 2712 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 2712 distinct pattern matches across 16 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 | …nd/packages/biz-ui/src/components/suggestion-action.ts | 22 | export function normalizeSuggestionAction(action?: string, label?: string): SuggestionAction | null { | CODE |
| LOW | …nd/packages/biz-ui/src/components/suggestion-action.ts | 51 | export function resolveSuggestionColorClass(action?: string, label?: string): string { | CODE |
| LOW | …packages/biz-ui/src/components/deep-analysis-modal.tsx | 490 | function DataCollectionDiagnostics({ sources }: { sources: ProgressDataSource[] }) { | CODE |
| LOW | …end/packages/biz-ui/src/components/technical-badge.tsx | 34 | export function technicalToneFromSuggestionAction(action?: string, actionLabel?: string): TechnicalBadgeTone { | CODE |
| LOW | frontend/packages/api/src/chat.ts | 659 | async function subscribeAssistantTaskStream( | CODE |
| LOW | frontend/packages/api/src/chat.ts | 703 | async function decideAssistantApprovalStream( | CODE |
| LOW | frontend/src/main.tsx | 15 | function ApplicationConfirmProvider({ children }: { children: React.ReactNode }) { | CODE |
| LOW | …/components/assistant/AssistantContextExportDialog.tsx | 24 | export function AssistantContextExportContent({ conversationId, exportId }: Omit<Props, 'onClose'>) { | CODE |
| LOW | …/components/assistant/AssistantContextExportDialog.tsx | 137 | export function AssistantContextExportDialog({ onClose, ...props }: Props) { | CODE |
| LOW | …/components/assistant/AssistantConversationActions.tsx | 15 | export function AssistantConversationActions({ conversation, onRename, onDelete }: Props) { | CODE |
| LOW | …/components/assistant/AssistantExportHistoryDialog.tsx | 14 | export function AssistantExportHistoryDialog({ conversationId, onClose }: Props) { | CODE |
| LOW | …rc/components/assistant/AssistantPermissionsDrawer.tsx | 21 | export function AssistantPermissionsDrawer({ open, onOpenChange }: AssistantPermissionsDrawerProps) { | CODE |
| LOW | frontend/src/lib/market-colors.ts | 39 | export function normalizeMarketColorPreference(value: string | null | undefined): MarketColorPreference { | CODE |
| LOW | frontend/src/lib/market-colors.ts | 78 | export function readMarketColorPreference(storage?: Pick<Storage, 'getItem'>): MarketColorPreference { | CODE |
| LOW | frontend/src/lib/assistant-activity.ts | 5 | export function signalAssistantActivityChange() { | CODE |
| LOW | frontend/src/lib/assistant-activity.ts | 10 | export function claimAssistantNotifications(ids: number[]): number[] { | CODE |
| LOW | frontend/src/lib/assistant-navigation.ts | 10 | export function parseAssistantPortfolioTarget( | CODE |
| LOW | frontend/src/lib/template-import-feedback.ts | 35 | export function buildTemplateImportFeedback(summary: TemplateImportSummary | undefined, tr: Translate) { | CODE |
| LOW | frontend/src/lib/tradingagents-progress.ts | 13 | export function shouldContinueProgressWatch( | CODE |
| LOW⚡ | tests/test_ai_failover.py | 88 | def test_classify_timeout_switch(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 93 | def test_classify_connection_switch(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 98 | def test_classify_rate_limit_switch(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 103 | def test_classify_server_error_switch(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 108 | def test_classify_auth_switch(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 113 | def test_classify_param_incompatible_retry_same(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 135 | def test_classify_unknown_defaults_switch(): | CODE |
| LOW⚡ | tests/test_ai_failover.py | 143 | def test_failover_param_strip_retry_same_model(): | CODE |
| LOW | tests/test_ai_failover.py | 158 | def test_failover_switch_to_next_and_cooldown(): | CODE |
| LOW | tests/test_ai_failover.py | 177 | def test_failover_fatal_raises_without_switch(): | CODE |
| LOW | tests/test_ai_failover.py | 189 | def test_failover_all_cooling_recovery_probe(): | CODE |
| LOW | tests/test_ai_failover.py | 204 | def test_failover_chain_exhausted_raises_last_error(): | CODE |
| LOW | tests/test_ai_failover.py | 257 | def test_failover_stream_switch_before_first_token(): | CODE |
| LOW | tests/test_ai_failover.py | 271 | def test_failover_stream_raise_after_started(): | CODE |
| LOW | tests/test_ai_failover.py | 299 | def test_build_failover_client_chain_from_db(): | CODE |
| LOW | tests/test_ai_failover.py | 318 | def test_build_failover_client_env_fallback(monkeypatch): | CODE |
| LOW | tests/test_ai_failover.py | 332 | def test_agent_context_model_label_reflects_used_model(): | CODE |
| LOW | tests/test_datasource_test_path.py | 26 | async def test_success_returns_items_and_count(self): | CODE |
| LOW | tests/test_datasource_test_path.py | 54 | async def test_unbacked_provider_returns_clean_error_not_raise(self): | CODE |
| LOW | tests/test_datasource_test_path.py | 68 | async def test_partial_results_include_symbol_level_errors(self): | CODE |
| LOW⚡ | tests/test_datasource_test_path.py | 91 | def test_default_kline_symbols_cover_each_market_twice(self): | CODE |
| LOW⚡ | tests/test_datasource_test_path.py | 100 | def test_all_symbol_based_seed_tests_use_balanced_defaults(self): | CODE |
| LOW⚡ | tests/test_datasource_test_path.py | 109 | async def test_empty_symbols_report_effective_defaults(self): | CODE |
| LOW | tests/test_datasource_test_path.py | 125 | async def test_success_returns_items_and_count(self): | CODE |
| LOW | tests/test_datasource_test_path.py | 148 | async def test_unbacked_provider_returns_clean_error_not_raise(self): | CODE |
| LOW | tests/test_portfolio_service.py | 11 | def test_portfolio_service_builds_position_summary_from_repository(): | CODE |
| LOW⚡ | tests/test_factor_eval.py | 6 | def test_pearson_perfect_positive(): | CODE |
| LOW⚡ | tests/test_factor_eval.py | 11 | def test_pearson_perfect_negative(): | CODE |
| LOW⚡ | tests/test_factor_eval.py | 16 | def test_pearson_too_few_returns_none(): | CODE |
| LOW⚡ | tests/test_factor_eval.py | 21 | def test_pearson_zero_variance_none(): | CODE |
| LOW⚡ | tests/test_factor_eval.py | 26 | def test_spearman_monotonic_nonlinear(): | CODE |
| LOW⚡ | tests/test_factor_eval.py | 31 | def test_spearman_handles_ties(): | CODE |
| LOW | tests/test_paper_trading_position.py | 7 | def test_position_weight_tiers(): | CODE |
| LOW | tests/test_paper_trading_position.py | 16 | def test_compute_quantity_respects_budget(): | CODE |
| LOW | tests/test_paper_trading_position.py | 27 | def test_compute_quantity_respects_cash(): | CODE |
| LOW | tests/test_paper_trading_position.py | 40 | def test_compute_quantity_insufficient_cash_returns_zero(): | CODE |
| LOW | tests/test_sse_infra.py | 19 | def test_format_sse_event_multiline(): | CODE |
| LOW | tests/test_sse_infra.py | 25 | def test_stream_replay_and_resume(): | CODE |
| LOW | tests/test_sse_infra.py | 49 | def test_stream_live_subscribe(): | CODE |
| LOW | tests/test_sse_infra.py | 72 | def test_hub_create_get_prune(): | CODE |
| LOW | tests/test_sse_infra.py | 88 | def test_middleware_sse_passthrough(): | CODE |
| 1284 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_ai_failover.py | 85 | # ── 错误分类 ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_ai_failover.py | 140 | # ── FailoverAIClient 行为 ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_ai_failover.py | 215 | # ── 流式 failover ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_ai_failover.py | 286 | # ── 候选链构建 ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_ai_failover.py | 329 | # ── run 记录实际使用的模型 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/conftest.py | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 94 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_paper_trading_notify.py | 105 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_paper_trading_notify.py | 107 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_paper_trading_notify.py | 167 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_paper_trading_notify.py | 169 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_paper_trading_notify.py | 278 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_paper_trading_notify.py | 280 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_tradingagents_hk_routes.py | 28 | # ============================================================ | COMMENT |
| MEDIUM | tests/test_tradingagents_hk_routes.py | 30 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_hk_routes.py | 54 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_hk_routes.py | 56 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_hk_routes.py | 78 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_hk_routes.py | 80 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 141 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 143 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 155 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 157 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 220 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 222 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 240 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 242 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 270 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 272 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 285 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 287 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 311 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 313 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 326 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_a_share_data_routes.py | 328 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_intraday_atr.py | 85 | # ── is_abnormal_move (自适应异动判定) ───────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_intraday_atr.py | 127 | # ── intraday_monitor build_prompt 注入 ATR / 自适应规则 ─────────────────── | COMMENT |
| MEDIUM | tests/test_notify_policy.py | 13 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_notify_policy.py | 15 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_notify_policy.py | 46 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_notify_policy.py | 48 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_notify_policy.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_notify_policy.py | 106 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_notify_policy.py | 138 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_notify_policy.py | 140 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 36 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 38 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 91 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 93 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 163 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 169 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 226 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 228 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 241 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 243 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 252 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 254 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 267 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 269 | # ============================================================ | COMMENT |
| MEDIUM⚡ | tests/test_tradingagents_5_tier_rating.py | 344 | # ============================================================ | COMMENT |
| 131 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 101 | except Exception: | CODE |
| LOW | server.py | 161 | except Exception: | CODE |
| LOW | server.py | 261 | except Exception as e: | CODE |
| LOW | server.py | 1040 | except Exception: | CODE |
| LOW | server.py | 1046 | except Exception: | CODE |
| LOW | server.py | 1183 | except Exception: | CODE |
| LOW | server.py | 1190 | except Exception as e: | CODE |
| LOW | server.py | 1308 | except Exception as e: | CODE |
| LOW | server.py | 1348 | except Exception as e: | CODE |
| LOW | server.py | 1433 | except Exception as e: | CODE |
| LOW | server.py | 1478 | except Exception as e: # 兜底:OTel 初始化异常绝不阻断服务启动 | CODE |
| LOW | server.py | 1504 | except Exception as e: | CODE |
| LOW | server.py | 1515 | except Exception as e: | CODE |
| LOW | server.py | 1535 | except Exception as e: | CODE |
| LOW | server.py | 1550 | except Exception as e: | CODE |
| LOW | server.py | 1560 | except Exception as e: | CODE |
| LOW | server.py | 1573 | except Exception as e: | CODE |
| LOW | server.py | 1578 | except Exception as e: | CODE |
| LOW | tests/test_pdf_export.py | 15 | except Exception: | CODE |
| LOW | tests/test_assistant_task_events.py | 107 | except Exception as exc: # pragma: no cover - assertion reports the cause | CODE |
| LOW | tests/eval/run_eval.py | 143 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/eval/framework.py | 124 | except Exception as e: # noqa: BLE001 - 评测记录任何运行异常 | CODE |
| LOW | tests/eval/framework.py | 134 | except Exception: | CODE |
| LOW | scripts/test_paper_trading_local.py | 37 | except Exception: | CODE |
| LOW | scripts/evaluate-assistant-runtime.py | 358 | except Exception as exc: | CODE |
| LOW | packages/marketdata/src/marketdata/client.py | 262 | except Exception as e: | CODE |
| LOW | packages/marketdata/src/marketdata/engine.py | 59 | except Exception as e: | CODE |
| LOW | packages/marketdata/src/marketdata/http.py | 143 | except Exception as e: | CODE |
| LOW⚡ | …ckages/marketdata/src/marketdata/vendors/flash_news.py | 82 | except Exception: | CODE |
| LOW⚡ | …ckages/marketdata/src/marketdata/vendors/flash_news.py | 170 | except Exception: | CODE |
| LOW⚡ | …ckages/marketdata/src/marketdata/vendors/flash_news.py | 250 | except Exception: | CODE |
| LOW | …ckages/marketdata/src/marketdata/vendors/flash_news.py | 314 | except Exception: | CODE |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 122 | except Exception as e: | CODE |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 163 | except Exception as e: | CODE |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 201 | except Exception as e: | CODE |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 238 | except Exception as e: | CODE |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 241 | except Exception as e: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/discovery.py | 94 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/discovery.py | 138 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/discovery.py | 185 | except Exception: | CODE |
| LOW | …ages/marketdata/src/marketdata/vendors/fundamentals.py | 249 | except Exception as e: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/events.py | 184 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/eastmoney.py | 49 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/yfinance.py | 54 | except Exception as e: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 24 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 51 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 68 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 141 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 178 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 249 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 271 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/news.py | 160 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/news.py | 305 | except Exception: | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/news.py | 400 | except Exception: | CODE |
| LOW | …nt-tool-research/src/pan_agent_tool_research/plugin.py | 118 | except Exception as exc: # noqa: BLE001 - plugin failure must fail open | CODE |
| LOW | …nt-tool-research/src/pan_agent_tool_research/plugin.py | 148 | except Exception as exc: # noqa: BLE001 - search is a fail-open boundary | CODE |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 153 | except Exception as exc: # noqa: BLE001 - hosts receive a stable terminal runtime result | CODE |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 286 | except Exception as exc: | CODE |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 485 | except Exception as exc: # noqa: BLE001 - hosts receive a stable terminal runtime result | CODE |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 571 | except Exception as exc: # noqa: BLE001 - extensions are optional boundaries | CODE |
| 405 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | server.py | 101 | except Exception: | CODE |
| HIGH | server.py | 161 | except Exception: | CODE |
| HIGH | server.py | 1183 | except Exception: | CODE |
| HIGH | …ckages/marketdata/src/marketdata/vendors/flash_news.py | 51 | except (ValueError, TypeError): | CODE |
| HIGH | packages/marketdata/src/marketdata/vendors/news.py | 59 | except (ValueError, TypeError): | CODE |
| HIGH | src/platform/marketdata/stock_list.py | 115 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | src/platform/marketdata/quote_display.py | 55 | except ValueError: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 209 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 233 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 242 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 255 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 268 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 354 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 387 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 287 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 307 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 314 | except Exception: | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 324 | except Exception: | CODE |
| HIGH | src/platform/marketdata/collectors/events_collector.py | 204 | except Exception: | CODE |
| HIGH | src/platform/marketdata/collectors/kline_collector.py | 50 | except Exception: | CODE |
| HIGH | src/platform/marketdata/collectors/kline_collector.py | 75 | except Exception: | CODE |
| HIGH | src/platform/marketdata/collectors/market_http.py | 49 | except Exception: | CODE |
| HIGH | src/platform/observability/log_handler.py | 105 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 90 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 186 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 346 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 226 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 255 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 281 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 336 | except Exception: | CODE |
| HIGH | src/platform/observability/otel.py | 322 | except Exception: | CODE |
| HIGH | src/platform/persistence/database.py | 175 | except Exception: | CODE |
| HIGH | src/platform/persistence/migrations.py | 1531 | except Exception: | CODE |
| HIGH | src/platform/persistence/json_safe.py | 49 | except Exception: | CODE |
| HIGH | src/platform/events/sse.py | 96 | except asyncio.TimeoutError: | CODE |
| HIGH | src/platform/notifications/notifier.py | 260 | except Exception: | CODE |
| HIGH | src/modules/research/context_builder.py | 393 | except Exception: | CODE |
| HIGH | src/modules/research/context_scheduler.py | 317 | except Exception: | CODE |
| HIGH | src/modules/research/api/insights.py | 198 | except Exception: | CODE |
| HIGH | src/modules/assistant/export_jobs.py | 263 | except (ExportLeaseLost, LookupError): | CODE |
| HIGH | src/modules/assistant/task_runner.py | 278 | except asyncio.CancelledError: | CODE |
| HIGH | src/modules/assistant/result_builder.py | 54 | except ValueError: | CODE |
| HIGH | src/modules/assistant/api.py | 260 | except asyncio.CancelledError: | CODE |
| HIGH | src/modules/reporting/pdf_export.py | 97 | except Exception: | CODE |
| HIGH | src/modules/reporting/pdf_export.py | 145 | except (TypeError, ValueError): | CODE |
| HIGH | src/modules/paper_trading/paper_trading_scheduler.py | 128 | except Exception: | CODE |
| HIGH | src/modules/market/price_alert_scheduler.py | 86 | except Exception: | CODE |
| HIGH | src/modules/administration/api/onboarding.py | 229 | except Exception: | CODE |
| HIGH | src/modules/administration/api/logs.py | 147 | except ValueError: | CODE |
| HIGH | src/modules/administration/api/logs.py | 156 | except ValueError: | CODE |
| HIGH | src/modules/administration/api/logs.py | 375 | except ValueError: | CODE |
| HIGH | src/modules/administration/api/settings.py | 178 | except OSError: | CODE |
| HIGH | src/modules/administration/api/settings.py | 211 | except Exception: | CODE |
| HIGH | src/modules/administration/api/settings.py | 156 | except OSError: | CODE |
| HIGH | src/modules/automation/daily_report.py | 426 | except ValueError: | CODE |
| HIGH | src/modules/automation/daily_report.py | 530 | except ValueError: | CODE |
| HIGH | src/modules/automation/intraday_monitor.py | 419 | except Exception: | CODE |
| HIGH | src/modules/automation/premarket_outlook.py | 356 | except Exception: | CODE |
| HIGH | src/modules/automation/premarket_outlook.py | 489 | except ValueError: | CODE |
| HIGH | src/modules/automation/premarket_outlook.py | 585 | except ValueError: | CODE |
| 11 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 26 | CODE | |
| LOW | server.py | 1608 | CODE | |
| LOW | tests/test_datasource_test_path.py | 3 | CODE | |
| LOW | tests/test_add_position_eval.py | 3 | CODE | |
| LOW | tests/test_tradingagents_progress_recovery.py | 3 | CODE | |
| LOW | tests/conftest.py | 7 | CODE | |
| LOW | tests/conftest.py | 85 | CODE | |
| LOW | tests/test_paper_trading_notify.py | 5 | CODE | |
| LOW | tests/test_tradingagents_hk_routes.py | 9 | CODE | |
| LOW | tests/test_factor_calibration_loop.py | 3 | CODE | |
| LOW | tests/test_factor_calibration_loop.py | 10 | CODE | |
| LOW | tests/test_evaluations_api.py | 3 | CODE | |
| LOW | tests/test_evaluations_api.py | 8 | CODE | |
| LOW | tests/test_ai_provider_sniff.py | 3 | CODE | |
| LOW | tests/test_ai_provider_sniff.py | 12 | CODE | |
| LOW | tests/test_factor_calibration.py | 3 | CODE | |
| LOW | tests/test_factor_calibration.py | 10 | CODE | |
| LOW | tests/test_assistant_context_repository.py | 7 | CODE | |
| LOW | tests/test_assistant_context_repository.py | 7 | CODE | |
| LOW | tests/test_datasource_reconcile.py | 3 | CODE | |
| LOW | tests/test_datasource_reconcile.py | 9 | CODE | |
| LOW | tests/test_i18n_system_outputs.py | 3 | CODE | |
| LOW | tests/test_tradingagents_history_comparison.py | 3 | CODE | |
| LOW | tests/test_pdf_export.py | 3 | CODE | |
| LOW | tests/test_pdf_export.py | 80 | CODE | |
| LOW | tests/test_tradingagents_a_share_data_routes.py | 18 | CODE | |
| LOW | tests/test_trading_execution_guards.py | 14 | CODE | |
| LOW | tests/test_trading_execution_guards.py | 14 | CODE | |
| LOW | tests/test_trading_execution_guards.py | 14 | CODE | |
| LOW | tests/test_ta_load_ohlcv_patch.py | 7 | CODE | |
| LOW | tests/test_tradingagents_module_layout.py | 3 | CODE | |
| LOW | tests/test_intraday_atr.py | 9 | CODE | |
| LOW | tests/test_notify_policy.py | 3 | CODE | |
| LOW | tests/test_quote_routing.py | 3 | CODE | |
| LOW | tests/test_assistant_service.py | 10 | CODE | |
| LOW | tests/test_assistant_service.py | 10 | CODE | |
| LOW | tests/test_json_safe.py | 3 | CODE | |
| LOW | tests/test_run_progress_stale.py | 3 | CODE | |
| LOW | tests/test_template_import.py | 1 | CODE | |
| LOW | tests/test_kline_collector_cache.py | 7 | CODE | |
| LOW | tests/test_assistant_results.py | 14 | CODE | |
| LOW | tests/test_home_phase_a.py | 3 | CODE | |
| LOW | tests/test_tradingagents_5_tier_rating.py | 7 | CODE | |
| LOW | tests/test_cn_symbol_mapping.py | 7 | CODE | |
| LOW | tests/test_price_alert_volume_ratio.py | 6 | CODE | |
| LOW | tests/test_context_enrichments.py | 12 | CODE | |
| LOW | tests/test_kline_fetch_coalesce.py | 11 | CODE | |
| LOW | tests/test_marketdata_flagon_caching.py | 11 | CODE | |
| LOW | tests/test_assistant_production_runtime.py | 4 | CODE | |
| LOW | tests/test_assistant_production_runtime.py | 4 | CODE | |
| LOW | tests/test_assistant_production_runtime.py | 4 | CODE | |
| LOW | tests/test_curate.py | 2 | CODE | |
| LOW | tests/test_portfolio_benchmark.py | 3 | CODE | |
| LOW | tests/test_notifications.py | 13 | CODE | |
| LOW | tests/test_onboarding.py | 15 | CODE | |
| LOW | tests/test_onboarding.py | 21 | CODE | |
| LOW | tests/test_tradingagents_trigger_idempotency.py | 9 | CODE | |
| LOW | tests/test_timezone.py | 3 | CODE | |
| LOW | tests/test_timezone.py | 5 | CODE | |
| LOW | tests/test_selfcheck.py | 3 | CODE | |
| 322 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/__init__.py | 31 | __all__ = [ | CODE |
| LOW | packages/marketdata/src/marketdata/engine.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/http.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ages/marketdata/src/marketdata/vendors/fundamentals.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/eastmoney.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/sina.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/tencent.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/yfinance.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | packages/marketdata/src/marketdata/vendors/kline.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | …-tool-research/src/pan_agent_tool_research/__init__.py | 13 | __all__ = [ | CODE |
| LOW | packages/pan-agent-runtime/src/pan_agent/registry.py | 66 | def set_exposure(self, name: str, exposure: ToolExposure) -> None: | CODE |
| LOW | packages/pan-agent-runtime/src/pan_agent/__init__.py | 55 | __all__ = [ | CODE |
| LOW | …gent-token-meter/src/pan_agent_token_meter/__init__.py | 6 | __all__ = ["HeuristicTokenMeter", "TiktokenTokenMeter", "normalize_provider_usage"] | CODE |
| LOW | src/platform/scheduling/trading_calendar.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/marketdata/stock_list.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/marketdata/marketdata_client.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/marketdata/javascript_runtime.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | …platform/marketdata/collectors/screenshot_collector.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | …/platform/marketdata/collectors/discovery_collector.py | 4 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/marketdata/collectors/events_collector.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/marketdata/collectors/kline_collector.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/marketdata/collectors/market_http.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | src/platform/observability/otel.py | 329 | def set_span_attributes(span: Any, attributes: dict) -> None: | CODE |
| LOW | src/platform/observability/otel.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | src/platform/ai/ai_failover.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/ai/ai_client.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/persistence/database.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/persistence/__init__.py | 10 | __all__ = ["Base", "SessionLocal", "engine", "get_db", "init_db"] | CODE |
| LOW | src/platform/persistence/migrations.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/platform/tasking/__init__.py | 10 | __all__ = ["TaskEvent", "TaskEventType", "TaskStatus", "can_transition"] | CODE |
| LOW | src/platform/notifications/notifier.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/analysis_history.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/analysis_link.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/context_builder.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/context_scheduler.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/context_store.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/prediction_outcome.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/signals/__init__.py | 3 | __all__ = ["SignalPack", "SignalPackBuilder"] | CODE |
| LOW | src/modules/research/signals/signal_pack.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/api/recommendations.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/research/api/insights.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/assistant/export_jobs.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/assistant/task_runner.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/assistant/result_builder.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/assistant/api.py | 59 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/assistant/portfolio_diagnosis.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/assistant/tool_adapters.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/reporting/pdf_export.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/paper_trading/paper_trading_engine.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/paper_trading/paper_trading_engine.py | 683 | def _update_account_metrics(self, db: Session, account: PaperTradingAccount) -> None: | CODE |
| LOW⚡ | src/modules/paper_trading/paper_trading_notifier.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/paper_trading/paper_trading_scheduler.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/paper_trading/api/paper_trading.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/portfolio/portfolio_diagnostics.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/portfolio/__init__.py | 18 | __all__ = ["PortfolioService", "build_portfolio_service"] | CODE |
| LOW | src/modules/portfolio/portfolio_benchmark.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/portfolio/api/accounts.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/modules/portfolio/api/dashboard.py | 391 | logger = logging.getLogger(__name__) | CODE |
| 49 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 288 | CODE | |
| LOW | server.py | 641 | CODE | |
| LOW | server.py | 768 | CODE | |
| LOW | server.py | 1233 | CODE | |
| LOW | tests/eval/framework.py | 79 | CODE | |
| LOW | …/skills/panwatch-local-delivery/scripts/isolated_qa.py | 333 | CODE | |
| LOW | scripts/docker_smoke.py | 72 | CODE | |
| LOW | scripts/install-agent-skills.py | 109 | CODE | |
| LOW | packages/marketdata/src/marketdata/client.py | 152 | CODE | |
| LOW | packages/marketdata/src/marketdata/http.py | 82 | CODE | |
| LOW | …kages/marketdata/src/marketdata/vendors/market_flow.py | 218 | CODE | |
| LOW | …ages/marketdata/src/marketdata/vendors/fundamentals.py | 235 | CODE | |
| LOW | packages/marketdata/src/marketdata/vendors/tencent.py | 33 | CODE | |
| LOW | packages/marketdata/src/marketdata/vendors/news.py | 105 | CODE | |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 88 | CODE | |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 201 | CODE | |
| LOW | packages/pan-agent-runtime/src/pan_agent/runtime.py | 516 | CODE | |
| LOW | src/web/response.py | 16 | CODE | |
| LOW | src/platform/scheduling/schedule_parser.py | 52 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 143 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 182 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 219 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 258 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 358 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 423 | CODE | |
| LOW | src/platform/marketdata/stock_list.py | 537 | CODE | |
| LOW | src/platform/marketdata/quote_display.py | 39 | CODE | |
| LOW | …platform/marketdata/collectors/screenshot_collector.py | 273 | CODE | |
| LOW | src/platform/marketdata/collectors/kline_collector.py | 315 | CODE | |
| LOW | src/platform/marketdata/collectors/kline_collector.py | 467 | CODE | |
| LOW | src/platform/marketdata/collectors/kline_collector.py | 633 | CODE | |
| LOW | …atform/marketdata/collectors/capital_flow_collector.py | 65 | CODE | |
| LOW | src/platform/marketdata/collectors/market_http.py | 84 | CODE | |
| LOW | src/platform/observability/log_handler.py | 75 | CODE | |
| LOW | src/platform/observability/otel.py | 302 | CODE | |
| LOW | src/platform/ai/ai_failover.py | 192 | CODE | |
| LOW | src/platform/ai/ai_failover.py | 257 | CODE | |
| LOW | src/platform/persistence/migrations.py | 992 | CODE | |
| LOW | src/platform/persistence/migrations.py | 1535 | CODE | |
| LOW | src/platform/events/sse.py | 77 | CODE | |
| LOW | src/platform/notifications/notifier.py | 126 | CODE | |
| LOW | src/platform/notifications/notifier.py | 211 | CODE | |
| LOW | src/platform/notifications/notifier.py | 241 | CODE | |
| LOW | src/platform/notifications/notifier.py | 351 | CODE | |
| LOW | src/modules/research/analysis_history.py | 23 | CODE | |
| LOW | src/modules/research/context_builder.py | 83 | CODE | |
| LOW | src/modules/research/signals/actions.py | 23 | CODE | |
| LOW | src/modules/research/signals/signal_pack.py | 116 | CODE | |
| LOW | src/modules/assistant/service.py | 181 | CODE | |
| LOW | src/modules/assistant/result_builder.py | 151 | CODE | |
| LOW | src/modules/assistant/api.py | 143 | CODE | |
| LOW | src/modules/assistant/portfolio_diagnosis.py | 219 | CODE | |
| LOW | src/modules/assistant/llm_adapter.py | 49 | CODE | |
| LOW | src/modules/paper_trading/paper_trading_engine.py | 563 | CODE | |
| LOW | src/modules/paper_trading/paper_trading_notifier.py | 367 | CODE | |
| LOW | src/modules/paper_trading/paper_trading_notifier.py | 404 | CODE | |
| LOW | src/modules/portfolio/api/accounts.py | 393 | CODE | |
| LOW | src/modules/portfolio/api/accounts.py | 834 | CODE | |
| LOW | src/modules/portfolio/api/dashboard.py | 61 | CODE | |
| LOW | src/modules/portfolio/api/dashboard.py | 88 | CODE | |
| 50 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/marketdata/src/marketdata/http.py | 82 | CODE | |
| LOW | src/platform/marketdata/collectors/market_http.py | 84 | CODE | |
| LOW | src/modules/research/api/recommendations.py | 134 | CODE | |
| LOW | src/modules/research/api/recommendations.py | 201 | CODE | |
| LOW | src/modules/research/api/evaluations.py | 24 | CODE | |
| LOW | src/modules/research/api/evaluations.py | 86 | CODE | |
| LOW | src/modules/research/api/evaluations.py | 123 | CODE | |
| LOW | src/modules/paper_trading/paper_trading_notifier.py | 454 | CODE | |
| LOW | src/modules/paper_trading/api/paper_trading.py | 541 | CODE | |
| LOW | src/modules/market/price_alert_service.py | 122 | CODE | |
| LOW | src/modules/market/api/stocks.py | 381 | CODE | |
| LOW | src/modules/market/api/price_alerts.py | 260 | CODE | |
| LOW | src/modules/administration/api/logs.py | 80 | CODE | |
| LOW | src/modules/administration/api/logs.py | 181 | CODE | |
| LOW | src/modules/automation/agent_runs.py | 64 | CODE | |
| LOW | src/modules/automation/intraday_monitor.py | 81 | CODE | |
| LOW | src/modules/automation/suggestion_pool.py | 47 | CODE | |
| LOW | src/modules/automation/tradingagents/agent.py | 86 | CODE | |
| LOW | src/modules/automation/tradingagents/runtime_support.py | 35 | CODE | |
| LOW | src/modules/notifications/service.py | 33 | CODE | |
| LOW | src/modules/strategy/entry_candidates.py | 1563 | CODE | |
| LOW | src/modules/strategy/strategy_engine.py | 1460 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_datasources_health.py | 21 | assert out2["health"] is None # 无该 provider 指标 → null,不编数据 | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 75 | raise RuntimeError("请先安装 playwright: pip install playwright && playwright install chromium") | CODE |
| HIGH | …platform/marketdata/collectors/screenshot_collector.py | 152 | Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | build.sh | 23 | # Step 1: 构建前端 | COMMENT |
| LOW⚡ | build.sh | 30 | # Step 2: 复制前端产物到 static 目录 | COMMENT |
| LOW⚡ | build.sh | 36 | # Step 3: 构建 Docker 镜像(amd64 架构,适配大多数服务器/NAS) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | build.sh | 23 | # Step 1: 构建前端 | COMMENT |
| LOW⚡ | build.sh | 30 | # Step 2: 复制前端产物到 static 目录 | COMMENT |
| LOW⚡ | build.sh | 36 | # Step 3: 构建 Docker 镜像(amd64 架构,适配大多数服务器/NAS) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_ai_failover.py | 228 | CODE | |
| MEDIUM | tests/test_portfolio_diagnosis.py | 195 | CODE | |
| MEDIUM | tests/test_portfolio_diagnosis.py | 241 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements-otel.txt | 1 | # OpenTelemetry 导出(可选依赖组) | COMMENT |
| LOW | requirements-runtime.txt | 21 | weasyprint>=60 | COMMENT |
| LOW | .github/workflows/pullfrog.yml | 41 | DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/modules/reporting/pdf_export.py | 104 | + ("This report was generated by AI for reference only; it is not investment advice." if english else "本报告由 AI 生 | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/ARCHITECTURE.en.md | 76 | ├── service.py # use-case orchestration and preferred public boundary | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/platform/persistence/database.py | 303 | # Check if it has the old schema (has base_url column) | COMMENT |