Distilly — Distill how they think into reusable Skills for any Agent or Bot. Formerly Colleague Skill(原同事 Skill).
This report presents the forensic synthetic code analysis of titanwings/colleague-skill, a Python project with 24,092 GitHub stars. SynthScan v2.0 examined 23,217 lines of code across 105 source files, recording 238 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 14.8 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).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 238 distinct pattern matches across 9 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 |
|---|---|---|---|---|
| LOW | tools/skill_presets.py | 196 | def normalize_research_profile(character: str | None, research_profile: str | None) -> str: | CODE |
| LOW | tools/skill_presets.py | 213 | def get_research_profile_preset(character: str | None, research_profile: str | None = None) -> dict: | CODE |
| LOW | tools/skill_presets.py | 266 | def resolve_existing_storage_root( | CODE |
| LOW | tools/install_generated_skill_common.py | 52 | def render_installed_markdown(skill_dir: Path, artifact_name: str, command_name: str) -> str: | CODE |
| LOW | tools/slack_auto_collector.py | 398 | def fetch_messages_from_channel( | CODE |
| LOW | tools/install_openclaw_generated_skill.py | 12 | def default_openclaw_skills_dir() -> Path: | CODE |
| LOW | tools/feishu_browser.py | 35 | def get_default_chrome_profile() -> str: | CODE |
| LOW⚡ | tools/install_claude_generated_skill.py | 17 | def default_claude_skills_dir() -> Path: | CODE |
| LOW⚡ | tools/install_claude_generated_skill.py | 22 | def default_claude_commands_dir() -> Path: | CODE |
| LOW⚡ | tools/install_claude_generated_skill.py | 27 | def should_install_command_shim(system_name: str | None = None) -> bool: | CODE |
| LOW | tools/skill_schema.py | 171 | def read_existing_artifact_names(skill_dir: Path) -> dict[str, str]: | CODE |
| LOW | tools/skill_schema.py | 337 | def enrich_existing_skill_meta( | CODE |
| LOW | tools/dingtalk_auto_collector.py | 487 | def get_default_chrome_profile() -> str: | CODE |
| LOW | tools/research/merge_research.py | 40 | def collect_structured_section_metrics(text: str) -> dict: | CODE |
| LOW | tools/research/merge_research.py | 77 | def collect_source_weight_distribution(text: str) -> Counter: | CODE |
| LOW | tools/research/merge_research.py | 106 | def count_potential_long_quote_lines(text: str) -> int: | CODE |
| LOW | tools/research/quality_check.py | 63 | def extract_summary_percentage(summary_text: str, label: str) -> int: | CODE |
| LOW | tools/research/transcribe_audio.py | 80 | def transcribe_with_faster_whisper(audio_path: Path, model_name: str, language: Optional[str]) -> str: | CODE |
| LOW | tools/research/transcribe_audio.py | 116 | def transcribe_with_openai_whisper(audio_path: Path, model_name: str, language: Optional[str]) -> str: | CODE |
| LOW | tools/research/transcribe_audio.py | 143 | def transcribe_with_openai_api(audio_path: Path, language: Optional[str]) -> str: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 48 | def _assert_readme_support_contract(self, content: str, source: str) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 72 | def _assert_readme_quick_start( | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 99 | def test_root_skill_uses_distilly_entrypoint(self) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 140 | def test_readme_quick_start_and_install_detail_contract(self) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 203 | def test_repo_examples_live_under_skills_colleague(self) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 209 | def test_multilingual_readmes_list_hosts_without_invocation_tutorials(self) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 237 | def test_non_chinese_docs_call_the_product_lark(self) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 251 | def test_non_chinese_surfaces_do_not_mix_chinese_copy(self) -> None: | CODE |
| LOW | tests/test_skill_entrypoint_docs.py | 300 | def test_code_uses_new_names_with_explicit_legacy_fallbacks(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 26 | def test_slugify_produces_portable_kebab_case(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 31 | def test_create_skill_rejects_unsafe_slug_before_writing(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 44 | def test_legacy_path_segments_are_windows_safe(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 52 | def test_create_colleague_uses_portable_names_and_adds_engine_schema(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 128 | def test_create_relationship_uses_character_preset_metadata(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 162 | def test_create_skill_renders_chinese_chrome_when_language_is_zh_cn(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 190 | def test_work_only_skill_replaces_persona_handoff(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 270 | def test_create_celebrity_adds_research_dirs_and_toolchain(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 313 | def test_create_celebrity_budget_unfriendly_embeds_profile_config(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 352 | def test_create_celebrity_accepts_string_profile_from_runtime_meta(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 375 | def test_existing_dot_skill_metadata_keeps_legacy_engine_identifiers(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 406 | def test_update_preserves_names_from_legacy_meta_without_artifacts(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 445 | def test_update_rejects_traversal_in_stored_version_before_backup(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 470 | def test_update_regenerates_manifest_and_archives_artifacts(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 500 | def test_update_accepts_multiple_persona_corrections_in_one_payload(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 542 | def test_update_replaces_existing_markdown_sections_instead_of_appending_duplicates(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 616 | def test_backup_and_rollback_include_manifest(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 638 | def test_version_manager_can_still_resolve_legacy_colleagues_root(self) -> None: | CODE |
| LOW | tests/test_skill_writer.py | 659 | def test_character_prompt_bundles_exist(self) -> None: | CODE |
| LOW | tests/test_config_migration.py | 29 | def test_collectors_read_legacy_config_and_save_new_config_privately(self) -> None: | CODE |
| LOW | tests/test_install_generated_skill.py | 43 | def test_default_skills_dirs_cover_all_documented_hosts(self) -> None: | CODE |
| LOW | tests/test_install_generated_skill.py | 68 | def test_install_rewrites_only_the_legacy_copy_to_canonical_name(self) -> None: | CODE |
| LOW | tests/test_install_generated_skill.py | 96 | def test_install_rejects_ancestor_or_descendant_destinations(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 58 | def test_build_query_accepts_username_with_at_prefix(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 61 | def test_build_query_rejects_invalid_username(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 65 | def test_validate_limit_rejects_unbounded_collection(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 71 | def test_normalize_post_canonicalizes_url_and_metrics(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 79 | def test_normalize_post_truncates_long_form_text(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 88 | def test_normalize_post_accepts_current_normalized_contract(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 100 | def test_normalize_post_removes_terminal_control_characters(self) -> None: | CODE |
| LOW⚡ | tests/test_xquik_public_posts.py | 108 | def test_normalize_post_rejects_non_x_source_url(self) -> None: | CODE |
| 35 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/feishu_auto_collector.py | 64 | # ─── 配置 ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_auto_collector.py | 129 | # ─── Token ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_auto_collector.py | 200 | # ─── 用户搜索 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_auto_collector.py | 368 | # ─── 消息记录 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_auto_collector.py | 666 | # ─── 文档采集 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_auto_collector.py | 777 | # ─── 多维表格 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_auto_collector.py | 832 | # ─── 主流程 ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_mcp_client.py | 49 | # ─── 配置管理 ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_mcp_client.py | 94 | # ─── MCP 调用封装 ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_mcp_client.py | 153 | # ─── 功能函数 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/feishu_mcp_client.py | 257 | # ─── CLI ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 43 | # ─── 依赖检查 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 55 | # ─── 常量 ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 73 | # ─── 错误类型 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 87 | # ─── 配置管理 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 159 | # ─── Slack Client 封装(带速率限制重试)───────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 239 | # ─── 用户搜索 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 331 | # ─── 频道发现 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 396 | # ─── 消息采集 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 493 | # ─── 主采集流程 ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/slack_auto_collector.py | 652 | # ─── CLI 入口 ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 50 | # ─── 配置 ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 94 | # ─── Token ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 144 | # ─── 用户搜索 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 217 | # ─── 文档采集 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 369 | # ─── 多维表格 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 485 | # ─── 消息记录(浏览器方案)──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tools/dingtalk_auto_collector.py | 673 | # ─── 主流程 ─────────────────────────────────────────────────────────────────── | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/feishu_browser.py | 148 | if (cells.length === 0) return null; | CODE |
| HIGH | tools/feishu_browser.py | 164 | row.push(grid[r] && grid[r][c] ? grid[r][c] : ''); | CODE |
| HIGH | tools/feishu_browser.py | 166 | rows.push(row); | CODE |
| HIGH | tools/feishu_browser.py | 264 | results.push({{ sender, content, time }}); | CODE |
| HIGH | tools/feishu_browser.py | 320 | print("错误:请先安装 Playwright:pip install playwright && playwright install chromium", file=sys.stderr) | STRING |
| HIGH | tools/dingtalk_auto_collector.py | 91 | print(" pip3 install playwright && playwright install chromium") | CODE |
| HIGH | tools/dingtalk_auto_collector.py | 512 | "请运行:pip3 install playwright && playwright install chromium\n" | CODE |
| HIGH | tools/dingtalk_auto_collector.py | 630 | results.push({{ sender, content, time }}); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/install_codex_skill.py | 4 | CODE | |
| LOW | tools/feishu_auto_collector.py | 42 | CODE | |
| LOW | tools/install_generated_skill.py | 4 | CODE | |
| LOW | tools/version_manager.py | 9 | CODE | |
| LOW | tools/skill_presets.py | 9 | CODE | |
| LOW | tools/install_codex_generated_skill.py | 4 | CODE | |
| LOW | tools/install_generated_skill_common.py | 4 | CODE | |
| LOW | tools/feishu_mcp_client.py | 34 | CODE | |
| LOW | tools/feishu_mcp_client.py | 42 | CODE | |
| LOW | tools/install_hermes_skill.py | 4 | CODE | |
| LOW | tools/slack_auto_collector.py | 33 | CODE | |
| LOW | tools/feishu_parser.py | 19 | CODE | |
| LOW | tools/install_openclaw_generated_skill.py | 4 | CODE | |
| LOW | tools/feishu_browser.py | 24 | CODE | |
| LOW | tools/feishu_browser.py | 28 | CODE | |
| LOW | tools/install_claude_generated_skill.py | 4 | CODE | |
| LOW | tools/skill_schema.py | 6 | CODE | |
| LOW | tools/dingtalk_auto_collector.py | 27 | CODE | |
| LOW | tools/dingtalk_auto_collector.py | 515 | CODE | |
| LOW | tools/install_openclaw_skill.py | 4 | CODE | |
| LOW | tools/skill_writer.py | 9 | CODE | |
| LOW | tools/research/merge_research.py | 13 | CODE | |
| LOW | tools/research/quality_check.py | 4 | CODE | |
| LOW | tools/research/xquik_public_posts.py | 4 | CODE | |
| LOW | tools/research/srt_to_transcript.py | 4 | CODE | |
| LOW | tools/research/transcribe_audio.py | 30 | CODE | |
| LOW | tests/test_skill_writer.py | 1 | CODE | |
| LOW | tests/test_config_migration.py | 1 | CODE | |
| LOW | tests/test_install_generated_skill.py | 1 | CODE | |
| LOW | tests/test_xquik_public_posts.py | 1 | CODE | |
| LOW | tests/test_install_claude_generated_skill.py | 1 | CODE | |
| LOW | tests/test_cli_lifecycle.py | 1 | CODE | |
| LOW | tests/test_research_tools.py | 1 | CODE | |
| LOW | tests/test_install_openclaw_and_codex.py | 1 | CODE | |
| LOW | tests/test_install_hermes_skill.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | SKILL.md | 843 | ### Step 0: Confirm the character family | COMMENT |
| LOW | SKILL.md | 860 | ### Step 1: Basic Info Collection | COMMENT |
| LOW | SKILL.md | 881 | ### Step 2: Source Material Import | COMMENT |
| LOW | SKILL.md | 1139 | ### Step 3: Analyze Source Material | COMMENT |
| LOW | SKILL.md | 1324 | ### Step 4: Generate and Preview | COMMENT |
| LOW | SKILL.md | 1352 | ### Step 5: Write Files | COMMENT |
| LOW⚡ | tools/feishu_auto_collector.py | 847 | # Step 1: 搜索用户 | COMMENT |
| LOW⚡ | tools/feishu_auto_collector.py | 853 | # Step 2: 采集消息记录 | COMMENT |
| LOW⚡ | tools/feishu_auto_collector.py | 864 | # Step 3: 采集文档 | COMMENT |
| LOW⚡ | tools/slack_auto_collector.py | 602 | # Step 1: 搜索用户 | COMMENT |
| LOW⚡ | tools/slack_auto_collector.py | 612 | # Step 2: 找共同频道 | COMMENT |
| LOW⚡ | tools/slack_auto_collector.py | 617 | # Step 3: 采集消息 | COMMENT |
| LOW⚡ | tools/dingtalk_auto_collector.py | 690 | # Step 1: 搜索用户 | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 698 | # Step 2: 文档 | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 709 | # Step 3: 多维表格 | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 720 | # Step 4: 消息记录(浏览器方案) | STRING |
| LOW⚡ | prompts/celebrity/persona_builder.md | 158 | ### Step 1: Classify the Question | COMMENT |
| LOW⚡ | prompts/celebrity/persona_builder.md | 164 | ### Step 2: Research Dimensions | COMMENT |
| LOW⚡ | prompts/celebrity/persona_builder.md | 173 | ### Step 3: Apply Framework | COMMENT |
| LOW⚡ | prompts/celebrity/persona_builder.md | 178 | ### Step 4: Calibrate Confidence | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tools/feishu_auto_collector.py | 861 | except Exception as e: | CODE |
| LOW⚡ | tools/feishu_auto_collector.py | 872 | except Exception as e: | CODE |
| LOW | tools/feishu_auto_collector.py | 466 | except Exception: | CODE |
| LOW | tools/feishu_auto_collector.py | 477 | except Exception: | CODE |
| LOW | tools/feishu_auto_collector.py | 540 | except Exception: | CODE |
| LOW | tools/feishu_auto_collector.py | 551 | except Exception: | CODE |
| LOW | tools/email_parser.py | 63 | except Exception: | CODE |
| LOW | tools/email_parser.py | 88 | except Exception: | CODE |
| LOW | tools/email_parser.py | 97 | except Exception: | CODE |
| LOW | tools/email_parser.py | 108 | except Exception: | CODE |
| LOW | tools/feishu_mcp_client.py | 207 | except Exception: | CODE |
| LOW | tools/slack_auto_collector.py | 628 | except Exception as e: | CODE |
| LOW | tools/feishu_browser.py | 64 | except Exception as e: | CODE |
| LOW | tools/feishu_browser.py | 105 | except Exception: | CODE |
| LOW | tools/feishu_browser.py | 123 | except Exception: | CODE |
| LOW | tools/feishu_browser.py | 137 | except Exception: | CODE |
| LOW | tools/feishu_browser.py | 206 | except Exception as e: | STRING |
| LOW | tools/dingtalk_auto_collector.py | 318 | except Exception: | CODE |
| LOW | tools/dingtalk_auto_collector.py | 531 | except Exception as e: | CODE |
| LOW | tools/dingtalk_auto_collector.py | 581 | except Exception as e: | CODE |
| LOW⚡ | tools/dingtalk_auto_collector.py | 706 | except Exception as e: | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 717 | except Exception as e: | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 730 | except Exception as e: | STRING |
| LOW | tools/skill_writer.py | 461 | except Exception: | CODE |
| LOW | tools/research/transcribe_audio.py | 211 | except Exception as exc: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tools/feishu_auto_collector.py | 847 | # Step 1: 搜索用户 | COMMENT |
| LOW⚡ | tools/feishu_auto_collector.py | 853 | # Step 2: 采集消息记录 | COMMENT |
| LOW⚡ | tools/feishu_auto_collector.py | 864 | # Step 3: 采集文档 | COMMENT |
| LOW⚡ | tools/slack_auto_collector.py | 602 | # Step 1: 搜索用户 | COMMENT |
| LOW⚡ | tools/slack_auto_collector.py | 612 | # Step 2: 找共同频道 | COMMENT |
| LOW⚡ | tools/slack_auto_collector.py | 617 | # Step 3: 采集消息 | COMMENT |
| LOW⚡ | tools/dingtalk_auto_collector.py | 690 | # Step 1: 搜索用户 | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 698 | # Step 2: 文档 | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 709 | # Step 3: 多维表格 | STRING |
| LOW⚡ | tools/dingtalk_auto_collector.py | 720 | # Step 4: 消息记录(浏览器方案) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/feishu_auto_collector.py | 240 | CODE | |
| LOW | tools/feishu_auto_collector.py | 418 | CODE | |
| LOW | tools/feishu_auto_collector.py | 489 | CODE | |
| LOW | tools/feishu_auto_collector.py | 569 | CODE | |
| LOW | tools/feishu_auto_collector.py | 779 | CODE | |
| LOW | tools/email_parser.py | 70 | CODE | |
| LOW | tools/feishu_mcp_client.py | 155 | CODE | |
| LOW | tools/feishu_mcp_client.py | 259 | CODE | |
| LOW | tools/feishu_browser.py | 71 | CODE | |
| LOW | tools/feishu_browser.py | 85 | CODE | |
| LOW | tools/dingtalk_auto_collector.py | 225 | CODE | |
| LOW | tools/dingtalk_auto_collector.py | 394 | CODE | |
| LOW | tools/dingtalk_auto_collector.py | 499 | CODE | |
| LOW | tools/research/merge_research.py | 40 | CODE | |
| LOW | tests/test_skill_writer.py | 659 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_research_tools.py | 107 | ## agentic protocol | COMMENT |
| MEDIUM | tests/test_research_tools.py | 225 | ## agentic protocol | COMMENT |