This report summarizes scanner evidence for jihe520/MathModelAgent. SynthScan examined 55,795 lines of code across 527 source files, recording 161 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 3.9 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 81 finding(s).
Are imports declared and package/API names verified? 35 finding(s).
Are wrappers, guards, and repeated structures necessary? 71 finding(s).
Which changes need focused human review? 161 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 161 distinct pattern matches across 13 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 | backend/app/routers/common_router.py | 54 | except Exception as e: | CODE |
| LOW | backend/app/routers/common_router.py | 108 | except Exception as e: | CODE |
| LOW | backend/app/routers/ws_router.py | 70 | except Exception as e: | CODE |
| LOW | backend/app/routers/ws_router.py | 108 | except Exception as e: | CODE |
| LOW | backend/app/routers/ws_router.py | 116 | except Exception as e: | CODE |
| LOW | backend/app/routers/modeling_router.py | 112 | except Exception as e: | CODE |
| LOW | backend/app/routers/modeling_router.py | 143 | except Exception as e: | CODE |
| LOW | backend/app/routers/modeling_router.py | 183 | except Exception as e: | CODE |
| LOW | backend/app/routers/modeling_router.py | 256 | except Exception as e: | CODE |
| LOW | backend/app/routers/modeling_router.py | 335 | except Exception as e: | CODE |
| LOW | backend/app/tools/openalex_scholar.py | 116 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 52 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 78 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 82 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 292 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 323 | except Exception as e: | CODE |
| LOW⚡ | backend/app/tools/e2b_interpreter.py | 334 | except Exception as e: | CODE |
| LOW⚡ | backend/app/tools/e2b_interpreter.py | 341 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 386 | except Exception as e: | CODE |
| LOW | backend/app/tools/e2b_interpreter.py | 392 | except Exception as e: | CODE |
| LOW | backend/app/tools/local_interpreter.py | 161 | except Exception: | CODE |
| LOW | backend/app/core/workflow.py | 93 | except Exception as e: | CODE |
| LOW | backend/app/core/llm/llm.py | 103 | except Exception as e: | CODE |
| LOW | backend/app/core/agents/agent.py | 123 | except Exception as e: | CODE |
| LOW | backend/app/core/agents/agent.py | 209 | except Exception as e: | CODE |
| LOW | backend/app/core/agents/coder_agent.py | 215 | except Exception as e: | CODE |
| LOW | backend/app/core/agents/writer_agent.py | 136 | except Exception as e: | CODE |
| LOW | backend/app/core/agents/writer_agent.py | 184 | except Exception as e: | CODE |
| LOW | backend/app/utils/data_recorder.py | 84 | except Exception as e: | CODE |
| LOW | backend/app/utils/common_utils.py | 61 | except Exception as e: | CODE |
| LOW | backend/app/utils/common_utils.py | 90 | except Exception as e: | CODE |
| LOW | backend/app/services/redis_manager.py | 32 | except Exception as e: | CODE |
| LOW | backend/app/services/redis_manager.py | 66 | except Exception as e: | CODE |
| LOW | backend/app/services/redis_manager.py | 82 | except Exception as e: | CODE |
| LOW | skills/doctor/SKILL.md | 93 | except Exception: | CODE |
| LOW | skills/6verity/scripts/writing_check.sh | 236 | except Exception: | CODE |
| LOW | skills/6verity/scripts/writing_check.sh | 604 | except Exception as exc: | CODE |
| MEDIUM | skills/6verity/scripts/writing_check.sh | 227 | def read(path): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/3coding-visual/SKILL.md | 22 | ### Step 1: 代码结构 | COMMENT |
| LOW | skills/3coding-visual/SKILL.md | 27 | ### Step 2: 逐子问题实现 | COMMENT |
| LOW | skills/3coding-visual/SKILL.md | 42 | ### Step 3: 结果文件格式 | COMMENT |
| LOW | skills/3coding-visual/SKILL.md | 65 | ### Step 4: 生成数据驱动图表 | COMMENT |
| LOW | skills/2analysis-modeling/SKILL.md | 27 | ### Step 1: 子问题拆解 | COMMENT |
| LOW | skills/2analysis-modeling/SKILL.md | 46 | ### Step 2: 假设敏感性预检 | COMMENT |
| LOW | skills/2analysis-modeling/SKILL.md | 71 | ### Step 3: 数据理解与建模路线 | COMMENT |
| LOW | skills/2analysis-modeling/SKILL.md | 86 | ### Step 4: 建模报告 | COMMENT |
| LOW | skills/2analysis-modeling/SKILL.md | 122 | ### Step 5: 给代码阶段的接口 | COMMENT |
| LOW | skills/6verity/SKILL.md | 38 | ### Step 1: 运行文本质量门禁 | COMMENT |
| LOW | skills/6verity/SKILL.md | 62 | ### Step 2: 章节数量和标题顺序 | COMMENT |
| LOW | skills/6verity/SKILL.md | 82 | ### Step 3: 图表和章节匹配 | COMMENT |
| LOW | skills/6verity/SKILL.md | 104 | ### Step 4: 写作质量和泄露检查 | COMMENT |
| LOW | skills/6verity/SKILL.md | 114 | ### Step 5: 数值和结果一致性 | COMMENT |
| LOW | skills/6verity/SKILL.md | 125 | ### Step 6: 引用和模板规范 | COMMENT |
| LOW | skills/6verity/SKILL.md | 136 | ### Step 7: 编译 | COMMENT |
| LOW | skills/6verity/SKILL.md | 154 | ### Step 8: PDF 视觉检查 | COMMENT |
| LOW | skills/6verity/SKILL.md | 188 | ### Step 9: 写验收报告 | COMMENT |
| LOW | skills/4drawio/SKILL.md | 41 | ### Step 1: 盘点已有图表和需求 | COMMENT |
| LOW | skills/4drawio/SKILL.md | 59 | ### Step 2: 判定图类型 | COMMENT |
| LOW | skills/4drawio/SKILL.md | 80 | ### Step 3: 生成 DrawIO 源文件 | COMMENT |
| LOW | skills/4drawio/SKILL.md | 112 | ### Step 4: 导出 PDF | COMMENT |
| LOW | skills/4drawio/SKILL.md | 127 | ### Step 5: 自检和修复 | COMMENT |
| LOW | skills/4drawio/SKILL.md | 141 | ### Step 6: 写生成记录 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/app/routers/common_router.py | 18 | 验证并返回安全的任务 ID。 Args: task_id: 待验证的任务 ID。 Returns: 验证通过的任务 ID。 Raises: HTTPExcepti | STRING |
| HIGH | backend/app/tools/interpreter_factory.py | 20 | 创建代码解释器实例。 Args: kind: 解释器类型,"remote" 使用 E2B 沙箱,"local" 使用本地 Jupyter。 task_id: 任务 ID。 work_ | STRING |
| HIGH | backend/app/tools/base.py | 14 | 工具注册装饰器,为函数生成工具 schema。 Args: name: 工具名称。 description: 工具描述。 parameters: 工具参数定义。 re | STRING |
| HIGH | backend/app/tools/base.py | 90 | 调用指定的工具函数。 Args: function_name: 工具函数名称。 **kwargs: 传递给工具的参数。 Returns: | STRING |
| HIGH | backend/app/utils/common_utils.py | 26 | 验证任务 ID 的合法性,防止路径遍历攻击。 Args: task_id: 待验证的任务 ID。 Returns: 验证通过的任务 ID。 Raises: Val | STRING |
| HIGH | backend/app/utils/common_utils.py | 95 | 获取指定任务的工作目录路径。 Args: task_id: 任务 ID。 Returns: 工作目录路径。 Raises: FileNotFoundError: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app/tools/matplotlib_setup.py | 3 | CODE | |
| LOW | backend/app/core/llm/providers/__init__.py | 3 | CODE | |
| LOW | backend/app/core/llm/providers/__init__.py | 4 | CODE | |
| LOW | backend/app/core/llm/providers/__init__.py | 5 | CODE | |
| LOW | backend/app/core/llm/providers/__init__.py | 6 | CODE | |
| LOW | backend/app/core/agents/__init__.py | 1 | CODE | |
| LOW | backend/app/core/agents/__init__.py | 2 | CODE | |
| LOW | backend/app/core/agents/__init__.py | 3 | CODE | |
| LOW | backend/app/core/agents/__init__.py | 4 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 1 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 1 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 2 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 3 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 4 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 5 | CODE | |
| LOW | backend/app/core/prompts/__init__.py | 5 | CODE | |
| LOW | …/mathmodel-figure-templates/scripts/render_template.py | 2 | CODE | |
| LOW | …tes/scripts/templates/make_prediction_marginal_grid.py | 1 | CODE | |
| LOW | …ure-templates/scripts/templates/make_taylor_diagram.py | 1 | CODE | |
| LOW | …plates/scripts/templates/make_multiclass_shap_combo.py | 1 | CODE | |
| LOW | …ure-templates/scripts/templates/make_rf_tpe_surface.py | 1 | CODE | |
| LOW | …l-figure-templates/scripts/templates/make_cv_roc_ci.py | 1 | CODE | |
| LOW | …tes/scripts/templates/make_grouped_circular_heatmap.py | 1 | CODE | |
| LOW | …mplates/scripts/templates/make_nature_chord_diagram.py | 1 | CODE | |
| LOW | …e-templates/scripts/templates/make_paired_raincloud.py | 1 | CODE | |
| LOW | …es/scripts/templates/make_grouped_corr_split_violin.py | 1 | CODE | |
| LOW | …mplates/scripts/templates/make_correlation_pairgrid.py | 1 | CODE | |
| LOW | …tes/scripts/templates/make_urban_park_cooling_combo.py | 1 | CODE | |
| LOW | …tes/scripts/templates/make_urban_park_cooling_combo.py | 16 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app/routers/common_router.py | 35 | async def _load_task_messages_from_file(task_id: str) -> list[dict]: | CODE |
| LOW⚡ | backend/app/tools/e2b_interpreter.py | 345 | async def download_all_files_from_sandbox(self) -> None: | CODE |
| LOW | backend/app/tools/notebook_serializer.py | 55 | def add_code_cell_to_notebook(self, code): | CODE |
| LOW | backend/app/tools/notebook_serializer.py | 60 | def add_code_cell_output_to_notebook(self, output): | CODE |
| LOW | backend/app/tools/notebook_serializer.py | 79 | def add_code_cell_error_to_notebook(self, error): | CODE |
| LOW | backend/app/tools/notebook_serializer.py | 103 | def add_markdown_segmentation_to_notebook(self, content, segmentation): | CODE |
| LOW | backend/app/tools/notebook_serializer.py | 115 | def get_notebook_output_content(self, segmentation): | CODE |
| LOW | backend/app/tools/base_interpreter.py | 80 | def delete_color_control_char(self, string): | CODE |
| LOW | backend/app/tools/matplotlib_setup.py | 20 | def build_matplotlib_init_code( | CODE |
| LOW | backend/app/core/llm/llm.py | 110 | def _validate_and_fix_tool_calls(self, history: list) -> list: | CODE |
| LOW | backend/app/core/agents/agent.py | 218 | def _find_safe_preserve_point(self) -> int: | CODE |
| LOW | backend/app/core/agents/agent.py | 267 | def _get_safe_fallback_history(self) -> list: | CODE |
| LOW | backend/app/core/agents/agent.py | 293 | def _format_history_for_summary(self, history: list[dict]) -> str: | CODE |
| LOW | backend/app/core/prompts/shared.py | 34 | def get_completion_check_prompt(prompt, text_to_gpt) -> str: | STRING |
| LOW | backend/app/utils/log_util.py | 18 | def __ensure_log_directory_exists(self): | CODE |
| LOW | backend/app/models/user_output.py | 77 | def replace_references_with_uuid(self, text: str) -> str: | CODE |
| LOW | backend/app/services/ws_manager.py | 22 | async def send_personal_message_json(self, message: dict, websocket: WebSocket): | CODE |
| LOW | …plates/scripts/templates/make_multiclass_shap_combo.py | 144 | def plot_multiclass_shap_combo( | CODE |
| LOW | …l-figure-templates/scripts/templates/make_cv_roc_ci.py | 74 | def make_empirical_fold_curve( | CODE |
| LOW | …e-templates/scripts/templates/make_paired_raincloud.py | 41 | def synthetic_sepal_width_data(seed: int = 20260624) -> dict[tuple[str, str], np.ndarray]: | CODE |
| LOW | …tes/scripts/templates/make_urban_park_cooling_combo.py | 129 | def simulate_city_metric_data(seed: int = 20260629) -> dict[str, list[np.ndarray]]: | CODE |
| LOW | …tes/scripts/templates/make_urban_park_cooling_combo.py | 272 | def draw_vertical_boxplot_panel(ax: plt.Axes, metric: str, metric_data: list[np.ndarray]) -> None: | CODE |
| LOW | …tes/scripts/templates/make_urban_park_cooling_combo.py | 313 | def add_city_and_legend_panel(ax: plt.Axes) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app/routers/ws_router.py | 34 | CODE | |
| LOW | backend/app/routers/modeling_router.py | 118 | CODE | |
| LOW | backend/app/routers/modeling_router.py | 223 | CODE | |
| LOW | backend/app/tools/e2b_interpreter.py | 56 | CODE | |
| LOW | backend/app/tools/e2b_interpreter.py | 113 | CODE | |
| LOW | backend/app/tools/e2b_interpreter.py | 327 | CODE | |
| LOW | backend/app/tools/e2b_interpreter.py | 345 | CODE | |
| LOW | backend/app/tools/local_interpreter.py | 68 | CODE | |
| LOW | backend/app/tools/local_interpreter.py | 145 | CODE | |
| LOW | backend/app/core/llm/llm.py | 110 | CODE | |
| LOW | backend/app/core/llm/providers/openai_responses.py | 11 | CODE | |
| LOW | backend/app/core/llm/providers/openai_responses.py | 62 | CODE | |
| LOW | backend/app/core/agents/agent.py | 235 | CODE | |
| LOW | backend/app/core/agents/coder_agent.py | 45 | CODE | |
| LOW | backend/app/utils/common_utils.py | 149 | CODE | |
| LOW | …ure-templates/scripts/templates/make_rf_tpe_surface.py | 45 | CODE | |
| LOW | …mplates/scripts/templates/make_correlation_pairgrid.py | 154 | CODE | |
| LOW | …tes/scripts/templates/make_urban_park_cooling_combo.py | 129 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/app/core/agents/modeler_agent.py | 30 | except json.JSONDecodeError: | CODE |
| HIGH | backend/app/core/agents/modeler_agent.py | 42 | except (json.JSONDecodeError, re.error): | CODE |
| HIGH | backend/app/core/agents/modeler_agent.py | 51 | except re.error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/typst-author/docs/tutorial/making-a-template.md | 65 | #let blind-text = [_Lorem ipsum_ dolor sit amet] | COMMENT |
| LOW | skills/typst-author/docs/tutorial/making-a-template.md | 65 | #let blind-text = [_Lorem ipsum_ dolor sit amet] | COMMENT |
| LOW | skills/typst-author/docs/tutorial/formatting.md | 142 | This example also uses the [`lorem`](/docs/reference/text/lorem/) function to generate some placeholder text. This funct | CODE |
| LOW | skills/typst-author/docs/reference/model/par.md | 143 | Lorem ipsum \ | CODE |
| LOW | skills/typst-author/docs/reference/model/par.md | 144 | dolor sit amet | CODE |
| LOW | skills/typst-author/docs/reference/text/lorem.md | 7 | This function yields a Latin-like _Lorem Ipsum_ blind text with the given number of words. The sequence of words generat | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/pyproject.toml | 121 | COMMENT | |
| LOW | skills/typst-author/docs/tutorial/making-a-template.md | 61 | Variables are not limited to storing content: they can store any data type Typst knows about. Throughout this tutorial, | COMMENT |
| LOW | skills/typst-author/docs/reference/context.md | 121 | #set text(lang: "de") | COMMENT |
| LOW | skills/typst-author/docs/reference/foundations/calc.md | 661 | Note that this function will return the same type as the operand. That is, applying `round` to a [`float`](/docs/referen | COMMENT |
| LOW | skills/3coding-visual/SKILL.md | 41 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/typst-author/docs/guides/for-latex-users.md | 241 | The [`import`](/docs/reference/scripting/#modules) statement makes [functions](/docs/reference/foundations/function/) (a | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app/core/llm/providers/__init__.py | 8 | __all__ = [ | CODE |
| LOW | backend/app/core/agents/__init__.py | 6 | __all__ = [ | CODE |
| LOW | backend/app/core/prompts/__init__.py | 7 | __all__ = [ | CODE |
| LOW | backend/app/utils/data_recorder.py | 151 | def update_token_usage(self, completion: Any, agent_name: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app/core/llm/llm.py | 67 | CODE | |
| LOW | …/mathmodel-figure-templates/scripts/render_template.py | 70 | CODE | |
| LOW | …mplates/scripts/templates/make_correlation_pairgrid.py | 58 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/app/config/setting.py | 85 | # RAG 知识库配置 | COMMENT |