Supports comfyui/API calls/modelscope calls
This report summarizes scanner evidence for hero8152/Infinite-Canvas, a Python project with 3,123 GitHub stars. SynthScan examined 109,168 lines of code across 86 source files, recording 1314 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 8.8 (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? 985 finding(s).
Are imports declared and package/API names verified? 9 finding(s).
Are wrappers, guards, and repeated structures necessary? 1211 finding(s).
Which changes need focused human review? 1314 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 1314 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | main.py | 143 | async def broadcast_asset_library_updated(self, updated_at: int = 0): | CODE |
| LOW⚡ | main.py | 714 | def runninghub_wallet_key_env(): | CODE |
| LOW⚡ | main.py | 717 | def volcengine_access_key_env(): | CODE |
| LOW⚡ | main.py | 720 | def volcengine_secret_key_env(): | CODE |
| LOW⚡ | main.py | 750 | def runninghub_wallet_key_value() -> str: | CODE |
| LOW⚡ | main.py | 754 | def volcengine_access_key_value() -> str: | CODE |
| LOW⚡ | main.py | 758 | def volcengine_secret_key_value() -> str: | CODE |
| LOW⚡ | main.py | 762 | def volcengine_provider_api_key(explicit_key: str = "") -> str: | CODE |
| LOW⚡ | main.py | 1206 | def locked_recommended_provider_rule(provider_id="", name="", base_url=""): | CODE |
| LOW⚡ | main.py | 1220 | def apply_locked_recommended_model_rules(base_url="", grouped=None): | CODE |
| LOW⚡ | main.py | 2343 | def update_backup_manifest_path(backup_dir: str) -> str: | CODE |
| LOW⚡ | main.py | 2346 | def read_update_backup_manifest(backup_dir: str) -> Dict[str, Any]: | CODE |
| LOW⚡ | main.py | 2354 | def write_update_backup_manifest(backup_dir: str, payload: Dict[str, Any]) -> None: | CODE |
| LOW⚡ | main.py | 4760 | def is_tudou_async_image_mode(provider, model=""): | CODE |
| LOW⚡ | main.py | 4766 | def is_tudou_async_image_model(model): | CODE |
| LOW⚡ | main.py | 4769 | def tudou_image_model_for_request(model): | CODE |
| LOW⚡ | main.py | 4994 | def codex_output_url_from_path(path): | CODE |
| LOW⚡ | main.py | 5671 | def gemini_cli_reference_note(reference_images=None): | CODE |
| LOW⚡ | main.py | 5681 | async def gemini_cli_reference_paths(reference_images=None): | CODE |
| LOW⚡ | main.py | 5684 | def gemini_cli_image_size_instruction(size="", model=""): | CODE |
| LOW⚡ | main.py | 5994 | def jimeng_video_submit_poll_seconds(): | CODE |
| LOW⚡ | main.py | 6375 | def jimeng_transition_duration(total_duration, transition_count): | CODE |
| LOW⚡ | main.py | 6383 | def jimeng_multiframe_transition_prompts(prompt, segments): | CODE |
| LOW⚡ | main.py | 6628 | def jimeng_normalize_upscale_resolution(value): | CODE |
| LOW⚡ | main.py | 6632 | async def generate_jimeng_upscale_image(reference_images, resolution_type): | CODE |
| LOW⚡ | main.py | 7043 | async def get_asset_classification_prompt(): | CODE |
| LOW⚡ | main.py | 7052 | async def update_asset_classification_prompt(payload: Dict[str, str]): | CODE |
| LOW⚡ | main.py | 7056 | def media_preview_cache_paths(path: str, width: int): | CODE |
| LOW⚡ | main.py | 7484 | def load_asset_classification_prompt(): | CODE |
| LOW⚡ | main.py | 7495 | def save_asset_classification_prompt(text): | CODE |
| LOW⚡ | main.py | 7587 | def parse_asset_classification_text(text): | CODE |
| LOW⚡ | main.py | 7600 | def _read_local_upload_classification(filename): | CODE |
| LOW⚡ | main.py | 7610 | def _write_local_upload_classification(filename, classification): | CODE |
| LOW⚡ | main.py | 7615 | def asset_classification_prompt(extra_prompt=""): | CODE |
| LOW⚡ | main.py | 7622 | async def classify_image_with_provider(abs_path, provider_id="", model="", ms_model="", prompt=""): | CODE |
| LOW⚡ | main.py | 7635 | async def classify_asset_image_best_effort(abs_path, provider_id="", model="", ms_model="", prompt=""): | CODE |
| LOW⚡ | main.py | 7642 | def migrate_asset_library_into_dirs(): | CODE |
| LOW⚡ | main.py | 7689 | def asset_library_workflow_category(lib, library_id="", category_id=""): | CODE |
| LOW⚡ | main.py | 7928 | def normalize_prompt_category_id(category="custom"): | CODE |
| LOW⚡ | main.py | 7932 | def normalize_prompt_library_item(item): | CODE |
| LOW⚡ | main.py | 8403 | def attachment_embedded_image_data_urls(refs, max_images=4): | CODE |
| LOW⚡ | main.py | 8513 | def volcengine_video_duration(duration) -> int: | CODE |
| LOW⚡ | main.py | 8520 | def volcengine_video_resolution(value: str) -> str: | CODE |
| LOW⚡ | main.py | 8530 | def probe_local_audio_duration_seconds(value: str) -> Optional[float]: | CODE |
| LOW⚡ | main.py | 10076 | def rewrite_runninghub_file_url(url): | CODE |
| LOW⚡ | main.py | 10087 | def runninghub_extract_outputs(data): | CODE |
| LOW⚡ | main.py | 10179 | def runninghub_is_workflow_link_value(value): | CODE |
| LOW⚡ | main.py | 10187 | def runninghub_workflow_node_info_list(workflow_json): | CODE |
| LOW⚡ | main.py | 10522 | def runninghub_size_for_aspect(aspect_ratio, fallback="1280x720"): | CODE |
| LOW⚡ | main.py | 10532 | def runninghub_is_image_to_video(value): | CODE |
| LOW⚡ | main.py | 10537 | def runninghub_apply_schema_defaults(body, params): | CODE |
| LOW⚡ | main.py | 11461 | def image_size_from_reference(ref): | CODE |
| LOW⚡ | main.py | 11474 | def chat_requested_image_count(message): | CODE |
| LOW⚡ | main.py | 11484 | def chat_split_parallel_prompts(prompt, count): | CODE |
| LOW⚡ | main.py | 12017 | def _local_upload_safe_folder(path_value): | CODE |
| LOW⚡ | main.py | 12021 | def _local_upload_safe_folder_name(name): | CODE |
| LOW⚡ | main.py | 12028 | def _local_upload_safe_file_stem(name): | CODE |
| LOW⚡ | main.py | 12036 | def _local_upload_caption_path(filename): | CODE |
| LOW⚡ | main.py | 12039 | def _read_local_upload_caption(filename): | CODE |
| LOW⚡ | main.py | 12089 | def _local_upload_folder_node(path="", name="全部上传"): | CODE |
| 831 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | main.py | 1018 | except Exception: | CODE |
| HIGH | main.py | 1575 | except Exception: | CODE |
| HIGH | main.py | 1627 | except Exception: | CODE |
| HIGH | main.py | 3596 | except Exception: | CODE |
| HIGH | main.py | 4291 | except HTTPException: | CODE |
| HIGH | main.py | 5596 | except Exception: | CODE |
| HIGH | main.py | 5927 | except Exception: | CODE |
| HIGH | main.py | 6473 | except Exception: | CODE |
| HIGH | main.py | 6882 | except Exception: | CODE |
| HIGH | main.py | 6971 | except Exception: | CODE |
| HIGH | main.py | 9305 | except HTTPException: | CODE |
| HIGH | main.py | 10175 | except Exception: | CODE |
| HIGH | main.py | 1427 | except Exception: | CODE |
| HIGH | main.py | 1697 | except Exception: | CODE |
| HIGH | main.py | 2507 | except Exception: | CODE |
| HIGH | main.py | 4967 | except Exception: | CODE |
| HIGH | main.py | 5179 | except Exception: | CODE |
| HIGH | main.py | 5225 | except Exception: | CODE |
| HIGH | main.py | 5896 | except Exception: | CODE |
| HIGH | main.py | 7038 | except OSError: | CODE |
| HIGH | main.py | 7094 | except OSError: | CODE |
| HIGH | main.py | 9504 | except Exception: | CODE |
| HIGH | main.py | 10668 | except HTTPException: | CODE |
| HIGH | main.py | 12079 | except Exception: | CODE |
| HIGH | main.py | 13106 | except Exception: | CODE |
| HIGH | main.py | 13305 | except: | CODE |
| HIGH | main.py | 18938 | except Exception: | CODE |
| HIGH | main.py | 3486 | except: pass | CODE |
| HIGH | main.py | 3968 | except Exception: | CODE |
| HIGH | main.py | 5465 | except Exception: | CODE |
| HIGH | main.py | 5507 | except Exception: | CODE |
| HIGH | main.py | 5751 | except Exception: | CODE |
| HIGH | main.py | 5796 | except Exception: | CODE |
| HIGH | main.py | 6623 | except Exception: | CODE |
| HIGH | main.py | 6652 | except Exception: | CODE |
| HIGH | main.py | 6776 | except Exception: | CODE |
| HIGH | main.py | 6861 | except HTTPException: | CODE |
| HIGH | main.py | 8631 | except OSError: pass | CODE |
| HIGH | main.py | 9559 | except Exception: | CODE |
| HIGH | main.py | 12429 | except OSError: | CODE |
| HIGH | main.py | 18265 | except Exception: | CODE |
| HIGH | main.py | 4622 | except HTTPException: | CODE |
| HIGH | main.py | 5335 | except Exception: | CODE |
| HIGH | main.py | 5434 | except Exception: | CODE |
| HIGH | main.py | 5642 | except Exception: | CODE |
| HIGH | main.py | 5889 | except Exception: | CODE |
| HIGH | main.py | 13647 | except Exception: | CODE |
| HIGH | main.py | 13923 | except Exception: | CODE |
| HIGH | main.py | 19007 | except Exception: | CODE |
| HIGH | main.py | 8598 | except OSError: pass | CODE |
| HIGH | main.py | 11403 | except Exception: | CODE |
| HIGH | main.py | 12169 | except OSError: | CODE |
| HIGH | main.py | 12231 | except OSError: | CODE |
| HIGH | main.py | 18032 | except Exception: | CODE |
| HIGH | main.py | 17280 | except Exception: | CODE |
| HIGH | main.py | 19020 | except (ValueError, TypeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | main.py | 3493 | def get_comfy_history(comfy_address, prompt_id): | CODE |
| MEDIUM | main.py | 3589 | def load_projects(): | CODE |
| MEDIUM | main.py | 4286 | def extract_image(data): | CODE |
| MEDIUM | main.py | 4618 | def remember_stream_images_from(value): | CODE |
| MEDIUM | main.py | 5988 | def jimeng_poll_seconds(default=JIMENG_DEFAULT_POLL_SECONDS): | CODE |
| MEDIUM | main.py | 7484 | def load_asset_classification_prompt(): | CODE |
| MEDIUM | main.py | 7635 | def classify_asset_image_best_effort(abs_path, provider_id="", model="", ms_mode | CODE |
| MEDIUM | main.py | 7785 | def shared_folders_load(): | CODE |
| MEDIUM | main.py | 8255 | def _xlsx_shared_strings(archive): | CODE |
| MEDIUM | main.py | 8513 | def volcengine_video_duration(duration) -> int: | CODE |
| MEDIUM | main.py | 8812 | def apimart_video_duration(duration) -> int: | CODE |
| MEDIUM | main.py | 8819 | def apimart_veo31_duration(duration) -> int: | CODE |
| MEDIUM | main.py | 10151 | def log_runninghub_error(stage, raw=None, **extra): | CODE |
| MEDIUM | main.py | 10766 | def normalize_seed_uint32(value): | CODE |
| MEDIUM | main.py | 10808 | def _num(raw, default): | CODE |
| MEDIUM | main.py | 11733 | def stream_remote(): | CODE |
| MEDIUM | main.py | 12189 | def _sniff_image_ext(path): | CODE |
| MEDIUM | main.py | 14903 | def agnes_video_frame_count(duration, fps=24): | CODE |
| MEDIUM | main.py | 15035 | def yuli_video_seconds(duration) -> str: | CODE |
| MEDIUM | main.py | 15263 | def tudou_snap_choice(value, choices, default): | CODE |
| MEDIUM | main.py | 16198 | def smart_canvas_prompt_templates(): | CODE |
| LOW⚡ | main.py | 139 | except Exception as e: | CODE |
| LOW⚡ | main.py | 151 | except Exception as e: | CODE |
| LOW⚡ | main.py | 160 | except Exception as e: | CODE |
| LOW⚡ | main.py | 188 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 193 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 198 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 1202 | except Exception: | CODE |
| LOW⚡ | main.py | 1212 | except Exception: | CODE |
| LOW⚡ | main.py | 2351 | except Exception: | CODE |
| LOW⚡ | main.py | 3962 | except Exception: | CODE |
| LOW⚡ | main.py | 3965 | except Exception: | CODE |
| LOW⚡ | main.py | 3968 | except Exception: | CODE |
| LOW⚡ | main.py | 4990 | except Exception: | CODE |
| LOW⚡ | main.py | 5000 | except Exception: | CODE |
| LOW⚡ | main.py | 5991 | except Exception: | CODE |
| LOW⚡ | main.py | 5998 | except Exception: | CODE |
| LOW⚡ | main.py | 6369 | except Exception: | CODE |
| LOW⚡ | main.py | 6379 | except Exception: | CODE |
| LOW⚡ | main.py | 6623 | except Exception: | CODE |
| LOW⚡ | main.py | 7491 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 7595 | except Exception: | CODE |
| LOW⚡ | main.py | 7607 | except Exception: | CODE |
| LOW⚡ | main.py | 7638 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 7647 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 7681 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 7686 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 7924 | except Exception as e: | CODE |
| LOW⚡ | main.py | 8397 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 8399 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 8516 | except Exception: | CODE |
| LOW⚡ | main.py | 10082 | except Exception: | CODE |
| LOW⚡ | main.py | 10175 | except Exception: | CODE |
| LOW⚡ | main.py | 11470 | except Exception as exc: | CODE |
| LOW⚡ | main.py | 12079 | except Exception: | CODE |
| LOW⚡ | main.py | 13395 | except Exception: | CODE |
| LOW⚡ | main.py | 13425 | except Exception: | CODE |
| LOW⚡ | main.py | 13440 | except Exception: | CODE |
| LOW⚡ | main.py | 15055 | except Exception: | CODE |
| LOW⚡ | main.py | 15064 | except Exception: | CODE |
| 203 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | main.py | 519 | CODE | |
| LOW | main.py | 723 | CODE | |
| LOW | main.py | 842 | CODE | |
| LOW | main.py | 1146 | CODE | |
| LOW | main.py | 1363 | CODE | |
| LOW | main.py | 1567 | CODE | |
| LOW | main.py | 1702 | CODE | |
| LOW | main.py | 1954 | CODE | |
| LOW | main.py | 2455 | CODE | |
| LOW | main.py | 2645 | CODE | |
| LOW | main.py | 3239 | CODE | |
| LOW | main.py | 3277 | CODE | |
| LOW | main.py | 3307 | CODE | |
| LOW | main.py | 3479 | CODE | |
| LOW | main.py | 3715 | CODE | |
| LOW | main.py | 3798 | CODE | |
| LOW | main.py | 3820 | CODE | |
| LOW | main.py | 4176 | CODE | |
| LOW | main.py | 4286 | CODE | |
| LOW | main.py | 4445 | CODE | |
| LOW | main.py | 4579 | CODE | |
| LOW | main.py | 5562 | CODE | |
| LOW | main.py | 5704 | CODE | |
| LOW | main.py | 5870 | CODE | |
| LOW | main.py | 6029 | CODE | |
| LOW | main.py | 6292 | CODE | |
| LOW | main.py | 6335 | CODE | |
| LOW | main.py | 6655 | CODE | |
| LOW | main.py | 6841 | CODE | |
| LOW | main.py | 7484 | CODE | |
| LOW | main.py | 7642 | CODE | |
| LOW | main.py | 7847 | CODE | |
| LOW | main.py | 7868 | CODE | |
| LOW | main.py | 8197 | CODE | |
| LOW | main.py | 8296 | CODE | |
| LOW | main.py | 8327 | CODE | |
| LOW | main.py | 8375 | CODE | |
| LOW | main.py | 8416 | CODE | |
| LOW | main.py | 8578 | CODE | |
| LOW | main.py | 8633 | CODE | |
| LOW | main.py | 8969 | CODE | |
| LOW | main.py | 9031 | CODE | |
| LOW | main.py | 9076 | CODE | |
| LOW | main.py | 9290 | CODE | |
| LOW | main.py | 9508 | CODE | |
| LOW | main.py | 10087 | CODE | |
| LOW | main.py | 10187 | CODE | |
| LOW | main.py | 10315 | CODE | |
| LOW | main.py | 10537 | CODE | |
| LOW | main.py | 10598 | CODE | |
| LOW | main.py | 10912 | CODE | |
| LOW | main.py | 11092 | CODE | |
| LOW | main.py | 11172 | CODE | |
| LOW | main.py | 11744 | CODE | |
| LOW | main.py | 11829 | CODE | |
| LOW | main.py | 11857 | CODE | |
| LOW | main.py | 12141 | CODE | |
| LOW | main.py | 12196 | CODE | |
| LOW | main.py | 12264 | CODE | |
| LOW | main.py | 12408 | CODE | |
| 34 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | main.py | 6096 | ". ~/.profile >/dev/null 2>&1 || true; . ~/.bashrc >/dev/null 2>&1 || true; " | CODE |
| HIGH | main.py | 6097 | "DREAMINA_BIN=$(command -v dreamina || find \"$HOME\" -maxdepth 4 -type f -name dreamina 2>/dev/null | head | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | static/klein.html | 300 | <div id="placeholder" class="text-center space-y-4 opacity-20"> | CODE |
| LOW | static/klein.html | 513 | const placeholder = document.getElementById('placeholder'); | CODE |
| LOW | static/klein.html | 592 | const placeholder = document.getElementById('placeholder'); | CODE |
| LOW | static/online.html | 199 | <div id="placeholder" class="text-center space-y-4 opacity-20"><i data-lucide="layout" class="w-12 h | CODE |
| LOW | static/online.html | 622 | const btn = document.getElementById('genBtn'), loader = document.getElementById('loader'), placeholder = doc | CODE |
| LOW | static/js/i18n-core.js | 45 | el.setAttribute('placeholder', t(el.dataset.i18nPlaceholder)); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | main.py | 7455 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | main.py | 13 | CODE |