Vibe-Research: Your Personal Trading Research Agent · A股/美股/港股 的个人投研 Agent:每日复盘、资讯雷达、个股数据、板块中心、我的持仓、研究记录。Vibe-Research 把数据和功能配齐,由你自己的 AI 驱动投资研究。
This report presents the forensic synthetic code analysis of simonlin1212/Vibe-Research, a TypeScript project with 1,923 GitHub stars. SynthScan v2.0 examined 23,510 lines of code across 83 source files, recording 229 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 13.1 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 229 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | a-stock-data/SKILL.md | 529 | # ── 东财防封:全局节流 + 会话复用 ──────────────────────────────────── | COMMENT |
| MEDIUM | backend/chat.py | 192 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/chat.py | 194 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/astock.py | 493 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/astock.py | 497 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 39 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 41 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 112 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 114 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 184 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 186 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 251 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 253 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 279 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 281 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/astock.py | 415 | # =========================================================================== | COMMENT |
| MEDIUM | backend/astock.py | 424 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | backend/app.py | 552 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/app.py | 555 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/test_fixes.py | 18 | # ── VR_API_KEY 鉴权中间件 ─────────────────────────────────────────── | COMMENT |
| MEDIUM | backend/tests/test_fixes.py | 29 | # ── 持仓:本地 JSON CRUD(不联网,行情打桩) ──────────────────────── | COMMENT |
| MEDIUM | backend/tests/test_fixes.py | 120 | # ── full_valuation:一致预期缺「均值」/ '-' 占位不再 502 ───────────── | COMMENT |
| MEDIUM | backend/tests/test_fixes.py | 149 | # ── 短线情绪:涨停池脏数值('-' 占位)不再让排序崩溃 ──────────────── | COMMENT |
| MEDIUM | backend/tests/test_fixes.py | 170 | # ── 缓存:数据源故障的空结果不缓存 5 分钟 ─────────────────────────── | COMMENT |
| MEDIUM⚡ | backend/tests/test_fixes.py | 187 | # ── akshare 未安装:market 降级返回空,不挡服务 ───────────────────── | COMMENT |
| MEDIUM⚡ | backend/tests/test_fixes.py | 198 | # ── 流式工具调用:非标网关不带 index 时按 id 归位、不串参数 ────────── | COMMENT |
| MEDIUM | backend/tests/test_fixes.py | 230 | # ── CLI 流式:子进程挂起时超时真正生效(不再无限期阻塞) ──────────── | COMMENT |
| MEDIUM | backend/tests/test_gstock_search.py | 77 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/test_gstock_search.py | 79 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | a-stock-data/SKILL.md | 327 | except Exception: | CODE |
| LOW | a-stock-data/SKILL.md | 341 | except Exception: | CODE |
| LOW | a-stock-data/SKILL.md | 360 | except Exception: | CODE |
| LOW | a-stock-data/SKILL.md | 367 | except Exception: | CODE |
| LOW | a-stock-data/SKILL.md | 546 | except Exception: | CODE |
| LOW | a-stock-data/SKILL.md | 1277 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 1337 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 1945 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2287 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2385 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2468 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2695 | except Exception: return x | CODE |
| LOW | a-stock-data/SKILL.md | 2713 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2791 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2824 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2854 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 2874 | except Exception as e: | CODE |
| LOW | a-stock-data/SKILL.md | 3039 | except Exception as e: | CODE |
| LOW | global-stock-data/SKILL.md | 1384 | except Exception: # Windows 上 zoneinfo 可能缺 tzdata | CODE |
| LOW | backend/gstock.py | 48 | except Exception: | CODE |
| LOW | backend/gstock.py | 130 | except Exception as e: # noqa: BLE001 — 网络/HTTP/JSON 解析都可能 | CODE |
| LOW | backend/market.py | 46 | except Exception: | CODE |
| LOW | backend/market.py | 77 | except Exception: | CODE |
| MEDIUM | backend/market.py | 33 | def _num(v) -> int: | CODE |
| LOW | backend/reflection.py | 68 | except Exception as e: # noqa: BLE001 — 运行时错误以流内事件上报 | CODE |
| LOW | backend/tools.py | 163 | except Exception: # noqa: BLE001 — 网络问题转备用源 | CODE |
| LOW | backend/tools.py | 168 | except Exception: # noqa: BLE001 | CODE |
| LOW | backend/tools.py | 230 | except Exception: # noqa: BLE001 | CODE |
| LOW | backend/tools.py | 253 | except Exception: # noqa: BLE001 — 热门概念是加分项,挂了不该拖垮板块归属 | CODE |
| LOW | backend/tools.py | 270 | except Exception: # noqa: BLE001 — 上游接口不稳,转降级源 | CODE |
| LOW | backend/tools.py | 279 | except Exception: # noqa: BLE001 — 行业是加分项,拿不到不影响主体 | CODE |
| LOW | backend/tools.py | 394 | except Exception as e: # noqa: BLE001 — 工具错误回喂给模型,不中断循环 | CODE |
| LOW | backend/newsradar.py | 44 | except Exception: | CODE |
| LOW | backend/newsradar.py | 47 | except Exception: | CODE |
| LOW | backend/newsradar.py | 97 | except Exception: | CODE |
| LOW | backend/debate.py | 129 | except Exception as e: # noqa: BLE001 — 单项失败只记缺口 | CODE |
| LOW | backend/debate.py | 138 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/debate.py | 293 | except Exception as e: # noqa: BLE001 — 单个角色失败不该毁掉整场辩论 | CODE |
| MEDIUM | backend/astock.py | 188 | def _akshare(): | CODE |
| LOW⚡ | backend/astock.py | 485 | except Exception: | CODE |
| LOW | backend/astock.py | 356 | except Exception: | CODE |
| LOW | backend/astock.py | 461 | except Exception: | CODE |
| LOW | backend/astock.py | 513 | except Exception: | CODE |
| LOW | backend/astock.py | 541 | except Exception: | CODE |
| LOW | backend/astock.py | 561 | except Exception: | CODE |
| LOW | backend/astock.py | 640 | except Exception: | CODE |
| LOW | backend/astock.py | 743 | except Exception: | CODE |
| LOW | backend/astock.py | 763 | except Exception: | CODE |
| LOW | backend/astock.py | 783 | except Exception: | CODE |
| LOW | backend/astock.py | 805 | except Exception: | CODE |
| MEDIUM | backend/app.py | 119 | def gen(): | CODE |
| MEDIUM | backend/app.py | 148 | def gen(): | CODE |
| LOW⚡ | backend/app.py | 297 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 306 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 315 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 324 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 337 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 346 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 355 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app.py | 548 | except Exception as e: # noqa: BLE001 | CODE |
| 35 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | a-stock-data/SKILL.md | 893 | def eastmoney_industry_reports(industry_code: str = "*", max_pages: int = 5, | CODE |
| LOW | a-stock-data/SKILL.md | 1214 | def _save_northbound_snapshot(date: str, hgt: float, sgt: float): | CODE |
| LOW | a-stock-data/SKILL.md | 1315 | def eastmoney_fund_flow_minute(code: str) -> list[dict]: | CODE |
| LOW | global-stock-data/SKILL.md | 993 | def financial_statements_eastmoney(secucode: str, statement: str = "balance", | CODE |
| LOW | global-stock-data/SKILL.md | 1229 | def financial_statements_yahoo(symbol: str, | CODE |
| LOW | backend/astock.py | 153 | def eastmoney_industry_reports(keywords: list[str] | None = None, days: int = 90, max_pages: int = 3) -> list[dict]: | CODE |
| LOW⚡ | backend/tests/test_version_source.py | 8 | def test_reads_version_from_package_json(): | CODE |
| LOW⚡ | backend/tests/test_version_source.py | 12 | def test_missing_file_returns_unknown_not_a_stale_version(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_version_source.py | 18 | def test_warning_never_goes_to_stdout(monkeypatch): | CODE |
| LOW | backend/tests/test_version_source.py | 32 | def test_mcp_server_reports_the_same_version(): | CODE |
| LOW | backend/tests/test_version_source.py | 37 | def test_turnover_projection_keeps_every_documented_field(): | CODE |
| LOW | backend/tests/test_pure.py | 53 | def test_parse_gtimg_bad_line_ignored(): | CODE |
| LOW | backend/tests/test_mcp_stdio_encoding.py | 21 | def test_gbk_stdout_would_crash_without_the_fix(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_live.py | 20 | def test_full_valuation_shape(): | CODE |
| LOW⚡ | backend/tests/test_live.py | 27 | def test_reports_and_announcements(): | CODE |
| LOW⚡ | backend/tests/test_live.py | 36 | def test_financials_and_percentile(): | CODE |
| LOW | backend/tests/test_live.py | 57 | def test_concept_blocks_and_industry(): | CODE |
| LOW | backend/tests/test_live.py | 65 | def test_short_term_emotion_shape(): | CODE |
| LOW | backend/tests/test_live.py | 94 | def test_global_indices_and_stock(): | CODE |
| LOW | backend/tests/test_fixes.py | 39 | def test_portfolio_crud_roundtrip(tmp_pf): | CODE |
| LOW | backend/tests/test_fixes.py | 63 | def test_portfolio_add_validation(tmp_pf): | CODE |
| LOW | backend/tests/test_fixes.py | 68 | def test_portfolio_corrupt_file_returns_empty(tmp_pf): | CODE |
| LOW | backend/tests/test_fixes.py | 86 | def test_portfolio_legacy_migration(tmp_path, monkeypatch): | CODE |
| LOW | backend/tests/test_fixes.py | 101 | def test_myreports_legacy_migration(tmp_path, monkeypatch): | CODE |
| LOW | backend/tests/test_fixes.py | 125 | def test_full_valuation_dirty_forecast(monkeypatch): | CODE |
| LOW | backend/tests/test_fixes.py | 137 | def test_full_valuation_string_numbers(monkeypatch): | CODE |
| LOW | backend/tests/test_fixes.py | 151 | def test_emotion_dirty_amount(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_fixes.py | 189 | def test_market_degrades_without_akshare(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_fixes.py | 200 | def test_stream_tool_calls_without_index(monkeypatch): | CODE |
| LOW | backend/tests/test_fixes.py | 232 | def test_run_cli_stream_timeout(monkeypatch): | CODE |
| LOW | backend/tests/test_api.py | 63 | def test_gstock_quote_full_null_shape(): | CODE |
| LOW | backend/tests/test_reports_and_security.py | 24 | def test_classify_by_filename(): | CODE |
| LOW | backend/tests/test_reports_and_security.py | 30 | def test_report_roundtrip_and_delete(): | CODE |
| LOW⚡ | backend/tests/test_reports_and_security.py | 76 | def test_ssrf_public_mode_blocks_internal(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_reports_and_security.py | 86 | def test_negative_cost_accepted(): | CODE |
| LOW⚡ | backend/tests/test_reports_and_security.py | 92 | def test_zero_shares_rejected(): | CODE |
| LOW | backend/tests/test_gstock_search.py | 25 | def test_falls_back_to_second_endpoint(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 42 | def test_all_endpoints_down_raises_instead_of_returning_none(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 56 | def test_unknown_symbol_still_returns_none(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 66 | def test_malformed_payload_is_not_treated_as_not_found(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 91 | def test_missing_table_falls_through_to_backup(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 111 | def test_all_endpoints_return_bad_shape_raises(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 122 | def test_http_error_with_json_body_is_not_a_match(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 133 | def test_empty_data_with_valid_shape_is_still_not_found(monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 145 | def test_malformed_payload_falls_through_instead_of_crashing(payload, monkeypatch): | CODE |
| LOW | backend/tests/test_gstock_search.py | 160 | def test_malformed_primary_still_uses_backup(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 42 | def test_chat_reexports_tools(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 48 | def test_pick_trims_and_tolerates(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 55 | def test_exec_tool_never_raises(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 61 | def test_exec_tool_wraps_handler_exception(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 89 | def test_referee_sees_everyone(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 95 | def test_referee_prompt_forbids_recommendation(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 102 | def test_dossier_spec_marks_rate_limited_sources_serial(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 119 | def test_payload_empty_sees_through_wrappers(value, empty): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 123 | def test_structurally_empty_counts_as_gap(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 133 | def test_legitimately_empty_section_is_not_a_gap(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 191 | def test_debate_aborts_when_no_data(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 199 | def test_no_record_wording_does_not_claim_certainty(monkeypatch): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 206 | def test_reflection_rejects_empty(): | CODE |
| LOW⚡ | backend/tests/test_agents.py | 211 | def test_reflection_truncates_long_source(monkeypatch): | CODE |
| 9 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/version.py | 10 | CODE | |
| LOW | backend/gstock.py | 16 | CODE | |
| LOW | backend/market.py | 7 | CODE | |
| LOW | backend/reflection.py | 11 | CODE | |
| LOW | backend/tools.py | 14 | CODE | |
| LOW | backend/newsradar.py | 10 | CODE | |
| LOW | backend/debate.py | 17 | CODE | |
| LOW | backend/myreports.py | 12 | CODE | |
| LOW | backend/chat.py | 10 | CODE | |
| LOW | backend/chat.py | 20 | CODE | |
| LOW | backend/chat.py | 22 | CODE | |
| LOW | backend/astock.py | 12 | CODE | |
| LOW | backend/astock.py | 17 | CODE | |
| LOW | backend/astock.py | 21 | CODE | |
| LOW | backend/app.py | 10 | CODE | |
| LOW | backend/portfolio.py | 12 | CODE | |
| LOW | backend/cli_runtime.py | 10 | CODE | |
| LOW | backend/mcp_server.py | 13 | CODE | |
| LOW | backend/tests/test_pure.py | 2 | CODE | |
| LOW | backend/tests/test_reports_and_security.py | 10 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/market.py | 40 | CODE | |
| LOW | backend/reflection.py | 37 | CODE | |
| LOW | backend/newsradar.py | 56 | CODE | |
| LOW | backend/debate.py | 65 | CODE | |
| LOW | backend/debate.py | 253 | CODE | |
| LOW | backend/chat.py | 247 | CODE | |
| LOW | backend/astock.py | 658 | CODE | |
| LOW | backend/cli_runtime.py | 93 | CODE | |
| LOW | backend/cli_runtime.py | 149 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | a-stock-data/SKILL.md | 3046 | # Step 1: iwencai 多 query 语义搜索 | COMMENT |
| LOW | a-stock-data/SKILL.md | 3063 | # Step 2: 东财补充同标的研报 + PDF | COMMENT |
| LOW | global-stock-data/SKILL.md | 231 | # Step 1: 获取 cookie | COMMENT |
| LOW | global-stock-data/SKILL.md | 234 | # Step 2: 获取 crumb | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | a-stock-data/SKILL.md | 601 | min5 = client.bars(symbol='688017', frequency=0, offset=48) # 5分钟 | COMMENT |
| LOW | frontend/src/hooks/useLiveQuotes.ts | 1 | // 自选股实时行情轮询。 | COMMENT |
| LOW | backend/debate.py | 21 | COMMENT |