中国专利.skill:专利点挖掘与交底书(发明/实用/外观)编写,通俗解读专利,嗅探政策动向,辅助审查答复。
This report summarizes scanner evidence for handsomestWei/patent-disclosure-skill, a Python project with 11,295 GitHub stars. SynthScan examined 77,393 lines of code across 453 source files, recording 1231 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 23.1 (Elevated 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? 625 finding(s).
Are imports declared and package/API names verified? 356 finding(s).
Are wrappers, guards, and repeated structures necessary? 724 finding(s).
Which changes need focused human review? 1231 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 1231 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 | scripts/generate-star-history.py | 372 | def remove_old_versioned_outputs(output: pathlib.Path, keep: pathlib.Path) -> None: | STRING |
| LOW | scripts/generate-star-history.py | 383 | def update_readme_cache_buster( | STRING |
| LOW | skills/patent-reader/tools/patent_type.py | 117 | def infer_patent_type_from_pub(pub: str | None) -> str | None: | CODE |
| LOW | skills/patent-reader/tools/patent_type.py | 132 | def infer_patent_type_from_biblio(text: str | None) -> str | None: | CODE |
| LOW | skills/patent-reader/tools/patent_type.py | 146 | def resolve_reader_patent_type( | CODE |
| LOW | skills/patent-reader/tools/patent_type.py | 211 | def google_patents_websearch_query( | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 38 | def persisted_vault_config_path() -> Path: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 90 | def detect_obsidian_installed() -> dict: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 140 | def _parse_obsidian_json_vaults(cfg_path: Path) -> list[dict]: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 169 | def candidate_default_vault_paths() -> list[Path]: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 322 | def probe_obsidian_environment() -> dict: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 684 | def load_ipc_application_hints() -> list[dict]: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 879 | def extract_application_number(text: str) -> str: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 916 | def extract_cited_pub_numbers(text: str, self_pub: str = "") -> list[str]: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 930 | def organizations_from_assignees(assignees: list[str]) -> list[str]: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 66 | def extract_class_codes_from_html(html: str) -> tuple[list[str], list[str]]: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 121 | def select_hits_for_disclosure( | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 165 | def backfill_hits_for_disclosure( | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 222 | def _extract_abstract_from_item_html(item_html: str) -> str | None: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 255 | def normalize_application_number(value: str | None) -> str | None: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 393 | def _parse_overview_card_layout(html: str) -> list[EpubSearchHit]: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 491 | def _parse_search_result_fallback_links(html: str) -> list[EpubSearchHit]: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 139 | def open_epub_advanced_search(page: Page) -> None: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 199 | def apply_epub_advanced_type_filter(page: Page, patent_type: str = TYPE_ALL) -> None: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 227 | def wait_for_epub_advanced_ready(page: Page, *, max_wait_sec: float | None = None) -> None: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 365 | def search_epub_keyword_with_page( | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 144 | def _count_text_chars_in_bbox(page, bbox: tuple[float, float, float, float]) -> int: | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 225 | def _estimate_bbox_near_caption( | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 516 | def extract_patent_pdf_figures( | CODE |
| LOW | …lls/patent-reader/tools/extract/extract_patent_text.py | 197 | def extract_background_snippets(text: str) -> list[str]: | CODE |
| LOW | skills/patent-reader/tools/extract/fetch_patent_pdf.py | 113 | def extract_pdf_urls_from_html(html: str, pub: str) -> list[str]: | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 121 | def _glossary_file_matches_term(path: Path, term: str) -> bool: | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 158 | def append_glossary_backlinks( | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 250 | def _normalize_glossary_backlink_section(body: str) -> tuple[str, bool]: | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 286 | def repair_glossary_backlinks(vault: Path, glossary_dir: str) -> int: | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 306 | def purge_spurious_patent_notes(vault: Path, papers_dir: str) -> list[str]: | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 395 | def _fill_glossary_definition(path: Path, term: str, definition: str) -> bool: | CODE |
| LOW | skills/patent-reader/tools/vault/schema_vault.py | 91 | def render_structure_section_md(schema: dict) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/schema_vault.py | 140 | def render_appearance_section_md(schema: dict) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/schema_vault.py | 211 | def upsert_appearance_section(content: str, section_md: str) -> str: | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 138 | def sanitize_user_facing_titles(content: str) -> str: | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 216 | def sanitize_internal_tool_leakage(content: str) -> str: | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 269 | def harvest_glossary_from_note(content: str) -> list[dict]: | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 303 | def merge_glossary_candidates( | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 359 | def copy_source_pdf_to_note_dir( | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 536 | def harvest_narrative_from_note(content: str) -> dict[str, str]: | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 590 | def _strip_stale_figure_blocks(content: str) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 56 | def split_cn_description_paragraphs(text: str) -> dict[str, str]: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 77 | def description_text_from_raw_sections(raw_sections_path: Path) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 95 | def load_description_paragraphs(workdir: Path | None) -> dict[str, str]: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 122 | def write_description_paragraphs_json( | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 193 | def parse_cited_paragraph_numbers(content: str) -> list[str]: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 201 | def paragraph_anchor_basename(pub: str) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 214 | def render_paragraph_anchor_note( | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 283 | def format_citation_wikilinks(pub: str, start: str, end: str | None = None) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 289 | def upgrade_legacy_citation_wikilinks(content: str, *, pub: str) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 303 | def wikilink_description_citations(content: str, *, pub: str) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 319 | def ensure_desc_paragraphs_nav(content: str, *, pub: str) -> str: | CODE |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 348 | def materialize_description_paragraphs( | CODE |
| LOW | skills/patent-reader/tools/vault/obsidian_bootstrap.py | 129 | def _repair_index_glossary_dataview(index_path: Path, glossary_dir: str) -> bool: | CODE |
| 407 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/patent-reader/tools/browser.py | 0 | 启动 chromium 内核浏览器。 返回 ``(browser, label)``,label 为 ``chrome`` / ``msedge`` / ``chromium``。 全部失败时抛出 runtimeerror,文案含安装提示( | STRING |
| HIGH | skills/patent-disclosure/tools/browser.py | 0 | 启动 chromium 内核浏览器。 返回 ``(browser, label)``,label 为 ``chrome`` / ``msedge`` / ``chromium``。 全部失败时抛出 runtimeerror,文案含安装提示( | STRING |
| HIGH | skills/patent-search/tools/browser.py | 0 | 启动 chromium 内核浏览器。 返回 ``(browser, label)``,label 为 ``chrome`` / ``msedge`` / ``chromium``。 全部失败时抛出 runtimeerror,文案含安装提示( | STRING |
| HIGH | skills/patent-reader/tools/browser.py | 0 | 本机浏览器自己的 ua,只把无头标记 ``headlesschrome`` 换成 ``chrome``。 版本号须与真实内核一致:写死旧版本时,公布站放行页面却拒绝表单提交(http 400)。 | STRING |
| HIGH | skills/patent-disclosure/tools/browser.py | 0 | 本机浏览器自己的 ua,只把无头标记 ``headlesschrome`` 换成 ``chrome``。 版本号须与真实内核一致:写死旧版本时,公布站放行页面却拒绝表单提交(http 400)。 | STRING |
| HIGH | skills/patent-search/tools/browser.py | 0 | 本机浏览器自己的 ua,只把无头标记 ``headlesschrome`` 换成 ``chrome``。 版本号须与真实内核一致:写死旧版本时,公布站放行页面却拒绝表单提交(http 400)。 | STRING |
| HIGH | skills/patent-reader/tools/browser.py | 0 | 尝试实际启动(无界面)。供 ``--probe`` 与 agent 判断是否需要下 chromium。 | STRING |
| HIGH | skills/patent-disclosure/tools/browser.py | 0 | 尝试实际启动(无界面)。供 ``--probe`` 与 agent 判断是否需要下 chromium。 | STRING |
| HIGH | skills/patent-search/tools/browser.py | 0 | 尝试实际启动(无界面)。供 ``--probe`` 与 agent 判断是否需要下 chromium。 | STRING |
| HIGH | skills/patent-reader/tools/stdio_utf8.py | 0 | windows 终端 utf-8:当前进程 stdio + 子进程 pythonutf8。 powershell 5 会把写入 stderr 标成 nativecommanderror,但退出码仍可能是 0。 agent 应以退出码和机读前 | STRING |
| HIGH | skills/patent-disclosure/tools/stdio_utf8.py | 0 | windows 终端 utf-8:当前进程 stdio + 子进程 pythonutf8。 powershell 5 会把写入 stderr 标成 nativecommanderror,但退出码仍可能是 0。 agent 应以退出码和机读前 | STRING |
| HIGH | skills/patent-docket/tools/stdio_utf8.py | 0 | windows 终端 utf-8:当前进程 stdio + 子进程 pythonutf8。 powershell 5 会把写入 stderr 标成 nativecommanderror,但退出码仍可能是 0。 agent 应以退出码和机读前 | STRING |
| HIGH | skills/patent-application/tools/stdio_utf8.py | 0 | windows 终端 utf-8:当前进程 stdio + 子进程 pythonutf8。 powershell 5 会把写入 stderr 标成 nativecommanderror,但退出码仍可能是 0。 agent 应以退出码和机读前 | STRING |
| HIGH | skills/patent-search/tools/stdio_utf8.py | 0 | windows 终端 utf-8:当前进程 stdio + 子进程 pythonutf8。 powershell 5 会把写入 stderr 标成 nativecommanderror,但退出码仍可能是 0。 agent 应以退出码和机读前 | STRING |
| HIGH | skills/patent-oa/tools/stdio_utf8.py | 0 | windows 终端 utf-8:当前进程 stdio + 子进程 pythonutf8。 powershell 5 会把写入 stderr 标成 nativecommanderror,但退出码仍可能是 0。 agent 应以退出码和机读前 | STRING |
| HIGH | skills/patent-reader/tools/patent_type.py | 0 | 由中国公开号/公告号文献种类码推断 invention|utility_model|design。 无法识别(非 cn 形态、缺种类字母等)时返回 none。 | STRING |
| HIGH | skills/patent-disclosure/tools/patent_type.py | 0 | 由中国公开号/公告号文献种类码推断 invention|utility_model|design。 无法识别(非 cn 形态、缺种类字母等)时返回 none。 | STRING |
| HIGH | skills/patent-search/tools/patent_type.py | 0 | 由中国公开号/公告号文献种类码推断 invention|utility_model|design。 无法识别(非 cn 形态、缺种类字母等)时返回 none。 | STRING |
| HIGH | skills/patent-reader/tools/patent_type.py | 0 | 解读/交底共用:解析最终类型与依据。 优先级:用户显式声明(非 all)> 公开号种类码 > 著录关键词。 | STRING |
| HIGH | skills/patent-disclosure/tools/patent_type.py | 0 | 解读/交底共用:解析最终类型与依据。 优先级:用户显式声明(非 all)> 公开号种类码 > 著录关键词。 | STRING |
| HIGH | skills/patent-search/tools/patent_type.py | 0 | 解读/交底共用:解析最终类型与依据。 优先级:用户显式声明(非 all)> 公开号种类码 > 著录关键词。 | STRING |
| HIGH | skills/patent-reader/tools/patent_type.py | 0 | 构造供 websearch / 浏览器使用的 google patents 倾向查询串(非官方 api)。 ``class_codes``:发明/实用用 ``cpc=b01j20/low``;外观把洛迦诺号当补充词(无稳定 loc 字段)。 | STRING |
| HIGH | skills/patent-disclosure/tools/patent_type.py | 0 | 构造供 websearch / 浏览器使用的 google patents 倾向查询串(非官方 api)。 ``class_codes``:发明/实用用 ``cpc=b01j20/low``;外观把洛迦诺号当补充词(无稳定 loc 字段)。 | STRING |
| HIGH | skills/patent-search/tools/patent_type.py | 0 | 构造供 websearch / 浏览器使用的 google patents 倾向查询串(非官方 api)。 ``class_codes``:发明/实用用 ``cpc=b01j20/low``;外观把洛迦诺号当补充词(无稳定 loc 字段)。 | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | 第二轮不足 ``min_keep`` 时,从第一轮池里按同一分类号回补。 返回 ``(hits, reason)``:``primary_enough`` / ``backfilled`` / ``still_short``。 不把分类号明 | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | 第二轮不足 ``min_keep`` 时,从第一轮池里按同一分类号回补。 返回 ``(hits, reason)``:``primary_enough`` / ``backfilled`` / ``still_short``。 不把分类号明 | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | 第二轮不足 ``min_keep`` 时,从第一轮池里按同一分类号回补。 返回 ``(hits, reason)``:``primary_enough`` / ``backfilled`` / ``still_short``。 不把分类号明 | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | 从单条 ``div.item`` 内 ``dt`` 摘要对应的 ``dd`` 中抽取全文(含折叠 span)。 | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | 从单条 ``div.item`` 内 ``dt`` 摘要对应的 ``dd`` 中抽取全文(含折叠 span)。 | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | 从单条 ``div.item`` 内 ``dt`` 摘要对应的 ``dd`` 中抽取全文(含折叠 span)。 | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | extract a ``dt``/``dd`` value from the publication-card layout. | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | extract a ``dt``/``dd`` value from the publication-card layout. | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | extract a ``dt``/``dd`` value from the publication-card layout. | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | normalize a chinese application number to ``yyyy...n.check`` form. | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | normalize a chinese application number to ``yyyy...n.check`` form. | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | normalize a chinese application number to ``yyyy...n.check`` form. | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | return the result count displayed by cnipa when the page exposes it. | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | return the result count displayed by cnipa when the page exposes it. | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | return the result count displayed by cnipa when the page exposes it. | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | 解析「公布公告」检索结果列表页 html。 兼容常见表格行 / 带链接的条目(站点改版时需调整正则或选择器)。 | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | 解析「公布公告」检索结果列表页 html。 兼容常见表格行 / 带链接的条目(站点改版时需调整正则或选择器)。 | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | 解析「公布公告」检索结果列表页 html。 兼容常见表格行 / 带链接的条目(站点改版时需调整正则或选择器)。 | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 0 | 新版「公布模式」结果页:无表格行,每条为 ``div.item``,题名在 ``h1.title``, 详情 url 多在二维码 ``div.qrcode`` 的 ``title="http://epub.../patent/cn…"`` | STRING |
| HIGH | …ills/patent-disclosure/tools/crawl/cnipa_epub_parse.py | 0 | 新版「公布模式」结果页:无表格行,每条为 ``div.item``,题名在 ``h1.title``, 详情 url 多在二维码 ``div.qrcode`` 的 ``title="http://epub.../patent/cn…"`` | STRING |
| HIGH | skills/patent-search/tools/cnipa_parse.py | 0 | 新版「公布模式」结果页:无表格行,每条为 ``div.item``,题名在 ``h1.title``, 详情 url 多在二维码 ``div.qrcode`` 的 ``title="http://epub.../patent/cn…"`` | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 0 | (titles) => { const t = document.title.trim(); if (t === titles.nohit) return true; if (t !== titles.result) return fals | STRING |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 0 | (titles) => { const t = document.title.trim(); if (t === titles.nohit) return true; if (t !== titles.result) return fals | STRING |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 0 | (titles) => { const t = document.title.trim(); if (t === titles.nohit) return true; if (t !== titles.result) return fals | STRING |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 0 | ({id, checked}) => { const el = document.getelementbyid(id); if (!el) return; el.checked = checked; el.dispatchevent(new | STRING |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 0 | ({id, checked}) => { const el = document.getelementbyid(id); if (!el) return; el.checked = checked; el.dispatchevent(new | STRING |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 0 | ({id, checked}) => { const el = document.getelementbyid(id); if (!el) return; el.checked = checked; el.dispatchevent(new | STRING |
| HIGH | skills/patent-disclosure/tools/md_to_docx.py | 0 | 匹配 ``\\(...\\)`` + 紧随的公式 png 注释;返回 (start,end,latex,alt,src)。 | STRING |
| HIGH | skills/patent-application/tools/md_to_docx.py | 0 | 匹配 ``\\(...\\)`` + 紧随的公式 png 注释;返回 (start,end,latex,alt,src)。 | STRING |
| HIGH | skills/patent-oa/tools/md_to_docx.py | 0 | 匹配 ``\\(...\\)`` + 紧随的公式 png 注释;返回 (start,end,latex,alt,src)。 | STRING |
| HIGH | skills/patent-disclosure/tools/md_to_docx.py | 0 | 按列分隔符 ``|`` 拆分表格行,忽略 ``\\(...\\)``、``$...$``、``<!-- -->`` 与 ``\\|`` 内的竖线。 | STRING |
| HIGH | skills/patent-application/tools/md_to_docx.py | 0 | 按列分隔符 ``|`` 拆分表格行,忽略 ``\\(...\\)``、``$...$``、``<!-- -->`` 与 ``\\|`` 内的竖线。 | STRING |
| HIGH | skills/patent-oa/tools/md_to_docx.py | 0 | 按列分隔符 ``|`` 拆分表格行,忽略 ``\\(...\\)``、``$...$``、``<!-- -->`` 与 ``\\|`` 内的竖线。 | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/generate-star-history.py | 4 | CODE | |
| LOW | skills/patent-reader/tools/browser.py | 13 | CODE | |
| LOW | skills/patent-reader/tools/stdio_utf8.py | 6 | CODE | |
| LOW | skills/patent-reader/tools/patent_type.py | 3 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_parse.py | 7 | CODE | |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 41 | CODE | |
| LOW | …patent-reader/tools/analyze/validate_claim_features.py | 8 | CODE | |
| LOW | …ls/patent-reader/tools/analyze/build_context_anchor.py | 12 | CODE | |
| LOW | …lls/patent-reader/tools/analyze/build_claim_mermaid.py | 8 | CODE | |
| LOW | skills/patent-reader/tools/analyze/lint_patent_note.py | 10 | CODE | |
| LOW | …s/patent-reader/tools/analyze/validate_public_clues.py | 12 | CODE | |
| LOW | …lls/patent-reader/tools/analyze/validate_claim_tree.py | 12 | CODE | |
| LOW | skills/patent-reader/tools/analyze/claim_features.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 10 | CODE | |
| LOW | …lls/patent-reader/tools/extract/extract_patent_text.py | 18 | CODE | |
| LOW | …/patent-reader/tools/extract/extract_patent_figures.py | 14 | CODE | |
| LOW | …/patent-reader/tools/extract/extract_patent_figures.py | 57 | CODE | |
| LOW | skills/patent-reader/tools/extract/fetch_patent_pdf.py | 22 | CODE | |
| LOW | …ills/patent-reader/tools/extract/fetch_design_views.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/link_patent_notes.py | 18 | CODE | |
| LOW | skills/patent-reader/tools/vault/build_patent_canvas.py | 14 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/vault/schema_vault.py | 3 | CODE | |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 13 | CODE | |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 10 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_bootstrap.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_claims.py | 2 | CODE | |
| LOW | …ills/patent-reader/tools/vault/obsidian_frontmatter.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/vault/check_obsidian_env.py | 15 | CODE | |
| LOW | skills/patent-reader/tools/vault/note_cites.py | 5 | CODE | |
| LOW | …/patent-reader/tools/vault/materialize_public_clues.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/patent_link.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_paths.py | 2 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 13 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 16 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 25 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 25 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 26 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian.py | 36 | CODE | |
| 255 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/patent-reader/tools/browser.py | 146 | except Exception: | CODE |
| HIGH | skills/patent-reader/tools/stdio_utf8.py | 22 | except (OSError, ValueError, TypeError): | CODE |
| HIGH | skills/patent-reader/tools/shared/common.py | 710 | except Exception: | CODE |
| HIGH | skills/patent-reader/tools/shared/common.py | 105 | except OSError: | CODE |
| HIGH | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 157 | except Exception: | CODE |
| HIGH | skills/patent-reader/tools/extract/figure_extract.py | 95 | except Exception: | CODE |
| HIGH | …ills/patent-reader/tools/extract/fetch_design_views.py | 216 | except Exception: | CODE |
| HIGH | …atent-reader/tools/vault/write_patent_obsidian_note.py | 993 | except (OSError, json.JSONDecodeError): | CODE |
| HIGH | skills/patent-reader/tools/vault/obsidian_bootstrap.py | 522 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | skills/patent-reader/tools/vault/obsidian_bootstrap.py | 540 | except (json.JSONDecodeError, OSError, TypeError): | CODE |
| HIGH | skills/patent-reader/tools/vault/obsidian_bootstrap.py | 486 | except OSError: | CODE |
| HIGH | skills/patent-disclosure/tools/md_to_docx.py | 1075 | except (AttributeError, KeyError): | CODE |
| HIGH | skills/patent-disclosure/tools/step_to_views.py | 213 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/mermaid_render.py | 125 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/mermaid_render.py | 117 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/browser.py | 146 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/stdio_utf8.py | 22 | except (OSError, ValueError, TypeError): | CODE |
| HIGH | …ills/patent-disclosure/tools/structure_lineart_gate.py | 306 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/pptx_to_md.py | 127 | except (AttributeError, ValueError): | CODE |
| HIGH | skills/patent-disclosure/tools/svg_screenshot.py | 293 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/svg_screenshot.py | 298 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/svg_screenshot.py | 302 | except Exception: | CODE |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_wait.py | 140 | except ValueError: | CODE |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 325 | except (PlaywrightTimeoutError, Error): | CODE |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 142 | except Error: | CODE |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 192 | except Exception: | CODE |
| HIGH | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 403 | except OSError: | CODE |
| HIGH | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 499 | except Exception: | CODE |
| HIGH | skills/patent-docket/tools/stdio_utf8.py | 22 | except (OSError, ValueError, TypeError): | CODE |
| HIGH | skills/patent-application/tools/md_to_docx.py | 1058 | except (AttributeError, KeyError): | CODE |
| HIGH | skills/patent-application/tools/stdio_utf8.py | 22 | except (OSError, ValueError, TypeError): | CODE |
| HIGH | skills/patent-search/tools/browser.py | 146 | except Exception: | CODE |
| HIGH | skills/patent-search/tools/stdio_utf8.py | 22 | except (OSError, ValueError, TypeError): | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 420 | except (PlaywrightTimeoutError, Error): | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 632 | except (PlaywrightTimeoutError, Error): | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 817 | except (TypeError, ValueError): | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 822 | except (TypeError, ValueError): | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 431 | except Error: | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 467 | except Exception: | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 760 | except Exception: | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 769 | except (PlaywrightTimeoutError, Error): | CODE |
| HIGH | skills/patent-map/tools/serve_map.py | 48 | except CONNECTION_ERRORS: | CODE |
| HIGH | skills/patent-map/tools/serve_map.py | 54 | except CONNECTION_ERRORS: | CODE |
| HIGH | skills/patent-map/tools/serve_map.py | 76 | except CONNECTION_ERRORS: | CODE |
| HIGH | skills/patent-map/tools/serve_map.py | 94 | except CONNECTION_ERRORS: | CODE |
| HIGH | skills/patent-map/tools/vault_index.py | 35 | except OSError: | CODE |
| HIGH | skills/patent-map/tools/map_cache.py | 31 | except Exception: | CODE |
| HIGH | skills/patent-oa/tools/store.py | 159 | except sqlite3.OperationalError: | CODE |
| HIGH | skills/patent-oa/tools/md_to_docx.py | 1066 | except (AttributeError, KeyError): | CODE |
| HIGH | skills/patent-oa/tools/config.py | 106 | except Exception: | CODE |
| HIGH | skills/patent-oa/tools/stdio_utf8.py | 22 | except (OSError, ValueError, TypeError): | CODE |
| HIGH | skills/patent-oa/tools/refresh_vault.py | 43 | except Exception: | CODE |
| HIGH | skills/patent-oa/tools/ingest_case.py | 197 | except Exception: | CODE |
| HIGH | skills/patent-oa/tools/vault_layout.py | 183 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ills/patent-reader/tools/extract/fetch_design_views.py | 296 | "img", "els => els.map(e => e.currentSrc || e.src || '')" | CODE |
| HIGH | skills/patent-disclosure/tools/mermaid_render.py | 71 | return null; | CODE |
| HIGH | skills/patent-disclosure/tools/mermaid_render.py | 73 | return String(e && e.message ? e.message : e); | CODE |
| HIGH | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 291 | total: m ? Number.parseInt(m[1], 10) : null, | CODE |
| HIGH | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 288 | body: body.toString(), | CODE |
| HIGH | skills/patent-disclosure/tests/test_cnipa_epub_chain.py | 5 | 需已安装:pip install -r skills/patent-disclosure/tools/crawl/requirements-cnipa.txt && python -m playwright install chromium | STRING |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 130 | if (!wanted.length) return null; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 133 | if (!el) return null; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 140 | return null; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 146 | const text = compact(el.innerText || el.textContent || ''); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 147 | if (!text || text.length > 24) continue; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 148 | if (!wanted.some((n) => text === n || text.startsWith(n))) continue; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 159 | const inRow = row && row.querySelector('input[type="text"], input:not([type]), textarea'); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 163 | for (let i = 0; i < 4 && sib; i += 1) { | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 164 | const hit = sib.matches && sib.matches('input, textarea') | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 166 | : sib.querySelector && sib.querySelector('input[type="text"], textarea'); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 172 | return null; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 205 | const n = Number.parseInt((el && el.textContent) || "", 10); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 206 | return Number.isFinite(n) ? n : null; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 210 | const n = Number.parseInt((el && el.textContent) || "", 10); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 211 | if (Number.isFinite(n) && previous != null && n !== previous) return true; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 271 | return element.disabled || element.hasAttribute("disabled") || | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 278 | const text = (element.innerText || element.value || "").replace(/\\s+/g, "").trim(); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 288 | return {found: true, label: text || title || aria || rel || "next"}; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 320 | return {clicked: true, label: text || title || aria || rel || "next"}; | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 330 | const size = Number.parseInt((sizeEl && sizeEl.value) || (per && per[1]) || "", 10); | CODE |
| HIGH⚡ | skills/patent-search/tools/cnipa_crawler.py | 332 | total_pages: pages ? Number.parseInt(pages[1].replace(/,/g, ""), 10) : null, | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 253 | (totalScriptMatch ? Number.parseInt(totalScriptMatch[1], 10) : null), | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 302 | return element.disabled || element.hasAttribute("disabled") || | CODE |
| HIGH | skills/patent-search/tools/cnipa_crawler.py | 309 | const text = (element.innerText || element.value || "").replace(/\\s+/g, "").trim(); | CODE |
| HIGH | skills/patent-oa/tools/store.py | 83 | case_id text not null, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/generate-star-history.py | 178 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/browser.py | 101 | except Exception as e: | CODE |
| LOW | skills/patent-reader/tools/browser.py | 133 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/browser.py | 146 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/browser.py | 185 | except Exception as e: | CODE |
| MEDIUM | skills/patent-reader/tools/browser.py | 40 | def playwright_installed() -> bool: | CODE |
| LOW | skills/patent-reader/tools/shared/common.py | 710 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 157 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 431 | except Exception as e: | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 71 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 95 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 363 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 411 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 464 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/extract/fetch_patent_pdf.py | 438 | except Exception as e: | CODE |
| LOW | …ills/patent-reader/tools/extract/fetch_design_views.py | 157 | except Exception: | CODE |
| LOW | …ills/patent-reader/tools/extract/fetch_design_views.py | 216 | except Exception: | CODE |
| LOW | …ills/patent-reader/tools/extract/fetch_design_views.py | 421 | except Exception as e: | CODE |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 394 | except Exception: | CODE |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 404 | except Exception: | CODE |
| LOW | skills/patent-chart/tools/emit_chart.py | 1119 | except Exception as exc: | CODE |
| LOW | …s/patent-disclosure/tools/structure_callout_overlay.py | 38 | except Exception as exc: | CODE |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 153 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 452 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 491 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/formula_eval.py | 240 | except Exception as exc: | CODE |
| LOW | skills/patent-disclosure/tools/bootstrap_cad_venv.py | 192 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 49 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 61 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 112 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 164 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 190 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 213 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 275 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 396 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 517 | except Exception as e: | CODE |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 33 | except Exception as exc: | CODE |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 558 | except Exception as exc: | CODE |
| LOW⚡ | skills/patent-disclosure/tools/mermaid_render.py | 107 | except Exception: | CODE |
| LOW⚡ | skills/patent-disclosure/tools/mermaid_render.py | 117 | except Exception: | CODE |
| LOW⚡ | skills/patent-disclosure/tools/mermaid_render.py | 125 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/mermaid_render.py | 258 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/mermaid_render.py | 317 | except Exception as e: | CODE |
| LOW | …ls/patent-disclosure/tools/structure_callout_layout.py | 143 | except Exception as exc: | CODE |
| LOW | …ls/patent-disclosure/tools/structure_callout_layout.py | 447 | except Exception as exc: | CODE |
| LOW | skills/patent-disclosure/tools/docx_to_md.py | 74 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/design_lineart_gate.py | 44 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/design_lineart_gate.py | 230 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/image_gen.py | 261 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/browser.py | 101 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/browser.py | 133 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/browser.py | 146 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/browser.py | 185 | except Exception as e: | CODE |
| MEDIUM | skills/patent-disclosure/tools/browser.py | 40 | def playwright_installed() -> bool: | CODE |
| LOW | …ills/patent-disclosure/tools/structure_lineart_gate.py | 44 | except Exception: | CODE |
| LOW | …ills/patent-disclosure/tools/structure_lineart_gate.py | 306 | except Exception: | CODE |
| LOW | …ills/patent-disclosure/tools/structure_lineart_gate.py | 345 | except Exception: | CODE |
| LOW | skills/patent-disclosure/tools/pptx_to_md.py | 86 | except Exception as e: | CODE |
| LOW | skills/patent-disclosure/tools/pptx_to_md.py | 111 | except Exception as e: | CODE |
| MEDIUM | skills/patent-disclosure/tools/pptx_to_md.py | 21 | def _require_pptx(): | CODE |
| 68 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/generate-star-history.py | 112 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 90 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 187 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 221 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 435 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 535 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 605 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 684 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 760 | CODE | |
| LOW | skills/patent-reader/tools/shared/common.py | 856 | CODE | |
| LOW | skills/patent-reader/tools/crawl/cnipa_epub_crawler.py | 301 | CODE | |
| LOW | skills/patent-reader/tools/analyze/lint_patent_note.py | 63 | CODE | |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 161 | CODE | |
| LOW | skills/patent-reader/tools/extract/fetch_patent_pdf.py | 201 | CODE | |
| LOW | …ills/patent-reader/tools/extract/fetch_design_views.py | 128 | CODE | |
| LOW | …ills/patent-reader/tools/extract/fetch_design_views.py | 222 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 12 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_glossary.py | 423 | CODE | |
| LOW | skills/patent-reader/tools/vault/schema_vault.py | 37 | CODE | |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 536 | CODE | |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 622 | CODE | |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 720 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_bootstrap.py | 414 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_claims.py | 51 | CODE | |
| LOW | …ills/patent-reader/tools/vault/obsidian_frontmatter.py | 124 | CODE | |
| LOW | skills/patent-reader/tools/vault/note_cites.py | 390 | CODE | |
| LOW | skills/patent-reader/tools/vault/patent_link.py | 231 | CODE | |
| LOW | skills/patent-reader/tools/vault/patent_link.py | 563 | CODE | |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 202 | CODE | |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 713 | CODE | |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 827 | CODE | |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 996 | CODE | |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 1525 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_canvas.py | 74 | CODE | |
| LOW | skills/patent-chart/tools/highlights.py | 173 | CODE | |
| LOW | skills/patent-chart/tools/emit_chart.py | 104 | CODE | |
| LOW | skills/patent-chart/tools/emit_chart.py | 295 | CODE | |
| LOW | skills/patent-chart/tools/emit_chart.py | 353 | CODE | |
| LOW | skills/patent-chart/tools/emit_chart.py | 650 | CODE | |
| LOW | skills/patent-chart/tools/emit_chart.py | 806 | CODE | |
| LOW | …s/patent-disclosure/tools/structure_callout_overlay.py | 111 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 232 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 456 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 495 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 533 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 562 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 879 | CODE | |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 1056 | CODE | |
| LOW | skills/patent-disclosure/tools/step_to_views.py | 95 | CODE | |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 147 | CODE | |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 274 | CODE | |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 361 | CODE | |
| LOW | skills/patent-disclosure/tools/mermaid_render.py | 227 | CODE | |
| LOW | skills/patent-disclosure/tools/mermaid_render.py | 443 | CODE | |
| LOW | …ls/patent-disclosure/tools/structure_callout_layout.py | 58 | CODE | |
| LOW | …ls/patent-disclosure/tools/structure_callout_layout.py | 173 | CODE | |
| LOW | skills/patent-disclosure/tools/latex_delimiters.py | 82 | CODE | |
| LOW | skills/patent-disclosure/tools/latex_delimiters.py | 123 | CODE | |
| LOW | skills/patent-disclosure/tools/check_formula_plan.py | 105 | CODE | |
| LOW | skills/patent-disclosure/tools/image_gen.py | 251 | CODE | |
| 69 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements.txt | 1 | # Used by skills/patent-disclosure/tools/md_to_docx.py, docx_to_md.py, pptx_to_md.py, | COMMENT |
| LOW | requirements.txt | 21 | # only if no system browser: python -m playwright install chromium | COMMENT |
| LOW | .github/workflows/update-star-history.yml | 1 | # Update star history (orphan branch) | COMMENT |
| LOW | skills/patent-reader/tools/crawl/requirements-cnipa.txt | 1 | # CNIPA gazette crawl (cnipa_epub_crawler.py / cnipa_epub_parse.py). | COMMENT |
| LOW | skills/patent-disclosure/tools/gen_demo_snap_step.py | 101 | #{a+2}=PRODUCT('demo_snap_plate','demo_snap_plate','teaching STEP for cad_scan / step_to_views',(#{a+3})); | COMMENT |
| LOW | skills/patent-disclosure/tools/requirements-step.txt | 1 | # CadQuery/OCP: STEP -> SVG. Install ONLY into tools/cad-env | COMMENT |
| LOW | …lls/patent-disclosure/tools/crawl/cnipa_epub_wait.yaml | 1 | # 国知局公布公告(epub.cnipa.gov.cn)Playwright 等待与第二轮收口上限。 | COMMENT |
| LOW | …lls/patent-disclosure/tools/crawl/cnipa_epub_wait.yaml | 21 | # 调大:偶发 JS 慢;调小:门闩一直不放时更快判失败。 | COMMENT |
| LOW | …s/patent-disclosure/tools/crawl/requirements-cnipa.txt | 1 | # CNIPA gazette crawl (cnipa_epub_search.py / cnipa_epub_crawler.py). | COMMENT |
| LOW | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 181 | wait_for_epub_advanced_ready, | COMMENT |
| LOW | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 241 | COMMENT | |
| LOW | …isclosure/references/schemas/design_around.schema.yaml | 1 | # 突围路径(全面覆盖 / 等同列表,不改稿) | COMMENT |
| LOW | …ferences/schemas/structure_callout_anchors.schema.yaml | 41 | # | COMMENT |
| LOW | …ferences/schemas/structure_lineart_compose.schema.yaml | 41 | # - slot 缺省:assembly 则跟 crop_box 或铺满画布;exploded 则自动网格。 | COMMENT |
| LOW | …atent-disclosure/references/schemas/matrix.schema.yaml | 1 | # 技术功效矩阵 | COMMENT |
| LOW | …-disclosure/references/schemas/family_plan.schema.yaml | 1 | # 保护型 1+N 族树 | COMMENT |
| LOW | …nt-disclosure/references/schemas/decompose.schema.yaml | 1 | # 技术分解(保护型 1+N 底稿) | COMMENT |
| LOW | skills/patent-application/references/promo_terms.yaml | 1 | # 申请文件 · 宣传性措辞词库 | COMMENT |
| LOW | skills/patent-search/tools/requirements-cnipa.txt | 1 | # CNIPA bibliographic search (skills/patent-search). Same playwright as root requirements.txt. | COMMENT |
| LOW | skills/patent-oa/docs/embedding.config.yaml | 1 | # 审查答复 · 向量嵌入配置(仓库模板种子) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 185 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 187 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 615 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ls/patent-disclosure/tools/crawl/cnipa_epub_crawler.py | 617 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/patent-search/tests/test_cnipa_search.py | 37 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/patent-search/tests/test_cnipa_search.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 337 | return "placeholder" | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 484 | "decision": "placeholder", | CODE |
| LOW | skills/patent-reader/tools/extract/figure_extract.py | 486 | f"嵌入图{img_index + 1}", page_number, fname, "placeholder", quality | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 448 | if decision == "placeholder" and status == "review": | CODE |
| LOW | …atent-reader/tools/vault/write_patent_obsidian_note.py | 510 | "decision": "placeholder", | CODE |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 212 | if source not in {"crop", "image", "placeholder"}: | CODE |
| LOW | …s/patent-disclosure/tools/structure_lineart_compose.py | 393 | source = str(item.get("source") or "placeholder") | CODE |
| LOW | …ent-disclosure/tests/test_structure_lineart_compose.py | 106 | "source": "placeholder", | CODE |
| LOW | …ent-disclosure/tests/test_structure_lineart_compose.py | 146 | self.assertIn('data-source="placeholder"', text) | CODE |
| LOW | …ent-disclosure/tests/test_structure_lineart_compose.py | 173 | "source": "placeholder", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/patent-reader/tools/shared/common.py | 532 | CODE | |
| LOW | skills/patent-reader/tools/vault/desc_paragraphs.py | 300 | CODE | |
| LOW | skills/patent-reader/tools/vault/patent_link.py | 775 | CODE | |
| LOW | skills/patent-reader/tools/vault/clue_vault.py | 74 | CODE | |
| LOW | skills/patent-reader/tools/vault/obsidian_canvas.py | 74 | CODE | |
| LOW | skills/patent-disclosure/tools/math_render.py | 111 | CODE | |
| LOW | skills/patent-oa/tools/config.py | 386 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/patent-reader/tools/vault/obsidian.py | 102 | __all__ = [ | CODE |
| LOW | skills/patent-disclosure/tools/md_to_docx.py | 789 | def _set_paragraph_num_id(paragraph, num_id: int) -> None: | CODE |
| LOW | skills/patent-disclosure/tools/crawl/cnipa_epub_nav.py | 329 | def _settle_after_load(page: Page) -> None: | CODE |
| LOW | skills/patent-application/tools/md_to_docx.py | 772 | def _set_paragraph_num_id(paragraph, num_id: int) -> None: | CODE |
| LOW | skills/patent-oa/tools/md_to_docx.py | 780 | def _set_paragraph_num_id(paragraph, num_id: int) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | skills/patent-disclosure/SKILL.md | 41 | 围栏:Step 8 之后只在交付回复 **`## 交付后请确认`** 第 3 条询问。口径见 `prompts/fence/guardrails.md`。立项说明直接写 `outputs/{案件}/fence/专利布局.md`(章节见 `p | CODE |
| MEDIUM | skills/patent-exam-policy/prompts/intake.md | 35 | 3. 展示 **`## 交付后请确认`**(见 guardrails);**不要**把「全部采纳」当成默认下一步 | CODE |