🚀 One-stop solution for creating your AI twin from chat history 💡 Fine-tune LLMs with your chat logs to capture your unique style, then bind to a chatbot to bring your digital self to life.
This report summarizes scanner evidence for xming521/WeClone, a Python project with 18,290 GitHub stars. SynthScan examined 40,557 lines of code across 112 source files, recording 337 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 8.5 (Moderate 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? 261 finding(s).
Are imports declared and package/API names verified? 29 finding(s).
Are wrappers, guards, and repeated structures necessary? 241 finding(s).
Which changes need focused human review? 337 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 337 distinct pattern matches across 9 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⚡ | tests/test_organize_memories.py | 144 | def test_preference_reader_reports_no_matching_input(tmp_path): | CODE |
| LOW⚡ | tests/test_organize_memories.py | 151 | def test_preference_dimension_rejects_other_memory_types(kind, type_): | CODE |
| LOW⚡ | tests/test_organize_memories.py | 157 | def test_preference_pipeline_only_sends_preferences_and_retains_sources(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_organize_memories.py | 12 | def test_source_statistics_weights_chats_equally_and_separates_peers(): | CODE |
| LOW | tests/test_organize_memories.py | 25 | def test_summary_injects_only_current_dimension_time_rule(dim, reduced): | CODE |
| LOW | tests/test_organize_memories.py | 53 | def test_prompt_record_limits_metadata_without_changing_source(content, expected_content): | CODE |
| LOW | tests/test_organize_memories.py | 84 | def test_reader_filters_scores_without_modifying_sources(tmp_path, kind): | CODE |
| LOW | tests/test_organize_memories.py | 102 | def test_reader_excludes_raw_chat_deduplicates_auxiliary_and_retains_origins(tmp_path): | CODE |
| LOW | tests/test_organize_memories.py | 122 | def test_dimension_source_contract(kind, type_, dims): | CODE |
| LOW | tests/test_organize_memories.py | 126 | def test_preference_reader_preserves_ids_scores_and_origins_without_reading_events(tmp_path): | CODE |
| LOW | tests/test_organize_memories.py | 220 | def test_preference_cli_uses_separate_default_output(monkeypatch, preferences_only): | CODE |
| LOW | tests/test_organize_memories.py | 229 | def test_mixed_prepare_separates_preference_naming_from_dimension_classification(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_organize_memories.py | 261 | def test_preference_attributes_fill_fixed_dimension_and_allow_multiple_attributes(): | CODE |
| LOW | tests/test_organize_memories.py | 277 | def test_preference_attributes_reject_invalid_fields_and_references(items): | CODE |
| LOW | tests/test_organize_memories.py | 283 | def test_context_window_uses_codex_effective_window_not_model_maximum(tmp_path, monkeypatch, configured, expected): | CODE |
| LOW | tests/test_organize_memories.py | 309 | def test_unknown_model_requires_explicit_context_window(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_organize_memories.py | 324 | def test_local_budget_does_not_override_codex_context_configuration(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_organize_memories.py | 342 | def test_token_budget_splits_classification_even_when_characters_fit(): | CODE |
| LOW | tests/test_organize_memories.py | 361 | def test_token_budget_splits_summary_and_cross_batch_merge(reduced): | CODE |
| LOW | tests/test_organize_memories.py | 372 | def test_llm_checks_input_budget_before_sending_or_loading_cache(): | CODE |
| LOW | tests/test_organize_memories.py | 380 | def test_classification_batches_use_tag_and_vector_union_without_losing_singletons(): | CODE |
| LOW | tests/test_organize_memories.py | 393 | def test_classification_rejects_lost_ids_and_wrong_source_dimensions(defect): | CODE |
| LOW | tests/test_organize_memories.py | 414 | def test_open_attributes_multi_assignment_and_empty_result_are_supported(): | CODE |
| LOW | tests/test_organize_memories.py | 424 | def test_attribute_clustering_connects_chains_within_dimension(reverse): | CODE |
| LOW | tests/test_organize_memories.py | 449 | def test_relation_groups_collect_each_peer_without_embedding_attributes(): | CODE |
| LOW | tests/test_organize_memories.py | 468 | def test_relation_summary_isolates_peers_through_split_and_reduce(split): | CODE |
| LOW | tests/test_organize_memories.py | 506 | def test_relation_group_validation_distinguishes_same_attribute_across_peers(tmp_path, monkeypatch, defect): | CODE |
| LOW | tests/test_organize_memories.py | 545 | def test_summary_rejects_invalid_references(defect): | CODE |
| LOW | tests/test_organize_memories.py | 557 | def test_summary_allows_unreferenced_inputs_without_extra_output_fields(): | CODE |
| LOW | tests/test_organize_memories.py | 565 | def test_llm_retry_truncation_and_content_addressed_resume(tmp_path): | CODE |
| LOW | tests/test_organize_memories.py | 598 | def test_llm_resume_ignores_configuration_changes(tmp_path, monkeypatch, change): | CODE |
| LOW | tests/test_organize_memories.py | 671 | def test_summary_overwrite_refreshes_current_tasks_and_preserves_other_entries(tmp_path, batched): | CODE |
| LOW | tests/test_organize_memories.py | 711 | def test_full_pipeline_keeps_inputs_and_joins_profile_goals_with_events(tmp_path, monkeypatch, cross_group, extra_sample | CODE |
| LOW | tests/test_organize_memories.py | 777 | def test_summary_record_limit_splits_group_and_reduces_all_sources(dim): | CODE |
| LOW | tests/test_organize_memories.py | 797 | def test_summary_request_limit_counts_unique_sources_across_groups(): | CODE |
| LOW | tests/test_organize_memories.py | 817 | def test_oversized_attribute_group_reduces_across_batches_without_losing_sources(): | CODE |
| LOW | tests/test_organize_memories.py | 844 | def test_different_attribute_groups_share_llm_batch(): | CODE |
| LOW | tests/test_organize_memories.py | 860 | def test_classification_fills_fifty_after_related_neighbors(): | CODE |
| LOW | tests/test_organize_memories.py | 867 | def test_summary_combines_thirty_groups_and_restores_reordered_results(): | CODE |
| LOW | tests/test_organize_memories.py | 893 | def test_combined_summary_rejects_unknown_sources_and_lost_groups(defect): | CODE |
| LOW | tests/test_organize_memories.py | 906 | def test_cross_group_references_warn_and_survive_final_summary(caplog): | CODE |
| LOW | tests/test_organize_memories.py | 929 | def test_combined_summary_deduplicates_shared_memories_and_respects_token_budget(): | CODE |
| LOW | tests/test_organize_memories.py | 949 | def test_embedding_cache_reuses_vectors_and_checks_model_identity(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_organize_memories.py | 972 | def test_embedding_batches_resume_without_rewriting_history(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_organize_memories.py | 1004 | def test_default_embedding_service_starts_as_module_and_keeps_custom_script(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_server_cli.py | 20 | def test_server_cli_routes_options_without_loading_model_config(monkeypatch, options, expected): | CODE |
| LOW | tests/test_server_cli.py | 36 | def test_reset_web_password_cli(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_server_cli.py | 57 | def test_unified_routes_lifespan_auth_and_streaming(tmp_path, monkeypatch, capsys): | CODE |
| LOW | tests/test_llm_inference.py | 62 | def test_parameters_multimodal_and_explicit_none(api): | CODE |
| LOW | tests/test_llm_inference.py | 85 | def test_response_model_validation_and_audit(api, tmp_path): | CODE |
| LOW | tests/test_llm_inference.py | 116 | def test_invalid_structured_responses_retain_text(api, text, finish, error_type): | CODE |
| LOW | tests/test_llm_inference.py | 135 | def test_provider_error_and_retry_override(api): | CODE |
| LOW | tests/test_llm_inference.py | 152 | def test_schema_fallback_and_last_attempt_empty(api, tmp_path): | CODE |
| LOW | tests/test_llm_inference.py | 183 | def test_stream_is_merged_and_closed(api): | CODE |
| LOW | tests/test_llm_inference.py | 226 | def test_batch_order_failures_and_callback_once(api): | CODE |
| LOW | tests/test_llm_inference.py | 246 | def test_stream_failure_preserves_partial_output(api): | CODE |
| LOW | tests/test_llm_inference.py | 272 | def test_close_interrupts_retry(api): | CODE |
| LOW | tests/test_llm_inference.py | 289 | def test_cancel_queued_batch_does_not_hang(api): | CODE |
| LOW | tests/test_llm_inference.py | 360 | def test_codex_success_schema_usage_search_and_cleanup(codex): | STRING |
| LOW | tests/test_llm_inference.py | 369 | def test_codex_minimal_context_defaults_and_explicit_web_search(codex, monkeypatch, web_search): | STRING |
| 131 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_organize_memories.py | 393 | CODE | |
| LOW | tests/test_organize_memories.py | 598 | CODE | |
| LOW | tests/test_canonicalize_state_memories.py | 246 | CODE | |
| LOW | tests/test_distill_windows.py | 93 | CODE | |
| LOW | tests/test_organize_identity_attributes.py | 59 | CODE | |
| LOW | tests/test_PII.py | 31 | CODE | |
| LOW | scripts/check_private_llm_logs.py | 171 | CODE | |
| LOW | scripts/check_profile_paths.py | 123 | CODE | |
| LOW | scripts/check_web_security.py | 85 | CODE | |
| LOW | scripts/check_profile_sources.py | 16 | CODE | |
| LOW | weclone/core/inference/audit.py | 183 | CODE | |
| LOW | weclone/core/inference/offline_infer.py | 51 | CODE | |
| LOW | weclone/core/inference/llm_client.py | 195 | CODE | |
| LOW | weclone/core/inference/llm_client.py | 390 | CODE | |
| LOW | weclone/core/inference/llm_client.py | 504 | CODE | |
| LOW | weclone/core/inference/llm_client.py | 856 | CODE | |
| LOW | weclone/server/auth.py | 173 | CODE | |
| LOW | weclone/server/auth.py | 178 | CODE | |
| LOW | weclone/server/auth.py | 256 | CODE | |
| LOW | weclone/server/api_service.py | 23 | CODE | |
| LOW | weclone/server/source_chat.py | 43 | CODE | |
| LOW | weclone/server/profile_review.py | 85 | CODE | |
| LOW | weclone/server/profile_review.py | 311 | CODE | |
| LOW | weclone/server/profile_review.py | 114 | CODE | |
| LOW | weclone/utils/secure_storage.py | 367 | CODE | |
| LOW | weclone/utils/secure_storage.py | 465 | CODE | |
| LOW | weclone/utils/secure_storage.py | 669 | CODE | |
| LOW | weclone/utils/secure_storage.py | 740 | CODE | |
| LOW | weclone/utils/secure_storage.py | 790 | CODE | |
| LOW | weclone/utils/secure_storage.py | 892 | CODE | |
| LOW | weclone/utils/secure_storage.py | 752 | CODE | |
| LOW | weclone/utils/config.py | 62 | CODE | |
| LOW | weclone/utils/retry.py | 9 | CODE | |
| LOW | weclone/utils/retry.py | 36 | CODE | |
| LOW | weclone/utils/retry.py | 38 | CODE | |
| LOW | weclone/eval/test_model.py | 96 | CODE | |
| LOW | weclone/data/utils.py | 58 | CODE | |
| LOW | weclone/data/qa_generator.py | 34 | CODE | |
| LOW | weclone/data/qa_generator.py | 268 | CODE | |
| LOW | weclone/data/qa_generator.py | 480 | CODE | |
| LOW | weclone/data/qa_generator.py | 686 | CODE | |
| LOW | weclone/data/make_dataset_stage2.py | 237 | CODE | |
| LOW | weclone/data/agent/distill_windows.py | 115 | CODE | |
| LOW | weclone/data/agent/distill_event.py | 96 | CODE | |
| LOW | weclone/data/agent/llm_profile_hierarchy.py | 50 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 76 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 182 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 230 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 371 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 777 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 826 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 191 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 518 | CODE | |
| LOW | weclone/data/agent/distill_profile.py | 439 | CODE | |
| LOW | weclone/data/agent/canonicalize_state_memories.py | 399 | CODE | |
| LOW | weclone/data/agent/canonicalize_state_memories.py | 1048 | CODE | |
| LOW | weclone/data/clean/strategies.py | 79 | CODE | |
| LOW | weclone/data/clean/strategies.py | 159 | CODE | |
| LOW | weclone/data/chat_parsers/telegram_parser.py | 39 | CODE | |
| LOW | weclone/data/chat_parsers/telegram_parser.py | 97 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_full_pipe.py | 256 | except Exception as e: | CODE |
| LOW | tests/test_full_pipe.py | 317 | except Exception as e: | CODE |
| LOW | weclone/cli.py | 390 | except Exception as e: | CODE |
| LOW | weclone/cli.py | 415 | except Exception as e: | CODE |
| LOW | weclone/cli.py | 432 | except Exception as e: | CODE |
| LOW | weclone/core/PII/pii_detector.py | 251 | except Exception as e: | CODE |
| LOW | weclone/core/inference/audit.py | 218 | except Exception as exc: | CODE |
| LOW | weclone/core/inference/embedding_service.py | 142 | except Exception: | CODE |
| LOW | weclone/core/inference/embedding_service.py | 255 | except Exception as exc: | CODE |
| LOW | weclone/core/inference/embedding_service.py | 414 | except Exception as exc: | CODE |
| MEDIUM | weclone/core/inference/embedding_service.py | 245 | def _load_settings_embedding_args() -> dict[str, Any]: | CODE |
| LOW | weclone/core/inference/offline_infer.py | 77 | except Exception as e: | CODE |
| LOW | weclone/core/inference/llm_client.py | 416 | except Exception as exc: | CODE |
| LOW | weclone/core/inference/llm_client.py | 420 | except Exception as exc: | CODE |
| LOW | weclone/core/inference/llm_client.py | 539 | except Exception as exc: | CODE |
| LOW | weclone/core/inference/llm_client.py | 589 | except Exception as exc: | CODE |
| LOW | weclone/utils/config.py | 31 | except Exception as e: | CODE |
| LOW | weclone/utils/config.py | 44 | except Exception as e: | CODE |
| LOW | weclone/utils/token_counter.py | 95 | except Exception as exc: | CODE |
| LOW | weclone/utils/log.py | 17 | except Exception: | CODE |
| LOW | weclone/utils/log.py | 149 | except Exception as e: | CODE |
| MEDIUM | weclone/utils/log.py | 12 | def _encrypted_logging() -> bool: | CODE |
| LOW | weclone/utils/retry.py | 65 | except Exception as e: | CODE |
| LOW | weclone/utils/retry.py | 112 | except Exception as e: | CODE |
| LOW | weclone/eval/cli_demo.py | 29 | except Exception: | CODE |
| LOW | weclone/data/utils.py | 35 | except Exception as e: | CODE |
| LOW | weclone/data/utils.py | 112 | except Exception as e: | CODE |
| LOW | weclone/data/qa_generator.py | 225 | except Exception as e: | CODE |
| LOW | weclone/data/qa_generator.py | 241 | except Exception as e: | CODE |
| LOW | weclone/data/make_dataset_stage2.py | 200 | except Exception: | CODE |
| LOW | weclone/data/agent/group_state_memories.py | 329 | except Exception as exc: | CODE |
| LOW | weclone/data/agent/group_state_memories.py | 348 | except Exception as health_error: | CODE |
| LOW | weclone/data/agent/group_state_memories.py | 371 | except Exception: | CODE |
| LOW | weclone/data/clean/strategies.py | 66 | except Exception as e: | CODE |
| LOW | weclone/data/clean/strategies.py | 201 | except Exception as e: | CODE |
| LOW | weclone/data/chat_parsers/telegram_parser.py | 130 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_full_pipe.py | 266 | except subprocess.TimeoutExpired: | CODE |
| HIGH | weclone/core/inference/embedding_service.py | 447 | except KeyboardInterrupt: | CODE |
| HIGH | weclone/core/inference/llm_client.py | 209 | except json.JSONDecodeError: | CODE |
| HIGH | weclone/core/inference/llm_client.py | 935 | except ProcessLookupError: | CODE |
| HIGH | weclone/server/auth.py | 278 | except asyncio.CancelledError: | CODE |
| HIGH | weclone/data/qa_generator.py | 66 | except (FileNotFoundError, json.JSONDecodeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_PII.py | 2 | CODE | |
| LOW | tests/test_PII.py | 3 | CODE | |
| LOW | tests/test_PII.py | 10 | CODE | |
| LOW | tests/test_PII.py | 20 | CODE | |
| LOW | tests/test_PII.py | 21 | CODE | |
| LOW | tests/test_full_pipe.py | 1 | CODE | |
| LOW | tests/test_full_pipe.py | 7 | CODE | |
| LOW | tests/test_full_pipe.py | 7 | CODE | |
| LOW | tests/test_full_pipe.py | 8 | CODE | |
| LOW | weclone/core/PII/__init__.py | 1 | CODE | |
| LOW | weclone/core/PII/__init__.py | 1 | CODE | |
| LOW | weclone/core/PII/__init__.py | 1 | CODE | |
| LOW | weclone/core/inference/audit.py | 1 | CODE | |
| LOW | weclone/core/inference/__init__.py | 1 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/__init__.py | 2 | CODE | |
| LOW | weclone/core/inference/embedding_service.py | 1 | CODE | |
| LOW | weclone/utils/secure_storage.py | 7 | CODE | |
| LOW | weclone/utils/token_counter.py | 1 | CODE | |
| LOW | weclone/eval/cli_demo.py | 14 | CODE | |
| LOW | weclone/data/agent/organize_identity_attributes.py | 3 | CODE | |
| LOW | weclone/data/agent/organize_memories.py | 3 | CODE | |
| LOW | weclone/data/agent/group_state_memories.py | 1 | CODE | |
| LOW | weclone/data/agent/canonicalize_state_memories.py | 10 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weclone/core/PII/__init__.py | 3 | __all__ = ["PIIResult", "PIIDetector", "ChinesePIIDetector"] | CODE |
| LOW | weclone/core/inference/audit.py | 340 | __all__ = [ | CODE |
| LOW | weclone/core/inference/__init__.py | 12 | __all__ = [ | CODE |
| LOW | weclone/core/inference/llm_client.py | 1112 | __all__ = [ | CODE |
| LOW | weclone/utils/secure_storage.py | 290 | def _set_run_key(key: bytes) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_full_pipe.py | 230 | # Check if blocked_words filtering is working correctly | COMMENT |
| LOW | tests/test_full_pipe.py | 238 | # Check if <image> tags count is correct for Qwen2.5-VL.jsonc config | COMMENT |
| LOW | weclone/utils/i18n.py | 23 | # Check if all lists have the same length | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .pre-commit-config.yaml | 41 | COMMENT | |
| LOW | weclone/utils/length_cdf.py | 1 | # Copyright 2025 the LlamaFactory team. | COMMENT |
| LOW | weclone/prompts/clean_data.py | 41 | # **重要考量:** | COMMENT |
| LOW | weclone/prompts/clean_data.py | 61 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weclone/core/inference/offline_infer.py | 104 | CODE | |
| LOW | weclone/core/inference/llm_client.py | 1040 | CODE | |
| LOW | weclone/core/inference/llm_client.py | 652 | CODE |